コード例 #1
0
ファイル: Default.php プロジェクト: naldz/cyberden
 public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Constant $filterName, Twig_NodeInterface $arguments, $lineno, $tag = null)
 {
     $default = new Twig_Node_Expression_Filter($node, new Twig_Node_Expression_Constant('default', $node->getTemplateLine()), $arguments, $node->getTemplateLine());
     if ('default' === $filterName->getAttribute('value') && ($node instanceof Twig_Node_Expression_Name || $node instanceof Twig_Node_Expression_GetAttr)) {
         $test = new Twig_Node_Expression_Test_Defined(clone $node, 'defined', new Twig_Node(), $node->getTemplateLine());
         $false = count($arguments) ? $arguments->getNode(0) : new Twig_Node_Expression_Constant('', $node->getTemplateLine());
         $node = new Twig_Node_Expression_Conditional($test, $default, $false, $node->getTemplateLine());
     } else {
         $node = $default;
     }
     parent::__construct($node, $filterName, $arguments, $lineno, $tag);
 }
コード例 #2
0
 public function __construct(Twig_NodeInterface $left, Twig_NodeInterface $right, $lineno)
 {
     $test = new Twig_Node_Expression_Binary_And(new Twig_Node_Expression_Test_Defined(clone $left, 'defined', new Twig_Node(), $left->getTemplateLine()), new Twig_Node_Expression_Unary_Not(new Twig_Node_Expression_Test_Null($left, 'null', new Twig_Node(), $left->getTemplateLine()), $left->getTemplateLine()), $left->getTemplateLine());
     parent::__construct($test, $left, $right, $lineno);
 }
コード例 #3
0
ファイル: For.php プロジェクト: naldz/cyberden
 protected function checkLoopUsageBody(Twig_TokenStream $stream, Twig_NodeInterface $node)
 {
     if ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' == $node->getNode('node')->getAttribute('name')) {
         $attribute = $node->getNode('attribute');
         if ($attribute instanceof Twig_Node_Expression_Constant && in_array($attribute->getAttribute('value'), array('length', 'revindex0', 'revindex', 'last'))) {
             throw new Twig_Error_Syntax(sprintf('The "loop.%s" variable is not defined when looping with a condition.', $attribute->getAttribute('value')), $node->getTemplateLine(), $stream->getSourceContext()->getName());
         }
     }
     // should check for parent.loop.XXX usage
     if ($node instanceof Twig_Node_For) {
         return;
     }
     foreach ($node as $n) {
         if (!$n) {
             continue;
         }
         $this->checkLoopUsageBody($stream, $n);
     }
 }
コード例 #4
0
ファイル: Escaper.php プロジェクト: naldz/cyberden
 protected function getEscaperFilter($type, Twig_NodeInterface $node)
 {
     $line = $node->getTemplateLine();
     $name = new Twig_Node_Expression_Constant('escape', $line);
     $args = new Twig_Node(array(new Twig_Node_Expression_Constant((string) $type, $line), new Twig_Node_Expression_Constant(null, $line), new Twig_Node_Expression_Constant(true, $line)));
     return new Twig_Node_Expression_Filter($node, $name, $args, $line);
 }
コード例 #5
0
 private function parseTestExpression(Twig_NodeInterface $node)
 {
     $stream = $this->parser->getStream();
     list($name, $test) = $this->getTest($node->getTemplateLine());
     $class = $this->getTestNodeClass($test);
     $arguments = null;
     if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
         $arguments = $this->parser->getExpressionParser()->parseArguments(true);
     }
     return new $class($node, $name, $arguments, $this->parser->getCurrentToken()->getLine());
 }
コード例 #6
0
ファイル: Compiler.php プロジェクト: naldz/cyberden
 /**
  * Adds debugging information.
  *
  * @return $this
  */
 public function addDebugInfo(Twig_NodeInterface $node)
 {
     if ($node->getTemplateLine() != $this->lastLine) {
         $this->write(sprintf("// line %d\n", $node->getTemplateLine()));
         // when mbstring.func_overload is set to 2
         // mb_substr_count() replaces substr_count()
         // but they have different signatures!
         if ((int) ini_get('mbstring.func_overload') & 2) {
             // this is much slower than the "right" version
             $this->sourceLine += mb_substr_count(mb_substr($this->source, $this->sourceOffset), "\n");
         } else {
             $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset);
         }
         $this->sourceOffset = strlen($this->source);
         $this->debugInfo[$this->sourceLine] = $node->getTemplateLine();
         $this->lastLine = $node->getTemplateLine();
     }
     return $this;
 }
コード例 #7
0
 protected function filterBodyNodes(Twig_NodeInterface $node)
 {
     // check that the body does not contain non-empty output nodes
     if ($node instanceof Twig_Node_Text && !ctype_space($node->getAttribute('data')) || !$node instanceof Twig_Node_Text && !$node instanceof Twig_Node_BlockReference && $node instanceof Twig_NodeOutputInterface) {
         if (false !== strpos((string) $node, chr(0xef) . chr(0xbb) . chr(0xbf))) {
             throw new Twig_Error_Syntax('A template that extends another one cannot start with a byte order mark (BOM); it must be removed.', $node->getTemplateLine(), $this->stream->getSourceContext()->getName());
         }
         throw new Twig_Error_Syntax('A template that extends another one cannot include contents outside Twig blocks. Did you forget to put the contents inside a {% block %} tag?', $node->getTemplateLine(), $this->stream->getSourceContext()->getName());
     }
     // bypass "set" nodes as they "capture" the output
     if ($node instanceof Twig_Node_Set) {
         return $node;
     }
     if ($node instanceof Twig_NodeOutputInterface) {
         return;
     }
     foreach ($node as $k => $n) {
         if (null !== $n && null === $this->filterBodyNodes($n)) {
             $node->removeNode($k);
         }
     }
     return $node;
 }