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