diff options
42 files changed, 235 insertions, 169 deletions
diff --git a/composer.lock b/composer.lock index d13fa52c9..76b30863a 100644 --- a/composer.lock +++ b/composer.lock @@ -57,12 +57,12 @@ "source": { "type": "git", "url": "https://github.com/fguillot/picoFeed.git", - "reference": "aa83e0c66525251cb6c6acab3babbc9e1879527b" + "reference": "035eed9d5d5b32441f44d59a9a75ea7e1c07a3aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fguillot/picoFeed/zipball/aa83e0c66525251cb6c6acab3babbc9e1879527b", - "reference": "aa83e0c66525251cb6c6acab3babbc9e1879527b", + "url": "https://api.github.com/repos/fguillot/picoFeed/zipball/035eed9d5d5b32441f44d59a9a75ea7e1c07a3aa", + "reference": "035eed9d5d5b32441f44d59a9a75ea7e1c07a3aa", "shasum": "" }, "require": { @@ -91,7 +91,7 @@ ], "description": "Modern library to write or read feeds (RSS/Atom)", "homepage": "http://fguillot.github.io/picoFeed", - "time": "2015-02-24 03:00:15" + "time": "2015-02-27 02:45:04" }, { "name": "pear/net_url2", diff --git a/fetcher/feedfetcher.php b/fetcher/feedfetcher.php index 5eeb58548..815c0e4f4 100644 --- a/fetcher/feedfetcher.php +++ b/fetcher/feedfetcher.php @@ -149,7 +149,7 @@ class FeedFetcher implements IFeedFetcher { $item->setUrl($parsedItem->getUrl()); $item->setGuid($parsedItem->getId()); $item->setGuidHash($item->getGuid()); - $item->setPubDate($parsedItem->getDate()); + $item->setPubDate($parsedItem->getDate()->getTimestamp()); $item->setLastModified($this->time->getTime()); // unescape content because angularjs helps against XSS diff --git a/tests/unit/fetcher/FeedFetcherTest.php b/tests/unit/fetcher/FeedFetcherTest.php index d9652429a..b0320de4b 100644 --- a/tests/unit/fetcher/FeedFetcherTest.php +++ b/tests/unit/fetcher/FeedFetcherTest.php @@ -203,7 +203,10 @@ class FeedFetcherTest extends \PHPUnit_Framework_TestCase { $item = new Item(); - $this->expectItem('getDate', $this->pub); + date_default_timezone_set('America/Los_Angeles'); + $date = new \DateTime(); + $date->setTimestamp($this->pub); + $this->expectItem('getDate', $date); $item->setPubDate($this->pub); $item->setStatus(0); diff --git a/vendor/autoload.php b/vendor/autoload.php index 815d13376..e4ee3e08c 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -4,4 +4,4 @@ require_once __DIR__ . '/composer' . '/autoload_real.php'; -return ComposerAutoloaderInitfee7a50d745041658cc0946610dc5951::getLoader(); +return ComposerAutoloaderInit878b2c9b24ed043c2ed72a45ff7ae283::getLoader(); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 72636c6dd..3a2bd3c33 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInitfee7a50d745041658cc0946610dc5951 +class ComposerAutoloaderInit878b2c9b24ed043c2ed72a45ff7ae283 { private static $loader; @@ -19,9 +19,9 @@ class ComposerAutoloaderInitfee7a50d745041658cc0946610dc5951 return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInitfee7a50d745041658cc0946610dc5951', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit878b2c9b24ed043c2ed72a45ff7ae283', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(); - spl_autoload_unregister(array('ComposerAutoloaderInitfee7a50d745041658cc0946610dc5951', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit878b2c9b24ed043c2ed72a45ff7ae283', 'loadClassLoader')); $includePaths = require __DIR__ . '/include_paths.php'; array_push($includePaths, get_include_path()); @@ -46,14 +46,14 @@ class ComposerAutoloaderInitfee7a50d745041658cc0946610dc5951 $includeFiles = require __DIR__ . '/autoload_files.php'; foreach ($includeFiles as $file) { - composerRequirefee7a50d745041658cc0946610dc5951($file); + composerRequire878b2c9b24ed043c2ed72a45ff7ae283($file); } return $loader; } } -function composerRequirefee7a50d745041658cc0946610dc5951($file) +function composerRequire878b2c9b24ed043c2ed72a45ff7ae283($file) { require $file; } diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 18cf0b2ed..1bfdaad8a 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -119,12 +119,12 @@ "source": { "type": "git", "url": "https://github.com/fguillot/picoFeed.git", - "reference": "aa83e0c66525251cb6c6acab3babbc9e1879527b" + "reference": "035eed9d5d5b32441f44d59a9a75ea7e1c07a3aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fguillot/picoFeed/zipball/aa83e0c66525251cb6c6acab3babbc9e1879527b", - "reference": "aa83e0c66525251cb6c6acab3babbc9e1879527b", + "url": "https://api.github.com/repos/fguillot/picoFeed/zipball/035eed9d5d5b32441f44d59a9a75ea7e1c07a3aa", + "reference": "035eed9d5d5b32441f44d59a9a75ea7e1c07a3aa", "shasum": "" }, "require": { @@ -135,7 +135,7 @@ "ext-xml": "*", "php": ">=5.3.0" }, - "time": "2015-02-24 03:00:15", + "time": "2015-02-27 02:45:04", "type": "library", "installation-source": "dist", "autoload": { diff --git a/vendor/fguillot/picofeed/docs/feed-parsing.markdown b/vendor/fguillot/picofeed/docs/feed-parsing.markdown index d00e08364..6e7f2fdc2 100644 --- a/vendor/fguillot/picofeed/docs/feed-parsing.markdown +++ b/vendor/fguillot/picofeed/docs/feed-parsing.markdown @@ -45,23 +45,23 @@ Feed::id = tag:linuxfr.org,2005:/news Feed::title = LinuxFr.org : les dépêches Feed::feed_url = http://linuxfr.org/news.atom Feed::site_url = http://linuxfr.org/news -Feed::date = 1415138079 Feed::language = en-US Feed::description = Feed::logo = -Feed::items = 15 items +Feed::date = Thu, 26 Feb 15 09:33:08 +0100 Feed::isRTL() = false +Feed::items = 15 items ---- -Item::id = 38d8f48284fb03940cbb3aff9101089b81e44efb1281641bdd7c3e7e4bf3b0cd -Item::title = openSUSE 13.2 : nouvelle version du caméléon disponible ! -Item::url = http://linuxfr.org/news/opensuse-13-2-nouvelle-version-du-cameleon-disponible -Item::date = 1415122640 +Item::id = 56198c98ae852d21c369bfb5ffbc2ad13db2f3227236dde3e21ca1a9eb943faf +Item::title = Les brevets logiciels : un frein à l'innovation et la recherche (un nouvel exemple aux États-Unis) +Item::url = http://linuxfr.org/news/les-brevets-logiciels-un-frein-a-l-innovation-et-la-recherche-un-nouvel-exemple-aux-etats-unis Item::language = en-US -Item::author = Syvolc +Item::author = alenvers Item::enclosure_url = Item::enclosure_type = +Item::date = Thu, 26 Feb 15 09:33:08 +0100 Item::isRTL() = false -Item::content = 18307 bytes +Item::content = 6452 bytes .... ``` @@ -186,7 +186,7 @@ $feed->getId(); // Unique feed id $feed->getTitle(); // Feed title $feed->getFeedUrl(); // Feed url $feed->getSiteUrl(); // Website url -$feed->getDate(); // Feed last updated date +$feed->getDate(); // Feed last updated date (DateTime object) $feed->getLanguage(); // Feed language $feed->getDescription(); // Feed description $feed->getLogo(); // Feed logo (can be a large image, different from icon) @@ -196,7 +196,7 @@ $feed->getItems(); // List of item objects $feed->items[0]->getId(); // Item unique id (hash) $feed->items[0]->getTitle(); // Item title $feed->items[0]->getUrl(); // Item url -$feed->items[0]->getDate(); // Item published date (timestamp) +$feed->items[0]->getDate(); // Item published date (DateTime object) $feed->items[0]->getLanguage(); // Item language $feed->items[0]->getAuthor(); // Item author $feed->items[0]->getEnclosureUrl(); // Enclosure url diff --git a/vendor/fguillot/picofeed/docs/installation.markdown b/vendor/fguillot/picofeed/docs/installation.markdown index f132b32cc..9bf1450d1 100644 --- a/vendor/fguillot/picofeed/docs/installation.markdown +++ b/vendor/fguillot/picofeed/docs/installation.markdown @@ -6,7 +6,8 @@ Versions - Development version: master - Available versions: - - v0.1.1 (stable) + - v0.1.2 (stable) + - v0.1.1 - v0.1.0 - v0.0.2 - v0.0.1 @@ -21,7 +22,7 @@ Configure your `composer.json`: ```json { "require": { - "fguillot/picofeed": "0.1.1" + "fguillot/picofeed": "0.1.2" } } ``` @@ -29,7 +30,7 @@ Configure your `composer.json`: Or simply: ```bash -composer require fguillot/picofeed:0.1.1 +composer require fguillot/picofeed:0.1.2 ``` And download the code: diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php index 52f2f0bf1..fe4890400 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Client/Grabber.php @@ -123,8 +123,6 @@ class Grabber * @var array */ private $stripTags = array( - 'script', - 'style', 'nav', 'header', 'footer', @@ -276,11 +274,11 @@ class Grabber } if ($this->html) { + $html_encoding = XmlParser::getEncodingFromMetaTag($this->html); - Logger::setMessage(get_called_class().': Fix encoding'); - Logger::setMessage(get_called_class().': HTTP Encoding "'.$this->encoding.'"'); - - $this->html = Encoding::convert($this->html, $this->encoding); + // Encode everything in UTF-8 + Logger::setMessage(get_called_class().': HTTP Encoding "'.$this->encoding.'" ; HTML Encoding "'.$html_encoding.'"'); + $this->html = Encoding::convert($this->html, $html_encoding ?: $this->encoding); $this->html = Filter::stripHeadTags($this->html); Logger::setMessage(get_called_class().': Content length: '.strlen($this->html).' bytes'); diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php index 647b7352f..aa7efe4bd 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Filter/Tag.php @@ -158,6 +158,11 @@ class Tag public function removeBlacklistedTags($data) { $dom = XmlParser::getDomDocument($data); + + if ($dom === false) { + return ''; + } + $xpath = new DOMXpath($dom); $nodes = $xpath->query(implode(' | ', $this->tag_blacklist)); diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php index 9f2f108d8..21566527e 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Atom.php @@ -131,7 +131,7 @@ class Atom extends Parser */ public function findFeedDate(SimpleXMLElement $xml, Feed $feed) { - $feed->date = $this->date->getTimestamp((string) $xml->updated); + $feed->date = $this->date->getDateTime((string) $xml->updated); } /** @@ -143,10 +143,15 @@ class Atom extends Parser */ public function findItemDate(SimpleXMLElement $entry, Item $item) { - $published = isset($entry->published) ? $this->date->getTimestamp((string) $entry->published) : 0; - $updated = isset($entry->updated) ? $this->date->getTimestamp((string) $entry->updated) : 0; + $published = isset($entry->published) ? $this->date->getDateTime((string) $entry->published) : null; + $updated = isset($entry->updated) ? $this->date->getDateTime((string) $entry->updated) : null; - $item->date = max($published, $updated) ?: time(); + if ($published !== null && $updated !== null) { + $item->date = max($published, $updated); + } + else { + $item->date = $updated ?: $published; + } } /** diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/DateParser.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/DateParser.php index 89f189e7a..92d0012ac 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/DateParser.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/DateParser.php @@ -21,7 +21,7 @@ class DateParser */ public $timezone = 'UTC'; - /** + /** * Supported formats [ 'format' => length ] * * @access public @@ -60,9 +60,9 @@ class DateParser * * @access public * @param string $value Original date format - * @return integer Timestamp + * @return DateTime */ - public function getTimestamp($value) + public function getDateTime($value) { $value = trim($value); @@ -73,14 +73,13 @@ class DateParser $truncated_value = substr($truncated_value, 0, $length); } - $timestamp = $this->getValidDate($format, $truncated_value); - if ($timestamp > 0) { - return $timestamp; + $date = $this->getValidDate($format, $truncated_value); + if ($date !== false) { + return $date; } } - $date = new DateTime('now', new DateTimeZone($this->timezone)); - return $date->getTimestamp(); + return $this->getCurrentDateTime(); } /** @@ -89,7 +88,7 @@ class DateParser * @access public * @param string $format Date format * @param string $value Original date value - * @return integer Timestamp + * @return DateTime */ public function getValidDate($format, $value) { @@ -100,10 +99,21 @@ class DateParser $errors = DateTime::getLastErrors(); if ($errors['error_count'] === 0 && $errors['warning_count'] === 0) { - return $date->getTimestamp(); + return $date; } } - return 0; + return false; + } + + /** + * Get the current datetime + * + * @access public + * @return DateTime + */ + public function getCurrentDateTime() + { + return new DateTime('now', new DateTimeZone($this->timezone)); } } diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php index 74e9ab4da..93831e746 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Feed.php @@ -62,9 +62,9 @@ class Feed * Feed date * * @access public - * @var integer + * @var \DateTime */ - public $date = 0; + public $date = null; /** * Feed language @@ -100,10 +100,11 @@ class Feed { $output = ''; - foreach (array('id', 'title', 'feed_url', 'site_url', 'date', 'language', 'description', 'logo') as $property) { + foreach (array('id', 'title', 'feed_url', 'site_url', 'language', 'description', 'logo') as $property) { $output .= 'Feed::'.$property.' = '.$this->$property.PHP_EOL; } + $output .= 'Feed::date = '.$this->date->format(DATE_RFC822).PHP_EOL; $output .= 'Feed::isRTL() = '.($this->isRTL() ? 'true' : 'false').PHP_EOL; $output .= 'Feed::items = '.count($this->items).' items'.PHP_EOL; diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Item.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Item.php index 3642cccea..1585131c7 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Item.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Item.php @@ -63,9 +63,9 @@ class Item * Item date * * @access public - * @var integer + * @var \DateTime */ - public $date = 0; + public $date = null; /** * Item content @@ -109,10 +109,11 @@ class Item { $output = ''; - foreach (array('id', 'title', 'url', 'date', 'language', 'author', 'enclosure_url', 'enclosure_type') as $property) { + foreach (array('id', 'title', 'url', 'language', 'author', 'enclosure_url', 'enclosure_type') as $property) { $output .= 'Item::'.$property.' = '.$this->$property.PHP_EOL; } + $output .= 'Item::date = '.$this->date->format(DATE_RFC822).PHP_EOL; $output .= 'Item::isRTL() = '.($this->isRTL() ? 'true' : 'false').PHP_EOL; $output .= 'Item::content = '.strlen($this->content).' bytes'.PHP_EOL; diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php index da57327ed..16c66a016 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss10.php @@ -33,7 +33,7 @@ class Rss10 extends Rss20 */ public function findFeedDate(SimpleXMLElement $xml, Feed $feed) { - $feed->date = $this->date->getTimestamp(XmlParser::getNamespaceValue($xml->channel, $this->namespaces, 'date')); + $feed->date = $this->date->getDateTime(XmlParser::getNamespaceValue($xml->channel, $this->namespaces, 'date')); } /** diff --git a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php index 114308f51..b5fb09580 100644 --- a/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php +++ b/vendor/fguillot/picofeed/lib/PicoFeed/Parser/Rss20.php @@ -134,7 +134,7 @@ class Rss20 extends Parser public function findFeedDate(SimpleXMLElement $xml, Feed $feed) { $date = isset($xml->channel->pubDate) ? $xml->channel->pubDate : $xml->channel->lastBuildDate; - $feed->date = $this->date->getTimestamp((string) $date); + $feed->date = $this->date->getDateTime((string) $date); } /** @@ -156,7 +156,7 @@ class Rss20 extends Parser $date = (string) $entry->pubDate; } - $item->date = $this->date->getTimestamp($date); + $item->date = $this->date->getDateTime($da |