✨ Add comic filter for Soggy Cardboard
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Tue, 15 Sep 2020 21:34:01 +0000 (23:34 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Tue, 15 Sep 2020 21:34:01 +0000 (23:34 +0200)
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SoggyCardboardComicFilter.kt [new file with mode: 0644]
src/test/kotlin/net/pterodactylus/rhynodge/filters/comics/SoggyCardboardComicFilterTest.kt [new file with mode: 0644]
src/test/resources/net/pterodactylus/rhynodge/filters/comics/soggy-cardboard.html [new file with mode: 0644]

diff --git a/src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SoggyCardboardComicFilter.kt b/src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SoggyCardboardComicFilter.kt
new file mode 100644 (file)
index 0000000..59ffb6b
--- /dev/null
@@ -0,0 +1,20 @@
+package net.pterodactylus.rhynodge.filters.comics
+
+import com.google.common.base.Optional
+import net.pterodactylus.rhynodge.filters.ComicSiteFilter
+import org.jsoup.nodes.Document
+
+class SoggyCardboardComicFilter : ComicSiteFilter() {
+
+       override fun extractTitle(document: Document): Optional<String> =
+                       document.select(".ceo_latest_comics_widget li").first().text().asOptional()
+
+       override fun extractImageUrls(document: Document): List<String> =
+                       listOf(document.select("#comic img").attr("src"))
+
+       override fun extractImageComments(document: Document): List<String> =
+                       listOf(document.select("#comic img").attr("alt"))
+
+}
+
+fun <T> T?.asOptional(): Optional<T> = Optional.fromNullable(this)
diff --git a/src/test/kotlin/net/pterodactylus/rhynodge/filters/comics/SoggyCardboardComicFilterTest.kt b/src/test/kotlin/net/pterodactylus/rhynodge/filters/comics/SoggyCardboardComicFilterTest.kt
new file mode 100644 (file)
index 0000000..b11f4eb
--- /dev/null
@@ -0,0 +1,29 @@
+package net.pterodactylus.rhynodge.filters.comics
+
+import net.pterodactylus.rhynodge.filters.ResourceLoader
+import net.pterodactylus.rhynodge.states.ComicState
+import net.pterodactylus.rhynodge.states.ComicState.Comic
+import net.pterodactylus.rhynodge.states.ComicState.Strip
+import net.pterodactylus.rhynodge.states.HtmlState
+import org.hamcrest.MatcherAssert.assertThat
+import org.hamcrest.Matchers.contains
+import org.junit.Test
+
+class SoggyCardboardComicFilterTest {
+
+       private val filter = SoggyCardboardComicFilter()
+       private val htmlState: HtmlState = ResourceLoader
+                       .loadDocument(javaClass, "soggy-cardboard.html", baseUrl)
+                       .let { HtmlState(baseUrl, it) }
+
+       @Test
+       fun `comic is extracted correctly`() {
+               val comicState = filter.filter(htmlState) as ComicState
+               assertThat(comicState.comics(), contains(
+                               Comic("#082 Pet Sedentary").add(Strip("http://www.soggycardboard.com/wp-content/uploads/2020/09/082.png", "That like how the Grand Canyon was made. But in reverse"))
+               ))
+       }
+
+}
+
+private val baseUrl = "http://www.soggycardboard.com/"
diff --git a/src/test/resources/net/pterodactylus/rhynodge/filters/comics/soggy-cardboard.html b/src/test/resources/net/pterodactylus/rhynodge/filters/comics/soggy-cardboard.html
new file mode 100644 (file)
index 0000000..af04536
--- /dev/null
@@ -0,0 +1,242 @@
+<!DOCTYPE html>\r
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> \r
+<head>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+       <link rel="stylesheet" href="http://www.soggycardboard.com/wp-content/themes/comicpress/style.css" type="text/css" media="screen" />\r
+       <link rel="pingback" href="http://www.soggycardboard.com/xmlrpc.php" />\r
+       <meta name="ComicPress" content="4.4" />\r
+<title>SoggyCardboard &#8211; Updates Every Thursday!</title>
+<link rel='dns-prefetch' href='//s.w.org' />
+<link rel="alternate" type="application/rss+xml" title="SoggyCardboard &raquo; Feed" href="http://www.soggycardboard.com" />
+<link rel="alternate" type="application/rss+xml" title="SoggyCardboard &raquo; Comments Feed" href="http://www.soggycardboard.com/?feed=comments-rss2" />
+               <script type="text/javascript">
+                       window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/13.0.0\/svg\/","svgExt":".svg","source":{"concatemoji":"http:\/\/www.soggycardboard.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.5.1"}};
+                       !function(e,a,t){var r,n,o,i,p=a.createElement("canvas"),s=p.getContext&&p.getContext("2d");function c(e,t){var a=String.fromCharCode;s.clearRect(0,0,p.width,p.height),s.fillText(a.apply(this,e),0,0);var r=p.toDataURL();return s.clearRect(0,0,p.width,p.height),s.fillText(a.apply(this,t),0,0),r===p.toDataURL()}function l(e){if(!s||!s.fillText)return!1;switch(s.textBaseline="top",s.font="600 32px Arial",e){case"flag":return!c([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])&&(!c([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!c([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]));case"emoji":return!c([55357,56424,8205,55356,57212],[55357,56424,8203,55356,57212])}return!1}function d(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(i=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},o=0;o<i.length;o++)t.supports[i[o]]=l(i[o]),t.supports.everything=t.supports.everything&&t.supports[i[o]],"flag"!==i[o]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[i[o]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(r=t.source||{}).concatemoji?d(r.concatemoji):r.wpemoji&&r.twemoji&&(d(r.twemoji),d(r.wpemoji)))}(window,document,window._wpemojiSettings);
+               </script>
+               <style type="text/css">
+img.wp-smiley,
+img.emoji {
+       display: inline !important;
+       border: none !important;
+       box-shadow: none !important;
+       height: 1em !important;
+       width: 1em !important;
+       margin: 0 .07em !important;
+       vertical-align: -0.1em !important;
+       background: none !important;
+       padding: 0 !important;
+}
+</style>
+       <link rel='stylesheet' id='wp-block-library-css'  href='http://www.soggycardboard.com/wp-includes/css/dist/block-library/style.min.css?ver=5.5.1' type='text/css' media='all' />
+<link rel='stylesheet' id='comiceasel-style-css'  href='http://www.soggycardboard.com/wp-content/plugins/comic-easel/css/comiceasel.css?ver=5.5.1' type='text/css' media='all' />
+<link rel='stylesheet' id='comiceasel-navstyle-css'  href='http://www.soggycardboard.com/wp-content/plugins/comic-easel/images/nav/default/navstyle.css?ver=5.5.1' type='text/css' media='all' />
+<script type='text/javascript' src='http://www.soggycardboard.com/wp-includes/js/jquery/jquery.js?ver=1.12.4-wp' id='jquery-core-js'></script>
+<script type='text/javascript' src='http://www.soggycardboard.com/wp-content/themes/comicpress/js/ddsmoothmenu.js?ver=5.5.1' id='ddsmoothmenu_js-js'></script>
+<script type='text/javascript' src='http://www.soggycardboard.com/wp-content/themes/comicpress/js/menubar.js?ver=5.5.1' id='menubar_js-js'></script>
+<link rel="https://api.w.org/" href="http://www.soggycardboard.com/index.php?rest_route=/" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.soggycardboard.com/xmlrpc.php?rsd" />
+<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://www.soggycardboard.com/wp-includes/wlwmanifest.xml" /> 
+<meta name="generator" content="WordPress 5.5.1" />
+<meta name="Comic-Easel" content="1.15" />\r
+<meta name="Referrer" content="" />\r
+<!--Customizer CSS-->\r
+<style type="text/css">\r
+       #page { width: 980px; max-width: 980px; }\r
+       #add-width { width: 10px; }\r
+       #content-column { width: 562px; max-width: 100%; }\r
+       #sidebar-right { width: 204px; }\r
+       #sidebar-left { width: 204px; }\r
+       #page { background-color: #4a86bf!important; }\r
+       #header { background-color: #ffffff!important; }\r
+       #content-wrapper { background-color: #ffffff!important; }\r
+       body { color: #000000!important; }\r
+       table#comic-nav-wrapper { background-color: #4a86bf!important; }\r
+       .header-info { display: inline-block; float: left; padding: 0; }\r
+       .header-info h1 { margin: 0; padding: 0; background: url("http://www.soggycardboard.com/wp-content/uploads/2014/10/Logo-x1601.png") top left no-repeat; background-size: contain; display: cover; }\r
+       .header-info h1 a { padding: 0; margin: 0; height: 120px; width: 180px; text-indent: -9999px; white-space: nowrap; overflow: hidden; display: block;}\r
+       .header-info .description { display: none!important; }\r
+</style>\r
+<!--/Customizer CSS-->\r
+      <!-- All in one Favicon 4.7 --><link rel="icon" href="http://www.soggycardboard.com/wp-content/uploads/2014/10/Logo-x1602.png" type="image/png"/>
+<style type="text/css" id="custom-background-css">
+body.custom-background { background-color: #6a9dc4; background-image: url("http://www.soggycardboard.com/wp-content/uploads/2015/02/Website-Background-2-Whitish.png"); background-position: center top; background-size: auto; background-repeat: no-repeat; background-attachment: fixed; }
+</style>
+       </head>\r
+\r
+<body class="home blog custom-background user-guest unknown pm day tue layout-3c scheme-boxed">\r
+<div id="page-wrap">\r
+       <div id="page">\r
+               <header id="header">\r
+                       <div class="header-info">\r
+                               <h1><a href="http://www.soggycardboard.com">SoggyCardboard</a></h1>\r
+                               <div class="description">Updates Every Thursday!</div>\r
+                       </div>\r
+                                               <div class="clear"></div>\r
+               </header>\r
+\r
+               <div id="menubar-wrapper">\r
+                       <div class="menu-container">\r
+                                                               <div class="menu"><ul>
+<li class="page_item page-item-576"><a href="http://www.soggycardboard.com/?page_id=576">Archive</a></li>
+</ul></div>
+                               <div class="menunav">\r
+                                                                               <div class="menunav-social-wrapper"><a href="https://twitter.com/Cuddlep00p" target="_blank" title="Follow me on Twitter" class="menunav-social menunav-twitter">Twitter</a>\r
+<div class="clear"></div></div>\r
+                                                                       </div>\r
+                               <div class="clear"></div>\r
+                       </div>\r
+                       <div class="clear"></div>\r
+               </div>\r
+                       <div id="sidebar-menubar" class="sidebar">\r
+                                       <div class="comic_navi_wrapper">\r
+               <table class="comic_navi">\r
+                                               <tr>\r
+               <td class="comic_navi_left">\r
+                                               <a href="http://www.soggycardboard.com/?comic=001-new-friends-1" class="navi navi-first" title="&lt;&lt;First">&lt;&lt;First</a>\r
+                                                       <a href="http://www.soggycardboard.com/?comic=081-sleep-or-swim" class="navi comic-nav-previous navi-prev" title="&lt;Previous">&lt;Previous</a>\r
+                                       </td>\r
+               <td class="comic_navi_center">\r
+                                       <a href="http://www.soggycardboard.com/?comic=082-pet-sedentary#comments" class="navi navi-comments" title="Comments"><span class="navi-comments-count">4</span>Comments</a>\r
+                               </td>\r
+               <td class="comic_navi_right">\r
+                                               <span class="navi navi-next navi-void">Next &gt;</span>\r
+                                                       <span class="navi navi-last navi-void">Last &gt;&gt;</span>\r
+                                       </td>\r
+               </tr>\r
+                               </table>\r
+               </div>\r
+                                       <div class="clear"></div>\r
+               </div>\r
+       <div id="content-wrapper">\r
+       \r
+                                       <div id="comic-wrap" class="comic-id-2507">
+                               <div id="comic-head">
+                                                                       </div>
+                                                               <div class="comic-table">       
+                                                                               <div id="comic">
+                                               <img src="http://www.soggycardboard.com/wp-content/uploads/2020/09/082.png" alt="That like how the Grand Canyon was made. But in reverse" title="That like how the Grand Canyon was made. But in reverse"   />                                  </div>
+                                                                       </div>                          
+                                                               <div id="comic-foot">
+                                               <table id="comic-nav-wrapper">
+               <tr class="comic-nav-container">
+                       <td class="comic-nav"><a href="http://www.soggycardboard.com/?comic=001-new-friends-1" class="comic-nav-base comic-nav-first">&lsaquo;&lsaquo; First</a></td>
+                       <td class="comic-nav"><a href="http://www.soggycardboard.com/?comic=081-sleep-or-swim" class="comic-nav-base comic-nav-previous">&lsaquo; Prev</a></td>
+                       <td class="comic-nav"><a href="http://www.soggycardboard.com/?comic=082-pet-sedentary#comments" class="comic-nav-comments" title="#082 Pet Sedentary"><span class="comic-nav-comment-count">Comments(4)</span></a></td>
+                       <td class="comic-nav"><a href="http://www.soggycardboard.com?random&nocache=1" class="comic-nav-random" title="Random Comic">Random</a></td>
+       <td class="comic-nav"><span class="comic-nav-base comic-nav-next comic-nav-void ">Next &rsaquo;</span></td>
+       <td class="comic-nav"><span class="comic-nav-base comic-nav-last comic-nav-void ">Last &rsaquo;&rsaquo;</span></td>
+               </tr>
+       </table>
+                                       </div>
+                               <div class="clear"></div>
+                       </div>
+                       \r
+       <div id="subcontent-wrapper">\r
+<div id="sidebar-left">\r
+    <div class="sidebar">\r
+    <div id="ceo_latest_comics_widget-3" class="widget ceo_latest_comics_widget">\r
+<div class="widget-content">\r
+<h2 class="widget-title">What I Miss?</h2>\r
+               <ul>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=082-pet-sedentary">#082 Pet Sedentary</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=081-sleep-or-swim">#081 Sleep or Swim</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=080-bittersweet-victory">#080 Bittersweet Victory</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=079-reach-for-the-stars">#079 Reach for the Stars</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=078-white-knuckle-routine">#078 White Knuckle Routine</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=077-free-er-dreamer">#077 Free-er Dreamer</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=076-free-dreamer">#076 Free Dreamer</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=075-compression-session">#075 Compression Session</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=074-take-up-makeup">#074 Take Up Makeup</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=073-home-run">#073 Home Run</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=072-building-character-part-8">#072 Building Character &#8211; Part 8</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=071-building-character-part-7">#071 Building Character &#8211; Part 7</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=070-building-character-part-6">#070 Building Character &#8211; Part 6</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=069-building-character-part-5">#069 Building Character &#8211; Part 5</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=068-building-character-part-4">#068 Building Character &#8211; Part 4</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=067-building-character-part-3">#067 Building Character &#8211; Part 3</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=066-building-character-part-2">#066 Building Character &#8211; Part 2</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=065-building-character-part-1">#065 Building Character &#8211; Part 1</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=064-punch-22">#064 Punch 22</a></li>\r
+                                       <li><a href="http://www.soggycardboard.com/?comic=063-gnarly-management">#063 Gnarly Management</a></li>\r
+                               </ul>\r
+               </div>\r
+<div class="clear"></div>\r
+</div>\r
+    </div>\r
+</div>\r
+               <div id="content-column">\r
+                       <div id="content" class="narrowcolumn">         \r
+                                                               <article id="post-2507" class="post-2507 comic type-comic status-publish has-post-thumbnail hentry uentry postonpage-1 odd post-author-admin">\r
+       <div class="post-content">\r
+                               <div class="post-info">\r
+                       <h2 class="post-title"><a href="http://www.soggycardboard.com/?comic=082-pet-sedentary">#082 Pet Sedentary</a></h2>\r
+<div class="post-calendar-date"><div class="calendar-date"><span>Sep</span>10</div></div>\r
+                       <div class="post-text">\r
+                               <span class="post-author">by <a href="http://www.soggycardboard.com/?author=1" rel="author">Cuddlep00p</a></span>\r
+<span class="posted-on">on&nbsp;</span><span class="post-date">September 10, 2020</span>\r
+<span class="posted-at">at&nbsp;</span><span class="post-time">12:00 am</span>\r
+<div class="comic-post-info"></div>                    </div>\r
+                       <div class="clear"></div>\r
+               </div>\r
+               <div class="clear"></div>\r
+               <div class="entry">\r
+                       <p>My pet can beat up AND out live your pet</p>
+<h1 style="text-align: center;"><a href="https://www.webtoons.com/en/challenge/soggycardboard/list?title_no=270358">Read on Webtoons!</a><a href="https://www.patreon.com/cuddlep00p"><img loading="lazy" class="aligncenter " src="https://i.imgur.com/eA7V2OA.jpg" width="520" height="507" /></a><a href="http://www.longliveabsolution.com/"><br />
+<img loading="lazy" class="aligncenter " src="https://i.imgur.com/8qzxn4s.png" width="700" height="394" /></a></h1>
+<p><strong>Cuddlep00p Links</strong></p>
+<p><a href="https://www.patreon.com/cuddlep00p" target="_blank" rel="noopener noreferrer">Patreon</a></p>
+<p><a href="https://twitter.com/Cuddlep00p">Twitter</a></p>
+<p><a class="hoverZoomLink" href="https://i.imgur.com/JIBgh81.png">Imgur Mirror</a></p>
+                       <div class="clear"></div>\r
+               </div>\r
+               <div class="post-extras">\r
+                       <div class="post-tags"></div>\r
+                       <div class="comment-link">\r
+                               <a href="http://www.soggycardboard.com/?comic=082-pet-sedentary#comments"><span class="comment-balloon">4</span> Comments</a>                   </div>\r
+                                               <div class="clear"></div>\r
+               </div>\r
+                       </div>\r
+</article>\r
+<div id="blogheader"></div>                                                            </div>\r
+               </div>\r
+<div id="sidebar-right">\r
+    <div class="sidebar">\r
+        <div id="ceo_thumbnail_widget-3" class="widget ceo_thumbnail_widget">\r
+<div class="widget-content">\r
+<h2 class="widget-title">Want more? Click this crap!</h2>\r
+<div class="comic-thumb-wrap comic-thumb-2352">\r
+<center>\r
+<a href="http://www.soggycardboard.com/?comic=048-power-hour" rel="bookmark" title="Permanent Link to #048 Power Hour"></a>\r
+<div class="comic-thumb-title"><a href="http://www.soggycardboard.com/?comic=048-power-hour" rel="bookmark" title="Permanent Link to #048 Power Hour">#048 Power Hour</a></div><div class="clear"></div>\r
+</center>\r
+</div>\r
+</div>\r
+<div class="clear"></div>\r
+</div>\r
+    </div>\r
+</div>         <div class="clear"></div>\r
+       </div>\r
+</div>\r
+               <footer id="footer">\r
+                               <div id="footer-sidebar-wrapper">\r
+                               </div>\r
+               <div class="clear"></div>\r
+               <div id="footer-menubar-wrapper">\r
+                                               <div class="clear"></div>\r
+               </div>\r
+               <p class="copyright-info">\r
+&copy;2014-2020 <a href="http://www.soggycardboard.com">SoggyCardboard</a> <span class="footer-pipe">|</span> Powered by <a href="http://wordpress.org/">WordPress</a> with <a href="http://frumph.net">ComicPress</a>\r
+<span class="footer-subscribe"><span class="footer-pipe">|</span> Subscribe: <a href="http://www.soggycardboard.com/?feed=rss2">RSS</a>\r
+</span>\r
+<span class="footer-uptotop"><span class="footer-pipe">|</span> <a href="" onclick="scrollup(); return false;">Back to Top &uarr;</a></span>\r
+</p>\r
+                       </footer>       \r
+               </div> <!-- // #page -->\r
+</div> <!-- / #page-wrap -->\r
+<script type='text/javascript' src='http://www.soggycardboard.com/wp-content/plugins/comic-easel/js/keynav.js' id='ceo_keynav-js'></script>
+<script type='text/javascript' src='http://www.soggycardboard.com/wp-content/themes/comicpress/js/scroll.js' id='comicpress_scroll-js'></script>
+<script type='text/javascript' src='http://www.soggycardboard.com/wp-content/themes/comicpress/js/cvi_text_lib.js' id='themetricks_historic1-js'></script>
+<script type='text/javascript' src='http://www.soggycardboard.com/wp-content/themes/comicpress/js/instant.js' id='themetricks_historic2-js'></script>
+<script type='text/javascript' src='http://www.soggycardboard.com/wp-includes/js/wp-embed.min.js?ver=5.5.1' id='wp-embed-js'></script>
+</body>\r
+</html>
\ No newline at end of file