diff options
Diffstat (limited to 'inc/Twig/Token.php')
-rw-r--r-- | inc/Twig/Token.php | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/inc/Twig/Token.php b/inc/Twig/Token.php new file mode 100644 index 00000000..bbca90db --- /dev/null +++ b/inc/Twig/Token.php | |||
@@ -0,0 +1,218 @@ | |||
1 | <?php | ||
2 | |||
3 | /* | ||
4 | * This file is part of Twig. | ||
5 | * | ||
6 | * (c) 2009 Fabien Potencier | ||
7 | * (c) 2009 Armin Ronacher | ||
8 | * | ||
9 | * For the full copyright and license information, please view the LICENSE | ||
10 | * file that was distributed with this source code. | ||
11 | */ | ||
12 | |||
13 | /** | ||
14 | * Represents a Token. | ||
15 | * | ||
16 | * @author Fabien Potencier <fabien@symfony.com> | ||
17 | */ | ||
18 | class Twig_Token | ||
19 | { | ||
20 | protected $value; | ||
21 | protected $type; | ||
22 | protected $lineno; | ||
23 | |||
24 | const EOF_TYPE = -1; | ||
25 | const TEXT_TYPE = 0; | ||
26 | const BLOCK_START_TYPE = 1; | ||
27 | const VAR_START_TYPE = 2; | ||
28 | const BLOCK_END_TYPE = 3; | ||
29 | const VAR_END_TYPE = 4; | ||
30 | const NAME_TYPE = 5; | ||
31 | const NUMBER_TYPE = 6; | ||
32 | const STRING_TYPE = 7; | ||
33 | const OPERATOR_TYPE = 8; | ||
34 | const PUNCTUATION_TYPE = 9; | ||
35 | const INTERPOLATION_START_TYPE = 10; | ||
36 | const INTERPOLATION_END_TYPE = 11; | ||
37 | |||
38 | /** | ||
39 | * Constructor. | ||
40 | * | ||
41 | * @param integer $type The type of the token | ||
42 | * @param string $value The token value | ||
43 | * @param integer $lineno The line position in the source | ||
44 | */ | ||
45 | public function __construct($type, $value, $lineno) | ||
46 | { | ||
47 | $this->type = $type; | ||
48 | $this->value = $value; | ||
49 | $this->lineno = $lineno; | ||
50 | } | ||
51 | |||
52 | /** | ||
53 | * Returns a string representation of the token. | ||
54 | * | ||
55 | * @return string A string representation of the token | ||
56 | */ | ||
57 | public function __toString() | ||
58 | { | ||
59 | return sprintf('%s(%s)', self::typeToString($this->type, true, $this->lineno), $this->value); | ||
60 | } | ||
61 | |||
62 | /** | ||
63 | * Tests the current token for a type and/or a value. | ||
64 | * | ||
65 | * Parameters may be: | ||
66 | * * just type | ||
67 | * * type and value (or array of possible values) | ||
68 | * * just value (or array of possible values) (NAME_TYPE is used as type) | ||
69 | * | ||
70 | * @param array|integer $type The type to test | ||
71 | * @param array|string|null $values The token value | ||
72 | * | ||
73 | * @return Boolean | ||
74 | */ | ||
75 | public function test($type, $values = null) | ||
76 | { | ||
77 | if (null === $values && !is_int($type)) { | ||
78 | $values = $type; | ||
79 | $type = self::NAME_TYPE; | ||
80 | } | ||
81 | |||
82 | return ($this->type === $type) && ( | ||
83 | null === $values || | ||
84 | (is_array($values) && in_array($this->value, $values)) || | ||
85 | $this->value == $values | ||
86 | ); | ||
87 | } | ||
88 | |||
89 | /** | ||
90 | * Gets the line. | ||
91 | * | ||
92 | * @return integer The source line | ||
93 | */ | ||
94 | public function getLine() | ||
95 | { | ||
96 | return $this->lineno; | ||
97 | } | ||
98 | |||
99 | /** | ||
100 | * Gets the token type. | ||
101 | * | ||
102 | * @return integer The token type | ||
103 | */ | ||
104 | public function getType() | ||
105 | { | ||
106 | return $this->type; | ||
107 | } | ||
108 | |||
109 | /** | ||
110 | * Gets the token value. | ||
111 | * | ||
112 | * @return string The token value | ||
113 | */ | ||
114 | public function getValue() | ||
115 | { | ||
116 | return $this->value; | ||
117 | } | ||
118 | |||
119 | /** | ||
120 | * Returns the constant representation (internal) of a given type. | ||
121 | * | ||
122 | * @param integer $type The type as an integer | ||
123 | * @param Boolean $short Whether to return a short representation or not | ||
124 | * @param integer $line The code line | ||
125 | * | ||
126 | * @return string The string representation | ||
127 | */ | ||
128 | public static function typeToString($type, $short = false, $line = -1) | ||
129 | { | ||
130 | switch ($type) { | ||
131 | case self::EOF_TYPE: | ||
132 | $name = 'EOF_TYPE'; | ||
133 | break; | ||
134 | case self::TEXT_TYPE: | ||
135 | $name = 'TEXT_TYPE'; | ||
136 | break; | ||
137 | case self::BLOCK_START_TYPE: | ||
138 | $name = 'BLOCK_START_TYPE'; | ||
139 | break; | ||
140 | case self::VAR_START_TYPE: | ||
141 | $name = 'VAR_START_TYPE'; | ||
142 | break; | ||
143 | case self::BLOCK_END_TYPE: | ||
144 | $name = 'BLOCK_END_TYPE'; | ||
145 | break; | ||
146 | case self::VAR_END_TYPE: | ||
147 | $name = 'VAR_END_TYPE'; | ||
148 | break; | ||
149 | case self::NAME_TYPE: | ||
150 | $name = 'NAME_TYPE'; | ||
151 | break; | ||
152 | case self::NUMBER_TYPE: | ||
153 | $name = 'NUMBER_TYPE'; | ||
154 | break; | ||
155 | case self::STRING_TYPE: | ||
156 | $name = 'STRING_TYPE'; | ||
157 | break; | ||
158 | case self::OPERATOR_TYPE: | ||
159 | $name = 'OPERATOR_TYPE'; | ||
160 | break; | ||
161 | case self::PUNCTUATION_TYPE: | ||
162 | $name = 'PUNCTUATION_TYPE'; | ||
163 | break; | ||
164 | case self::INTERPOLATION_START_TYPE: | ||
165 | $name = 'INTERPOLATION_START_TYPE'; | ||
166 | break; | ||
167 | case self::INTERPOLATION_END_TYPE: | ||
168 | $name = 'INTERPOLATION_END_TYPE'; | ||
169 | break; | ||
170 | default: | ||
171 | throw new LogicException(sprintf('Token of type "%s" does not exist.', $type)); | ||
172 | } | ||
173 | |||
174 | return $short ? $name : 'Twig_Token::'.$name; | ||
175 | } | ||
176 | |||
177 | /** | ||
178 | * Returns the english representation of a given type. | ||
179 | * | ||
180 | * @param integer $type The type as an integer | ||
181 | * @param integer $line The code line | ||
182 | * | ||
183 | * @return string The string representation | ||
184 | */ | ||
185 | public static function typeToEnglish($type, $line = -1) | ||
186 | { | ||
187 | switch ($type) { | ||
188 | case self::EOF_TYPE: | ||
189 | return 'end of template'; | ||
190 | case self::TEXT_TYPE: | ||
191 | return 'text'; | ||
192 | case self::BLOCK_START_TYPE: | ||
193 | return 'begin of statement block'; | ||
194 | case self::VAR_START_TYPE: | ||
195 | return 'begin of print statement'; | ||
196 | case self::BLOCK_END_TYPE: | ||
197 | return 'end of statement block'; | ||
198 | case self::VAR_END_TYPE: | ||
199 | return 'end of print statement'; | ||
200 | case self::NAME_TYPE: | ||
201 | return 'name'; | ||
202 | case self::NUMBER_TYPE: | ||
203 | return 'number'; | ||
204 | case self::STRING_TYPE: | ||
205 | return 'string'; | ||
206 | case self::OPERATOR_TYPE: | ||
207 | return 'operator'; | ||
208 | case self::PUNCTUATION_TYPE: | ||
209 | return 'punctuation'; | ||
210 | case self::INTERPOLATION_START_TYPE: | ||
211 | return 'begin of string interpolation'; | ||
212 | case self::INTERPOLATION_END_TYPE: | ||
213 | return 'end of string interpolation'; | ||
214 | default: | ||
215 | throw new LogicException(sprintf('Token of type "%s" does not exist.', $type)); | ||
216 | } | ||
217 | } | ||
218 | } | ||