Fix bug for atom items without date and add grabber rules

This commit is contained in:
Frederic Guillot 2015-03-02 22:31:20 -05:00
parent 580dd1f7b7
commit ec95d8699d
13 changed files with 187 additions and 25 deletions

2
vendor/autoload.php vendored
View File

@ -4,4 +4,4 @@
require_once __DIR__ . '/composer' . '/autoload_real.php';
return ComposerAutoloaderInit32c1e5caea1303c23c9e3aeeb4850b2e::getLoader();
return ComposerAutoloaderInit093c65b5382fc7317d870fcd9f8036ba::getLoader();

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit32c1e5caea1303c23c9e3aeeb4850b2e
class ComposerAutoloaderInit093c65b5382fc7317d870fcd9f8036ba
{
private static $loader;
@ -19,9 +19,9 @@ class ComposerAutoloaderInit32c1e5caea1303c23c9e3aeeb4850b2e
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit32c1e5caea1303c23c9e3aeeb4850b2e', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit093c65b5382fc7317d870fcd9f8036ba', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInit32c1e5caea1303c23c9e3aeeb4850b2e', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit093c65b5382fc7317d870fcd9f8036ba', 'loadClassLoader'));
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
@ -42,14 +42,14 @@ class ComposerAutoloaderInit32c1e5caea1303c23c9e3aeeb4850b2e
$includeFiles = require __DIR__ . '/autoload_files.php';
foreach ($includeFiles as $file) {
composerRequire32c1e5caea1303c23c9e3aeeb4850b2e($file);
composerRequire093c65b5382fc7317d870fcd9f8036ba($file);
}
return $loader;
}
}
function composerRequire32c1e5caea1303c23c9e3aeeb4850b2e($file)
function composerRequire093c65b5382fc7317d870fcd9f8036ba($file)
{
require $file;
}

View File

@ -162,12 +162,12 @@
"source": {
"type": "git",
"url": "https://github.com/fguillot/picoFeed.git",
"reference": "da9c8df79c76b00e2e7c16ae12f768117164a838"
"reference": "a006fc10642fbdc5414bebd6542aeabd35f8c98b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/fguillot/picoFeed/zipball/da9c8df79c76b00e2e7c16ae12f768117164a838",
"reference": "da9c8df79c76b00e2e7c16ae12f768117164a838",
"url": "https://api.github.com/repos/fguillot/picoFeed/zipball/a006fc10642fbdc5414bebd6542aeabd35f8c98b",
"reference": "a006fc10642fbdc5414bebd6542aeabd35f8c98b",
"shasum": ""
},
"require": {
@ -178,7 +178,7 @@
"ext-xml": "*",
"php": ">=5.3.0"
},
"time": "2015-03-01 23:58:00",
"time": "2015-03-03 03:14:01",
"type": "library",
"installation-source": "dist",
"autoload": {

View File

@ -138,16 +138,20 @@ class Atom extends Parser
* Find the item date
*
* @access public
* @param SimpleXMLElement $entry Feed item
* @param Item $item Item object
* @param SimpleXMLElement $entry Feed item
* @param Item $item Item object
* @param \PicoFeed\Parser\Feed $feed Feed object
*/
public function findItemDate(SimpleXMLElement $entry, Item $item)
public function findItemDate(SimpleXMLElement $entry, Item $item, Feed $feed)
{
$published = isset($entry->published) ? $this->date->getDateTime((string) $entry->published) : null;
$updated = isset($entry->updated) ? $this->date->getDateTime((string) $entry->updated) : null;
if ($published !== null && $updated !== null) {
$item->date = max($published, $updated);
if ($published === null && $updated === null) {
$item->date = $feed->getDate(); // We use the feed date if there is no date for the item
}
else if ($published !== null && $updated !== null) {
$item->date = max($published, $updated); // We use the most recent date between published and updated
}
else {
$item->date = $updated ?: $published;

View File

@ -164,7 +164,7 @@ abstract class Parser
// Id generation can use the item url/title/content (order is important)
$this->findItemId($entry, $item, $feed);
$this->findItemDate($entry, $item);
$this->findItemDate($entry, $item, $feed);
$this->findItemEnclosure($entry, $item, $feed);
$this->findItemLanguage($entry, $item, $feed);
@ -333,7 +333,7 @@ abstract class Parser
if ($timezone) {
$this->date->timezone = $timezone;
}
return $this;
}
@ -532,9 +532,10 @@ abstract class Parser
*
* @access public
* @param SimpleXMLElement $entry Feed item
* @param \PicoFeed\Parser\Item $item Item object
* @param Item $item Item object
* @param \PicoFeed\Parser\Feed $feed Feed object
*/
public abstract function findItemDate(SimpleXMLElement $entry, Item $item);
public abstract function findItemDate(SimpleXMLElement $entry, Item $item, Feed $feed);
/**
* Find the item content

View File

@ -142,9 +142,10 @@ class Rss20 extends Parser
*
* @access public
* @param SimpleXMLElement $entry Feed item
* @param \PicoFeed\Parser\Item $item Item object
* @param Item $item Item object
* @param \PicoFeed\Parser\Feed $feed Feed object
*/
public function findItemDate(SimpleXMLElement $entry, Item $item)
public function findItemDate(SimpleXMLElement $entry, Item $item, Feed $feed)
{
$date = XmlParser::getNamespaceValue($entry, $this->namespaces, 'date');
@ -156,7 +157,7 @@ class Rss20 extends Parser
$date = (string) $entry->pubDate;
}
$item->date = $this->date->getDateTime($date);
$item->date = empty($date) ? $feed->getDate() : $this->date->getDateTime($date);
}
/**

View File

@ -0,0 +1,15 @@
<?php
return array(
'test_url' => 'http://dailyjs.com/2014/08/07/p5js/',
'body' => array(
'//div[@id="post"]',
),
'strip' => array(
'//h2[@class="post"]',
'//div[@class="meta"]',
'//*[contains(@class, "addthis_toolbox")]',
'//*[contains(@class, "addthis_default_style")]',
'//*[@class="navigation small"]',
'//*[@id="related"]',
)
);

View File

@ -0,0 +1,12 @@
<?php
return array(
'test_url' => 'http://putaindecode.fr/posts/js/etat-lieux-js-modulaire-front/',
'body' => array(
'//*[@class="putainde-Post-md"]',
),
'strip' => array(
'//*[contains(@class, "inlineimg")]',
'//*[contains(@class, "comment-respond")]',
'//header'
)
);

View File

@ -2,8 +2,16 @@
return array(
'test_url' => 'http://www.developpez.com/actu/81757/Mozilla-annonce-la-disponibilite-de-Firefox-36-qui-passe-au-HTTP-2-et-permet-la-synchronisation-de-son-ecran-d-accueil/',
'body' => array(
'//div[@itemprop="articleBody"]',
'//*[@itemprop="articleBody"]',
),
'strip' => array(
'//form',
'//div[@class="content"]/img',
'//a[last()]/following-sibling::*',
'//*[contains(@class,"actuTitle")]',
'//*[contains(@class,"date")]',
'//*[contains(@class,"inlineimg")]',
'//*[@id="signaler"]',
'//*[@id="signalerFrame"]',
)
);

View File

@ -124,6 +124,10 @@ class AtomParserTest extends PHPUnit_Framework_TestCase
$parser = new Atom(file_get_contents('tests/fixtures/atomsample.xml'));
$feed = $parser->execute();
$this->assertEquals(1071340202, $feed->getDate()->getTimestamp(), '', 1);
$parser = new Atom(file_get_contents('tests/fixtures/duesseldorf_lokalzeit.rdf'));
$feed = $parser->execute();
$this->assertEquals('2015-01-05', $feed->getDate()->format('Y-m-d'));
}
public function testFeedLanguage()
@ -193,6 +197,11 @@ class AtomParserTest extends PHPUnit_Framework_TestCase
public function testItemDate()
{
$parser = new Atom(file_get_contents('tests/fixtures/duesseldorf_lokalzeit.rdf'));
$feed = $parser->execute();
$this->assertNotEmpty($feed->items);
$this->assertEquals('2015-01-05', $feed->items[4]->getDate()->format('Y-m-d'));
$parser = new Atom(file_get_contents('tests/fixtures/atom.xml'));
$feed = $parser->execute();
$this->assertNotEmpty($feed->items);

View File

@ -12,6 +12,7 @@ class DateParserTest extends PHPUnit_Framework_TestCase
date_default_timezone_set('UTC');
$this->assertEquals('2013-04-12', $parser->getDateTime('Fri, 12 Apr 2013 15:38:15 +0000')->format('Y-m-d'));
$this->assertEquals(1359066183, $parser->getDateTime('Thu, 24 Jan 2013 22:23:03 +0000')->getTimestamp(), '', 1);
$this->assertEquals(1362992761, $parser->getDateTime('2013-03-11T09:06:01+00:00')->getTimestamp(), '', 1);
$this->assertEquals(1363752990, $parser->getDateTime('2013-03-20T04:16:30+00:00')->getTimestamp(), '', 1);

View File

@ -172,12 +172,12 @@ class Rss20ParserTest extends PHPUnit_Framework_TestCase
$parser = new Rss20(file_get_contents('tests/fixtures/rss20.xml'));
$feed = $parser->execute();
$this->assertNotEmpty($feed->items);
$this->assertEquals(1357006940, $feed->items[1]->getDate()->getTimestamp());
$this->assertEquals('2013-01-01', $feed->items[1]->getDate()->format('Y-m-d'));
$parser = new Rss20(file_get_contents('tests/fixtures/fulltextrss.xml'));
$feed = $parser->execute();
$this->assertNotEmpty($feed->items);
$this->assertEquals(1365781095, $feed->items[0]->getDate()->getTimestamp());
$this->assertEquals('2013-04-12', $feed->items[0]->getDate()->format('Y-m-d'));
}
public function testItemLanguage()

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<title>Studio Düsseldorf - NRW-Studios WDR</title>
<link rel="alternate" type="text/html" href="http://www1.wdr.de/studio/duesseldorf/studioduesseldorf-homepage100.html" />
<link rel="self" href="http://www1.wdr.de/studio/duesseldorf/studioduesseldorf-homepage100.feed" />
<updated>2015-01-05T08:18:00Z</updated>
<dc:date>2015-01-05T08:18:00Z</dc:date>
<entry>
<title>Lokalzeit aus Düsseldorf: Unsere Themen am Montag, 02.03.2015</title>
<link rel="alternate" href="http://www1.wdr.de/studio/duesseldorf/lokalzeit/studioduesseldorf-lokalzeit100.html" />
<author>
<name>NRW-Studios</name>
</author>
<id>http://www1.wdr.de/studio/duesseldorf/lokalzeit/studioduesseldorf-lokalzeit100.html</id>
<updated>2015-02-05T11:15:00Z</updated>
<published>2015-02-05T11:15:00Z</published>
<content type="html">Umstrittene Dügida-Urteile&lt;br/&gt;&lt;br/&gt;Ein preisgekröntes Fachwerkhaus</content>
<summary>Umstrittene Dügida-UrteileEin preisgekröntes Fachwerkhaus</summary>
<dc:creator>NRW-Studios</dc:creator>
<dc:date>2015-02-05T11:15:00Z</dc:date>
<dc:type>Nachricht</dc:type>
</entry>
<entry>
<title>Neues Kennzeichen im Kreis Viersen: Großes Interesse an „KK“</title>
<link rel="alternate" href="http://www1.wdr.de/studio/duesseldorf/themadestages/kennzeichen-kreis-viersen100.html" />
<author>
<name>NRW-Studios</name>
</author>
<id>http://www1.wdr.de/studio/duesseldorf/themadestages/kennzeichen-kreis-viersen100.html</id>
<updated>2015-03-02T09:01:00Z</updated>
<published>2015-03-02T09:01:00Z</published>
<content type="html">Bürger im Kreis Viersen können ihre Autos ab sofort wieder mit dem früheren Kennzeichen KK zulassen. Rund 7.000 Mal sind bereits im Vorfeld Wunschkennzeichen reserviert worden. Am Morgen bildeten sich vor dem Straßenverkehrsamt in Kempen bereits längere Schlangen.</content>
<summary>Bürger im Kreis Viersen können ihre Autos ab sofort wieder mit dem früheren Kennzeichen KK zulassen. Rund 7.000 Mal sind bereits im Vorfeld Wunschkennzeichen reserviert worden. Am Morgen bildeten sich vor dem Straßenverkehrsamt in Kempen bereits längere Schlangen.</summary>
<dc:creator>NRW-Studios</dc:creator>
<dc:date>2015-03-02T09:01:00Z</dc:date>
<dc:type>Nachricht</dc:type>
</entry>
<entry>
<title>Tarifstreit: Eine Woche voller Streiks</title>
<link rel="alternate" href="http://www1.wdr.de/studio/essen/themadestages/streikwoche100.html" />
<author>
<name>NRW-Studios</name>
</author>
<id>http://www1.wdr.de/studio/essen/themadestages/streikwoche100.html</id>
<updated>2015-03-02T13:15:00Z</updated>
<published>2015-03-02T13:15:00Z</published>
<content type="html">Geduld ist in dieser Woche an vielen Krankenhäusern, aber auch an Gerichten und bei Behörden im Ruhrgebiet gefragt. Die Gewerkschaft ver.di hat die Angestellten im öffentlichen Dienst zu Warnstreiks aufgerufen. Von morgen an legen auch angestellte Lehrer ihre Arbeit nieder.</content>
<summary>Geduld ist in dieser Woche an vielen Krankenhäusern, aber auch an Gerichten und bei Behörden im Ruhrgebiet gefragt. Die Gewerkschaft ver.di hat die Angestellten im öffentlichen Dienst zu Warnstreiks aufgerufen. Von morgen an legen auch angestellte Lehrer ihre Arbeit nieder.</summary>
<dc:creator>NRW-Studios</dc:creator>
<dc:date>2015-03-02T13:15:00Z</dc:date>
<dc:type>Nachricht</dc:type>
</entry>
<entry>
<title>Die neue WDR-App macht vieles möglich: Filme gucken, Bilder schicken</title>
<link rel="alternate" href="http://www1.wdr.de/studio/duesseldorf/themadestages/wdr-app100.html" />
<author>
<name>NRW-Studios</name>
</author>
<id>http://www1.wdr.de/studio/duesseldorf/themadestages/wdr-app100.html</id>
<updated>2015-02-13T15:06:00Z</updated>
<published>2015-02-13T15:06:00Z</published>
<content type="html">Mit der neuen WDR-App können Sie Fotos, Videos, Texte und Audio-Aufnahmen direkt an den WDR schicken. Und: Holen Sie sich alle WDR Hörfunkprogramme und das WDR Fernsehen auf Ihr Smartphone oder Tablet!</content>
<summary>Mit der neuen WDR-App können Sie Fotos, Videos, Texte und Audio-Aufnahmen direkt an den WDR schicken. Und: Holen Sie sich alle WDR Hörfunkprogramme und das WDR Fernsehen auf Ihr Smartphone oder Tablet!</summary>
<dc:creator>NRW-Studios</dc:creator>
<dc:date>2015-02-13T15:06:00Z</dc:date>
<dc:type>Nachricht</dc:type>
</entry>
<entry>
<title>Die Lokalzeit Düsseldorf bei Facebook: Bleiben Sie mit uns in Kontakt!</title>
<link rel="alternate" href="https://www.facebook.com/wdrlokalzeitduesseldorf" />
<author>
<name>NRW-Studios</name>
</author>
<id>https://www.facebook.com/wdrlokalzeitduesseldorf</id>
<content type="html">Halb acht am Abend, von Montag bis Freitag - ihre Lokalzeit aus Düsseldorf. Alles Wichtige vom Tag gibts bei uns. Über die Themen aus Düsseldorf und der Region diskutieren wir mit Ihnen außerdem auf unserer Facebook-Seite.</content>
<summary>Halb acht am Abend, von Montag bis Freitag - ihre Lokalzeit aus Düsseldorf. Alles Wichtige vom Tag gibts bei uns. Über die Themen aus Düsseldorf und der Region diskutieren wir mit Ihnen außerdem auf unserer Facebook-Seite.</summary>
<dc:creator>NRW-Studios</dc:creator>
<dc:type>Nachricht</dc:type>
</entry>
<entry>
<title>Beiträge aus dem Studio Düsseldorf: Ihre Region im Überblick</title>
<link rel="alternate" href="http://www1.wdr.de/studio/duesseldorf/themadestages/archiv/themadestages-duesseldorf104.html" />
<author>
<name>NRW-Studios</name>
</author>
<id>http://www1.wdr.de/studio/duesseldorf/themadestages/archiv/themadestages-duesseldorf104.html</id>
<updated>2015-01-19T08:58:00Z</updated>
<published>2015-01-19T08:58:00Z</published>
<content type="html">Hier finden Sie die wichtigsten Themen, über die wir in den vergangenen Tagen und Wochen berichtet haben, nochmal zum Nachlesen, - hören und -schauen.</content>
<summary>Hier finden Sie die wichtigsten Themen, über die wir in den vergangenen Tagen und Wochen berichtet haben, nochmal zum Nachlesen, - hören und -schauen.</summary>
<dc:creator>NRW-Studios</dc:creator>
<dc:date>2015-01-19T08:58:00Z</dc:date>
<dc:type>Nachricht</dc:type>
</entry>
<entry>
<title>Alles tanzt - rund um Düsseldorf: Die schönsten Bilder und Videos</title>
<link rel="alternate" href="http://www1.wdr.de/studio/duesseldorf/lokalzeit/studioduesseldorf_tanzaktion100.html" />
<author>
<name>NRW-Studios</name>
</author>
<id>http://www1.wdr.de/studio/duesseldorf/lokalzeit/studioduesseldorf_tanzaktion100.html</id>
<updated>2013-11-22T15:55:00Z</updated>
<published>2013-11-22T15:55:00Z</published>
<content type="html">In unserer Weihnachtsaktion wollten wir mit Ihnen gemeinsam tanzen. Sie haben mitgemacht und uns dabei wirklich beeindruckt! Eishockeyspieler, Gärtner, Rollkunstläufer oder Busfahrer - alle haben sie zusammen mit unserer Reporterin Regina Bremer getanzt.</content>
<summary>In unserer Weihnachtsaktion wollten wir mit Ihnen gemeinsam tanzen. Sie haben mitgemacht und uns dabei wirklich beeindruckt! Eishockeyspieler, Gärtner, Rollkunstläufer oder Busfahrer - alle haben sie zusammen mit unserer Reporterin Regina Bremer getanzt.</summary>
<dc:creator>NRW-Studios</dc:creator>
<dc:date>2013-11-22T15:55:00Z</dc:date>
<dc:type>Nachricht</dc:type>
</entry>
</feed>