d03a36b017ff0157843b6d91bc6c1f3a923bec0d
[yaffs-website] / vendor / twig / twig / lib / Twig / TokenParser / Set.php
1 <?php
2
3 /*
4  * This file is part of Twig.
5  *
6  * (c) Fabien Potencier
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 /**
13  * Defines a variable.
14  *
15  * <pre>
16  *  {% set foo = 'foo' %}
17  *
18  *  {% set foo = [1, 2] %}
19  *
20  *  {% set foo = {'foo': 'bar'} %}
21  *
22  *  {% set foo = 'foo' ~ 'bar' %}
23  *
24  *  {% set foo, bar = 'foo', 'bar' %}
25  *
26  *  {% set foo %}Some content{% endset %}
27  * </pre>
28  *
29  * @final
30  */
31 class Twig_TokenParser_Set extends Twig_TokenParser
32 {
33     public function parse(Twig_Token $token)
34     {
35         $lineno = $token->getLine();
36         $stream = $this->parser->getStream();
37         $names = $this->parser->getExpressionParser()->parseAssignmentExpression();
38
39         $capture = false;
40         if ($stream->nextIf(Twig_Token::OPERATOR_TYPE, '=')) {
41             $values = $this->parser->getExpressionParser()->parseMultitargetExpression();
42
43             $stream->expect(Twig_Token::BLOCK_END_TYPE);
44
45             if (count($names) !== count($values)) {
46                 throw new Twig_Error_Syntax('When using set, you must have the same number of variables and assignments.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
47             }
48         } else {
49             $capture = true;
50
51             if (count($names) > 1) {
52                 throw new Twig_Error_Syntax('When using set with a block, you cannot have a multi-target.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
53             }
54
55             $stream->expect(Twig_Token::BLOCK_END_TYPE);
56
57             $values = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
58             $stream->expect(Twig_Token::BLOCK_END_TYPE);
59         }
60
61         return new Twig_Node_Set($capture, $names, $values, $lineno, $this->getTag());
62     }
63
64     public function decideBlockEnd(Twig_Token $token)
65     {
66         return $token->test('endset');
67     }
68
69     public function getTag()
70     {
71         return 'set';
72     }
73 }