root / drupal7 / sites / all / libraries / simplepie / library / SimplePie / XML / Declaration / Parser.php @ 41cc1b08
1 | 41cc1b08 | Assos Assos | <?php
|
---|---|---|---|
2 | /**
|
||
3 | * SimplePie
|
||
4 | *
|
||
5 | * A PHP-Based RSS and Atom Feed Framework.
|
||
6 | * Takes the hard work out of managing a complete RSS/Atom solution.
|
||
7 | *
|
||
8 | * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
|
||
9 | * All rights reserved.
|
||
10 | *
|
||
11 | * Redistribution and use in source and binary forms, with or without modification, are
|
||
12 | * permitted provided that the following conditions are met:
|
||
13 | *
|
||
14 | * * Redistributions of source code must retain the above copyright notice, this list of
|
||
15 | * conditions and the following disclaimer.
|
||
16 | *
|
||
17 | * * Redistributions in binary form must reproduce the above copyright notice, this list
|
||
18 | * of conditions and the following disclaimer in the documentation and/or other materials
|
||
19 | * provided with the distribution.
|
||
20 | *
|
||
21 | * * Neither the name of the SimplePie Team nor the names of its contributors may be used
|
||
22 | * to endorse or promote products derived from this software without specific prior
|
||
23 | * written permission.
|
||
24 | *
|
||
25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
|
||
26 | * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||
27 | * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
|
||
28 | * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
29 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||
30 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
31 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||
32 | * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
33 | * POSSIBILITY OF SUCH DAMAGE.
|
||
34 | *
|
||
35 | * @package SimplePie
|
||
36 | * @version 1.3.1
|
||
37 | * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
|
||
38 | * @author Ryan Parman
|
||
39 | * @author Geoffrey Sneddon
|
||
40 | * @author Ryan McCue
|
||
41 | * @link http://simplepie.org/ SimplePie
|
||
42 | * @license http://www.opensource.org/licenses/bsd-license.php BSD License
|
||
43 | */
|
||
44 | |||
45 | |||
46 | /**
|
||
47 | * Parses the XML Declaration
|
||
48 | *
|
||
49 | * @package SimplePie
|
||
50 | * @subpackage Parsing
|
||
51 | */
|
||
52 | class SimplePie_XML_Declaration_Parser |
||
53 | { |
||
54 | /**
|
||
55 | * XML Version
|
||
56 | *
|
||
57 | * @access public
|
||
58 | * @var string
|
||
59 | */
|
||
60 | var $version = '1.0'; |
||
61 | |||
62 | /**
|
||
63 | * Encoding
|
||
64 | *
|
||
65 | * @access public
|
||
66 | * @var string
|
||
67 | */
|
||
68 | var $encoding = 'UTF-8'; |
||
69 | |||
70 | /**
|
||
71 | * Standalone
|
||
72 | *
|
||
73 | * @access public
|
||
74 | * @var bool
|
||
75 | */
|
||
76 | var $standalone = false; |
||
77 | |||
78 | /**
|
||
79 | * Current state of the state machine
|
||
80 | *
|
||
81 | * @access private
|
||
82 | * @var string
|
||
83 | */
|
||
84 | var $state = 'before_version_name'; |
||
85 | |||
86 | /**
|
||
87 | * Input data
|
||
88 | *
|
||
89 | * @access private
|
||
90 | * @var string
|
||
91 | */
|
||
92 | var $data = ''; |
||
93 | |||
94 | /**
|
||
95 | * Input data length (to avoid calling strlen() everytime this is needed)
|
||
96 | *
|
||
97 | * @access private
|
||
98 | * @var int
|
||
99 | */
|
||
100 | var $data_length = 0; |
||
101 | |||
102 | /**
|
||
103 | * Current position of the pointer
|
||
104 | *
|
||
105 | * @var int
|
||
106 | * @access private
|
||
107 | */
|
||
108 | var $position = 0; |
||
109 | |||
110 | /**
|
||
111 | * Create an instance of the class with the input data
|
||
112 | *
|
||
113 | * @access public
|
||
114 | * @param string $data Input data
|
||
115 | */
|
||
116 | public function __construct($data) |
||
117 | { |
||
118 | $this->data = $data; |
||
119 | $this->data_length = strlen($this->data); |
||
120 | } |
||
121 | |||
122 | /**
|
||
123 | * Parse the input data
|
||
124 | *
|
||
125 | * @access public
|
||
126 | * @return bool true on success, false on failure
|
||
127 | */
|
||
128 | public function parse() |
||
129 | { |
||
130 | while ($this->state && $this->state !== 'emit' && $this->has_data()) |
||
131 | { |
||
132 | $state = $this->state; |
||
133 | $this->$state(); |
||
134 | } |
||
135 | $this->data = ''; |
||
136 | if ($this->state === 'emit') |
||
137 | { |
||
138 | return true; |
||
139 | } |
||
140 | else
|
||
141 | { |
||
142 | $this->version = ''; |
||
143 | $this->encoding = ''; |
||
144 | $this->standalone = ''; |
||
145 | return false; |
||
146 | } |
||
147 | } |
||
148 | |||
149 | /**
|
||
150 | * Check whether there is data beyond the pointer
|
||
151 | *
|
||
152 | * @access private
|
||
153 | * @return bool true if there is further data, false if not
|
||
154 | */
|
||
155 | public function has_data() |
||
156 | { |
||
157 | return (bool) ($this->position < $this->data_length); |
||
158 | } |
||
159 | |||
160 | /**
|
||
161 | * Advance past any whitespace
|
||
162 | *
|
||
163 | * @return int Number of whitespace characters passed
|
||
164 | */
|
||
165 | public function skip_whitespace() |
||
166 | { |
||
167 | $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position); |
||
168 | $this->position += $whitespace; |
||
169 | return $whitespace; |
||
170 | } |
||
171 | |||
172 | /**
|
||
173 | * Read value
|
||
174 | */
|
||
175 | public function get_value() |
||
176 | { |
||
177 | $quote = substr($this->data, $this->position, 1); |
||
178 | if ($quote === '"' || $quote === "'") |
||
179 | { |
||
180 | $this->position++;
|
||
181 | $len = strcspn($this->data, $quote, $this->position); |
||
182 | if ($this->has_data()) |
||
183 | { |
||
184 | $value = substr($this->data, $this->position, $len); |
||
185 | $this->position += $len + 1; |
||
186 | return $value; |
||
187 | } |
||
188 | } |
||
189 | return false; |
||
190 | } |
||
191 | |||
192 | public function before_version_name() |
||
193 | { |
||
194 | if ($this->skip_whitespace()) |
||
195 | { |
||
196 | $this->state = 'version_name'; |
||
197 | } |
||
198 | else
|
||
199 | { |
||
200 | $this->state = false; |
||
201 | } |
||
202 | } |
||
203 | |||
204 | public function version_name() |
||
205 | { |
||
206 | if (substr($this->data, $this->position, 7) === 'version') |
||
207 | { |
||
208 | $this->position += 7; |
||
209 | $this->skip_whitespace();
|
||
210 | $this->state = 'version_equals'; |
||
211 | } |
||
212 | else
|
||
213 | { |
||
214 | $this->state = false; |
||
215 | } |
||
216 | } |
||
217 | |||
218 | public function version_equals() |
||
219 | { |
||
220 | if (substr($this->data, $this->position, 1) === '=') |
||
221 | { |
||
222 | $this->position++;
|
||
223 | $this->skip_whitespace();
|
||
224 | $this->state = 'version_value'; |
||
225 | } |
||
226 | else
|
||
227 | { |
||
228 | $this->state = false; |
||
229 | } |
||
230 | } |
||
231 | |||
232 | public function version_value() |
||
233 | { |
||
234 | if ($this->version = $this->get_value()) |
||
235 | { |
||
236 | $this->skip_whitespace();
|
||
237 | if ($this->has_data()) |
||
238 | { |
||
239 | $this->state = 'encoding_name'; |
||
240 | } |
||
241 | else
|
||
242 | { |
||
243 | $this->state = 'emit'; |
||
244 | } |
||
245 | } |
||
246 | else
|
||
247 | { |
||
248 | $this->state = false; |
||
249 | } |
||
250 | } |
||
251 | |||
252 | public function encoding_name() |
||
253 | { |
||
254 | if (substr($this->data, $this->position, 8) === 'encoding') |
||
255 | { |
||
256 | $this->position += 8; |
||
257 | $this->skip_whitespace();
|
||
258 | $this->state = 'encoding_equals'; |
||
259 | } |
||
260 | else
|
||
261 | { |
||
262 | $this->state = 'standalone_name'; |
||
263 | } |
||
264 | } |
||
265 | |||
266 | public function encoding_equals() |
||
267 | { |
||
268 | if (substr($this->data, $this->position, 1) === '=') |
||
269 | { |
||
270 | $this->position++;
|
||
271 | $this->skip_whitespace();
|
||
272 | $this->state = 'encoding_value'; |
||
273 | } |
||
274 | else
|
||
275 | { |
||
276 | $this->state = false; |
||
277 | } |
||
278 | } |
||
279 | |||
280 | public function encoding_value() |
||
281 | { |
||
282 | if ($this->encoding = $this->get_value()) |
||
283 | { |
||
284 | $this->skip_whitespace();
|
||
285 | if ($this->has_data()) |
||
286 | { |
||
287 | $this->state = 'standalone_name'; |
||
288 | } |
||
289 | else
|
||
290 | { |
||
291 | $this->state = 'emit'; |
||
292 | } |
||
293 | } |
||
294 | else
|
||
295 | { |
||
296 | $this->state = false; |
||
297 | } |
||
298 | } |
||
299 | |||
300 | public function standalone_name() |
||
301 | { |
||
302 | if (substr($this->data, $this->position, 10) === 'standalone') |
||
303 | { |
||
304 | $this->position += 10; |
||
305 | $this->skip_whitespace();
|
||
306 | $this->state = 'standalone_equals'; |
||
307 | } |
||
308 | else
|
||
309 | { |
||
310 | $this->state = false; |
||
311 | } |
||
312 | } |
||
313 | |||
314 | public function standalone_equals() |
||
315 | { |
||
316 | if (substr($this->data, $this->position, 1) === '=') |
||
317 | { |
||
318 | $this->position++;
|
||
319 | $this->skip_whitespace();
|
||
320 | $this->state = 'standalone_value'; |
||
321 | } |
||
322 | else
|
||
323 | { |
||
324 | $this->state = false; |
||
325 | } |
||
326 | } |
||
327 | |||
328 | public function standalone_value() |
||
329 | { |
||
330 | if ($standalone = $this->get_value()) |
||
331 | { |
||
332 | switch ($standalone) |
||
333 | { |
||
334 | case 'yes': |
||
335 | $this->standalone = true; |
||
336 | break;
|
||
337 | |||
338 | case 'no': |
||
339 | $this->standalone = false; |
||
340 | break;
|
||
341 | |||
342 | default:
|
||
343 | $this->state = false; |
||
344 | return;
|
||
345 | } |
||
346 | |||
347 | $this->skip_whitespace();
|
||
348 | if ($this->has_data()) |
||
349 | { |
||
350 | $this->state = false; |
||
351 | } |
||
352 | else
|
||
353 | { |
||
354 | $this->state = 'emit'; |
||
355 | } |
||
356 | } |
||
357 | else
|
||
358 | { |
||
359 | $this->state = false; |
||
360 | } |
||
361 | } |
||
362 | } |