From 901dd67a1a756f5c4e03cc452c40b39584184474 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 17 Feb 2014 13:00:25 +0400 Subject: af_comics: split filters to separate files to ease maintenance --- plugins/af_comics/af_comics_template.php | 14 + plugins/af_comics/filter_base.php | 6 + plugins/af_comics/filters/af_comics_cad.php | 39 +++ plugins/af_comics/filters/af_comics_comicpress.php | 50 ++++ plugins/af_comics/filters/af_comics_dilbert.php | 52 ++++ plugins/af_comics/filters/af_comics_explosm.php | 49 ++++ plugins/af_comics/filters/af_comics_gocomics.php | 62 +++++ plugins/af_comics/filters/af_comics_pa.php | 89 ++++++ plugins/af_comics/filters/af_comics_twp.php | 39 +++ plugins/af_comics/init.php | 308 +++------------------ 10 files changed, 432 insertions(+), 276 deletions(-) create mode 100644 plugins/af_comics/af_comics_template.php create mode 100644 plugins/af_comics/filter_base.php create mode 100644 plugins/af_comics/filters/af_comics_cad.php create mode 100644 plugins/af_comics/filters/af_comics_comicpress.php create mode 100644 plugins/af_comics/filters/af_comics_dilbert.php create mode 100644 plugins/af_comics/filters/af_comics_explosm.php create mode 100644 plugins/af_comics/filters/af_comics_gocomics.php create mode 100644 plugins/af_comics/filters/af_comics_pa.php create mode 100644 plugins/af_comics/filters/af_comics_twp.php diff --git a/plugins/af_comics/af_comics_template.php b/plugins/af_comics/af_comics_template.php new file mode 100644 index 000000000..117d69280 --- /dev/null +++ b/plugins/af_comics/af_comics_template.php @@ -0,0 +1,14 @@ + diff --git a/plugins/af_comics/filter_base.php b/plugins/af_comics/filter_base.php new file mode 100644 index 000000000..a53430645 --- /dev/null +++ b/plugins/af_comics/filter_base.php @@ -0,0 +1,6 @@ + diff --git a/plugins/af_comics/filters/af_comics_cad.php b/plugins/af_comics/filters/af_comics_cad.php new file mode 100644 index 000000000..6184977d1 --- /dev/null +++ b/plugins/af_comics/filters/af_comics_cad.php @@ -0,0 +1,39 @@ +loadHTML(fetch_file_contents($article["link"])); + + $basenode = false; + + if ($doc) { + $xpath = new DOMXPath($doc); + $basenode = $xpath->query('(//img[contains(@src, "/comics/cad-")])')->item(0); + + if ($basenode) { + $article["content"] = $doc->saveXML($basenode); + $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; + } + } + + } else if (isset($article["stored"]["content"])) { + $article["content"] = $article["stored"]["content"]; + } + + return true; + } + + return false; + } +} +?> diff --git a/plugins/af_comics/filters/af_comics_comicpress.php b/plugins/af_comics/filters/af_comics_comicpress.php new file mode 100644 index 000000000..e60b2dfe5 --- /dev/null +++ b/plugins/af_comics/filters/af_comics_comicpress.php @@ -0,0 +1,50 @@ +loadHTML($res); + + $basenode = false; + + if ($doc) { + $xpath = new DOMXPath($doc); + $basenode = $xpath->query('//div[@id="comic"]')->item(0); + + if ($basenode) { + $article["content"] = $doc->saveXML($basenode); + $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; + } + } + } else if (isset($article["stored"]["content"])) { + $article["content"] = $article["stored"]["content"]; + } + + return true; + } + + return false; + } +} +?> diff --git a/plugins/af_comics/filters/af_comics_dilbert.php b/plugins/af_comics/filters/af_comics_dilbert.php new file mode 100644 index 000000000..4c2233a3a --- /dev/null +++ b/plugins/af_comics/filters/af_comics_dilbert.php @@ -0,0 +1,52 @@ +loadHTML(fetch_file_contents($article["link"])); + + $basenode = false; + + if ($doc) { + $xpath = new DOMXPath($doc); + $entries = $xpath->query('(//img[@src])'); // we might also check for img[@class='strip'] I guess... + + $matches = array(); + + foreach ($entries as $entry) { + + if (preg_match("/dyn\/str_strip\/.*zoom\.gif$/", $entry->getAttribute("src"), $matches)) { + + $entry->setAttribute("src", + rewrite_relative_url("http://dilbert.com/", + $matches[0])); + + $basenode = $entry; + break; + } + } + + if ($basenode) { + $article["content"] = $doc->saveXML($basenode); + $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; + } + } + } else if (isset($article["stored"]["content"])) { + $article["content"] = $article["stored"]["content"]; + } + + return true; + } + + return false; + } +} +?> diff --git a/plugins/af_comics/filters/af_comics_explosm.php b/plugins/af_comics/filters/af_comics_explosm.php new file mode 100644 index 000000000..7e0621852 --- /dev/null +++ b/plugins/af_comics/filters/af_comics_explosm.php @@ -0,0 +1,49 @@ +loadHTML(fetch_file_contents($article["link"])); + + $basenode = false; + + if ($doc) { + $xpath = new DOMXPath($doc); + $entries = $xpath->query('(//img[@src])'); // we might also check for img[@class='strip'] I guess... + + $matches = array(); + + foreach ($entries as $entry) { + + if (preg_match("/(http:\/\/.*\/db\/files\/Comics\/.*)/i", $entry->getAttribute("src"), $matches)) { + + $basenode = $entry; + break; + } + } + + if ($basenode) { + $article["content"] = $doc->saveXML($basenode); + $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; + } + } + } else if (isset($article["stored"]["content"])) { + $article["content"] = $article["stored"]["content"]; + } + + return true; + } + + return false; + } +} +?> diff --git a/plugins/af_comics/filters/af_comics_gocomics.php b/plugins/af_comics/filters/af_comics_gocomics.php new file mode 100644 index 000000000..bd57c08ff --- /dev/null +++ b/plugins/af_comics/filters/af_comics_gocomics.php @@ -0,0 +1,62 @@ +loadHTML(fetch_file_contents($article["link"])); + + $basenode = false; + + if ($doc) { + $xpath = new DOMXPath($doc); + $entries = $xpath->query('(//img[@src])'); // we might also check for img[@class='strip'] I guess... + + $matches = array(); + + foreach ($entries as $entry) { + + if (preg_match("/(http:\/\/assets.amuniversal.com\/.*width.*)/i", $entry->getAttribute("src"), $matches)) { + + $entry->setAttribute("src", $matches[0]); + $basenode = $entry; + break; + } + } + + if (!$basenode) { + // fallback on the smaller version + foreach ($entries as $entry) { + + if (preg_match("/(http:\/\/assets.amuniversal.com\/.*)/i", $entry->getAttribute("src"), $matches)) { + + $entry->setAttribute("src", $matches[0]); + $basenode = $entry; + break; + } + } + } + + if ($basenode) { + $article["content"] = $doc->saveXML($basenode); + $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; + } + } + } else if (isset($article["stored"]["content"])) { + $article["content"] = $article["stored"]["content"]; + } + + return true; + } + + return false; + } +} +?> diff --git a/plugins/af_comics/filters/af_comics_pa.php b/plugins/af_comics/filters/af_comics_pa.php new file mode 100644 index 000000000..b44de9cff --- /dev/null +++ b/plugins/af_comics/filters/af_comics_pa.php @@ -0,0 +1,89 @@ +loadHTML(fetch_file_contents($article["link"])); + + $basenode = false; + + if ($doc) { + $xpath = new DOMXPath($doc); + $basenode = $xpath->query('(//div[@id="comicFrame"])')->item(0); + + if ($basenode) { + $article["content"] = $doc->saveXML($basenode); + $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; + } + } + } else if (isset($article["stored"]["content"])) { + $article["content"] = $article["stored"]["content"]; + } + + return true; + } + + if (strpos($article["link"], "penny-arcade.com") !== FALSE && strpos($article["title"], "News Post:") !== FALSE) { + if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) { + if ($debug_enabled) { + _debug("af_pennyarcade: Processing news post"); + } + $doc = new DOMDocument(); + $doc->loadHTML(fetch_file_contents($article["link"])); + + if ($doc) { + $xpath = new DOMXPath($doc); + $entries = $xpath->query('(//div[@class="post"])'); + + $basenode = false; + + foreach ($entries as $entry) { + $basenode = $entry; + } + + $meta = $xpath->query('(//div[@class="meta"])')->item(0); + if ($meta->parentNode) { $meta->parentNode->removeChild($meta); } + + $header = $xpath->query('(//div[@class="postBody"]/h2)')->item(0); + if ($header->parentNode) { $header->parentNode->removeChild($header); } + + $header = $xpath->query('(//div[@class="postBody"]/div[@class="comicPost"])')->item(0); + if ($header->parentNode) { $header->parentNode->removeChild($header); } + + $avatar = $xpath->query('(//div[@class="avatar"]//img)')->item(0); + $basenode->insertBefore($avatar, $basenode->firstChild); + + $uninteresting = $xpath->query('(//div[@class="avatar"])'); + foreach ($uninteresting as $i) { + $i->parentNode->removeChild($i); + } + + if ($basenode){ + $article["content"] = $doc->saveXML($basenode); + $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; + } + } + } else if (isset($article["stored"]["content"])) { + $article["content"] = $article["stored"]["content"]; + } + + return true; + } + + return false; + } +} +?> diff --git a/plugins/af_comics/filters/af_comics_twp.php b/plugins/af_comics/filters/af_comics_twp.php new file mode 100644 index 000000000..156b2b687 --- /dev/null +++ b/plugins/af_comics/filters/af_comics_twp.php @@ -0,0 +1,39 @@ +loadHTML(fetch_file_contents($article["link"])); + + $basenode = false; + + if ($doc) { + $xpath = new DOMXpath($doc); + + $basenode = $xpath->query("//td/center/img")->item(0); + + if ($basenode) { + $article["content"] = $doc->saveXML($basenode); + $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; + } + } + } else if (isset($article["stored"]["content"])) { + $article["content"] = $article["stored"]["content"]; + } + + return true; + } + + return false; + } +} +?> diff --git a/plugins/af_comics/init.php b/plugins/af_comics/init.php index 0d1a49a57..784be9e0a 100644 --- a/plugins/af_comics/init.php +++ b/plugins/af_comics/init.php @@ -2,6 +2,7 @@ class Af_Comics extends Plugin { private $host; + private $filters = array(); function about() { return array(1.0, @@ -14,307 +15,62 @@ class Af_Comics extends Plugin { $host->add_hook($host::HOOK_ARTICLE_FILTER, $this); $host->add_hook($host::HOOK_PREFS_TAB, $this); - } - - function hook_prefs_tab($args) { - if ($args != "prefPrefs") return; - - print "
"; - - print_notice("This plugin supports the following comics:"); - - print ""; - - print "
"; - } - - function hook_article_filter($article) { - $owner_uid = $article["owner_uid"]; - - $found = false; - - # div#comic - comicpress? - - if (strpos($article["guid"], "bunicomic.com") !== FALSE || - strpos($article["guid"], "buttersafe.com") !== FALSE || - strpos($article["guid"], "whompcomic.com") !== FALSE || - strpos($article["guid"], "happyjar.com") !== FALSE || - strpos($article["guid"], "csectioncomics.com") !== FALSE) { - - if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) { - - - // lol at people who block clients by user agent - // oh noes my ad revenue Q_Q - - $res = fetch_file_contents($article["link"], false, false, false, - false, false, 0, - "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)"); - - $doc = new DOMDocument(); - @$doc->loadHTML($res); - - $basenode = false; - - if ($doc) { - $xpath = new DOMXPath($doc); - $basenode = $xpath->query('//div[@id="comic"]')->item(0); - - if ($basenode) { - $article["content"] = $doc->saveXML($basenode); - $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; - } - } - } else if (isset($article["stored"]["content"])) { - $article["content"] = $article["stored"]["content"]; - } - } - - if (strpos($article["guid"], "dilbert.com") !== FALSE) { - if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) { - $doc = new DOMDocument(); - @$doc->loadHTML(fetch_file_contents($article["link"])); - - $basenode = false; - - if ($doc) { - $xpath = new DOMXPath($doc); - $entries = $xpath->query('(//img[@src])'); // we might also check for img[@class='strip'] I guess... - - $matches = array(); - - foreach ($entries as $entry) { - - if (preg_match("/dyn\/str_strip\/.*zoom\.gif$/", $entry->getAttribute("src"), $matches)) { - - $entry->setAttribute("src", - rewrite_relative_url("http://dilbert.com/", - $matches[0])); - - $basenode = $entry; - break; - } - } - - if ($basenode) { - $article["content"] = $doc->saveXML($basenode); - $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; - } - } - } else if (isset($article["stored"]["content"])) { - $article["content"] = $article["stored"]["content"]; - } - } - - if (strpos($article["link"], "explosm.net/comics") !== FALSE) { - if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) { - - $doc = new DOMDocument(); - @$doc->loadHTML(fetch_file_contents($article["link"])); - - $basenode = false; - - if ($doc) { - $xpath = new DOMXPath($doc); - $entries = $xpath->query('(//img[@src])'); // we might also check for img[@class='strip'] I guess... - $matches = array(); + require_once __DIR__ . "/filter_base.php"; - foreach ($entries as $entry) { + $filters = glob(__DIR__ . "/filters/*.php"); - if (preg_match("/(http:\/\/.*\/db\/files\/Comics\/.*)/i", $entry->getAttribute("src"), $matches)) { + foreach ($filters as $file) { + require_once $file; + $filter_name = preg_replace("/\..*$/", "", basename($file)); - $basenode = $entry; - break; - } - } + $filter = new $filter_name(); - if ($basenode) { - $article["content"] = $doc->saveXML($basenode); - $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; - } - } - } else if (isset($article["stored"]["content"])) { - $article["content"] = $article["stored"]["content"]; + if (is_subclass_of($filter, "Af_ComicFilter")) { + array_push($this->filters, $filter); } } - if (strpos($article["link"], "cad-comic.com/cad/") !== FALSE) { - if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) { - - $doc = new DOMDocument(); - @$doc->loadHTML(fetch_file_contents($article["link"])); - - $basenode = false; - - if ($doc) { - $xpath = new DOMXPath($doc); - $basenode = $xpath->query('(//img[contains(@src, "/comics/cad-")])')->item(0); - - if ($basenode) { - $article["content"] = $doc->saveXML($basenode); - $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; - } - } - - } else if (isset($article["stored"]["content"])) { - $article["content"] = $article["stored"]["content"]; - } - } - - if (strpos($article["guid"], "gocomics.com") !== FALSE) { - if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) { - $doc = new DOMDocument(); - @$doc->loadHTML(fetch_file_contents($article["link"])); - - $basenode = false; - - if ($doc) { - $xpath = new DOMXPath($doc); - $entries = $xpath->query('(//img[@src])'); // we might also check for img[@class='strip'] I guess... - - $matches = array(); - - foreach ($entries as $entry) { - - if (preg_match("/(http:\/\/assets.amuniversal.com\/.*width.*)/i", $entry->getAttribute("src"), $matches)) { - - $entry->setAttribute("src", $matches[0]); - $basenode = $entry; - break; - } - } - - if (!$basenode) { - // fallback on the smaller version - foreach ($entries as $entry) { - - if (preg_match("/(http:\/\/assets.amuniversal.com\/.*)/i", $entry->getAttribute("src"), $matches)) { - - $entry->setAttribute("src", $matches[0]); - $basenode = $entry; - break; - } - } - } - - if ($basenode) { - $article["content"] = $doc->saveXML($basenode); - $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; - } - } - } else if (isset($article["stored"]["content"])) { - $article["content"] = $article["stored"]["content"]; - } - } + } - if (strpos($article["link"], "penny-arcade.com") !== FALSE && strpos($article["title"], "Comic:") !== FALSE) { - if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) { + function hook_prefs_tab($args) { + if ($args != "prefPrefs") return; - if ($debug_enabled) { - _debug("af_pennyarcade: Processing comic"); - } + print "
"; - $doc = new DOMDocument(); - $doc->loadHTML(fetch_file_contents($article["link"])); + print_notice("This plugin can be easily extended by adding filters to plugins/af_comics/filters."); - $basenode = false; + print "

" . __("The following comics are currently supported:") . "

"; - if ($doc) { - $xpath = new DOMXPath($doc); - $basenode = $xpath->query('(//div[@id="comicFrame"])')->item(0); + $comics = array(); - if ($basenode) { - $article["content"] = $doc->saveXML($basenode); - $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; - } - } - } else if (isset($article["stored"]["content"])) { - $article["content"] = $article["stored"]["content"]; + foreach ($this->filters as $f) { + foreach ($f->supported() as $comic) { + array_push($comics, $comic); } } - if (strpos($article["link"], "penny-arcade.com") !== FALSE && strpos($article["title"], "News Post:") !== FALSE) { - if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) { - if ($debug_enabled) { - _debug("af_pennyarcade: Processing news post"); - } - $doc = new DOMDocument(); - $doc->loadHTML(fetch_file_contents($article["link"])); - - if ($doc) { - $xpath = new DOMXPath($doc); - $entries = $xpath->query('(//div[@class="post"])'); - - $basenode = false; - - foreach ($entries as $entry) { - $basenode = $entry; - } - - $meta = $xpath->query('(//div[@class="meta"])')->item(0); - if ($meta->parentNode) { $meta->parentNode->removeChild($meta); } + asort($comics); - $header = $xpath->query('(//div[@class="postBody"]/h2)')->item(0); - if ($header->parentNode) { $header->parentNode->removeChild($header); } - - $header = $xpath->query('(//div[@class="postBody"]/div[@class="comicPost"])')->item(0); - if ($header->parentNode) { $header->parentNode->removeChild($header); } - - $avatar = $xpath->query('(//div[@class="avatar"]//img)')->item(0); - $basenode->insertBefore($avatar, $basenode->firstChild); - - $uninteresting = $xpath->query('(//div[@class="avatar"])'); - foreach ($uninteresting as $i) { - $i->parentNode->removeChild($i); - } - - if ($basenode){ - $article["content"] = $doc->saveXML($basenode); - $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; - } - } - } else if (isset($article["stored"]["content"])) { - $article["content"] = $article["stored"]["content"]; - } + print ""; - if (strpos($article["link"], "threewordphrase.com") !== FALSE) { - if (strpos($article["plugin_data"], "af_comics,$owner_uid:") === FALSE) { - - $doc = new DOMDocument(); - @$doc->loadHTML(fetch_file_contents($article["link"])); - - $basenode = false; - - if ($doc) { - $xpath = new DOMXpath($doc); + print "
"; + } - $basenode = $xpath->query("//td/center/img")->item(0); + function hook_article_filter($article) { + $owner_uid = $article["owner_uid"]; - if ($basenode) { - $article["content"] = $doc->saveXML($basenode); - $article["plugin_data"] = "af_comics,$owner_uid:" . $article["plugin_data"]; - } - } - } else if (isset($article["stored"]["content"])) { - $article["content"] = $article["stored"]["content"]; - } + foreach ($this->filters as $f) { + if ($f->process($article)) + break; } return $article; + } function api_version() { -- cgit v1.2.3