| 1 |
<?php |
| 2 |
class FeedWordPie_Parser extends SimplePie_Parser { |
| 3 |
function reset_parser (&$xml) { |
| 4 |
// reset members |
| 5 |
$this->namespace = array(''); |
| 6 |
$this->element = array(''); |
| 7 |
$this->xml_base = array(''); |
| 8 |
$this->xml_base_explicit = array(false); |
| 9 |
$this->xml_lang = array(''); |
| 10 |
$this->data = array(); |
| 11 |
$this->datas = array(array()); |
| 12 |
$this->current_xhtml_construct = -1; |
| 13 |
$this->xmlns_stack = array(); |
| 14 |
$this->xmlns_current = array(); |
| 15 |
|
| 16 |
// reset libxml parser |
| 17 |
xml_parser_free($xml); |
| 18 |
|
| 19 |
$xml = xml_parser_create_ns($this->encoding, $this->separator); |
| 20 |
xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); |
| 21 |
xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0); |
| 22 |
xml_set_object($xml, $this); |
| 23 |
xml_set_character_data_handler($xml, 'cdata'); |
| 24 |
xml_set_element_handler($xml, 'tag_open', 'tag_close'); |
| 25 |
xml_set_start_namespace_decl_handler($xml, 'start_xmlns'); |
| 26 |
} |
| 27 |
|
| 28 |
public function parse (&$data, $encoding, $url = '') |
| 29 |
{ |
| 30 |
$data = apply_filters('feedwordpress_parser_parse', $data, $encoding, $this, $url); |
| 31 |
|
| 32 |
if (class_exists('DOMXpath') && function_exists('Mf2\parse')) { |
| 33 |
$doc = new DOMDocument(); |
| 34 |
@$doc->loadHTML($data); |
| 35 |
$xpath = new DOMXpath($doc); |
| 36 |
// Check for both h-feed and h-entry, as both a feed with no entries |
| 37 |
// and a list of entries without an h-feed wrapper are both valid. |
| 38 |
$query = '//*[contains(concat(" ", @class, " "), " h-feed ") or '. |
| 39 |
'contains(concat(" ", @class, " "), " h-entry ")]'; |
| 40 |
$result = $xpath->query($query); |
| 41 |
if ($result->length !== 0) { |
| 42 |
return $this->parse_microformats($data, $url); |
| 43 |
} |
| 44 |
} |
| 45 |
|
| 46 |
// Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character |
| 47 |
if (strtoupper($encoding) === 'US-ASCII') |
| 48 |
{ |
| 49 |
$this->encoding = 'UTF-8'; |
| 50 |
} |
| 51 |
else |
| 52 |
{ |
| 53 |
$this->encoding = $encoding; |
| 54 |
} |
| 55 |
|
| 56 |
// Strip BOM: |
| 57 |
// UTF-32 Big Endian BOM |
| 58 |
if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") |
| 59 |
{ |
| 60 |
$data = substr($data, 4); |
| 61 |
} |
| 62 |
// UTF-32 Little Endian BOM |
| 63 |
elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") |
| 64 |
{ |
| 65 |
$data = substr($data, 4); |
| 66 |
} |
| 67 |
// UTF-16 Big Endian BOM |
| 68 |
elseif (substr($data, 0, 2) === "\xFE\xFF") |
| 69 |
{ |
| 70 |
$data = substr($data, 2); |
| 71 |
} |
| 72 |
// UTF-16 Little Endian BOM |
| 73 |
elseif (substr($data, 0, 2) === "\xFF\xFE") |
| 74 |
{ |
| 75 |
$data = substr($data, 2); |
| 76 |
} |
| 77 |
// UTF-8 BOM |
| 78 |
elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") |
| 79 |
{ |
| 80 |
$data = substr($data, 3); |
| 81 |
} |
| 82 |
|
| 83 |
if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false) |
| 84 |
{ |
| 85 |
$declaration = $this->registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5))); |
| 86 |
if ($declaration->parse()) |
| 87 |
{ |
| 88 |
$data = substr($data, $pos + 2); |
| 89 |
$data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' ."\n". $this->declare_html_entities() . $data; |
| 90 |
} |
| 91 |
else |
| 92 |
{ |
| 93 |
$this->error_string = 'SimplePie bug! Please report this!'; |
| 94 |
return false; |
| 95 |
} |
| 96 |
} |
| 97 |
|
| 98 |
$return = true; |
| 99 |
|
| 100 |
static $xml_is_sane = null; |
| 101 |
if ($xml_is_sane === null) |
| 102 |
{ |
| 103 |
$parser_check = xml_parser_create(); |
| 104 |
xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); |
| 105 |
xml_parser_free($parser_check); |
| 106 |
$xml_is_sane = isset($values[0]['value']); |
| 107 |
} |
| 108 |
|
| 109 |
// Create the parser |
| 110 |
if ($xml_is_sane) |
| 111 |
{ |
| 112 |
$xml = xml_parser_create_ns($this->encoding, $this->separator); |
| 113 |
xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); |
| 114 |
xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0); |
| 115 |
xml_set_object($xml, $this); |
| 116 |
xml_set_character_data_handler($xml, 'cdata'); |
| 117 |
xml_set_element_handler($xml, 'tag_open', 'tag_close'); |
| 118 |
|
| 119 |
// Parse! |
| 120 |
$results = $this->do_xml_parse_attempt($xml, $data); |
| 121 |
$parseResults = $results[0]; |
| 122 |
$data = $results[1]; |
| 123 |
|
| 124 |
if (!$parseResults) { |
| 125 |
$this->error_code = xml_get_error_code($xml); |
| 126 |
$this->error_string = xml_error_string($this->error_code); |
| 127 |
$return = false; |
| 128 |
} |
| 129 |
$this->current_line = xml_get_current_line_number($xml); |
| 130 |
$this->current_column = xml_get_current_column_number($xml); |
| 131 |
$this->current_byte = xml_get_current_byte_index($xml); |
| 132 |
xml_parser_free($xml); |
| 133 |
return $return; |
| 134 |
} |
| 135 |
|
| 136 |
libxml_clear_errors(); |
| 137 |
$xml = new XMLReader(); |
| 138 |
$xml->xml($data); |
| 139 |
while (@$xml->read()) |
| 140 |
{ |
| 141 |
switch ($xml->nodeType) |
| 142 |
{ |
| 143 |
|
| 144 |
case constant('XMLReader::END_ELEMENT'): |
| 145 |
if ($xml->namespaceURI !== '') |
| 146 |
{ |
| 147 |
$tagName = $xml->namespaceURI . $this->separator . $xml->localName; |
| 148 |
} |
| 149 |
else |
| 150 |
{ |
| 151 |
$tagName = $xml->localName; |
| 152 |
} |
| 153 |
$this->tag_close(null, $tagName); |
| 154 |
break; |
| 155 |
case constant('XMLReader::ELEMENT'): |
| 156 |
$empty = $xml->isEmptyElement; |
| 157 |
if ($xml->namespaceURI !== '') |
| 158 |
{ |
| 159 |
$tagName = $xml->namespaceURI . $this->separator . $xml->localName; |
| 160 |
} |
| 161 |
else |
| 162 |
{ |
| 163 |
$tagName = $xml->localName; |
| 164 |
} |
| 165 |
$attributes = array(); |
| 166 |
while ($xml->moveToNextAttribute()) |
| 167 |
{ |
| 168 |
if ($xml->namespaceURI !== '') |
| 169 |
{ |
| 170 |
$attrName = $xml->namespaceURI . $this->separator . $xml->localName; |
| 171 |
} |
| 172 |
else |
| 173 |
{ |
| 174 |
$attrName = $xml->localName; |
| 175 |
} |
| 176 |
$attributes[$attrName] = $xml->value; |
| 177 |
} |
| 178 |
|
| 179 |
$this->do_scan_attributes_namespaces($attributes); |
| 180 |
|
| 181 |
$this->tag_open(null, $tagName, $attributes); |
| 182 |
if ($empty) |
| 183 |
{ |
| 184 |
$this->tag_close(null, $tagName); |
| 185 |
} |
| 186 |
break; |
| 187 |
case constant('XMLReader::TEXT'): |
| 188 |
|
| 189 |
case constant('XMLReader::CDATA'): |
| 190 |
$this->cdata(null, $xml->value); |
| 191 |
break; |
| 192 |
} |
| 193 |
} |
| 194 |
if ($error = libxml_get_last_error()) |
| 195 |
{ |
| 196 |
$this->error_code = $error->code; |
| 197 |
$this->error_string = $error->message; |
| 198 |
$this->current_line = $error->line; |
| 199 |
$this->current_column = $error->column; |
| 200 |
return false; |
| 201 |
} |
| 202 |
|
| 203 |
return true; |
| 204 |
} /* FeedWordPie_Parser::parse() */ |
| 205 |
|
| 206 |
public function do_xml_parse_attempt ($xml, $data) { |
| 207 |
xml_set_start_namespace_decl_handler($xml, 'start_xmlns'); |
| 208 |
|
| 209 |
// Parse! |
| 210 |
$parseResults = xml_parse($xml, $data, true); |
| 211 |
$endOfJunk = strpos($data, '<?xml'); |
| 212 |
if (!$parseResults and $endOfJunk > 0) : |
| 213 |
// There is some junk before the feed prolog. Try to get rid of it. |
| 214 |
$data = substr($data, $endOfJunk); |
| 215 |
$data = trim($data); |
| 216 |
$this->reset_parser($xml); |
| 217 |
|
| 218 |
$parseResults = xml_parse($xml, $data, true); |
| 219 |
endif; |
| 220 |
|
| 221 |
$badEntity = (xml_get_error_code($xml) == 26); |
| 222 |
if (!$parseResults and $badEntity) : |
| 223 |
// There was an entity that libxml couldn't understand. |
| 224 |
// Chances are, it was a stray HTML entity. So let's try |
| 225 |
// converting all the named HTML entities to numeric XML |
| 226 |
// entities and starting over. |
| 227 |
$data = $this->html_convert_entities($data); |
| 228 |
$this->reset_parser($xml); |
| 229 |
|
| 230 |
$parseResults = xml_parse($xml, $data, true); |
| 231 |
endif; |
| 232 |
|
| 233 |
$result = array( |
| 234 |
$parseResults, |
| 235 |
$data |
| 236 |
); |
| 237 |
return $result; |
| 238 |
|
| 239 |
} |
| 240 |
|
| 241 |
public function do_scan_attributes_namespaces ($attributes) { |
| 242 |
foreach ($attributes as $attr => $value) : |
| 243 |
list($ns, $local) = $this->split_ns($attr); |
| 244 |
if ($ns=='http://www.w3.org/2000/xmlns/') : |
| 245 |
if ('xmlns' == $local) : $local = false; endif; |
| 246 |
$this->start_xmlns(null, $local, $value); |
| 247 |
endif; |
| 248 |
endforeach; |
| 249 |
} |
| 250 |
|
| 251 |
var $xmlns_stack = array(); |
| 252 |
var $xmlns_current = array(); |
| 253 |
function tag_open ($parser, $tag, $attributes) { |
| 254 |
$ret = parent::tag_open($parser, $tag, $attributes); |
| 255 |
if ($this->current_xhtml_construct < 0) : |
| 256 |
$this->data['xmlns'] = $this->xmlns_current; |
| 257 |
$this->xmlns_stack[] = $this->xmlns_current; |
| 258 |
endif; |
| 259 |
return $ret; |
| 260 |
} |
| 261 |
|
| 262 |
function tag_close($parser, $tag) { |
| 263 |
if ($this->current_xhtml_construct < 0) : |
| 264 |
$this->xmlns_current = array_pop($this->xmlns_stack); |
| 265 |
endif; |
| 266 |
$ret = parent::tag_close($parser, $tag); |
| 267 |
return $ret; |
| 268 |
} |
| 269 |
|
| 270 |
function start_xmlns ($parser, $prefix, $uri) { |
| 271 |
if (!$prefix) : |
| 272 |
$prefix = ''; |
| 273 |
endif; |
| 274 |
if ($this->current_xhtml_construct < 0) : |
| 275 |
$this->xmlns_current[$prefix] = $uri; |
| 276 |
endif; |
| 277 |
|
| 278 |
return true; |
| 279 |
} /* FeedWordPie_Parser::start_xmlns() */ |
| 280 |
|
| 281 |
/* html_convert_entities($string) -- convert named HTML entities to |
| 282 |
* XML-compatible numeric entities. Adapted from code by @inanimatt: |
| 283 |
* https://gist.github.com/inanimatt/879249 |
| 284 |
*/ |
| 285 |
public function html_convert_entities($string) { |
| 286 |
return preg_replace_callback('/&([a-zA-Z][a-zA-Z0-9]+);/S', |
| 287 |
array($this, 'convert_entity'), $string); |
| 288 |
} |
| 289 |
|
| 290 |
/* Swap HTML named entity with its numeric equivalent. If the entity |
| 291 |
* isn't in the lookup table, this function returns a blank, which |
| 292 |
* destroys the character in the output - this is probably the |
| 293 |
* desired behaviour when producing XML. Adapted from code by @inanimatt: |
| 294 |
* https://gist.github.com/inanimatt/879249 |
| 295 |
*/ |
| 296 |
public function convert_entity($matches) { |
| 297 |
static $table = array( |
| 298 |
'quot' => '"', |
| 299 |
'amp' => '&', |
| 300 |
'lt' => '<', |
| 301 |
'gt' => '>', |
| 302 |
'OElig' => 'Œ', |
| 303 |
'oelig' => 'œ', |
| 304 |
'Scaron' => 'Š', |
| 305 |
'scaron' => 'š', |
| 306 |
'Yuml' => 'Ÿ', |
| 307 |
'circ' => 'ˆ', |
| 308 |
'tilde' => '˜', |
| 309 |
'ensp' => ' ', |
| 310 |
'emsp' => ' ', |
| 311 |
'thinsp' => ' ', |
| 312 |
'zwnj' => '‌', |
| 313 |
'zwj' => '‍', |
| 314 |
'lrm' => '‎', |
| 315 |
'rlm' => '‏', |
| 316 |
'ndash' => '–', |
| 317 |
'mdash' => '—', |
| 318 |
'lsquo' => '‘', |
| 319 |
'rsquo' => '’', |
| 320 |
'sbquo' => '‚', |
| 321 |
'ldquo' => '“', |
| 322 |
'rdquo' => '”', |
| 323 |
'bdquo' => '„', |
| 324 |
'dagger' => '†', |
| 325 |
'Dagger' => '‡', |
| 326 |
'permil' => '‰', |
| 327 |
'lsaquo' => '‹', |
| 328 |
'rsaquo' => '›', |
| 329 |
'euro' => '€', |
| 330 |
'fnof' => 'ƒ', |
| 331 |
'Alpha' => 'Α', |
| 332 |
'Beta' => 'Β', |
| 333 |
'Gamma' => 'Γ', |
| 334 |
'Delta' => 'Δ', |
| 335 |
'Epsilon' => 'Ε', |
| 336 |
'Zeta' => 'Ζ', |
| 337 |
'Eta' => 'Η', |
| 338 |
'Theta' => 'Θ', |
| 339 |
'Iota' => 'Ι', |
| 340 |
'Kappa' => 'Κ', |
| 341 |
'Lambda' => 'Λ', |
| 342 |
'Mu' => 'Μ', |
| 343 |
'Nu' => 'Ν', |
| 344 |
'Xi' => 'Ξ', |
| 345 |
'Omicron' => 'Ο', |
| 346 |
'Pi' => 'Π', |
| 347 |
'Rho' => 'Ρ', |
| 348 |
'Sigma' => 'Σ', |
| 349 |
'Tau' => 'Τ', |
| 350 |
'Upsilon' => 'Υ', |
| 351 |
'Phi' => 'Φ', |
| 352 |
'Chi' => 'Χ', |
| 353 |
'Psi' => 'Ψ', |
| 354 |
'Omega' => 'Ω', |
| 355 |
'alpha' => 'α', |
| 356 |
'beta' => 'β', |
| 357 |
'gamma' => 'γ', |
| 358 |
'delta' => 'δ', |
| 359 |
'epsilon' => 'ε', |
| 360 |
'zeta' => 'ζ', |
| 361 |
'eta' => 'η', |
| 362 |
'theta' => 'θ', |
| 363 |
'iota' => 'ι', |
| 364 |
'kappa' => 'κ', |
| 365 |
'lambda' => 'λ', |
| 366 |
'mu' => 'μ', |
| 367 |
'nu' => 'ν', |
| 368 |
'xi' => 'ξ', |
| 369 |
'omicron' => 'ο', |
| 370 |
'pi' => 'π', |
| 371 |
'rho' => 'ρ', |
| 372 |
'sigmaf' => 'ς', |
| 373 |
'sigma' => 'σ', |
| 374 |
'tau' => 'τ', |
| 375 |
'upsilon' => 'υ', |
| 376 |
'phi' => 'φ', |
| 377 |
'chi' => 'χ', |
| 378 |
'psi' => 'ψ', |
| 379 |
'omega' => 'ω', |
| 380 |
'thetasym' => 'ϑ', |
| 381 |
'upsih' => 'ϒ', |
| 382 |
'piv' => 'ϖ', |
| 383 |
'bull' => '•', |
| 384 |
'hellip' => '…', |
| 385 |
'prime' => '′', |
| 386 |
'Prime' => '″', |
| 387 |
'oline' => '‾', |
| 388 |
'frasl' => '⁄', |
| 389 |
'weierp' => '℘', |
| 390 |
'image' => 'ℑ', |
| 391 |
'real' => 'ℜ', |
| 392 |
'trade' => '™', |
| 393 |
'alefsym' => 'ℵ', |
| 394 |
'larr' => '←', |
| 395 |
'uarr' => '↑', |
| 396 |
'rarr' => '→', |
| 397 |
'darr' => '↓', |
| 398 |
'harr' => '↔', |
| 399 |
'crarr' => '↵', |
| 400 |
'lArr' => '⇐', |
| 401 |
'uArr' => '⇑', |
| 402 |
'rArr' => '⇒', |
| 403 |
'dArr' => '⇓', |
| 404 |
'hArr' => '⇔', |
| 405 |
'forall' => '∀', |
| 406 |
'part' => '∂', |
| 407 |
'exist' => '∃', |
| 408 |
'empty' => '∅', |
| 409 |
'nabla' => '∇', |
| 410 |
'isin' => '∈', |
| 411 |
'notin' => '∉', |
| 412 |
'ni' => '∋', |
| 413 |
'prod' => '∏', |
| 414 |
'sum' => '∑', |
| 415 |
'minus' => '−', |
| 416 |
'lowast' => '∗', |
| 417 |
'radic' => '√', |
| 418 |
'prop' => '∝', |
| 419 |
'infin' => '∞', |
| 420 |
'ang' => '∠', |
| 421 |
'and' => '∧', |
| 422 |
'or' => '∨', |
| 423 |
'cap' => '∩', |
| 424 |
'cup' => '∪', |
| 425 |
'int' => '∫', |
| 426 |
'there4' => '∴', |
| 427 |
'sim' => '∼', |
| 428 |
'cong' => '≅', |
| 429 |
'asymp' => '≈', |
| 430 |
'ne' => '≠', |
| 431 |
'equiv' => '≡', |
| 432 |
'le' => '≤', |
| 433 |
'ge' => '≥', |
| 434 |
'sub' => '⊂', |
| 435 |
'sup' => '⊃', |
| 436 |
'nsub' => '⊄', |
| 437 |
'sube' => '⊆', |
| 438 |
'supe' => '⊇', |
| 439 |
'oplus' => '⊕', |
| 440 |
'otimes' => '⊗', |
| 441 |
'perp' => '⊥', |
| 442 |
'sdot' => '⋅', |
| 443 |
'lceil' => '⌈', |
| 444 |
'rceil' => '⌉', |
| 445 |
'lfloor' => '⌊', |
| 446 |
'rfloor' => '⌋', |
| 447 |
'lang' => '〈', |
| 448 |
'rang' => '〉', |
| 449 |
'loz' => '◊', |
| 450 |
'spades' => '♠', |
| 451 |
'clubs' => '♣', |
| 452 |
'hearts' => '♥', |
| 453 |
'diams' => '♦', |
| 454 |
'nbsp' => ' ', |
| 455 |
'iexcl' => '¡', |
| 456 |
'cent' => '¢', |
| 457 |
'pound' => '£', |
| 458 |
'curren' => '¤', |
| 459 |
'yen' => '¥', |
| 460 |
'brvbar' => '¦', |
| 461 |
'sect' => '§', |
| 462 |
'uml' => '¨', |
| 463 |
'copy' => '©', |
| 464 |
'ordf' => 'ª', |
| 465 |
'laquo' => '«', |
| 466 |
'not' => '¬', |
| 467 |
'shy' => '­', |
| 468 |
'reg' => '®', |
| 469 |
'macr' => '¯', |
| 470 |
'deg' => '°', |
| 471 |
'plusmn' => '±', |
| 472 |
'sup2' => '²', |
| 473 |
'sup3' => '³', |
| 474 |
'acute' => '´', |
| 475 |
'micro' => 'µ', |
| 476 |
'para' => '¶', |
| 477 |
'middot' => '·', |
| 478 |
'cedil' => '¸', |
| 479 |
'sup1' => '¹', |
| 480 |
'ordm' => 'º', |
| 481 |
'raquo' => '»', |
| 482 |
'frac14' => '¼', |
| 483 |
'frac12' => '½', |
| 484 |
'frac34' => '¾', |
| 485 |
'iquest' => '¿', |
| 486 |
'Agrave' => 'À', |
| 487 |
'Aacute' => 'Á', |
| 488 |
'Acirc' => 'Â', |
| 489 |
'Atilde' => 'Ã', |
| 490 |
'Auml' => 'Ä', |
| 491 |
'Aring' => 'Å', |
| 492 |
'AElig' => 'Æ', |
| 493 |
'Ccedil' => 'Ç', |
| 494 |
'Egrave' => 'È', |
| 495 |
'Eacute' => 'É', |
| 496 |
'Ecirc' => 'Ê', |
| 497 |
'Euml' => 'Ë', |
| 498 |
'Igrave' => 'Ì', |
| 499 |
'Iacute' => 'Í', |
| 500 |
'Icirc' => 'Î', |
| 501 |
'Iuml' => 'Ï', |
| 502 |
'ETH' => 'Ð', |
| 503 |
'Ntilde' => 'Ñ', |
| 504 |
'Ograve' => 'Ò', |
| 505 |
'Oacute' => 'Ó', |
| 506 |
'Ocirc' => 'Ô', |
| 507 |
'Otilde' => 'Õ', |
| 508 |
'Ouml' => 'Ö', |
| 509 |
'times' => '×', |
| 510 |
'Oslash' => 'Ø', |
| 511 |
'Ugrave' => 'Ù', |
| 512 |
'Uacute' => 'Ú', |
| 513 |
'Ucirc' => 'Û', |
| 514 |
'Uuml' => 'Ü', |
| 515 |
'Yacute' => 'Ý', |
| 516 |
'THORN' => 'Þ', |
| 517 |
'szlig' => 'ß', |
| 518 |
'agrave' => 'à', |
| 519 |
'aacute' => 'á', |
| 520 |
'acirc' => 'â', |
| 521 |
'atilde' => 'ã', |
| 522 |
'auml' => 'ä', |
| 523 |
'aring' => 'å', |
| 524 |
'aelig' => 'æ', |
| 525 |
'ccedil' => 'ç', |
| 526 |
'egrave' => 'è', |
| 527 |
'eacute' => 'é', |
| 528 |
'ecirc' => 'ê', |
| 529 |
'euml' => 'ë', |
| 530 |
'igrave' => 'ì', |
| 531 |
'iacute' => 'í', |
| 532 |
'icirc' => 'î', |
| 533 |
'iuml' => 'ï', |
| 534 |
'eth' => 'ð', |
| 535 |
'ntilde' => 'ñ', |
| 536 |
'ograve' => 'ò', |
| 537 |
'oacute' => 'ó', |
| 538 |
'ocirc' => 'ô', |
| 539 |
'otilde' => 'õ', |
| 540 |
'ouml' => 'ö', |
| 541 |
'divide' => '÷', |
| 542 |
'oslash' => 'ø', |
| 543 |
'ugrave' => 'ù', |
| 544 |
'uacute' => 'ú', |
| 545 |
'ucirc' => 'û', |
| 546 |
'uuml' => 'ü', |
| 547 |
'yacute' => 'ý', |
| 548 |
'thorn' => 'þ', |
| 549 |
'yuml' => 'ÿ' |
| 550 |
); |
| 551 |
// Entity not found? Destroy it. |
| 552 |
return isset($table[$matches[1]]) ? $table[$matches[1]] : ''; |
| 553 |
} /* FeedWordPie_Parser::convert_entity() */ |
| 554 |
|
| 555 |
private function declare_html_entities() { |
| 556 |
// This is required because the RSS specification says that entity-encoded |
| 557 |
// html is allowed, but the xml specification says they must be declared. |
| 558 |
return '<!DOCTYPE html [ <!ENTITY nbsp " "> <!ENTITY iexcl "¡"> <!ENTITY cent "¢"> <!ENTITY pound "£"> <!ENTITY curren "¤"> <!ENTITY yen "¥"> <!ENTITY brvbar "¦"> <!ENTITY sect "§"> <!ENTITY uml "¨"> <!ENTITY copy "©"> <!ENTITY ordf "ª"> <!ENTITY laquo "«"> <!ENTITY not "¬"> <!ENTITY shy "­"> <!ENTITY reg "®"> <!ENTITY macr "¯"> <!ENTITY deg "°"> <!ENTITY plusmn "±"> <!ENTITY sup2 "²"> <!ENTITY sup3 "³"> <!ENTITY acute "´"> <!ENTITY micro "µ"> <!ENTITY para "¶"> <!ENTITY middot "·"> <!ENTITY cedil "¸"> <!ENTITY sup1 "¹"> <!ENTITY ordm "º"> <!ENTITY raquo "»"> <!ENTITY frac14 "¼"> <!ENTITY frac12 "½"> <!ENTITY frac34 "¾"> <!ENTITY iquest "¿"> <!ENTITY Agrave "À"> <!ENTITY Aacute "Á"> <!ENTITY Acirc "Â"> <!ENTITY Atilde "Ã"> <!ENTITY Auml "Ä"> <!ENTITY Aring "Å"> <!ENTITY AElig "Æ"> <!ENTITY Ccedil "Ç"> <!ENTITY Egrave "È"> <!ENTITY Eacute "É"> <!ENTITY Ecirc "Ê"> <!ENTITY Euml "Ë"> <!ENTITY Igrave "Ì"> <!ENTITY Iacute "Í"> <!ENTITY Icirc "Î"> <!ENTITY Iuml "Ï"> <!ENTITY ETH "Ð"> <!ENTITY Ntilde "Ñ"> <!ENTITY Ograve "Ò"> <!ENTITY Oacute "Ó"> <!ENTITY Ocirc "Ô"> <!ENTITY Otilde "Õ"> <!ENTITY Ouml "Ö"> <!ENTITY times "×"> <!ENTITY Oslash "Ø"> <!ENTITY Ugrave "Ù"> <!ENTITY Uacute "Ú"> <!ENTITY Ucirc "Û"> <!ENTITY Uuml "Ü"> <!ENTITY Yacute "Ý"> <!ENTITY THORN "Þ"> <!ENTITY szlig "ß"> <!ENTITY agrave "à"> <!ENTITY aacute "á"> <!ENTITY acirc "â"> <!ENTITY atilde "ã"> <!ENTITY auml "ä"> <!ENTITY aring "å"> <!ENTITY aelig "æ"> <!ENTITY ccedil "ç"> <!ENTITY egrave "è"> <!ENTITY eacute "é"> <!ENTITY ecirc "ê"> <!ENTITY euml "ë"> <!ENTITY igrave "ì"> <!ENTITY iacute "í"> <!ENTITY icirc "î"> <!ENTITY iuml "ï"> <!ENTITY eth "ð"> <!ENTITY ntilde "ñ"> <!ENTITY ograve "ò"> <!ENTITY oacute "ó"> <!ENTITY ocirc "ô"> <!ENTITY otilde "õ"> <!ENTITY ouml "ö"> <!ENTITY divide "÷"> <!ENTITY oslash "ø"> <!ENTITY ugrave "ù"> <!ENTITY uacute "ú"> <!ENTITY ucirc "û"> <!ENTITY uuml "ü"> <!ENTITY yacute "ý"> <!ENTITY thorn "þ"> <!ENTITY yuml "ÿ"> <!ENTITY OElig "Œ"> <!ENTITY oelig "œ"> <!ENTITY Scaron "Š"> <!ENTITY scaron "š"> <!ENTITY Yuml "Ÿ"> <!ENTITY fnof "ƒ"> <!ENTITY circ "ˆ"> <!ENTITY tilde "˜"> <!ENTITY Alpha "Α"> <!ENTITY Beta "Β"> <!ENTITY Gamma "Γ"> <!ENTITY Epsilon "Ε"> <!ENTITY Zeta "Ζ"> <!ENTITY Eta "Η"> <!ENTITY Theta "Θ"> <!ENTITY Iota "Ι"> <!ENTITY Kappa "Κ"> <!ENTITY Lambda "Λ"> <!ENTITY Mu "Μ"> <!ENTITY Nu "Ν"> <!ENTITY Xi "Ξ"> <!ENTITY Omicron "Ο"> <!ENTITY Pi "Π"> <!ENTITY Rho "Ρ"> <!ENTITY Sigma "Σ"> <!ENTITY Tau "Τ"> <!ENTITY Upsilon "Υ"> <!ENTITY Phi "Φ"> <!ENTITY Chi "Χ"> <!ENTITY Psi "Ψ"> <!ENTITY Omega "Ω"> <!ENTITY alpha "α"> <!ENTITY beta "β"> <!ENTITY gamma "γ"> <!ENTITY delta "δ"> <!ENTITY epsilon "ε"> <!ENTITY zeta "ζ"> <!ENTITY eta "η"> <!ENTITY theta "θ"> <!ENTITY iota "ι"> <!ENTITY kappa "κ"> <!ENTITY lambda "λ"> <!ENTITY mu "μ"> <!ENTITY nu "ν"> <!ENTITY xi "ξ"> <!ENTITY omicron "ο"> <!ENTITY pi "π"> <!ENTITY rho "ρ"> <!ENTITY sigmaf "ς"> <!ENTITY sigma "σ"> <!ENTITY tau "τ"> <!ENTITY upsilon "υ"> <!ENTITY phi "φ"> <!ENTITY chi "χ"> <!ENTITY psi "ψ"> <!ENTITY omega "ω"> <!ENTITY thetasym "ϑ"> <!ENTITY upsih "ϒ"> <!ENTITY piv "ϖ"> <!ENTITY ensp " "> <!ENTITY emsp " "> <!ENTITY thinsp " "> <!ENTITY zwnj "‌"> <!ENTITY zwj "‍"> <!ENTITY lrm "‎"> <!ENTITY rlm "‏"> <!ENTITY ndash "–"> <!ENTITY mdash "—"> <!ENTITY lsquo "‘"> <!ENTITY rsquo "’"> <!ENTITY sbquo "‚"> <!ENTITY ldquo "“"> <!ENTITY rdquo "”"> <!ENTITY bdquo "„"> <!ENTITY dagger "†"> <!ENTITY Dagger "‡"> <!ENTITY bull "•"> <!ENTITY hellip "…"> <!ENTITY permil "‰"> <!ENTITY prime "′"> <!ENTITY Prime "″"> <!ENTITY lsaquo "‹"> <!ENTITY rsaquo "›"> <!ENTITY oline "‾"> <!ENTITY frasl "⁄"> <!ENTITY euro "€"> <!ENTITY image "ℑ"> <!ENTITY weierp "℘"> <!ENTITY real "ℜ"> <!ENTITY trade "™"> <!ENTITY alefsym "ℵ"> <!ENTITY larr "←"> <!ENTITY uarr "↑"> <!ENTITY rarr "→"> <!ENTITY darr "↓"> <!ENTITY harr "↔"> <!ENTITY crarr "↵"> <!ENTITY lArr "⇐"> <!ENTITY uArr "⇑"> <!ENTITY rArr "⇒"> <!ENTITY dArr "⇓"> <!ENTITY hArr "⇔"> <!ENTITY forall "∀"> <!ENTITY part "∂"> <!ENTITY exist "∃"> <!ENTITY empty "∅"> <!ENTITY nabla "∇"> <!ENTITY isin "∈"> <!ENTITY notin "∉"> <!ENTITY ni "∋"> <!ENTITY prod "∏"> <!ENTITY sum "∑"> <!ENTITY minus "−"> <!ENTITY lowast "∗"> <!ENTITY radic "√"> <!ENTITY prop "∝"> <!ENTITY infin "∞"> <!ENTITY ang "∠"> <!ENTITY and "∧"> <!ENTITY or "∨"> <!ENTITY cap "∩"> <!ENTITY cup "∪"> <!ENTITY int "∫"> <!ENTITY there4 "∴"> <!ENTITY sim "∼"> <!ENTITY cong "≅"> <!ENTITY asymp "≈"> <!ENTITY ne "≠"> <!ENTITY equiv "≡"> <!ENTITY le "≤"> <!ENTITY ge "≥"> <!ENTITY sub "⊂"> <!ENTITY sup "⊃"> <!ENTITY nsub "⊄"> <!ENTITY sube "⊆"> <!ENTITY supe "⊇"> <!ENTITY oplus "⊕"> <!ENTITY otimes "⊗"> <!ENTITY perp "⊥"> <!ENTITY sdot "⋅"> <!ENTITY lceil "⌈"> <!ENTITY rceil "⌉"> <!ENTITY lfloor "⌊"> <!ENTITY rfloor "⌋"> <!ENTITY lang "〈"> <!ENTITY rang "〉"> <!ENTITY loz "◊"> <!ENTITY spades "♠"> <!ENTITY clubs "♣"> <!ENTITY hearts "♥"> <!ENTITY diams "♦"> ]>'; |
| 559 |
} |
| 560 |
} /* class FeedWordPie_Parser */ |
| 561 |
|
| 562 |
|
| 563 |
|