/** * Defined by Twig_NodeVisitorInterface * * Extracts messages from calls to the translate function. */ public function enterNode(\Twig_NodeInterface $node, \Twig_Environment $env) { if ($node instanceof \Skeleton\I18n\Template\Twig\Extension\Node\Trans\Tigron) { if ($node->getNodeTag() == 'trans') { $this->extracted[] = $node->getNode('body')->getAttribute('value'); } } elseif ($node instanceof \Twig_Node_Print) { $n = $node->getNode('expr'); while ($n instanceof \Twig_Node_Expression_Filter) { $filter = null; if ($n->hasNode('filter')) { $filter = $n->getNode('filter')->getAttribute('value'); } $n = $n->getNode('node'); if ($n instanceof \Twig_Node_Expression_Constant and $filter == 'trans') { $this->extracted[] = $n->getAttribute('value'); } } } elseif ($node instanceof \Twig_Node_Expression_Array) { $data = $node->getIterator(); foreach ($data as $row) { if ($row instanceof \Twig_Node_Expression_Filter) { if ($row->hasNode('filter') and $row->getNode('filter')->getAttribute('value') == 'trans') { $this->extracted[] = $row->getNode('node')->getAttribute('value'); } } } } return $node; }
/** * Parses module dependencies from Twig AST. * * @param JsCompiler $compiler * @param \Twig_NodeInterface $node * * @return array of dependencies */ private function getDependencies(JsCompiler $compiler, \Twig_NodeInterface $node) { $dependencies = ['files' => [], 'functions' => []]; $stack = iterator_to_array($node->getIterator()); while (count($stack)) { $subNode = array_shift($stack); if (!$subNode instanceof \Twig_Node) { continue; } if ($subNode instanceof \Twig_Node_Include || $subNode instanceof \Twig_Node_Import) { $expr = $subNode->getNode('expr'); $env = $compiler->getEnvironment(); $path = $expr->getAttribute('value'); $source = $env->getLoader()->getSource($path); $module = $env->parse($env->tokenize($source, $path)); $name = $compiler->getFunctionName($module); array_push($dependencies['files'], $name . 'Template'); array_push($dependencies['functions'], $name); } elseif ($subNode->count()) { $stack = array_merge(iterator_to_array($subNode->getIterator()), $stack); } } return $dependencies; }