2013-04-05 05:34:07 +02:00
|
|
|
<?php
|
|
|
|
|
2013-06-29 03:50:15 +02:00
|
|
|
namespace PicoFeed\Parsers;
|
2013-04-05 05:34:07 +02:00
|
|
|
|
2013-06-29 03:50:15 +02:00
|
|
|
class Rss20 extends \PicoFeed\Parser
|
2013-04-05 05:34:07 +02:00
|
|
|
{
|
|
|
|
public function execute()
|
|
|
|
{
|
|
|
|
\libxml_use_internal_errors(true);
|
|
|
|
$xml = \simplexml_load_string($this->content);
|
|
|
|
|
|
|
|
if ($xml === false) {
|
|
|
|
|
2013-07-06 20:29:45 +02:00
|
|
|
\PicoFeed\Logging::log($this->getXmlErrors());
|
2013-04-05 05:34:07 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
$namespaces = $xml->getNamespaces(true);
|
2013-04-05 05:34:07 +02:00
|
|
|
|
2013-06-27 01:30:46 +02:00
|
|
|
if ($xml->channel->link && $xml->channel->link->count() > 1) {
|
2013-04-12 21:57:54 +02:00
|
|
|
|
|
|
|
foreach ($xml->channel->link as $xml_link) {
|
|
|
|
|
|
|
|
$link = (string) $xml_link;
|
|
|
|
|
|
|
|
if ($link !== '') {
|
|
|
|
|
|
|
|
$this->url = (string) $link;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
|
|
|
|
$this->url = (string) $xml->channel->link;
|
|
|
|
}
|
|
|
|
|
2013-06-29 19:41:36 +02:00
|
|
|
$this->title = $this->stripWhiteSpace((string) $xml->channel->title);
|
2013-04-05 05:34:07 +02:00
|
|
|
$this->id = $this->url;
|
|
|
|
$this->updated = isset($xml->channel->pubDate) ? (string) $xml->channel->pubDate : (string) $xml->channel->lastBuildDate;
|
2013-04-07 16:58:46 +02:00
|
|
|
$this->updated = $this->updated ? strtotime($this->updated) : time();
|
2013-04-05 05:34:07 +02:00
|
|
|
|
2013-06-27 01:30:46 +02:00
|
|
|
// RSS feed might be empty
|
|
|
|
if (! $xml->channel->item) return $this;
|
|
|
|
|
2013-04-05 05:34:07 +02:00
|
|
|
foreach ($xml->channel->item as $entry) {
|
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
$item = new \StdClass;
|
2013-06-29 19:41:36 +02:00
|
|
|
$item->title = $this->stripWhiteSpace((string) $entry->title);
|
2013-04-07 16:58:46 +02:00
|
|
|
$item->url = '';
|
|
|
|
$item->author= '';
|
|
|
|
$item->updated = '';
|
|
|
|
$item->content = '';
|
2013-04-05 05:34:07 +02:00
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
foreach ($namespaces as $name => $url) {
|
2013-04-05 05:34:07 +02:00
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
$namespace = $entry->children($namespaces[$name]);
|
2013-04-05 05:34:07 +02:00
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
if (! $item->url && ! empty($namespace->origLink)) $item->url = (string) $namespace->origLink;
|
|
|
|
if (! $item->author && ! empty($namespace->creator)) $item->author = (string) $namespace->creator;
|
|
|
|
if (! $item->updated && ! empty($namespace->date)) $item->updated = strtotime((string) $namespace->date);
|
|
|
|
if (! $item->updated && ! empty($namespace->updated)) $item->updated = strtotime((string) $namespace->updated);
|
|
|
|
if (! $item->content && ! empty($namespace->encoded)) $item->content = (string) $namespace->encoded;
|
2013-04-05 05:34:07 +02:00
|
|
|
}
|
|
|
|
|
2013-06-29 19:41:36 +02:00
|
|
|
if (empty($item->url)) {
|
|
|
|
|
|
|
|
if (isset($entry->link)) {
|
|
|
|
$item->url = (string) $entry->link;
|
|
|
|
}
|
|
|
|
else if (isset($entry->guid)) {
|
|
|
|
$item->url = (string) $entry->guid;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
if (empty($item->updated)) $item->updated = strtotime((string) $entry->pubDate) ?: $this->updated;
|
2013-04-05 05:34:07 +02:00
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
if (empty($item->content)) {
|
2013-04-05 05:34:07 +02:00
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
$item->content = isset($entry->description) ? (string) $entry->description : '';
|
2013-04-05 05:34:07 +02:00
|
|
|
}
|
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
if (empty($item->author)) {
|
2013-04-05 05:34:07 +02:00
|
|
|
|
|
|
|
if (isset($entry->author)) {
|
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
$item->author = (string) $entry->author;
|
2013-04-05 05:34:07 +02:00
|
|
|
}
|
|
|
|
else if (isset($xml->channel->webMaster)) {
|
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
$item->author = (string) $xml->channel->webMaster;
|
2013-04-05 05:34:07 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
if (isset($entry->guid) && isset($entry->guid['isPermaLink']) && (string) $entry->guid['isPermaLink'] != 'false') {
|
|
|
|
|
|
|
|
$item->id = (string) $entry->guid;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
|
|
|
|
$item->id = $item->url;
|
|
|
|
}
|
2013-04-05 05:34:07 +02:00
|
|
|
|
2013-05-06 03:44:03 +02:00
|
|
|
if (empty($item->title)) $item->title = $item->url;
|
|
|
|
|
2013-04-07 16:58:46 +02:00
|
|
|
$item->content = $this->filterHtml($item->content, $item->url);
|
2013-04-05 05:34:07 +02:00
|
|
|
$this->items[] = $item;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
}
|