diff options
Diffstat (limited to 'inc/Twig/TokenStream.php')
-rw-r--r-- | inc/Twig/TokenStream.php | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/inc/Twig/TokenStream.php b/inc/Twig/TokenStream.php new file mode 100644 index 00000000..a78189f6 --- /dev/null +++ b/inc/Twig/TokenStream.php | |||
@@ -0,0 +1,144 @@ | |||
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 stream. | ||
15 | * | ||
16 | * @author Fabien Potencier <fabien@symfony.com> | ||
17 | */ | ||
18 | class Twig_TokenStream | ||
19 | { | ||
20 | protected $tokens; | ||
21 | protected $current; | ||
22 | protected $filename; | ||
23 | |||
24 | /** | ||
25 | * Constructor. | ||
26 | * | ||
27 | * @param array $tokens An array of tokens | ||
28 | * @param string $filename The name of the filename which tokens are associated with | ||
29 | */ | ||
30 | public function __construct(array $tokens, $filename = null) | ||
31 | { | ||
32 | $this->tokens = $tokens; | ||
33 | $this->current = 0; | ||
34 | $this->filename = $filename; | ||
35 | } | ||
36 | |||
37 | /** | ||
38 | * Returns a string representation of the token stream. | ||
39 | * | ||
40 | * @return string | ||
41 | */ | ||
42 | public function __toString() | ||
43 | { | ||
44 | return implode("\n", $this->tokens); | ||
45 | } | ||
46 | |||
47 | public function injectTokens(array $tokens) | ||
48 | { | ||
49 | $this->tokens = array_merge(array_slice($this->tokens, 0, $this->current), $tokens, array_slice($this->tokens, $this->current)); | ||
50 | } | ||
51 | |||
52 | /** | ||
53 | * Sets the pointer to the next token and returns the old one. | ||
54 | * | ||
55 | * @return Twig_Token | ||
56 | */ | ||
57 | public function next() | ||
58 | { | ||
59 | if (!isset($this->tokens[++$this->current])) { | ||
60 | throw new Twig_Error_Syntax('Unexpected end of template', $this->tokens[$this->current - 1]->getLine(), $this->filename); | ||
61 | } | ||
62 | |||
63 | return $this->tokens[$this->current - 1]; | ||
64 | } | ||
65 | |||
66 | /** | ||
67 | * Tests a token and returns it or throws a syntax error. | ||
68 | * | ||
69 | * @return Twig_Token | ||
70 | */ | ||
71 | public function expect($type, $value = null, $message = null) | ||
72 | { | ||
73 | $token = $this->tokens[$this->current]; | ||
74 | if (!$token->test($type, $value)) { | ||
75 | $line = $token->getLine(); | ||
76 | throw new Twig_Error_Syntax(sprintf('%sUnexpected token "%s" of value "%s" ("%s" expected%s)', | ||
77 | $message ? $message.'. ' : '', | ||
78 | Twig_Token::typeToEnglish($token->getType(), $line), $token->getValue(), | ||
79 | Twig_Token::typeToEnglish($type, $line), $value ? sprintf(' with value "%s"', $value) : ''), | ||
80 | $line, | ||
81 | $this->filename | ||
82 | ); | ||
83 | } | ||
84 | $this->next(); | ||
85 | |||
86 | return $token; | ||
87 | } | ||
88 | |||
89 | /** | ||
90 | * Looks at the next token. | ||
91 | * | ||
92 | * @param integer $number | ||
93 | * | ||
94 | * @return Twig_Token | ||
95 | */ | ||
96 | public function look($number = 1) | ||
97 | { | ||
98 | if (!isset($this->tokens[$this->current + $number])) { | ||
99 | throw new Twig_Error_Syntax('Unexpected end of template', $this->tokens[$this->current + $number - 1]->getLine(), $this->filename); | ||
100 | } | ||
101 | |||
102 | return $this->tokens[$this->current + $number]; | ||
103 | } | ||
104 | |||
105 | /** | ||
106 | * Tests the current token | ||
107 | * | ||
108 | * @return bool | ||
109 | */ | ||
110 | public function test($primary, $secondary = null) | ||
111 | { | ||
112 | return $this->tokens[$this->current]->test($primary, $secondary); | ||
113 | } | ||
114 | |||
115 | /** | ||
116 | * Checks if end of stream was reached | ||
117 | * | ||
118 | * @return bool | ||
119 | */ | ||
120 | public function isEOF() | ||
121 | { | ||
122 | return $this->tokens[$this->current]->getType() === Twig_Token::EOF_TYPE; | ||
123 | } | ||
124 | |||
125 | /** | ||
126 | * Gets the current token | ||
127 | * | ||
128 | * @return Twig_Token | ||
129 | */ | ||
130 | public function getCurrent() | ||
131 | { | ||
132 | return $this->tokens[$this->current]; | ||
133 | } | ||
134 | |||
135 | /** | ||
136 | * Gets the filename associated with this stream | ||
137 | * | ||
138 | * @return string | ||
139 | */ | ||
140 | public function getFilename() | ||
141 | { | ||
142 | return $this->filename; | ||
143 | } | ||
144 | } | ||