Пример #1
0
 public function parse(Apishka_Templater_Token $token)
 {
     $name = $this->parser->getVarName();
     $ref = Apishka_Templater_Node_Expression_BlockReference::apishka(Apishka_Templater_Node_Expression_Constant::apishka($name, $token->getLine()), Apishka_Templater_Node::apishka(), true, $token->getLine(), $this->getTag());
     $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag());
     $this->parser->getStream()->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
     $this->parser->getStream()->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     $block = Apishka_Templater_Node_Block::apishka($name, $body, $token->getLine());
     $this->parser->setBlock($name, $block);
     return Apishka_Templater_Node_Print::apishka($filter, $token->getLine(), $this->getTag());
 }
Пример #2
0
 public function parse(Apishka_Templater_Token $token)
 {
     $lineno = $token->getLine();
     $stream = $this->parser->getStream();
     $name = $stream->expect(Apishka_Templater_Token::NAME_TYPE)->getValue();
     if ($this->parser->hasBlock($name)) {
         throw new Apishka_Templater_Error_Syntax(sprintf("The block '%s' has already been defined line %d.", $name, $this->parser->getBlock($name)->getLine()), $stream->getCurrent()->getLine(), $stream->getFilename());
     }
     $this->parser->setBlock($name, $block = Apishka_Templater_Node_Block::apishka($name, Apishka_Templater_Node::apishka(array()), $lineno));
     $this->parser->pushLocalScope();
     $this->parser->pushBlockStack($name);
     if ($stream->nextIf(Apishka_Templater_Token::BLOCK_END_TYPE)) {
         $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
         if ($token = $stream->nextIf(Apishka_Templater_Token::NAME_TYPE)) {
             $value = $token->getValue();
             if ($value != $name) {
                 throw new Apishka_Templater_Error_Syntax(sprintf('Expected endblock for block "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getFilename());
             }
         }
     } else {
         $body = Apishka_Templater_Node::apishka(array(Apishka_Templater_Node_Print::apishka($this->parser->getExpressionParser()->parseExpression(), $lineno)));
     }
     $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     $block->setNode('body', $body);
     $this->parser->popBlockStack();
     $this->parser->popLocalScope();
     return Apishka_Templater_Node_BlockReference::apishka($name, $lineno, $this->getTag());
 }
Пример #3
0
 public function parse(Apishka_Templater_Token $token)
 {
     $lineno = $token->getLine();
     $expr = $this->parser->getExpressionParser()->parseExpression();
     $stream = $this->parser->getStream();
     $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     $body = $this->parser->subparse(array($this, 'decideIfFork'));
     $tests = array($expr, $body);
     $else = null;
     $end = false;
     while (!$end) {
         switch ($stream->next()->getValue()) {
             case 'else':
                 $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
                 $else = $this->parser->subparse(array($this, 'decideIfEnd'));
                 break;
             case 'elseif':
                 $expr = $this->parser->getExpressionParser()->parseExpression();
                 $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
                 $body = $this->parser->subparse(array($this, 'decideIfFork'));
                 $tests[] = $expr;
                 $tests[] = $body;
                 break;
             case 'endif':
                 $end = true;
                 break;
             default:
                 throw new Apishka_Templater_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d).', $lineno), $stream->getCurrent()->getLine(), $stream->getFilename());
         }
     }
     $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     return Apishka_Templater_Node_If::apishka(Apishka_Templater_Node::apishka($tests), $else, $lineno, $this->getTag());
 }
Пример #4
0
 public function parse(Apishka_Templater_Token $token)
 {
     if (!$this->parser->isMainScope()) {
         throw new Apishka_Templater_Error_Syntax('Cannot extend from a block.', $token->getLine(), $this->parser->getFilename());
     }
     if (null !== $this->parser->getParent()) {
         throw new Apishka_Templater_Error_Syntax('Multiple extends tags are forbidden.', $token->getLine(), $this->parser->getFilename());
     }
     $parent = $this->parser->getExpressionParser()->parseExpression();
     $stream = $this->parser->getStream();
     $options = array();
     while (!$stream->test(Apishka_Templater_Token::BLOCK_END_TYPE)) {
         $token = $stream->expect(Apishka_Templater_Token::NAME_TYPE);
         $name = $token->getValue();
         $stream->expect(Apishka_Templater_Token::OPERATOR_TYPE, '=');
         $options[$name] = $this->parser->getExpressionParser()->parseExpression();
     }
     $parent->setAttribute('parent_options', $options);
     $this->parser->setParent($parent);
     $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
 }
Пример #5
0
 public function parse(Apishka_Templater_Token $token)
 {
     $lineno = $token->getLine();
     $stream = $this->parser->getStream();
     if ($stream->test(Apishka_Templater_Token::BLOCK_END_TYPE)) {
         $value = 'html';
     } else {
         $expr = $this->parser->getExpressionParser()->parseExpression();
         if (!$expr instanceof Apishka_Templater_Node_Expression_Constant) {
             throw new Apishka_Templater_Error_Syntax('An escaping strategy must be a string or false.', $stream->getCurrent()->getLine(), $stream->getFilename());
         }
         $value = $expr->getAttribute('value');
     }
     $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
     $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     return Apishka_Templater_Node_AutoEscape::apishka($value, $body, $lineno, $this->getTag());
 }
Пример #6
0
 public function parse(Apishka_Templater_Token $token)
 {
     $lineno = $token->getLine();
     $stream = $this->parser->getStream();
     $names = $this->parser->getExpressionParser()->parseAssignmentExpression();
     $capture = false;
     if ($stream->nextIf(Apishka_Templater_Token::OPERATOR_TYPE, '=')) {
         $values = $this->parser->getExpressionParser()->parseMultitargetExpression();
         $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
         if (count($names) !== count($values)) {
             throw new Apishka_Templater_Error_Syntax('When using set, you must have the same number of variables and assignments.', $stream->getCurrent()->getLine(), $stream->getFilename());
         }
     } else {
         $capture = true;
         if (count($names) > 1) {
             throw new Apishka_Templater_Error_Syntax('When using set with a block, you cannot have a multi-target.', $stream->getCurrent()->getLine(), $stream->getFilename());
         }
         $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
         $values = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
         $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     }
     return Apishka_Templater_Node_Set::apishka($capture, $names, $values, $lineno, $this->getTag());
 }
Пример #7
0
 public function parse(Apishka_Templater_Token $token)
 {
     $lineno = $token->getLine();
     $stream = $this->parser->getStream();
     $targets = $this->parser->getExpressionParser()->parseAssignmentExpression();
     $stream->expect(Apishka_Templater_Token::OPERATOR_TYPE, 'in');
     $seq = $this->parser->getExpressionParser()->parseExpression();
     $ifexpr = null;
     if ($stream->nextIf(Apishka_Templater_Token::NAME_TYPE, 'if')) {
         $ifexpr = $this->parser->getExpressionParser()->parseExpression();
     }
     $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     $body = $this->parser->subparse(array($this, 'decideForFork'));
     if ($stream->next()->getValue() == 'else') {
         $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
         $else = $this->parser->subparse(array($this, 'decideForEnd'), true);
     } else {
         $else = null;
     }
     $stream->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     if (count($targets) > 1) {
         $keyTarget = $targets->getNode(0);
         $keyTarget = Apishka_Templater_Node_Expression_AssignName::apishka($keyTarget->getAttribute('name'), $keyTarget->getLine());
         $valueTarget = $targets->getNode(1);
         $valueTarget = Apishka_Templater_Node_Expression_AssignName::apishka($valueTarget->getAttribute('name'), $valueTarget->getLine());
     } else {
         $keyTarget = Apishka_Templater_Node_Expression_AssignName::apishka('_key', $lineno);
         $valueTarget = $targets->getNode(0);
         $valueTarget = Apishka_Templater_Node_Expression_AssignName::apishka($valueTarget->getAttribute('name'), $valueTarget->getLine());
     }
     if ($ifexpr) {
         $this->checkLoopUsageCondition($stream, $ifexpr);
         $this->checkLoopUsageBody($stream, $body);
     }
     return Apishka_Templater_Node_For::apishka($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, $lineno, $this->getTag());
 }
Пример #8
0
 public function parse(Apishka_Templater_Token $token)
 {
     $expr = $this->parser->getExpressionParser()->parseExpression();
     $this->parser->getStream()->expect(Apishka_Templater_Token::BLOCK_END_TYPE);
     return Apishka_Templater_Node_Do::apishka($expr, $token->getLine(), $this->getTag());
 }