Пример #1
0
 /**
  * {@inheritdoc}
  */
 public function leaveNode(Twig_Node $node, Twig_Environment $env)
 {
     if ($node instanceof Twig_Node_Module) {
         $varName = $this->getVarName();
         $node->setNode('display_start', new Twig_Node(array(new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::TEMPLATE, $node->getAttribute('filename'), $varName), $node->getNode('display_start'))));
         $node->setNode('display_end', new Twig_Node(array(new Twig_Profiler_Node_LeaveProfile($varName), $node->getNode('display_end'))));
     } elseif ($node instanceof Twig_Node_Block) {
         $varName = $this->getVarName();
         $node->setNode('body', new Twig_Node_Body(array(new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::BLOCK, $node->getAttribute('name'), $varName), $node->getNode('body'), new Twig_Profiler_Node_LeaveProfile($varName))));
     } elseif ($node instanceof Twig_Node_Macro) {
         $varName = $this->getVarName();
         $node->setNode('body', new Twig_Node_Body(array(new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::MACRO, $node->getAttribute('name'), $varName), $node->getNode('body'), new Twig_Profiler_Node_LeaveProfile($varName))));
     }
     return $node;
 }
Пример #2
0
 /**
  * Called after child nodes are visited.
  *
  * @param Twig_Node        $node The node to visit
  * @param Twig_Environment $env  The Twig environment instance
  *
  * @return Twig_Node The modified node
  */
 public function leaveNode(Twig_Node $node, Twig_Environment $env)
 {
     if ($node instanceof Twig_Node_Module) {
         $this->inAModule = false;
         $node->setNode('display_start', new Twig_Node(array(new Twig_Node_CheckSecurity($this->filters, $this->tags, $this->functions), $node->getNode('display_start'))));
     }
     return $node;
 }
Пример #3
0
 public function parse(\Twig_Token $token)
 {
     $lineno = $token->getLine();
     $expression = $this->parser->getExpressionParser()->parseExpression();
     $this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
     $this->parser->subparse(array($this, 'decideCaseFork'));
     $cases = new \Twig_Node();
     $default = null;
     $end = false;
     $i = 0;
     while (!$end) {
         switch ($tag = $this->parser->getStream()->next()->getValue()) {
             case 'case':
                 $i++;
                 $expr = $this->parser->getExpressionParser()->parseExpression();
                 $this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
                 $body = $this->parser->subparse(array($this, 'decideCaseFork'));
                 $cases->setNode($i, new \Twig_Node(array('expression' => $expr, 'body' => $body)));
                 break;
             case 'default':
                 $i = null;
                 $this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
                 $body = $this->parser->subparse(array($this, 'decideCaseFork'));
                 $default = $body;
                 break;
             case 'break':
                 $this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
                 $this->parser->subparse(array($this, 'decideCaseFork'));
                 if ($cases->hasNode($i)) {
                     $cases->getNode($i)->setAttribute('break', true);
                 }
                 break;
             case 'endswitch':
                 $end = true;
                 break;
             default:
                 throw new \Twig_Error_Syntax(sprintf('Unexpected end of template at line %d' . $tag, $lineno), -1);
         }
     }
     $this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
     return new SwitchNode($cases, $default, $expression, $lineno, $this->getTag());
 }
 /**
  * {@inheritdoc}
  */
 protected function doEnterNode(\Twig_Node $node, \Twig_Environment $env)
 {
     if ($node instanceof \Twig_Node_Block || $node instanceof \Twig_Node_Module) {
         $this->scope = $this->scope->enter();
     }
     if ($node instanceof TransDefaultDomainNode) {
         if ($node->getNode('expr') instanceof \Twig_Node_Expression_Constant) {
             $this->scope->set('domain', $node->getNode('expr'));
             return $node;
         } else {
             $var = $env->getParser()->getVarName();
             $name = new \Twig_Node_Expression_AssignName($var, $node->getLine());
             $this->scope->set('domain', new \Twig_Node_Expression_Name($var, $node->getLine()));
             return new \Twig_Node_Set(false, new \Twig_Node(array($name)), new \Twig_Node(array($node->getNode('expr'))), $node->getLine());
         }
     }
     if (!$this->scope->has('domain')) {
         return $node;
     }
     if ($node instanceof \Twig_Node_Expression_Filter && in_array($node->getNode('filter')->getAttribute('value'), array('trans', 'transchoice'))) {
         $arguments = $node->getNode('arguments');
         $ind = 'trans' === $node->getNode('filter')->getAttribute('value') ? 1 : 2;
         if ($this->isNamedArguments($arguments)) {
             if (!$arguments->hasNode('domain') && !$arguments->hasNode($ind)) {
                 $arguments->setNode('domain', $this->scope->get('domain'));
             }
         } else {
             if (!$arguments->hasNode($ind)) {
                 if (!$arguments->hasNode($ind - 1)) {
                     $arguments->setNode($ind - 1, new \Twig_Node_Expression_Array(array(), $node->getLine()));
                 }
                 $arguments->setNode($ind, $this->scope->get('domain'));
             }
         }
     } elseif ($node instanceof TransNode) {
         if (!$node->hasNode('domain')) {
             $node->setNode('domain', $this->scope->get('domain'));
         }
     }
     return $node;
 }
 /**
  * {@inheritdoc}
  */
 protected function doLeaveNode(\Twig_Node $node, \Twig_Environment $env)
 {
     if ($node instanceof \Twig_Node_Module) {
         $this->filename = null;
     }
     if ($this->shouldProcess()) {
         if ($node instanceof \Twig_Node_Module) {
             if ($this->shouldBufferize) {
                 $node->setNode('body', new \Twig_Node(array(new Initialize($this->settings['defaultExecutionPriority']), $node->getNode('body'), new Terminate($this->settings['defaultExecutionPriority']))));
             }
             $this->shouldBufferize = false;
             $this->blocks = array();
         }
         if ($this->isBufferizingNode($node) || $node instanceof \Twig_Node_BlockReference && $this->hasBufferizingNode($this->blocks[$node->getAttribute('name')])) {
             return new \Twig_Node(array(new BufferBreakPoint($this->settings['defaultExecutionPriority']), $node, new BufferBreakPoint($this->settings['defaultExecutionPriority'], array(), array(BaseBufferNode::BUFFERIZED_EXECUTION_PRIORITY_ATTRIBUTE_NAME => $this->getNodeExecutionPriority($node)))));
         } elseif ($this->currentScope && $node instanceof \Twig_Node_Block && $this->hasBufferizingNode($node)) {
             $node->setNode('body', new \Twig_Node(array(new Initialize($this->settings['defaultExecutionPriority']), $node->getNode('body'), new Terminate($this->settings['defaultExecutionPriority']))));
             return $node;
         }
     }
     return $node;
 }
Пример #6
0
    public function getTests()
    {
        $tests = array();
        // #1 switch with one case, without break
        $expression = new \Twig_Node_Expression_Name('foo', 0);
        $default = null;
        $cases = new \Twig_Node();
        $cases->setNode(0, new \Twig_Node(array('expression' => new \Twig_Node_Expression_Constant(0, 0), 'body' => new \Twig_Node_Text('case 0', 0))));
        $node = new SwitchNode($cases, $default, $expression, 0);
        $tests[] = array($node, <<<EOF
switch ({$this->getVariableGetter('foo')}) {
    case 0:
        echo "case 0";
}
EOF
);
        // #2 switch with two cases, second with break
        $expression = new \Twig_Node_Expression_Name('foo', 0);
        $default = null;
        $cases = new \Twig_Node();
        $cases->setNode(0, new \Twig_Node(array('expression' => new \Twig_Node_Expression_Constant(0, 0), 'body' => new \Twig_Node_Text('case 0', 0))));
        $cases->setNode(1, new \Twig_Node(array('expression' => new \Twig_Node_Expression_Constant(1, 0), 'body' => new \Twig_Node_Text('case 1', 0))));
        $cases->getNode(1)->setAttribute('break', true);
        $node = new SwitchNode($cases, $default, $expression, 0);
        $tests[] = array($node, <<<EOF
switch ({$this->getVariableGetter('foo')}) {
    case 0:
        echo "case 0";
    case 1:
        echo "case 1";
        break;
}
EOF
);
        // #3 switch with two cases (second with break) and default
        $expression = new \Twig_Node_Expression_Name('foo', 0);
        $default = new \Twig_Node_Text('default case', 0);
        $cases = new \Twig_Node();
        $cases->setNode(0, new \Twig_Node(array('expression' => new \Twig_Node_Expression_Constant(0, 0), 'body' => new \Twig_Node_Text('case 0', 0))));
        $cases->setNode(1, new \Twig_Node(array('expression' => new \Twig_Node_Expression_Constant(1, 0), 'body' => new \Twig_Node_Text('case 1', 0))));
        $cases->getNode(1)->setAttribute('break', true);
        $node = new SwitchNode($cases, $default, $expression, 0);
        $tests[] = array($node, <<<EOF
switch ({$this->getVariableGetter('foo')}) {
    case 0:
        echo "case 0";
    case 1:
        echo "case 1";
        break;
    default:
        echo "default case";
}
EOF
);
        // #4 switch with two cases (first without body, second with break) and default
        $expression = new \Twig_Node_Expression_Name('foo', 0);
        $default = new \Twig_Node_Text('default case', 0);
        $cases = new \Twig_Node();
        $cases->setNode(0, new \Twig_Node(array('expression' => new \Twig_Node_Expression_Constant(0, 0), 'body' => new \Twig_Node())));
        $cases->setNode(1, new \Twig_Node(array('expression' => new \Twig_Node_Expression_Constant(1, 0), 'body' => new \Twig_Node_Text('case 1', 0))));
        $cases->getNode(1)->setAttribute('break', true);
        $node = new SwitchNode($cases, $default, $expression, 0);
        $tests[] = array($node, <<<EOF
switch ({$this->getVariableGetter('foo')}) {
    case 0:
    case 1:
        echo "case 1";
        break;
    default:
        echo "default case";
}
EOF
);
        return $tests;
    }