Twig lexer:添加分隔符

时间:2014-01-10 14:22:12

标签: php twig lexer

我想在我的项目中使用Twig(v1.15.0)来替换我们自制的模板引擎。它使用特定的分隔符来替换变量,[[...]]或管理本地化字符串,[%...%]。

<table>
    <tr>
        <td>[%myLocalizedString%]</td>
        <td>[[myVarToReplace]]</td>
    </tr>
</table>

出于遗留和兼容性原因,我不想修改所有现有模板来替换每个分隔符。

对于变量,这不是什么大问题,我只需要设置Twig词法分析器的选项:

$twig = new Twig_Environment();

$lexer = new Twig_Lexer($twig, array(
    'tag_comment'   => array('{#', '#}'),
    'tag_block'     => array('{%', '%}'),
    'tag_variable'  => array('[[', ']]'), // was array('{{', '}}')
    'interpolation' => array('#{', '}'),
));
$twig->setLexer($lexer);

在本地化分隔符的情况下并不那么简单。最初我想做那样的事情:

$twig = new Twig_Environment();
$lexer = new Twig_Lexer($twig);
$lexer->addDelimiter('tag_localize', array('[%', '%]'), 'functionToCall');

但它似乎尚未实施。

最终的解决方案是扩展Lexer类并在我的twig环境中使用它。 但我想避免这种情况。

有没有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

我相信你已经知道了:在Twig中你使用I18n扩展进行翻译。该扩展程序提供了“反式”代码:see i18n docs

我认为你无法通过扩展Lexer类将翻译语法[%Hello world%]转换为Twig方式{% trans %}Hello world{% endtrans %},因为{%是一个块元素而trans a I18n扩展中定义的标记。您可以构建自己的翻译逻辑,但我认为创建一个用[%替换{% trans %]%}替换{% endtrans %}的预处理器要容易得多。

我想它可以像这样工作(未经测试):

class MYTwigEnvironment extends Twig_Environment {
   public function compileSource($source, $name = null) {
     /* 
      * code to replace '[%' with '{% trans %}' in $source 
      * comes here ...
      */
     return parent::compileSource($source, $name = null);
   }
}

据我了解,这样模板缓存应该保持不变。

问候