2014-02-18 36 views
2

twig的最新版本中,客戶功能將被實現爲Twig_SimpleFunction,因爲舊方法已被棄用。解析/搜索樹枝模板中的某個功能

我有對付使用資源包的消息格式化自定義翻譯功能:

{{ trans('key') }} 

我建立一個PHP腳本通過我的所有模板來獲取這些密鑰。我不希望在該腳本中呈現模板,因爲我沒有將所有變量傳遞給模板。當使用load()(這對性能很重要)加載模板時,不會調用函數,所以我需要一個詞法分析器來解析我的模板。

不幸的是,關於這方面的信息並不多,所以很難說從哪裏開始。

如何添加客戶詞法分析器來解析像{{ trans('key') }}這樣的函數?

另外,如果有一個更好/更簡單的方法來實現這一點,我一定會喜歡知道!

回答

2

這個解決方案真的很簡單。我們需要獲取所有模板,加載每個模板,然後運行解析器來生成AST。然後我們通過AST來選擇我們想要的東西。沒有必要編譯模板。

下面是如何可以做到這一點:

public function process($node) 
{ 
    // Process nodes that are function expressions 
    if ($node instanceof \Twig_Node_Expression_Function) { 
     // Check the function name 
     if ($node->getAttribute('name') == 'trans') { 
      // Grab the argument 
      foreach ($node->getNode('arguments') as $argument) { 
       $key = eval('return ' . $this->twig->compile($argument) . ';'); 

       if (!in_array($key, $translationKeys)) { 
        $this->trans[] = $key; 
       } 

       // I only needed the first argument in my implementation 
       break; 
      } 
     } 
    } 

    // Recursively loop through the AST 
    foreach ($node as $child) { 
     if ($child instanceof \Twig_Node) { 
      process($child); 
     } 
    } 
} 

提示:如果您加載從外部文件,而不是字符串的模板,那麼你需要使用getContent()獲得以文本形式的模板:

$parsed = $twig->parse($twig->tokenize($loader->getSource($template))); 
+0

謝謝。這完美的作品! – mblaettermann