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()); }
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()); }
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()); }
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); }
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()); }
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()); }
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()); }
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()); }