]> git.wh0rd.org - tt-rss.git/blobdiff - classes/feeditem/atom.php
fix previous to not crash if document first child is not a DOMElement or whatever
[tt-rss.git] / classes / feeditem / atom.php
index 7dc4ce5c1373cea87de139898b43ba87a4ad0afd..8c3e0f8a748b029b8c81b9df86cce89269efabdd 100644 (file)
@@ -1,10 +1,6 @@
 <?php
-class FeedItem_Atom {
-       private $elem;
-
-       function __construct($elem, $doc, $xpath) {
-               $this->elem = $elem;
-       }
+class FeedItem_Atom extends FeedItem_Common {
+       const NS_XML = "http://www.w3.org/XML/1998/namespace";
 
        function get_id() {
                $id = $this->elem->getElementsByTagName("id")->item(0);
@@ -22,14 +18,36 @@ class FeedItem_Atom {
                if ($updated) {
                        return strtotime($updated->nodeValue);
                }
+
+               $published = $this->elem->getElementsByTagName("published")->item(0);
+
+               if ($published) {
+                       return strtotime($published->nodeValue);
+               }
+
+               $date = $this->xpath->query("dc:date", $this->elem)->item(0);
+
+               if ($date) {
+                       return strtotime($date->nodeValue);
+               }
        }
 
+
        function get_link() {
                $links = $this->elem->getElementsByTagName("link");
 
                foreach ($links as $link) {
-                       if ($link && $link->hasAttribute("href") && !$link->hasAttribute("rel")) {
-                               return $link->getAttribute("href");
+                       if ($link && $link->hasAttribute("href") &&
+                               (!$link->hasAttribute("rel")
+                                       || $link->getAttribute("rel") == "alternate"
+                                       || $link->getAttribute("rel") == "standout")) {
+                               $base = $this->xpath->evaluate("string(ancestor-or-self::*[@xml:base][1]/@xml:base)", $link);
+
+                               if ($base)
+                                       return rewrite_relative_url($base, trim($link->getAttribute("href")));
+                               else
+                                       return trim($link->getAttribute("href"));
+
                        }
                }
        }
@@ -38,7 +56,7 @@ class FeedItem_Atom {
                $title = $this->elem->getElementsByTagName("title")->item(0);
 
                if ($title) {
-                       return $title->nodeValue;
+                       return trim($title->nodeValue);
                }
        }
 
@@ -46,25 +64,40 @@ class FeedItem_Atom {
                $content = $this->elem->getElementsByTagName("content")->item(0);
 
                if ($content) {
-                       return $content->nodeValue;
-               }
-       }
-
-       function get_description() {
-               $summary = $this->elem->getElementsByTagName("summary")->item(0);
+                       if ($content->hasAttribute('type')) {
+                               if ($content->getAttribute('type') == 'xhtml') {
+                                       for ($i = 0; $i < $content->childNodes->length; $i++) {
+                                               $child = $content->childNodes->item($i);
+
+                                               if ($child->hasChildNodes()) {
+                                                       return $this->doc->saveHTML($child);
+                                               }
+                                       }
+                               }
+                       }
 
-               if ($summary) {
-                       return $summary->nodeValue;
+                       return $this->subtree_or_text($content);
                }
        }
 
-       // todo
-       function get_comments_url() {
+       function get_description() {
+               $content = $this->elem->getElementsByTagName("summary")->item(0);
 
-       }
+               if ($content) {
+                       if ($content->hasAttribute('type')) {
+                               if ($content->getAttribute('type') == 'xhtml') {
+                                       for ($i = 0; $i < $content->childNodes->length; $i++) {
+                                               $child = $content->childNodes->item($i);
+
+                                               if ($child->hasChildNodes()) {
+                                                       return $this->doc->saveHTML($child);
+                                               }
+                                       }
+                               }
+                       }
 
-       // todo
-       function get_comments_count() {
+                       return $this->subtree_or_text($content);
+               }
 
        }
 
@@ -74,9 +107,14 @@ class FeedItem_Atom {
 
                foreach ($categories as $cat) {
                        if ($cat->hasAttribute("term"))
-                               array_push($cats, $cat->getAttribute("term"));
+                               array_push($cats, trim($cat->getAttribute("term")));
                }
 
+               $categories = $this->xpath->query("dc:subject", $this->elem);
+
+               foreach ($categories as $cat) {
+                       array_push($cats, trim($cat->nodeValue));
+               }
 
                return $cats;
        }
@@ -100,22 +138,78 @@ class FeedItem_Atom {
                        }
                }
 
-               return $encs;
-       }
+               $enclosures = $this->xpath->query("media:content", $this->elem);
+
+               foreach ($enclosures as $enclosure) {
+                       $enc = new FeedEnclosure();
 
-       function get_author() {
-               $author = $this->elem->getElementsByTagName("author")->item(0);
+                       $enc->type = $enclosure->getAttribute("type");
+                       $enc->link = $enclosure->getAttribute("url");
+                       $enc->length = $enclosure->getAttribute("length");
+                       $enc->height = $enclosure->getAttribute("height");
+                       $enc->width = $enclosure->getAttribute("width");
+
+                       $desc = $this->xpath->query("media:description", $enclosure)->item(0);
+                       if ($desc) $enc->title = strip_tags($desc->nodeValue);
+
+                       array_push($encs, $enc);
+               }
 
-               if ($author) {
-                       $name = $author->getElementsByTagName("name")->item(0);
 
-                       if ($name) return $name->nodeValue;
+               $enclosures = $this->xpath->query("media:group", $this->elem);
 
-                       $email = $author->getElementsByTagName("email")->item(0);
+               foreach ($enclosures as $enclosure) {
+                       $enc = new FeedEnclosure();
 
-                       if ($email) return $email->nodeValue;
+                       $content = $this->xpath->query("media:content", $enclosure)->item(0);
+
+                       if ($content) {
+                               $enc->type = $content->getAttribute("type");
+                               $enc->link = $content->getAttribute("url");
+                               $enc->length = $content->getAttribute("length");
+                               $enc->height = $content->getAttribute("height");
+                               $enc->width = $content->getAttribute("width");
+
+                               $desc = $this->xpath->query("media:description", $content)->item(0);
+                               if ($desc) {
+                                       $enc->title = strip_tags($desc->nodeValue);
+                               } else {
+                                       $desc = $this->xpath->query("media:description", $enclosure)->item(0);
+                                       if ($desc) $enc->title = strip_tags($desc->nodeValue);
+                               }
+
+                               array_push($encs, $enc);
+                       }
+               }
 
+               $enclosures = $this->xpath->query("media:thumbnail", $this->elem);
+
+               foreach ($enclosures as $enclosure) {
+                       $enc = new FeedEnclosure();
+
+                       $enc->type = "image/generic";
+                       $enc->link = $enclosure->getAttribute("url");
+                       $enc->height = $enclosure->getAttribute("height");
+                       $enc->width = $enclosure->getAttribute("width");
+
+                       array_push($encs, $enc);
+               }
+
+               return $encs;
+       }
+
+       function get_language() {
+               $lang = $this->elem->getAttributeNS(self::NS_XML, "lang");
+
+               if (!empty($lang)) {
+                       return $lang;
+               } else {
+                       // Fall back to the language declared on the feed, if any.
+                       foreach ($this->doc->childNodes as $child) {
+                               if (method_exists($child, "getAttributeNS")) {
+                                       return $child->getAttributeNS(self::NS_XML, "lang");
+                               }
+                       }
                }
        }
 }
-?>