Twig tags: use namespaced classes

This commit is contained in:
Matias Griese
2019-03-14 09:03:24 +02:00
parent 8789fd91ee
commit 561abc851f
14 changed files with 190 additions and 141 deletions

View File

@@ -9,24 +9,28 @@
namespace Grav\Common\Twig\Node;
class TwigNodeMarkdown extends \Twig_Node implements \Twig_NodeOutputInterface
use Twig\Compiler;
use Twig\Node\Node;
use Twig\Node\NodeOutputInterface;
class TwigNodeMarkdown extends Node implements NodeOutputInterface
{
/**
* TwigNodeMarkdown constructor.
* @param \Twig_Node $body
* @param $lineno
* @param Node $body
* @param int $lineno
* @param string $tag
*/
public function __construct(\Twig_Node $body, $lineno, $tag = 'markdown')
public function __construct(Node $body, $lineno, $tag = 'markdown')
{
parent::__construct(['body' => $body], [], $lineno, $tag);
}
/**
* Compiles the node to PHP.
*
* @param \Twig_Compiler A Twig_Compiler instance
* @param Compiler $compiler A Twig_Compiler instance
*/
public function compile(\Twig_Compiler $compiler)
public function compile(Compiler $compiler)
{
$compiler
->addDebugInfo($this)

View File

@@ -9,21 +9,26 @@
namespace Grav\Common\Twig\Node;
class TwigNodeRender extends \Twig_Node implements \Twig_NodeCaptureInterface
use Twig\Compiler;
use Twig\Node\Expression\AbstractExpression;
use Twig\Node\Node;
use Twig\Node\NodeCaptureInterface;
class TwigNodeRender extends Node implements NodeCaptureInterface
{
protected $tagName = 'render';
/**
* @param \Twig_Node_Expression $object
* @param \Twig_Node_Expression|null $layout
* @param \Twig_Node_Expression|null $context
* @param AbstractExpression $object
* @param AbstractExpression|null $layout
* @param AbstractExpression|null $context
* @param int $lineno
* @param string|null $tag
*/
public function __construct(
\Twig_Node_Expression $object,
?\Twig_Node_Expression $layout,
?\Twig_Node_Expression $context,
AbstractExpression $object,
?AbstractExpression $layout,
?AbstractExpression $context,
$lineno,
$tag = null
)
@@ -33,10 +38,10 @@ class TwigNodeRender extends \Twig_Node implements \Twig_NodeCaptureInterface
/**
* Compiles the node to PHP.
*
* @param \Twig_Compiler $compiler A Twig_Compiler instance
* @param Compiler $compiler A Twig_Compiler instance
* @throws \LogicException
*/
public function compile(\Twig_Compiler $compiler)
public function compile(Compiler $compiler)
{
$compiler->addDebugInfo($this);
$compiler->write('$object = ')->subcompile($this->getNode('object'))->raw(';' . PHP_EOL);

View File

@@ -9,26 +9,31 @@
namespace Grav\Common\Twig\Node;
class TwigNodeScript extends \Twig_Node implements \Twig_NodeCaptureInterface
use Twig\Compiler;
use Twig\Node\Expression\AbstractExpression;
use Twig\Node\Node;
use Twig\Node\NodeCaptureInterface;
class TwigNodeScript extends Node implements NodeCaptureInterface
{
protected $tagName = 'script';
/**
* TwigNodeScript constructor.
* @param \Twig_Node|null $body
* @param \Twig_Node_Expression|null $file
* @param \Twig_Node_Expression|null $group
* @param \Twig_Node_Expression|null $priority
* @param \Twig_Node_Expression|null $attributes
* @param Node|null $body
* @param AbstractExpression|null $file
* @param AbstractExpression|null $group
* @param AbstractExpression|null $priority
* @param AbstractExpression|null $attributes
* @param int $lineno
* @param string|null $tag
*/
public function __construct(
\Twig_Node $body = null,
\Twig_Node_Expression $file = null,
\Twig_Node_Expression $group = null,
\Twig_Node_Expression $priority = null,
\Twig_Node_Expression $attributes = null,
Node $body = null,
AbstractExpression $file = null,
AbstractExpression $group = null,
AbstractExpression $priority = null,
AbstractExpression $attributes = null,
$lineno = 0,
$tag = null
)
@@ -38,10 +43,10 @@ class TwigNodeScript extends \Twig_Node implements \Twig_NodeCaptureInterface
/**
* Compiles the node to PHP.
*
* @param \Twig_Compiler $compiler A Twig_Compiler instance
* @param Compiler $compiler A Twig_Compiler instance
* @throws \LogicException
*/
public function compile(\Twig_Compiler $compiler)
public function compile(Compiler $compiler)
{
$compiler->addDebugInfo($this);

View File

@@ -9,26 +9,31 @@
namespace Grav\Common\Twig\Node;
class TwigNodeStyle extends \Twig_Node implements \Twig_NodeCaptureInterface
use Twig\Compiler;
use Twig\Node\Expression\AbstractExpression;
use Twig\Node\Node;
use Twig\Node\NodeCaptureInterface;
class TwigNodeStyle extends Node implements NodeCaptureInterface
{
protected $tagName = 'style';
/**
* TwigNodeAssets constructor.
* @param \Twig_Node|null $body
* @param \Twig_Node_Expression|null $file
* @param \Twig_Node_Expression|null $group
* @param \Twig_Node_Expression|null $priority
* @param \Twig_Node_Expression|null $attributes
* @param Node|null $body
* @param AbstractExpression|null $file
* @param AbstractExpression|null $group
* @param AbstractExpression|null $priority
* @param AbstractExpression|null $attributes
* @param int $lineno
* @param string|null $tag
*/
public function __construct(
\Twig_Node $body = null,
\Twig_Node_Expression $file = null,
\Twig_Node_Expression $group = null,
\Twig_Node_Expression $priority = null,
\Twig_Node_Expression $attributes = null,
Node $body = null,
AbstractExpression $file = null,
AbstractExpression $group = null,
AbstractExpression $priority = null,
AbstractExpression $attributes = null,
$lineno = 0,
$tag = null
)
@@ -38,10 +43,10 @@ class TwigNodeStyle extends \Twig_Node implements \Twig_NodeCaptureInterface
/**
* Compiles the node to PHP.
*
* @param \Twig_Compiler $compiler A Twig_Compiler instance
* @param Compiler $compiler A Twig_Compiler instance
* @throws \LogicException
*/
public function compile(\Twig_Compiler $compiler)
public function compile(Compiler $compiler)
{
$compiler->addDebugInfo($this);

View File

@@ -9,20 +9,23 @@
namespace Grav\Common\Twig\Node;
class TwigNodeSwitch extends \Twig_Node
use Twig\Compiler;
use Twig\Node\Node;
class TwigNodeSwitch extends Node
{
/**
* TwigNodeSwitch constructor.
* @param \Twig_Node $value
* @param \Twig_Node $cases
* @param \Twig_Node|null $default
* @param Node $value
* @param Node $cases
* @param Node|null $default
* @param int $lineno
* @param string|null $tag
*/
public function __construct(
\Twig_Node $value,
\Twig_Node $cases,
\Twig_Node $default = null,
Node $value,
Node $cases,
Node $default = null,
$lineno = 0,
$tag = null
)
@@ -33,9 +36,9 @@ class TwigNodeSwitch extends \Twig_Node
/**
* Compiles the node to PHP.
*
* @param \Twig_Compiler A Twig_Compiler instance
* @param Compiler $compiler A Twig_Compiler instance
*/
public function compile(\Twig_Compiler $compiler)
public function compile(Compiler $compiler)
{
$compiler
->addDebugInfo($this)

View File

@@ -9,18 +9,21 @@
namespace Grav\Common\Twig\Node;
class TwigNodeThrow extends \Twig_Node
use Twig\Compiler;
use Twig\Node\Node;
class TwigNodeThrow extends Node
{
/**
* TwigNodeThrow constructor.
* @param $code
* @param \Twig_Node $message
* @param int $code
* @param Node $message
* @param int $lineno
* @param string|null $tag
*/
public function __construct(
$code,
\Twig_Node $message,
Node $message,
$lineno = 0,
$tag = null
)
@@ -31,10 +34,10 @@ class TwigNodeThrow extends \Twig_Node
/**
* Compiles the node to PHP.
*
* @param \Twig_Compiler $compiler A Twig_Compiler instance
* @param Compiler $compiler A Twig_Compiler instance
* @throws \LogicException
*/
public function compile(\Twig_Compiler $compiler)
public function compile(Compiler $compiler)
{
$compiler->addDebugInfo($this);

View File

@@ -9,18 +9,21 @@
namespace Grav\Common\Twig\Node;
class TwigNodeTryCatch extends \Twig_Node
use Twig\Compiler;
use Twig\Node\Node;
class TwigNodeTryCatch extends Node
{
/**
* TwigNodeTryCatch constructor.
* @param \Twig_Node $try
* @param \Twig_Node|null $catch
* @param Node $try
* @param Node|null $catch
* @param int $lineno
* @param string|null $tag
*/
public function __construct(
\Twig_Node $try,
\Twig_Node $catch = null,
Node $try,
Node $catch = null,
$lineno = 0,
$tag = null
)
@@ -31,10 +34,10 @@ class TwigNodeTryCatch extends \Twig_Node
/**
* Compiles the node to PHP.
*
* @param \Twig_Compiler $compiler A Twig_Compiler instance
* @param Compiler $compiler A Twig_Compiler instance
* @throws \LogicException
*/
public function compile(\Twig_Compiler $compiler)
public function compile(Compiler $compiler)
{
$compiler->addDebugInfo($this);

View File

@@ -10,6 +10,8 @@
namespace Grav\Common\Twig\TokenParser;
use Grav\Common\Twig\Node\TwigNodeMarkdown;
use Twig\Token;
use Twig\TokenParser\AbstractTokenParser;
/**
* Adds ability to inline markdown between tags.
@@ -21,26 +23,26 @@ use Grav\Common\Twig\Node\TwigNodeMarkdown;
* 2. This is another item in that same list
* {% endmarkdown %}
*/
class TwigTokenParserMarkdown extends \Twig_TokenParser
class TwigTokenParserMarkdown extends AbstractTokenParser
{
/**
* {@inheritdoc}
*/
public function parse(\Twig_Token $token)
public function parse(Token $token)
{
$lineno = $token->getLine();
$this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
$this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
$body = $this->parser->subparse(array($this, 'decideMarkdownEnd'), true);
$this->parser->getStream()->expect(\Twig_Token::BLOCK_END_TYPE);
$this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
return new TwigNodeMarkdown($body, $lineno, $this->getTag());
}
/**
* Decide if current token marks end of Markdown block.
*
* @param \Twig_Token $token
* @param Token $token
* @return bool
*/
public function decideMarkdownEnd(\Twig_Token $token)
public function decideMarkdownEnd(Token $token)
{
return $token->test('endmarkdown');
}

View File

@@ -10,22 +10,25 @@
namespace Grav\Common\Twig\TokenParser;
use Grav\Common\Twig\Node\TwigNodeRender;
use Twig\Node\Node;
use Twig\Token;
use Twig\TokenParser\AbstractTokenParser;
/**
* Renders an object.
*
* {% render object layout: 'default' with { variable: true } %}
*/
class TwigTokenParserRender extends \Twig_TokenParser
class TwigTokenParserRender extends AbstractTokenParser
{
/**
* Parses a token and returns a node.
*
* @param \Twig_Token $token A Twig_Token instance
* @param Token $token A Twig_Token instance
*
* @return \Twig_Node A Twig_Node instance
* @return Node A Twig_Node instance
*/
public function parse(\Twig_Token $token)
public function parse(Token $token)
{
$lineno = $token->getLine();
@@ -35,27 +38,27 @@ class TwigTokenParserRender extends \Twig_TokenParser
}
/**
* @param \Twig_Token $token
* @param Token $token
* @return array
*/
protected function parseArguments(\Twig_Token $token)
protected function parseArguments(Token $token)
{
$stream = $this->parser->getStream();
$object = $this->parser->getExpressionParser()->parseExpression();
$layout = null;
if ($stream->nextIf(\Twig_Token::NAME_TYPE, 'layout')) {
$stream->expect(\Twig_Token::PUNCTUATION_TYPE, ':');
if ($stream->nextIf(Token::NAME_TYPE, 'layout')) {
$stream->expect(Token::PUNCTUATION_TYPE, ':');
$layout = $this->parser->getExpressionParser()->parseExpression();
}
$context = null;
if ($stream->nextIf(\Twig_Token::NAME_TYPE, 'with')) {
if ($stream->nextIf(Token::NAME_TYPE, 'with')) {
$context = $this->parser->getExpressionParser()->parseExpression();
}
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
return [$object, $layout, $context];
}

View File

@@ -10,6 +10,9 @@
namespace Grav\Common\Twig\TokenParser;
use Grav\Common\Twig\Node\TwigNodeScript;
use Twig\Node\Node;
use Twig\Token;
use Twig\TokenParser\AbstractTokenParser;
/**
* Adds a script to head/bottom/custom location in the document.
@@ -21,16 +24,16 @@ use Grav\Common\Twig\Node\TwigNodeScript;
* {% endscript %}
*/
class TwigTokenParserScript extends \Twig_TokenParser
class TwigTokenParserScript extends AbstractTokenParser
{
/**
* Parses a token and returns a node.
*
* @param \Twig_Token $token A Twig_Token instance
* @param Token $token A Twig_Token instance
*
* @return \Twig_Node A Twig_Node instance
* @return Node A Twig_Node instance
*/
public function parse(\Twig_Token $token)
public function parse(Token $token)
{
$lineno = $token->getLine();
$stream = $this->parser->getStream();
@@ -40,51 +43,51 @@ class TwigTokenParserScript extends \Twig_TokenParser
$content = null;
if ($file === null) {
$content = $this->parser->subparse([$this, 'decideBlockEnd'], true);
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
}
return new TwigNodeScript($content, $file, $group, $priority, $attributes, $lineno, $this->getTag());
}
/**
* @param \Twig_Token $token
* @param Token $token
* @return array
*/
protected function parseArguments(\Twig_Token $token)
protected function parseArguments(Token $token)
{
$stream = $this->parser->getStream();
$file = null;
if (!$stream->test(\Twig_Token::NAME_TYPE) && !$stream->test(\Twig_Token::OPERATOR_TYPE) && !$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
if (!$stream->test(Token::NAME_TYPE) && !$stream->test(Token::OPERATOR_TYPE) && !$stream->test(Token::BLOCK_END_TYPE)) {
$file = $this->parser->getExpressionParser()->parseExpression();
}
$group = null;
if ($stream->nextIf(\Twig_Token::OPERATOR_TYPE, 'in')) {
if ($stream->nextIf(Token::OPERATOR_TYPE, 'in')) {
$group = $this->parser->getExpressionParser()->parseExpression();
}
$priority = null;
if ($stream->nextIf(\Twig_Token::NAME_TYPE, 'priority')) {
$stream->expect(\Twig_Token::PUNCTUATION_TYPE, ':');
if ($stream->nextIf(Token::NAME_TYPE, 'priority')) {
$stream->expect(Token::PUNCTUATION_TYPE, ':');
$priority = $this->parser->getExpressionParser()->parseExpression();
}
$attributes = null;
if ($stream->nextIf(\Twig_Token::NAME_TYPE, 'with')) {
if ($stream->nextIf(Token::NAME_TYPE, 'with')) {
$attributes = $this->parser->getExpressionParser()->parseExpression();
}
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
return [$file, $group, $priority, $attributes];
}
/**
* @param \Twig_Token $token
* @param Token $token
* @return bool
*/
public function decideBlockEnd(\Twig_Token $token)
public function decideBlockEnd(Token $token)
{
return $token->test('endscript');
}

View File

@@ -10,6 +10,9 @@
namespace Grav\Common\Twig\TokenParser;
use Grav\Common\Twig\Node\TwigNodeStyle;
use Twig\Node\Node;
use Twig\Token;
use Twig\TokenParser\AbstractTokenParser;
/**
* Adds a style to the document.
@@ -20,16 +23,16 @@ use Grav\Common\Twig\Node\TwigNodeStyle;
* a { color: red; }
* {% endstyle %}
*/
class TwigTokenParserStyle extends \Twig_TokenParser
class TwigTokenParserStyle extends AbstractTokenParser
{
/**
* Parses a token and returns a node.
*
* @param \Twig_Token $token A Twig_Token instance
* @param Token $token A Twig_Token instance
*
* @return \Twig_Node A Twig_Node instance
* @return Node A Twig_Node instance
*/
public function parse(\Twig_Token $token)
public function parse(Token $token)
{
$lineno = $token->getLine();
$stream = $this->parser->getStream();
@@ -39,51 +42,51 @@ class TwigTokenParserStyle extends \Twig_TokenParser
$content = null;
if (!$file) {
$content = $this->parser->subparse([$this, 'decideBlockEnd'], true);
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
}
return new TwigNodeStyle($content, $file, $group, $priority, $attributes, $lineno, $this->getTag());
}
/**
* @param \Twig_Token $token
* @param Token $token
* @return array
*/
protected function parseArguments(\Twig_Token $token)
protected function parseArguments(Token $token)
{
$stream = $this->parser->getStream();
$file = null;
if (!$stream->test(\Twig_Token::NAME_TYPE) && !$stream->test(\Twig_Token::OPERATOR_TYPE) && !$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
if (!$stream->test(Token::NAME_TYPE) && !$stream->test(Token::OPERATOR_TYPE) && !$stream->test(Token::BLOCK_END_TYPE)) {
$file = $this->parser->getExpressionParser()->parseExpression();
}
$group = null;
if ($stream->nextIf(\Twig_Token::OPERATOR_TYPE, 'in')) {
if ($stream->nextIf(Token::OPERATOR_TYPE, 'in')) {
$group = $this->parser->getExpressionParser()->parseExpression();
}
$priority = null;
if ($stream->nextIf(\Twig_Token::NAME_TYPE, 'priority')) {
$stream->expect(\Twig_Token::PUNCTUATION_TYPE, ':');
if ($stream->nextIf(Token::NAME_TYPE, 'priority')) {
$stream->expect(Token::PUNCTUATION_TYPE, ':');
$priority = $this->parser->getExpressionParser()->parseExpression();
}
$attributes = null;
if ($stream->nextIf(\Twig_Token::NAME_TYPE, 'with')) {
if ($stream->nextIf(Token::NAME_TYPE, 'with')) {
$attributes = $this->parser->getExpressionParser()->parseExpression();
}
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
return [$file, $group, $priority, $attributes];
}
/**
* @param \Twig_Token $token
* @param Token $token
* @return bool
*/
public function decideBlockEnd(\Twig_Token $token)
public function decideBlockEnd(Token $token)
{
return $token->test('endstyle');
}

View File

@@ -11,6 +11,10 @@
namespace Grav\Common\Twig\TokenParser;
use Grav\Common\Twig\Node\TwigNodeSwitch;
use Twig\Error\SyntaxError;
use Twig\Node\Node;
use Twig\Token;
use Twig\TokenParser\AbstractTokenParser;
/**
* Adds ability use elegant switch instead of ungainly if statements
@@ -24,25 +28,25 @@ use Grav\Common\Twig\Node\TwigNodeSwitch;
* {{ my_data.default }}
* {% endswitch %}
*/
class TwigTokenParserSwitch extends \Twig_TokenParser
class TwigTokenParserSwitch extends AbstractTokenParser
{
/**
* {@inheritdoc}
*/
public function parse(\Twig_Token $token)
public function parse(Token $token)
{
$lineno = $token->getLine();
$stream = $this->parser->getStream();
$name = $this->parser->getExpressionParser()->parseExpression();
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
// There can be some whitespace between the {% switch %} and first {% case %} tag.
while ($stream->getCurrent()->getType() === \Twig_Token::TEXT_TYPE && trim($stream->getCurrent()->getValue()) === '') {
while ($stream->getCurrent()->getType() === Token::TEXT_TYPE && trim($stream->getCurrent()->getValue()) === '') {
$stream->next();
}
$stream->expect(\Twig_Token::BLOCK_START_TYPE);
$stream->expect(Token::BLOCK_START_TYPE);
$expressionParser = $this->parser->getExpressionParser();
@@ -60,23 +64,23 @@ class TwigTokenParserSwitch extends \Twig_TokenParser
while (true) {
$values[] = $expressionParser->parsePrimaryExpression();
// Multiple allowed values?
if ($stream->test(\Twig_Token::OPERATOR_TYPE, 'or')) {
if ($stream->test(Token::OPERATOR_TYPE, 'or')) {
$stream->next();
} else {
break;
}
}
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
$body = $this->parser->subparse(array($this, 'decideIfFork'));
$cases[] = new \Twig_Node([
'values' => new \Twig_Node($values),
$cases[] = new Node([
'values' => new Node($values),
'body' => $body
]);
break;
case 'default':
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
$default = $this->parser->subparse(array($this, 'decideIfEnd'));
break;
@@ -85,22 +89,22 @@ class TwigTokenParserSwitch extends \Twig_TokenParser
break;
default:
throw new \Twig_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags "case", "default", or "endswitch" to close the "switch" block started at line %d)', $lineno), -1);
throw new SyntaxError(sprintf('Unexpected end of template. Twig was looking for the following tags "case", "default", or "endswitch" to close the "switch" block started at line %d)', $lineno), -1);
}
}
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
return new TwigNodeSwitch($name, new \Twig_Node($cases), $default, $lineno, $this->getTag());
return new TwigNodeSwitch($name, new Node($cases), $default, $lineno, $this->getTag());
}
/**
* Decide if current token marks switch logic.
*
* @param \Twig_Token $token
* @param Token $token
* @return bool
*/
public function decideIfFork(\Twig_Token $token)
public function decideIfFork(Token $token)
{
return $token->test(array('case', 'default', 'endswitch'));
}
@@ -108,10 +112,10 @@ class TwigTokenParserSwitch extends \Twig_TokenParser
/**
* Decide if current token marks end of swtich block.
*
* @param \Twig_Token $token
* @param Token $token
* @return bool
*/
public function decideIfEnd(\Twig_Token $token)
public function decideIfEnd(Token $token)
{
return $token->test(array('endswitch'));
}

View File

@@ -10,6 +10,9 @@
namespace Grav\Common\Twig\TokenParser;
use Grav\Common\Twig\Node\TwigNodeThrow;
use Twig\Node\Node;
use Twig\Token;
use Twig\TokenParser\AbstractTokenParser;
/**
* Handles try/catch in template file.
@@ -18,23 +21,23 @@ use Grav\Common\Twig\Node\TwigNodeThrow;
* {% throw 404 'Not Found' %}
* </pre>
*/
class TwigTokenParserThrow extends \Twig_TokenParser
class TwigTokenParserThrow extends AbstractTokenParser
{
/**
* Parses a token and returns a node.
*
* @param \Twig_Token $token A Twig_Token instance
* @param Token $token A Twig_Token instance
*
* @return \Twig_Node A Twig_Node instance
* @return Node A Twig_Node instance
*/
public function parse(\Twig_Token $token)
public function parse(Token $token)
{
$lineno = $token->getLine();
$stream = $this->parser->getStream();
$code = $stream->expect(\Twig_Token::NUMBER_TYPE)->getValue();
$code = $stream->expect(Token::NUMBER_TYPE)->getValue();
$message = $this->parser->getExpressionParser()->parseExpression();
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
return new TwigNodeThrow($code, $message, $lineno, $this->getTag());
}

View File

@@ -10,6 +10,9 @@
namespace Grav\Common\Twig\TokenParser;
use Grav\Common\Twig\Node\TwigNodeTryCatch;
use Twig\Node\Node;
use Twig\Token;
use Twig\TokenParser\AbstractTokenParser;
/**
* Handles try/catch in template file.
@@ -22,37 +25,37 @@ use Grav\Common\Twig\Node\TwigNodeTryCatch;
* {% endcatch %}
* </pre>
*/
class TwigTokenParserTryCatch extends \Twig_TokenParser
class TwigTokenParserTryCatch extends AbstractTokenParser
{
/**
* Parses a token and returns a node.
*
* @param \Twig_Token $token A Twig_Token instance
* @param Token $token A Twig_Token instance
*
* @return \Twig_Node A Twig_Node instance
* @return Node A Twig_Node instance
*/
public function parse(\Twig_Token $token)
public function parse(Token $token)
{
$lineno = $token->getLine();
$stream = $this->parser->getStream();
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
$try = $this->parser->subparse([$this, 'decideCatch']);
$stream->next();
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
$catch = $this->parser->subparse([$this, 'decideEnd']);
$stream->next();
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
$stream->expect(Token::BLOCK_END_TYPE);
return new TwigNodeTryCatch($try, $catch, $lineno, $this->getTag());
}
public function decideCatch(\Twig_Token $token)
public function decideCatch(Token $token)
{
return $token->test(array('catch'));
}
public function decideEnd(\Twig_Token $token)
public function decideEnd(Token $token)
{
return $token->test(array('endtry')) || $token->test(array('endcatch'));
}