diff --git a/lib/Feed.php b/lib/Feed.php index 9b4ab2e..ad0af3d 100644 --- a/lib/Feed.php +++ b/lib/Feed.php @@ -104,30 +104,50 @@ class Feed { } else { $f->titleContentHash = hash('sha256', $f->title.$content); } - // If there is an Atom id element use it as the id. $id = (string)$f->xml->children('http://www.w3.org/2005/Atom')->id; if ($id !== '') { $f->id = hash('sha256', $id); continue; } - // If there is a guid element use it as the id. $id = (string)$f->xml->guid; if ($id !== '') { $f->id = hash('sha256', $id); continue; } - // If there is a Dublin Core identifier use it. $id = (string)$f->xml->children('http://purl.org/dc/elements/1.1/')->identifier; if ($id !== '') { $f->id = hash('sha256', $id); continue; } - // If there aren't any of those there is no id. $f->id = null; + + // PicoFeed also doesn't gather up categories, so we do this as well + $f->categories = []; + // first add Atom categories + foreach($f->xml->children('http://www.w3.org/2005/Atom')->category as $c) { + // if the category has a label, use that + $name = (string) $c->attributes()->label; + // otherwise use the term + if(!strlen($name)) $name = (string) $c->attributes()->term; + // ... assuming it has that much + if(strlen($name)) $f->categories[] = $name; + } + // next add RSS2 categories + foreach($f->xml->children()->category as $c) { + $name = (string) $c; + if(strlen($name)) $f->categories[] = $name; + } + // and finally try Dublin Core subjects + foreach($f->xml->children('http://purl.org/dc/elements/1.1/')->subject as $c) { + $name = (string) $c; + if(strlen($name)) $f->categories[] = $name; + } + //sort the results + sort($f->categories); } $this->data = $feed; return true; diff --git a/tests/Feed/TestFeed.php b/tests/Feed/TestFeed.php index 9bb5e91..4f062af 100644 --- a/tests/Feed/TestFeed.php +++ b/tests/Feed/TestFeed.php @@ -117,6 +117,14 @@ class TestFeed extends \PHPUnit\Framework\TestCase { $this->assertSame(null, $f->data->items[3]->id); $this->assertSame(null, $f->data->items[4]->id); $this->assertSame(null, $f->data->items[5]->id); + // check categories + $categories = [ + "Aniki!", + "Beams", + "Bodybuilders", + "Men", + ]; + $this->assertSame($categories, $f->data->items[5]->categories); } function testParseEntityExpansionAttack() { diff --git a/tests/docroot/Feed/Parsing/Valid.php b/tests/docroot/Feed/Parsing/Valid.php index e4c179b..8e0a3ca 100644 --- a/tests/docroot/Feed/Parsing/Valid.php +++ b/tests/docroot/Feed/Parsing/Valid.php @@ -28,6 +28,10 @@ Example content + Men + + + Bodybuilders