]> git.wh0rd.org - tt-rss.git/blobdiff - classes/feeditem/rss.php
minor css fixes (mostly for zoom mode)
[tt-rss.git] / classes / feeditem / rss.php
old mode 100644 (file)
new mode 100755 (executable)
index d566710..6bb2721
@@ -1,11 +1,5 @@
 <?php
-class FeedItem_RSS {
-       private $elem;
-
-       function __construct($elem) {
-               $this->elem = $elem;
-       }
-
+class FeedItem_RSS extends FeedItem_Common {
        function get_id() {
                $id = $this->elem->getElementsByTagName("guid")->item(0);
 
@@ -22,48 +16,83 @@ class FeedItem_RSS {
                if ($pubDate) {
                        return strtotime($pubDate->nodeValue);
                }
+
+               $date = $this->xpath->query("dc:date", $this->elem)->item(0);
+
+               if ($date) {
+                       return strtotime($date->nodeValue);
+               }
        }
 
        function get_link() {
+               $links = $this->xpath->query("atom:link", $this->elem);
+
+               foreach ($links as $link) {
+                       if ($link && $link->hasAttribute("href") &&
+                               (!$link->hasAttribute("rel")
+                                       || $link->getAttribute("rel") == "alternate"
+                                       || $link->getAttribute("rel") == "standout")) {
+
+                               return trim($link->getAttribute("href"));
+                       }
+               }
+
+               $link = $this->elem->getElementsByTagName("guid")->item(0);
+
+               if ($link && $link->hasAttributes() && $link->getAttribute("isPermaLink") == "true") {
+                       return trim($link->nodeValue);
+               }
+
                $link = $this->elem->getElementsByTagName("link")->item(0);
 
                if ($link) {
-                       return $link->nodeValue;
+                       return trim($link->nodeValue);
                }
        }
 
        function get_title() {
+               $title = $this->xpath->query("title", $this->elem)->item(0);
+
+               if ($title) {
+                       return trim($title->nodeValue);
+               }
+
+               // if the document has a default namespace then querying for
+               // title would fail because of reasons so let's try the old way
                $title = $this->elem->getElementsByTagName("title")->item(0);
 
                if ($title) {
-                       return $title->nodeValue;
+                       return trim($title->nodeValue);
                }
        }
 
        function get_content() {
-               $content = $this->elem->getElementsByTagName("description")->item(0);
+               $contentA = $this->xpath->query("content:encoded", $this->elem)->item(0);
+               $contentB = $this->elem->getElementsByTagName("description")->item(0);
 
-               if ($content) {
-                       return $content->nodeValue;
+               if ($contentA && !$contentB) {
+                       return $this->subtree_or_text($contentA);
                }
-       }
 
-       function get_description() {
-               $summary = $this->elem->getElementsByTagName("description")->item(0);
 
-               if ($summary) {
-                       return $summary->nodeValue;
+               if ($contentB && !$contentA) {
+                       return $this->subtree_or_text($contentB);
                }
-       }
 
-       // todo
-       function get_comments_url() {
+               if ($contentA && $contentB) {
+                       $resultA = $this->subtree_or_text($contentA);
+                       $resultB = $this->subtree_or_text($contentB);
 
+                       return mb_strlen($resultA) > mb_strlen($resultB) ? $resultA : $resultB;
+               }
        }
 
-       // todo
-       function get_comments_count() {
+       function get_description() {
+               $summary = $this->elem->getElementsByTagName("description")->item(0);
 
+               if ($summary) {
+                       return $summary->nodeValue;
+               }
        }
 
        function get_categories() {
@@ -71,7 +100,13 @@ class FeedItem_RSS {
                $cats = array();
 
                foreach ($categories as $cat) {
-                       array_push($cats, $cat->nodeValue);
+                       array_push($cats, trim($cat->nodeValue));
+               }
+
+               $categories = $this->xpath->query("dc:subject", $this->elem);
+
+               foreach ($categories as $cat) {
+                       array_push($cats, trim($cat->nodeValue));
                }
 
                return $cats;
@@ -88,26 +123,25 @@ class FeedItem_RSS {
                        $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");
 
                        array_push($encs, $enc);
                }
 
+               $encs = array_merge($encs, parent::get_enclosures());
+
                return $encs;
        }
 
-       function get_author() {
-               $author = $this->elem->getElementsByTagName("author")->item(0);
-
-               if ($author) {
-                       $name = $author->getElementsByTagName("name")->item(0);
-
-                       if ($name) return $name->nodeValue;
-
-                       $email = $author->getElementsByTagName("email")->item(0);
-
-                       if ($email) return $email->nodeValue;
+       function get_language() {
+               $languages = $this->doc->getElementsByTagName('language');
 
+               if (count($languages) == 0) {
+                       return "";
                }
+
+               return $languages[0]->textContent;
        }
+
 }
-?>