0

我正在写一个 twig 标签,我想告诉 Tokenizer 标签 first Argument 是一个常量而不是表达式。

例如,假设我的标签是 "echo" 的别名:

{% tagname 'toto' %}

应该产生“toto”(没有引号)

{% tagname toto %}

还应该产生“toto”(无引号)

{% tagname toto.xx %}

应该产生“toto.xx”(无引号)

问题出在最后一个示例中,令牌解析器将“toto”视为表达式,因此查找名为“toto”的变量。

所以我想知道是否有可能以某种方式指定标签参数必须是一个常量?

我的代码现在的样子:

public function parse(\Twig_Token $token)
{
    $parser = $this->parser;
    $stream = $parser->getStream();
    $text = $parser->getExpressionParser()->parseStringExpression();

我还尝试了 ExpressionParser 中的 parsePrimaryExpression、parseHashExpression(这是错误吗?)

提前致谢

4

1 回答 1

0

如果我理解正确,您想同时使用{% sometag 'foo' %}and{% sometag foo %}吗?

这是在词法分析器中完成的,SometagTokenParser. 带引号的被调用Twig_Token::STRING_TYPE,不带引号的被调用Twig_Token::NAME_TYPE。在令牌解析器中使用类似的东西:

if ($stream->test(\Twig_Token::NAME_TYPE)) {  
    $name = $stream->expect(\Twig_Token::NAME_TYPE)->getValue();  
} else {  
    $name = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();  
}  

两者都只是在应用程序的其余部分中作为字符串处理。

在 Twig 中不支持tuto.foo不带引号是不可能的。

于 2013-06-19T13:15:18.023 回答