summaryrefslogtreecommitdiff
path: root/classes/feeditem
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2016-01-23 01:48:32 +0300
committerAndrew Dolgov <[email protected]>2016-01-23 01:48:32 +0300
commit7d1e15c396f36c261d0c8067fc316f6c3e8e1948 (patch)
tree900a332a2b5ddfef8e3c9075570275fc3ef0d05f /classes/feeditem
parentd2bb392bae5d3de97e1e99bc810524e149c5c199 (diff)
parser: properly support tag subtrees instead of text content for article content
Diffstat (limited to 'classes/feeditem')
-rw-r--r--classes/feeditem/atom.php4
-rw-r--r--classes/feeditem/common.php11
-rw-r--r--classes/feeditem/rss.php10
3 files changed, 19 insertions, 6 deletions
diff --git a/classes/feeditem/atom.php b/classes/feeditem/atom.php
index dfac7149f..e132789ba 100644
--- a/classes/feeditem/atom.php
+++ b/classes/feeditem/atom.php
@@ -75,7 +75,7 @@ class FeedItem_Atom extends FeedItem_Common {
}
}
- return $content->nodeValue;
+ return $this->subtree_or_text($content);
}
}
@@ -95,7 +95,7 @@ class FeedItem_Atom extends FeedItem_Common {
}
}
- return $content->nodeValue;
+ return $this->subtree_or_text($content);
}
}
diff --git a/classes/feeditem/common.php b/classes/feeditem/common.php
index 80bebf8fb..070692d7f 100644
--- a/classes/feeditem/common.php
+++ b/classes/feeditem/common.php
@@ -70,6 +70,17 @@ abstract class FeedItem_Common extends FeedItem {
}
}
+ function count_children($node) {
+ return $node->getElementsByTagName("*")->length;
+ }
+
+ function subtree_or_text($node) {
+ if ($this->count_children($node) == 0) {
+ return $node->nodeValue;
+ } else {
+ return $node->c14n();
+ }
+ }
}
?>
diff --git a/classes/feeditem/rss.php b/classes/feeditem/rss.php
index 27a364b81..080e4083a 100644
--- a/classes/feeditem/rss.php
+++ b/classes/feeditem/rss.php
@@ -71,17 +71,19 @@ class FeedItem_RSS extends FeedItem_Common {
$contentB = $this->elem->getElementsByTagName("description")->item(0);
if ($contentA && !$contentB) {
- return $contentA->nodeValue;
+ return $this->subtree_or_text($contentA);
}
if ($contentB && !$contentA) {
- return $contentB->nodeValue;
+ return $this->subtree_or_text($contentB);
}
if ($contentA && $contentB) {
- return mb_strlen($contentA->nodeValue) > mb_strlen($contentB->nodeValue) ?
- $contentA->nodeValue : $contentB->nodeValue;
+ $resultA = $this->subtree_or_text($contentA);
+ $resultB = $this->subtree_or_text($contentB);
+
+ return mb_strlen($resultA) > mb_strlen($resultB) ? $resultA : $resultB;
}
}