public function Twig_TokenParser_Block::parse

Parses a token and returns a node.

Parameters

Twig_Token $token A Twig_Token instance:

Return value

Twig_NodeInterface A Twig_NodeInterface instance

Overrides Twig_TokenParserInterface::parse

File

drupal/core/vendor/twig/twig/lib/Twig/TokenParser/Block.php, line 32

Class

Twig_TokenParser_Block
Marks a section of a template as being reusable.

Code

public function parse(Twig_Token $token) {
  $lineno = $token
    ->getLine();
  $stream = $this->parser
    ->getStream();
  $name = $stream
    ->expect(Twig_Token::NAME_TYPE)
    ->getValue();
  if ($this->parser
    ->hasBlock($name)) {
    throw new Twig_Error_Syntax(sprintf("The block '{$name}' has already been defined line %d", $this->parser
      ->getBlock($name)
      ->getLine()), $stream
      ->getCurrent()
      ->getLine(), $stream
      ->getFilename());
  }
  $this->parser
    ->setBlock($name, $block = new Twig_Node_Block($name, new Twig_Node(array()), $lineno));
  $this->parser
    ->pushLocalScope();
  $this->parser
    ->pushBlockStack($name);
  if ($stream
    ->test(Twig_Token::BLOCK_END_TYPE)) {
    $stream
      ->next();
    $body = $this->parser
      ->subparse(array(
      $this,
      'decideBlockEnd',
    ), true);
    if ($stream
      ->test(Twig_Token::NAME_TYPE)) {
      $value = $stream
        ->next()
        ->getValue();
      if ($value != $name) {
        throw new Twig_Error_Syntax(sprintf("Expected endblock for block '{$name}' (but %s given)", $value), $stream
          ->getCurrent()
          ->getLine(), $stream
          ->getFilename());
      }
    }
  }
  else {
    $body = new Twig_Node(array(
      new Twig_Node_Print($this->parser
        ->getExpressionParser()
        ->parseExpression(), $lineno),
    ));
  }
  $stream
    ->expect(Twig_Token::BLOCK_END_TYPE);
  $block
    ->setNode('body', $body);
  $this->parser
    ->popBlockStack();
  $this->parser
    ->popLocalScope();
  return new Twig_Node_BlockReference($name, $lineno, $this
    ->getTag());
}