From 19910df42e93ef370048e8d0d2609af71bf46676 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Mon, 22 Sep 2014 12:14:23 +0200 Subject: fix #454, allow global enhancers --- articleenhancer/enhancer.php | 21 ++++++++++-- articleenhancer/globalarticleenhancer.php | 56 +++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 articleenhancer/globalarticleenhancer.php (limited to 'articleenhancer') diff --git a/articleenhancer/enhancer.php b/articleenhancer/enhancer.php index 9aa2153d1..e0ad2ab2d 100644 --- a/articleenhancer/enhancer.php +++ b/articleenhancer/enhancer.php @@ -17,6 +17,7 @@ namespace OCA\News\ArticleEnhancer; class Enhancer { private $enhancers = []; + private $globalEnhancers = []; /** * @param string $feedUrl @@ -34,6 +35,16 @@ class Enhancer { } + /** + * Registers enhancers that are run for every item and after all previous + * enhancers have been run + * @param ArticleEnhancer $enhancer + */ + public function registerGlobalEnhancer (ArticleEnhancer $enhancer) { + $this->globalEnhancers[] = $enhancer; + } + + /** * @param \OCA\News\Db\Item $item * @param string $feedUrl @@ -43,10 +54,16 @@ class Enhancer { $feedUrl = $this->removeTrailingSlash($feedUrl); if(array_key_exists($feedUrl, $this->enhancers)) { - return $this->enhancers[$feedUrl]->enhance($item); + $result = $this->enhancers[$feedUrl]->enhance($item); } else { - return $item; + $result = $item; + } + + foreach ($this->globalEnhancers as $enhancer) { + $result = $enhancer->enhance($result); } + + return $result; } diff --git a/articleenhancer/globalarticleenhancer.php b/articleenhancer/globalarticleenhancer.php new file mode 100644 index 000000000..cfefb882b --- /dev/null +++ b/articleenhancer/globalarticleenhancer.php @@ -0,0 +1,56 @@ + + * @author Bernhard Posselt + * @copyright Alessandro Cosentino 2012 + * @copyright Bernhard Posselt 2012, 2014 + */ + +namespace OCA\News\ArticleEnhancer; + +use \OCA\News\Db\Item; + + +class GlobalArticleEnhancer implements ArticleEnhancer { + + + /** + * This method is run after all enhancers and for every item + */ + public function enhance(Item $item) { + $dom = new \DOMDocument(); + @$dom->loadHTML($item->getBody(), LIBXML_HTML_NOIMPLIED | + LIBXML_HTML_NODEFDTD); + $xpath = new \DOMXpath($dom); + + // remove youtube autoplay + // NOTE: PHP supports only XPath 1.0 so no matches() function :( + $youtubeIframes = "//iframe[contains(@src, 'youtube.com')]"; + + $elements = $xpath->query($youtubeIframes); + foreach ($elements as $element) { + + // src needs to be matched against regex to prevent false positives + // and because theres no XPath matches function available + $src = $element->getAttribute('src'); + $regex = '%^(http://|https://|//)(www\.)?youtube.com/.*autoplay=1.*%i'; + + if (preg_match($regex, $src)) { + $replaced = str_replace('autoplay=1', 'autoplay=0', $src); + $element->setAttribute('src', $replaced); + } + } + + // save all changes back to the item + $item->setBody(trim($dom->saveHTML())); + + return $item; + } + + +} \ No newline at end of file -- cgit v1.2.3