]> git.wh0rd.org - tt-rss.git/blobdiff - classes/feedparser.php
packed headlines: no point in using JSON here
[tt-rss.git] / classes / feedparser.php
index efef3bca41a0914c01b5f1c85e3588840ee95d2b..a5e406149d46062c620b60a6ce53738f0b0d13d8 100644 (file)
@@ -15,7 +15,11 @@ class FeedParser {
 
        function normalize_encoding($data) {
                if (preg_match('/^(<\?xml[\t\n\r ].*?encoding[\t\n\r ]*=[\t\n\r ]*["\'])(.+?)(["\'].*?\?>)/s', $data, $matches) === 1) {
-                       $data = mb_convert_encoding($data, 'UTF-8', $matches[2]);
+
+                       $encoding = strtolower($matches[2]);
+
+                       if (in_array($encoding, array_map('strtolower', mb_list_encodings())))
+                               $data = mb_convert_encoding($data, 'UTF-8', $encoding);
 
                        $data = preg_replace('/^<\?xml[\t\n\r ].*?\?>/s', $matches[1] . "UTF-8" . $matches[3] , $data);
                }
@@ -27,7 +31,6 @@ class FeedParser {
                libxml_use_internal_errors(true);
                libxml_clear_errors();
                $this->doc = new DOMDocument();
-               $this->doc->preserveWhiteSpace = false;
                $this->doc->loadXML($data);
 
                mb_substitute_character("none");
@@ -42,7 +45,6 @@ class FeedParser {
                                libxml_clear_errors();
 
                                $this->doc = new DOMDocument();
-                               $this->doc->preserveWhiteSpace = false;
                                $this->doc->loadXML($data);
 
                                $error = libxml_get_last_error();
@@ -66,7 +68,6 @@ class FeedParser {
                                                libxml_clear_errors();
 
                                                $this->doc = new DOMDocument();
-                                               $this->doc->preserveWhiteSpace = false;
                                                $this->doc->loadXML($data);
 
                                                $error = libxml_get_last_error();
@@ -118,6 +119,7 @@ class FeedParser {
                                        $this->type = $this::FEED_RSS;
                                        break;
                                case "feed":
+                               case "atom:feed":
                                        $this->type = $this::FEED_ATOM;
                                        break;
                                default:
@@ -143,9 +145,14 @@ class FeedParser {
 
                                $link = $xpath->query("//atom:feed/atom:link[not(@rel)]")->item(0);
 
+                               if (!$link)
+                                       $link = $xpath->query("//atom:feed/atom:link[@rel='alternate']")->item(0);
+
                                if (!$link)
                                        $link = $xpath->query("//atom03:feed/atom03:link[not(@rel)]")->item(0);
 
+                               if (!$link)
+                                       $link = $xpath->query("//atom03:feed/atom03:link[@rel='alternate']")->item(0);
 
                                if ($link && $link->hasAttributes()) {
                                        $this->link = $link->getAttribute("href");
@@ -208,6 +215,10 @@ class FeedParser {
                                break;
 
                        }
+
+                       if ($this->title) $this->title = trim($this->title);
+                       if ($this->link) $this->link = trim($this->link);
+
                } else {
                        if( !isset($this->error) ){
                                $this->error = "Unknown/unsupported feed type";
@@ -255,7 +266,7 @@ class FeedParser {
 
                        foreach ($links as $link) {
                                if (!$rel || $link->hasAttribute('rel') && $link->getAttribute('rel') == $rel) {
-                                       array_push($rv, $link->getAttribute('href'));
+                                       array_push($rv, trim($link->getAttribute('href')));
                                }
                        }
                        break;
@@ -264,7 +275,7 @@ class FeedParser {
 
                        foreach ($links as $link) {
                                if (!$rel || $link->hasAttribute('rel') && $link->getAttribute('rel') == $rel) {
-                                       array_push($rv, $link->getAttribute('href'));
+                                       array_push($rv, trim($link->getAttribute('href')));
                                }
                        }
                        break;
@@ -272,4 +283,4 @@ class FeedParser {
 
                return $rv;
        }
-} ?>
+}