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 int $type The type of the token
|
42
|
* @param string $value The token value
|
43
|
* @param int $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->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|int $type The type to test
|
71
|
* @param array|string|null $values The token value
|
72
|
*
|
73
|
* @return bool
|
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 int The source line
|
93
|
*/
|
94
|
public function getLine()
|
95
|
{
|
96
|
return $this->lineno;
|
97
|
}
|
98
|
|
99
|
/**
|
100
|
* Gets the token type.
|
101
|
*
|
102
|
* @return int 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 int $type The type as an integer
|
123
|
* @param bool $short Whether to return a short representation or not
|
124
|
*
|
125
|
* @return string The string representation
|
126
|
*/
|
127
|
public static function typeToString($type, $short = false)
|
128
|
{
|
129
|
switch ($type) {
|
130
|
case self::EOF_TYPE:
|
131
|
$name = 'EOF_TYPE';
|
132
|
break;
|
133
|
case self::TEXT_TYPE:
|
134
|
$name = 'TEXT_TYPE';
|
135
|
break;
|
136
|
case self::BLOCK_START_TYPE:
|
137
|
$name = 'BLOCK_START_TYPE';
|
138
|
break;
|
139
|
case self::VAR_START_TYPE:
|
140
|
$name = 'VAR_START_TYPE';
|
141
|
break;
|
142
|
case self::BLOCK_END_TYPE:
|
143
|
$name = 'BLOCK_END_TYPE';
|
144
|
break;
|
145
|
case self::VAR_END_TYPE:
|
146
|
$name = 'VAR_END_TYPE';
|
147
|
break;
|
148
|
case self::NAME_TYPE:
|
149
|
$name = 'NAME_TYPE';
|
150
|
break;
|
151
|
case self::NUMBER_TYPE:
|
152
|
$name = 'NUMBER_TYPE';
|
153
|
break;
|
154
|
case self::STRING_TYPE:
|
155
|
$name = 'STRING_TYPE';
|
156
|
break;
|
157
|
case self::OPERATOR_TYPE:
|
158
|
$name = 'OPERATOR_TYPE';
|
159
|
break;
|
160
|
case self::PUNCTUATION_TYPE:
|
161
|
$name = 'PUNCTUATION_TYPE';
|
162
|
break;
|
163
|
case self::INTERPOLATION_START_TYPE:
|
164
|
$name = 'INTERPOLATION_START_TYPE';
|
165
|
break;
|
166
|
case self::INTERPOLATION_END_TYPE:
|
167
|
$name = 'INTERPOLATION_END_TYPE';
|
168
|
break;
|
169
|
default:
|
170
|
throw new LogicException(sprintf('Token of type "%s" does not exist.', $type));
|
171
|
}
|
172
|
|
173
|
return $short ? $name : 'Twig_Token::'.$name;
|
174
|
}
|
175
|
|
176
|
/**
|
177
|
* Returns the english representation of a given type.
|
178
|
*
|
179
|
* @param int $type The type as an integer
|
180
|
*
|
181
|
* @return string The string representation
|
182
|
*/
|
183
|
public static function typeToEnglish($type)
|
184
|
{
|
185
|
switch ($type) {
|
186
|
case self::EOF_TYPE:
|
187
|
return 'end of template';
|
188
|
case self::TEXT_TYPE:
|
189
|
return 'text';
|
190
|
case self::BLOCK_START_TYPE:
|
191
|
return 'begin of statement block';
|
192
|
case self::VAR_START_TYPE:
|
193
|
return 'begin of print statement';
|
194
|
case self::BLOCK_END_TYPE:
|
195
|
return 'end of statement block';
|
196
|
case self::VAR_END_TYPE:
|
197
|
return 'end of print statement';
|
198
|
case self::NAME_TYPE:
|
199
|
return 'name';
|
200
|
case self::NUMBER_TYPE:
|
201
|
return 'number';
|
202
|
case self::STRING_TYPE:
|
203
|
return 'string';
|
204
|
case self::OPERATOR_TYPE:
|
205
|
return 'operator';
|
206
|
case self::PUNCTUATION_TYPE:
|
207
|
return 'punctuation';
|
208
|
case self::INTERPOLATION_START_TYPE:
|
209
|
return 'begin of string interpolation';
|
210
|
case self::INTERPOLATION_END_TYPE:
|
211
|
return 'end of string interpolation';
|
212
|
default:
|
213
|
throw new LogicException(sprintf('Token of type "%s" does not exist.', $type));
|
214
|
}
|
215
|
}
|
216
|
}
|