Add parser for Chief O’Brien at Work.
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Tue, 10 Feb 2015 19:37:08 +0000 (20:37 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Tue, 10 Feb 2015 19:37:08 +0000 (20:37 +0100)
src/main/java/net/pterodactylus/rhynodge/filters/comics/ChiefOBrienAtWorkComicFilter.java [new file with mode: 0644]
src/test/java/net/pterodactylus/rhynodge/filters/comics/ChiefOBrienAtWorkComicFilterTest.java [new file with mode: 0644]
src/test/java/net/pterodactylus/rhynodge/filters/comics/ComicLoader.java [new file with mode: 0644]
src/test/resources/net/pterodactylus/rhynodge/filters/comics/chief-obrien-at-work.html [new file with mode: 0644]

diff --git a/src/main/java/net/pterodactylus/rhynodge/filters/comics/ChiefOBrienAtWorkComicFilter.java b/src/main/java/net/pterodactylus/rhynodge/filters/comics/ChiefOBrienAtWorkComicFilter.java
new file mode 100644 (file)
index 0000000..8ec8e21
--- /dev/null
@@ -0,0 +1,35 @@
+package net.pterodactylus.rhynodge.filters.comics;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
+
+import com.google.common.base.Optional;
+import org.jsoup.nodes.Document;
+
+/**
+ * {@link ComicSiteFilter} implementation that can parse “Chief O’Brien at Work”
+ * comics.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class ChiefOBrienAtWorkComicFilter extends ComicSiteFilter {
+
+       @Override
+       protected List<String> extractImageUrls(Document document) {
+               return Arrays.asList(document.select(".P .P-H .larger-width img").get(0).attr("src"));
+       }
+
+       @Override
+       protected List<String> extractImageComments(Document document) {
+               return Collections.emptyList();
+       }
+
+       @Override
+       protected Optional<String> extractTitle(Document document) {
+               return Optional.fromNullable(document.select(".P-post .captions p").get(0).text());
+       }
+
+}
diff --git a/src/test/java/net/pterodactylus/rhynodge/filters/comics/ChiefOBrienAtWorkComicFilterTest.java b/src/test/java/net/pterodactylus/rhynodge/filters/comics/ChiefOBrienAtWorkComicFilterTest.java
new file mode 100644 (file)
index 0000000..d511ced
--- /dev/null
@@ -0,0 +1,40 @@
+package net.pterodactylus.rhynodge.filters.comics;
+
+import java.io.IOException;
+
+import com.google.common.base.Optional;
+import org.hamcrest.MatcherAssert;
+import org.hamcrest.Matchers;
+import org.jsoup.nodes.Document;
+import org.junit.Test;
+
+/**
+ * Unit test for {@link ChiefOBrienAtWorkComicFilter}.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class ChiefOBrienAtWorkComicFilterTest {
+
+       private final ChiefOBrienAtWorkComicFilter filter = new ChiefOBrienAtWorkComicFilter();
+       private final Document document;
+
+       public ChiefOBrienAtWorkComicFilterTest() throws IOException {
+               document = ComicLoader.loadDocument("chief-obrien-at-work.html", "http://chiefobrienatwork.com/");
+       }
+
+       @Test
+       public void filterCanParseComics() {
+               MatcherAssert.assertThat(filter.extractImageUrls(document), Matchers.contains("http://41.media.tumblr.com/db92f4218b8a100f216863ce980e19a9/tumblr_njaewe7vNU1tjd8fao1_1280.jpg"));
+       }
+
+       @Test
+       public void filterReturnsEmptyListForImageComments() {
+               MatcherAssert.assertThat(filter.extractImageComments(document), Matchers.empty());
+       }
+
+       @Test
+       public void filterCanParseComicTitles() {
+               MatcherAssert.assertThat(filter.extractTitle(document), Matchers.is(Optional.of("EPISODE 60: Being Human\u00a0")));
+       }
+
+}
diff --git a/src/test/java/net/pterodactylus/rhynodge/filters/comics/ComicLoader.java b/src/test/java/net/pterodactylus/rhynodge/filters/comics/ComicLoader.java
new file mode 100644 (file)
index 0000000..c6a4cec
--- /dev/null
@@ -0,0 +1,22 @@
+package net.pterodactylus.rhynodge.filters.comics;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+/**
+ * Loads a resource from the classpath and parses it as HTML.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class ComicLoader {
+
+       static Document loadDocument(String resourceName, String baseUri) throws IOException {
+               InputStream inputStream = ComicLoader.class.getResourceAsStream(resourceName);
+               Document document = Jsoup.parse(inputStream, "UTF-8", baseUri);
+               return document;
+       }
+
+}
diff --git a/src/test/resources/net/pterodactylus/rhynodge/filters/comics/chief-obrien-at-work.html b/src/test/resources/net/pterodactylus/rhynodge/filters/comics/chief-obrien-at-work.html
new file mode 100644 (file)
index 0000000..cb0485c
--- /dev/null
@@ -0,0 +1,371 @@
+<!DOCTYPE html>
+<script>var __pbpa = true;</script><script>var translated_warning_string = 'Warning: Never enter your Tumblr password unless \u201chttps://www.tumblr.com/login\u201d\x0ais the address in your web browser.\x0a\x0aYou should also see a green \u201cTumblr, Inc.\u201d identification in the address bar.\x0a\x0aSpammers and other bad guys use fake forms to steal passwords.\x0a\x0aTumblr will never ask you to log in from a user\u2019s blog.\x0a\x0aAre you absolutely sure you want to continue?';</script><script type="text/javascript" language="javascript" src="http://assets.tumblr.com/assets/scripts/pre_tumblelog.js?_v=0fe6931f685c5a29060675a836044a62"></script>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+
+<!-- ------------------------------------------------------------------
+                                                                             
+    VIENNA | ZEN 2013                                                
+   
+    Last update: Jan 1st, 2013
+    
+    Get this theme: http://zen-themes.com/free-tumblr-themes/vienna
+    More themes at: http://zen-themes.com
+
+------------------------------------------------------------------ -->
+
+<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# blog: http://ogp.me/ns/blog#">
+
+<title>CHIEF O'BRIEN AT WORK</title>
+
+
+<script>
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-58169102-1', 'auto');
+  ga('send', 'pageview');
+
+</script>
+
+
+<style type="text/css">figure {margin: 0;}</style>
+<link rel="alternate" type="application/rss+xml" href="http://chiefobrienatwork.com/rss">
+<link rel="shortcut icon" href="http://38.media.tumblr.com/avatar_4dfdeb91b2ed_128.png">
+
+<meta name="viewport" content="width=device-width,user-scalable=false">
+
+<meta name="image:Background" content=""/>
+<meta name="image:Cover" content=""/>
+<meta name="image:Cover Logo" content=""/>
+
+<meta name="color:Background" content="#f4f4f4"/>
+<meta name="color:Body Text" content="#8a8a8a"/>
+<meta name="color:Links" content="#12ad9e"/>
+<meta name="color:Social Icons" content="#808080"/>
+<meta name="color:Cover Title" content="#656565"/>
+<meta name="color:Cover Description" content="#808080"/>
+<meta name="color:Cover Description Divider" content="#c0c0c0"/>
+<meta name="color:Navigation Bar" content="#ffffff"/>
+<meta name="color:Navigation Bar Links" content="#616161"/>
+<meta name="color:Navigation Bar Links Hover" content="#000000"/>
+<meta name="color:Navigation Bar Dividers" content="#bbbbbb"/>
+<meta name="color:Photo Overlay" content="#000000"/>
+<meta name="color:Photo Overlay Effect" content="#000000"/>
+<meta name="color:Post Background" content="#ffffff"/>
+<meta name="color:Post Dividers" content="#dddddd"/>
+
+<meta name="if:Animated Loading" content="1"/>
+<meta name="if:Hover Style 1" content="1"/>
+<meta name="if:Hover Style 2" content="0"/>
+<meta name="if:Infinite Scrolling" content="1"/>
+<meta name="if:Infinite Scrolling Animated" content="0"/>
+<meta name="if:Photo Captions" content="0"/>
+<meta name="if:Post Border" content="1"/>
+<meta name="if:Post Rounded" content="0"/>
+<meta name="if:Post Shadow" content="1"/>
+<meta name="if:Show Social Icons" content="0"/>
+<meta name="if:Show Archive Link" content="1"/>
+<meta name="if:Show Random Link" content="0"/>
+<meta name="if:Show RSS Link" content="0"/>
+<meta name="if:Show Post Buttons" content="1"/>
+<meta name="if:Show Post Tags" content="1"/>
+<meta name="if:Sticked Navigation Bar" content="1"/>
+<meta name="if:Wide Permalinkpage" content="0"/>
+<meta name="if:Wide Posts" contetn="0"/>
+
+<meta name="select:Title Font" content="Source Sans Pro" title="Sans Pro"/><meta name="select:Title Font" content="Arial" title="Arial"/><meta name="select:Title Font" content="Abel" title="Abel"/><meta name="select:Title Font" content="courier new" title="Courier"/><meta name="select:Title Font" content="Droid Sans" title="Droid Sans"/><meta name="select:Title Font" content="helvetica" title="Helvetica"/><meta name="select:Title Font" content="Karla" Title="Karla"/><meta name="select:Title Font" content="Mako" title="Mako"/><meta name="select:Title Font" content="Montserrat" title="Montserrat"/><meta name="select:Title Font" content="Noto Sans" title="Noto Sans"/><meta name="select:Title Font" content="PT Mono" title="PT Mono"/><meta name="select:Title Font" content="Raleway" title="Raleway"/><meta name="select:Title Font" content="Roboto Slab" title="Roboto Slab"/><meta name="select:Title Font" content="Ropa Sans" title="Ropa Sans"/><meta name="select:Title Font" content="Rokkitt" title="Rokkitt"/><meta name="select:Title Font" content="Times New Roman" title="Times New Roman"/><meta name="select:Body Font" content="Source Sans Pro" title="Sans Pro"/><meta name="select:Body Font" content="Abel" title="Abel"/><meta name="select:Body Font" content="Arial" title="Arial"/><meta name="select:Body Font" content="courier new" title="Courier"/><meta name="select:Body Font" content="Droid Sans" title="Droid Sans"/><meta name="select:Body Font" content="helvetica" title="Helvetica"/><meta name="select:Body Font" content="Karla" Title="Karla"/><meta name="select:Body Font" content="Mako" title="Mako"/><meta name="select:Body Font" content="Noto Sans" title="Noto Sans"/><meta name="select:Body Font" content="PT Mono" title="PT Mono"/><meta name="select:Body Font" content="Raleway" title="Raleway"/><meta name="select:Body Font" content="Roboto Slab" title="Roboto Slab"/><meta name="select:Body Font" content="Rokkitt" title="Rokkitt"/><meta name="select:Body Font" content="Ropa Sans" title="Ropa Sans"/><meta name="select:Body Font" content="Times New Roman" title="Times New Roman"/><meta name="select:Cover Dividers" content="dotted" title="Dotted"/><meta name="select:Cover Dividers" content="Dashed" title="Dashed"/><meta name="select:Cover Dividers" content="solid" title="Solid"/><meta name="select:Cover Dividers" content="none" title="none"/><meta name="select:Navigation Dividers" content="dotted" title="Dotted"/><meta name="select:Navigation Dividers" content="Dashed" title="Dashed"/><meta name="select:Navigation Dividers" content="solid" title="Solid"/><meta name="select:Navigation Dividers" content="none" title="none"/><meta name="select:Post Dividers" content="dotted" title="Dotted"/><meta name="select:Post Dividers" content="Dashed" title="Dashed"/><meta name="select:Post Dividers" content="solid" title="Solid"/><meta name="select:Post Dividers" content="none" title="none"/><meta name="select:Post Width" content="W_M" Title="Medium"/><meta name="select:Post Width" content="W_T" Title="Tiny"/><meta name="select:Post Width" content="W_S" Title="Small"/><meta name="select:Post Width" content="W_L" Title="Large"/><meta name="select:Post Width" content="W_H" Title="Huge"/>
+
+<meta name="text:Archive Title" content="Archive"/>
+<meta name="text:Ask Title" content="Message"/>
+<meta name="text:Overlay Opacity" content=".35"/>
+<meta name="text:Custom Link 1" content=""/>
+<meta name="text:Custom Link 1 Title" content=""/>
+<meta name="text:Custom Link 2" content=""/>
+<meta name="text:Custom Link 2 Title" content=""/>
+<meta name="text:Custom Link 3" content=""/>
+<meta name="text:Custom Link 3 Title" content=""/>
+<meta name="text:Custom Link 4" content=""/>
+<meta name="text:Custom Link 4 Title" content=""/>
+<meta name="text:Custom Link 5" content=""/>
+<meta name="text:Custom Link 5 Title" content=""/>
+<meta name="text:URL Flickr" content=""/>
+<meta name="text:URL Vimeo" content=""/>
+<meta name="text:URL Twitter" content=""/>
+<meta name="text:URL Facebook" content=""/>
+<meta name="text:URL Youtube" content=""/>
+<meta name="text:URL Google Plus" content=""/>
+<meta name="text:URL Pinterest" content=""/>
+<meta name="text:URL Dribble" content=""/>
+<meta name="text:URL Spotify" content=""/>
+<meta name="text:URL Instagram" content=""/>
+<meta name="text:URL Soundcloud" content=""/>
+<meta name="text:URL Behance" content=""/>
+<meta name="text:URL Linkedin" content=""/>
+<meta name="text:URL Stumbleupon" content=""/>
+<meta name="text:URL Lastfm" content=""/>
+<meta name="text:URL Github" content=""/>
+
+<meta name="description" content="From the man who brought you Chief O&rsquo;Brien after Star Trek brought you Chief O&rsquo;Brien, comes a comic for fans of space travel, dead-end jobs, and ennui."/>
+
+<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Roboto Slab|Montserrat:400,400italic,700,700italic"><link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro' rel='stylesheet' type='text/css'><link rel="stylesheet" href="http://static.tumblr.com/3zmswwt/RKRmwg3k8/icon-embedded.css"/><!--[if IE 7]><link rel="stylesheet" href="http://static.tumblr.com/3zmswwt/1rsmwg3kh/icon-ie7.css"/><![endif]--><link rel='stylesheet' href='http://static.tumblr.com/j6tha7z/vmZmxj72r/style.css' type='text/css'>
+
+<style type="text/css">body{font:12px/1.6em "Roboto Slab", san-serif;color:#8a8a8a;background:#F6F6F6 url("http://assets.tumblr.com/images/x.gif?v=1")}a,a:link,a:visited{text-decoration:none;color:#00c3ff}h1,h2,h3,h4,h5,#A,#P{font-family:Montserrat}#A #C{background:url("http://static.tumblr.com/2f8f745313ad7a1790d6c49c707affeb/mwc1sef/Ybhnhinmv/tumblr_static_7icssraw114w0cc8kg4ksggg8.jpg") no-repeat center;background-size:cover}#A #C h1 a{color:#FFFFFF}#A #S a{color:#808080;background:#FFFFFF}#A #S a:hover{color:#FFFFFF}#A #D{color:#808080;border-top:1px dotted #c0c0c0}#A{background:#FFFFFF !important}#A #N{border-top:1px dotted #bbbbbb}#A #N li{border-left:1px dotted #bbbbbb}#A #N li:last-child{border-right:1px dotted #bbbbbb}#A #N li a{color:#00c3ff}#A #N li a:hover{color:#000000}.X{-webkit-transition:opacity .6s ease;transition:opacity .6s ease}.X,.PB{background:#ffffff}.X:hover .P-H a.G{opacity:.33}.X .P .P-H a.G{background:#000000}.X .P .P-H .H-2 .U_C,.X .P .P-H .H-2 .L_C,.X .P .P-H .H-1 a{background:rgba(0,0,0,.65)}.X .P .P-H .H-2 .U_C:hover,.X .P .P-H .H-2 .L_C:hover,.X .P .P-H .H-1 a:hover{background:rgba(0,0,0,.8)}.X .T .QN{border-bottom:1px dotted #dddddd}.X .D{border-top:1px dotted #dddddd}.X .D a:hover{color:#777}.X .T a.L{background:#00c3ff}.X .P .P-H a.G{background:#000000}#P a{color:#8a8a8a}#P a:hover,#P a.current{color:#00c3ff !important}#CDT{display:none !important}#A #N,.X,.PB{box-shadow:0 1px 2px 0 rgba(0,0,0,.1)}#A #S{border-top:1px dotted #c0c0c0}#A #S a{border-left:1px dotted #c0c0c0}#A #S a:last-child{border-right:1px dotted #c0c0c0}#A #C{height:300px;padding:135px 0}#A #C{padding:60px 0}.X .P,.X .media{border:8px solid #ffffff}.stick{position:fixed;top:0;background:#FFFFFF}.extra-padding{padding:85px 0 0 0 !important}#PML .X,#PML .PB{width:700px !important}</style><link rel="alternate" href="android-app://com.tumblr/tumblr/x-callback-url/blog?blogName=chiefobrienatwork" />
+<script src="http://assets.tumblr.com/assets/scripts/tumblelog.js?_v=c78ef57bd25c48e7f24a984e7ef6ceba"></script>
+<link rel="stylesheet" type="text/css" href="http://assets.tumblr.com/fonts/gibson/stylesheet.css?v=3">
+<meta http-equiv="x-dns-prefetch-control" content="off"/>
+
+<!-- BEGIN TUMBLR FACEBOOK OPENGRAPH TAGS --><!-- If you'd like to specify your own Open Graph tags, define the og:url and og:title tags in your theme's HTML. --><!-- Read more: http://ogp.me/ --><meta property="fb:app_id" content="48119224995" /><meta property="og:title" content="CHIEF O&#039;BRIEN AT WORK" /><meta property="og:url" content="http://chiefobrienatwork.com/?og=1" /><meta property="og:description" content="From the man who brought you Chief O&rsquo;Brien after Star Trek brought you Chief O&rsquo;Brien, comes a comic..." /><meta property="og:type" content="tumblr-feed:tumblelog" /><meta property="og:image" content="http://38.media.tumblr.com/avatar_4dfdeb91b2ed_128.png" /><meta property="al:ios:url" content="tumblr://x-callback-url/blog?blogName=chiefobrienatwork" /><meta property="al:ios:app_name" content="Tumblr" /><meta property="al:ios:app_store_id" content="305343404" /><meta property="al:android:url" content="tumblr://x-callback-url/blog?blogName=chiefobrienatwork" /><meta property="al:android:app_name" content="Tumblr" /><meta property="al:android:package" content="com.tumblr" /><!-- END TUMBLR FACEBOOK OPENGRAPH TAGS -->
+
+
+<!-- TWITTER TAGS --><meta charset="utf-8"><meta name="twitter:site" content="tumblr" /><meta name="twitter:card" content="summary" /><meta name="twitter:title" content="chiefobrienatwork" /><meta name="twitter:description" content="From the man who brought you Chief O&rsquo;Brien after Star Trek brought you Chief O&rsquo;Brien, &lt;/br&gt;comes a comic for fans of space travel, dead-end jobs, and ennui." /><meta name="twitter:app:name:iphone" content="Tumblr" /><meta name="twitter:app:name:ipad" content="Tumblr" /><meta name="twitter:app:name:googleplay" content="Tumblr" /><meta name="twitter:app:id:iphone" content="305343404" /><meta name="twitter:app:id:ipad" content="305343404" /><meta name="twitter:app:id:googleplay" content="com.tumblr" /><meta name="twitter:app:url:iphone" content="tumblr://x-callback-url/blog?blogName=chiefobrienatwork&amp;referrer=twitter-cards" /><meta name="twitter:app:url:ipad" content="tumblr://x-callback-url/blog?blogName=chiefobrienatwork&amp;referrer=twitter-cards" /><meta name="twitter:app:url:googleplay" content="tumblr://x-callback-url/blog?blogName=chiefobrienatwork&amp;referrer=twitter-cards" />
+
+</head>
+
+<body>
+
+<div id="A"><div id="C"><a href="/"><img src="http://static.tumblr.com/1226a1d5a76e2a51d1b87a44c5e725b8/mwc1sef/1fRnhm8rv/tumblr_static_9wppz6rokhcsk4o48wkwk88k4.png" alt="CHIEF O'BRIEN AT WORK"/></a></div><div id="D"><div id="DC">From the man who brought you Chief O’Brien after Star Trek brought you Chief O’Brien, </br>comes a comic for fans of space travel, dead-end jobs, and ennui.</div></div>
+
+
+
+
+<div id="N"><li><a href="/prints" title="Prints">Prints</a></li><li><a href="/about" title="About">About</a></li><li><a href="https://twitter.com/citycyclops">TWITTER</a></li><li><a href="http://chiefobrienatwork.com/post/106684455801">EPISODE 1</a></li></div></div>
+
+<div id="Z-wrapper">
+
+<div id="L"></div>
+
+<div id="Z" class="W_M">
+
+
+
+<article id="110143813381" class="X">
+
+
+
+
+
+
+
+
+
+
+<div class="P"><div class="P-H"><a class="G" href="http://chiefobrienatwork.com/post/110143813381/episode-60-being-human-read-the-previous"></a><div class="larger-width"><img src="http://41.media.tumblr.com/db92f4218b8a100f216863ce980e19a9/tumblr_njaewe7vNU1tjd8fao1_1280.jpg"alt="EPISODE 60: Being Human&nbsp;Read the previous episode&rarr;"></div><div class="normal-width"><img src="http://41.media.tumblr.com/db92f4218b8a100f216863ce980e19a9/tumblr_njaewe7vNU1tjd8fao1_500.jpg"alt="EPISODE 60: Being Human&nbsp;Read the previous episode&rarr;"></div></div></div>
+
+
+
+
+
+
+<div class="P-post"><div class="captions"><p>EPISODE 60: Being Human </p><p><a href="http://chiefobrienatwork.com/post/109475745976">Read the previous episode→</a></p></div><div class="D"><a href="http://chiefobrienatwork.com/post/110143813381/episode-60-being-human-read-the-previous">5 days ago</a> /  <a href="http://chiefobrienatwork.com/post/110143813381/episode-60-being-human-read-the-previous">87 notes</a><div class="buttons"><span><a href="https://www.tumblr.com/reblog/110143813381/TfGpuMLW" class="reblog_button"style="display: block;width:14px;height:14px;"><svg width="100%" height="100%" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ccc"><path d="M5.01092527,5.99908429 L16.0088498,5.99908429 L16.136,9.508 L20.836,4.752 L16.136,0.083 L16.1360004,3.01110845 L2.09985349,3.01110845 C1.50585349,3.01110845 0.979248041,3.44726568 0.979248041,4.45007306 L0.979248041,10.9999998 L3.98376463,8.30993634 L3.98376463,6.89801007 C3.98376463,6.20867902 4.71892527,5.99908429 5.01092527,5.99908429 Z"></path><path d="M17.1420002,13.2800293 C17.1420002,13.5720293 17.022957,14.0490723 16.730957,14.0490723 L4.92919922,14.0490723 L4.92919922,11 L0.5,15.806 L4.92919922,20.5103758 L5.00469971,16.9990234 L18.9700928,16.9990234 C19.5640928,16.9990234 19.9453125,16.4010001 19.9453125,15.8060001 L19.9453125,9.5324707 L17.142,12.203"></path></svg></a></span><span><div class="like_button" data-post-id="110143813381" id="like_button_110143813381"><iframe id="like_iframe_110143813381" src="http://assets.tumblr.com/assets/html/like_iframe.html?_v=eec83bdba6047aaffe0aea2a68f975cb#name=chiefobrienatwork&amp;post_id=110143813381&amp;rk=TfGpuMLW" scrolling="no" width="14" height="14" frameborder="0" class="like_toggle" allowTransparency="true"></iframe></div></span></div></div></div></article>
+
+
+
+<article id="109475745976" class="X">
+
+
+
+
+
+
+
+
+
+
+<div class="P"><div class="P-H"><a class="G" href="http://chiefobrienatwork.com/post/109475745976/episode-59-safe-place-read-the-next-episode-read"></a><div class="larger-width"><img src="http://41.media.tumblr.com/36ceea89fd47fa34c1a02dce5c958861/tumblr_nixokfO2CS1tjd8fao1_1280.jpg"alt="EPISODE 59: Safe PlaceRead the next episode&rarr;Read the previous episode&rarr;"></div><div class="normal-width"><img src="http://40.media.tumblr.com/36ceea89fd47fa34c1a02dce5c958861/tumblr_nixokfO2CS1tjd8fao1_500.jpg"alt="EPISODE 59: Safe PlaceRead the next episode&rarr;Read the previous episode&rarr;"></div></div></div>
+
+
+
+
+
+
+<div class="P-post"><div class="captions"><p>EPISODE 59: Safe Place</p><p><a href="http://chiefobrienatwork.com/post/110143813381">Read the next episode→</a></p><p><a href="http://chiefobrienatwork.com/post/108775686736">Read the previous episode→</a></p></div><div class="D"><a href="http://chiefobrienatwork.com/post/109475745976/episode-59-safe-place-read-the-next-episode-read">1 week ago</a> /  <a href="http://chiefobrienatwork.com/post/109475745976/episode-59-safe-place-read-the-next-episode-read">57 notes</a><div class="buttons"><span><a href="https://www.tumblr.com/reblog/109475745976/kPhzIxSX" class="reblog_button"style="display: block;width:14px;height:14px;"><svg width="100%" height="100%" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ccc"><path d="M5.01092527,5.99908429 L16.0088498,5.99908429 L16.136,9.508 L20.836,4.752 L16.136,0.083 L16.1360004,3.01110845 L2.09985349,3.01110845 C1.50585349,3.01110845 0.979248041,3.44726568 0.979248041,4.45007306 L0.979248041,10.9999998 L3.98376463,8.30993634 L3.98376463,6.89801007 C3.98376463,6.20867902 4.71892527,5.99908429 5.01092527,5.99908429 Z"></path><path d="M17.1420002,13.2800293 C17.1420002,13.5720293 17.022957,14.0490723 16.730957,14.0490723 L4.92919922,14.0490723 L4.92919922,11 L0.5,15.806 L4.92919922,20.5103758 L5.00469971,16.9990234 L18.9700928,16.9990234 C19.5640928,16.9990234 19.9453125,16.4010001 19.9453125,15.8060001 L19.9453125,9.5324707 L17.142,12.203"></path></svg></a></span><span><div class="like_button" data-post-id="109475745976" id="like_button_109475745976"><iframe id="like_iframe_109475745976" src="http://assets.tumblr.com/assets/html/like_iframe.html?_v=eec83bdba6047aaffe0aea2a68f975cb#name=chiefobrienatwork&amp;post_id=109475745976&amp;rk=kPhzIxSX" scrolling="no" width="14" height="14" frameborder="0" class="like_toggle" allowTransparency="true"></iframe></div></span></div></div></div></article>
+
+
+
+<article id="108775686736" class="X">
+
+
+
+
+
+
+
+
+
+
+<div class="P"><div class="P-H"><a class="G" href="http://chiefobrienatwork.com/post/108775686736/episode-58-table-for-three-read-the-next"></a><div class="larger-width"><img src="http://40.media.tumblr.com/b3a89c42cc5e2f782aff3e535344693b/tumblr_nijws5yQWT1tjd8fao1_1280.jpg"alt="EPISODE 58: Table for Three
+Read the next episode&rarr;
+Read the previous episode&rarr;"></div><div class="normal-width"><img src="http://40.media.tumblr.com/b3a89c42cc5e2f782aff3e535344693b/tumblr_nijws5yQWT1tjd8fao1_500.jpg"alt="EPISODE 58: Table for Three
+Read the next episode&rarr;
+Read the previous episode&rarr;"></div></div></div>
+
+
+
+
+
+
+<div class="P-post"><div class="captions"><p>EPISODE 58: Table for Three</p>
+<p><a href="http://chiefobrienatwork.com/post/109475745976">Read the next episode→</a></p>
+<p><a href="http://chiefobrienatwork.com/post/108137460551">Read the previous episode→</a></p></div><div class="D"><a href="http://chiefobrienatwork.com/post/108775686736/episode-58-table-for-three-read-the-next">2 weeks ago</a> /  <a href="http://chiefobrienatwork.com/post/108775686736/episode-58-table-for-three-read-the-next">68 notes</a><div class="buttons"><span><a href="https://www.tumblr.com/reblog/108775686736/dsLjB1xR" class="reblog_button"style="display: block;width:14px;height:14px;"><svg width="100%" height="100%" viewBox="0 0 21 21" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#ccc"><path d="M5.01092527,5.99908429 L16.0088498,5.99908429 L16.136,9.508 L20.836,4.752 L16.136,0.083 L16.1360004,3.01110845 L2.09985349,3.01110845 C1.50585349,3.01110845 0.979248041,3.44726568 0.979248041,4.45007306 L0.979248041,10.9999998 L3.98376463,8.30993634 L3.98376463,6.89801007 C3.98376463,6.20867902 4.71892527,5.99908429 5.01092527,5.99908429 Z"></path><path d="M17.1420002,13.2800293 C17.1420002,13.5720293 17.022957,14.0490723 16.730957,14.0490723 L4.92919922,14.0490723 L4.92919922,11 L0.5,15.806 L4.92919922,20.5103758 L5.00469971,16.9990234 L18.9700928,16.9990234 C19.5640928,16.9990234 19.9453125,16.4010001 19.9453125,15.8060001 L19.9453125,9.5324707 L17.142,12.203"></path></svg></a></span><span><div class="like_button" data-post-id="108775686736" id="like_button_108775686736"><iframe id="like_iframe_108775686736" src="http://assets.tumblr.com/assets/html/like_iframe.html?_v=eec83bdba6047aaffe0aea2a68f975cb#name=chiefobrienatwork&amp;post_id=108775686736&amp;rk=dsLjB1xR" scrolling="no" width="14" height="14" frameborder="0" class="like_toggle" allowTransparency="true"></iframe></div></span></div></div></div></article>
+
+
+
+</div>
+
+<div id="P"><a class="current">1</a><a href="/page/2">2</a><a href="/page/3">3</a><a href="/page/4">4</a><a href="/page/5">5</a><a href="/page/2" id="nextPage">Older   →</a></div>
+
+</div>
+
+<script src="http://static.tumblr.com/3zmswwt/nC3mwrowe/jquery.js" type="text/javascript"></script>
+
+<script type="text/javascript">(function (){var $K = $('#Z');$K.imagesLoaded(function (){$K.masonry({itemSelector:'.X,big-post',isFitWidth:true})});})();</script>
+
+<!-- BEGIN TUMBLR CODE --><iframe scrolling="no" width="1" height="1" frameborder="0" style="background-color:transparent; overflow:hidden; position:absolute; top:0; left:0; z-index:9999;" id="ga_target"></iframe><script type="text/javascript">
+    (function(){
+        var analytics_frame = document.getElementById('ga_target');
+        var analytics_iframe_loaded;
+        var user_logged_in;
+        var blog_is_nsfw = 'No';
+        var addthis_enabled = false;
+
+        var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
+        var eventer = window[eventMethod];
+        var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
+        eventer(messageEvent,function(e) {
+            var message = (e.data && e.data.split) ? e.data.split(';') : '';
+            switch (message[0]) {
+                case 'analytics_iframe_loaded':
+                    analytics_iframe_loaded = true;
+                    postCSMessage();
+                    postGAMessage();
+                    postATMessage();
+                    break;
+                case 'user_logged_in':
+                    user_logged_in = message[1];
+                    postGAMessage();
+                    postATMessage();
+                    break;
+            }
+        }, false);
+
+        analytics_frame.src = "https://secure.assets.tumblr.com/analytics.html?a57a7a4b4579d695d8e64bdfee554a5e#http://chiefobrienatwork.com";
+        function postGAMessage() {
+            if (analytics_iframe_loaded && user_logged_in) {
+                var is_ajax = false;
+                analytics_frame.contentWindow.postMessage(['tick_google_analytics', is_ajax, user_logged_in, blog_is_nsfw, '/?route=%2F'].join(';'), analytics_frame.src.split('/analytics.html')[0]);
+            }
+        }
+        function postCSMessage() {
+            COMSCORE = true;
+            analytics_frame.contentWindow.postMessage('enable_comscore;' + window.location, analytics_frame.src.split('/analytics.html')[0]);
+        }
+        function postATMessage() {
+            if (addthis_enabled && analytics_iframe_loaded) {
+                analytics_frame.contentWindow.postMessage('enable_addthis', analytics_frame.src.split('/analytics.html')[0]);
+            }
+        }
+    })();
+</script><script type="text/javascript">!function(s){s.src='https://www.tumblr.com/impixu?T=1423592634&J=eyJ0eXBlIjoidXJsIiwidXJsIjoiaHR0cDpcL1wvY2hpZWZvYnJpZW5hdHdvcmsuY29tXC8iLCJyZXF0eXBlIjowLCJyb3V0ZSI6IlwvIn0=&U=MBOAOBLGKE&K=37cfd691e5fdcc09fc63511778811a73c942db1a8f532d5a8d5b057cf538439e&R='.replace(/&R=[^&$]*/,'').concat('&R='+escape(document.referrer)).slice(0,2000).replace(/%.?.?$/,'');}(new Image());</script><noscript><img style="position:absolute;z-index:-3334;top:0px;left:0px;visibility:hidden;" src="https://www.tumblr.com/impixu?T=1423592634&J=eyJ0eXBlIjoidXJsIiwidXJsIjoiaHR0cDpcL1wvY2hpZWZvYnJpZW5hdHdvcmsuY29tXC8iLCJyZXF0eXBlIjowLCJyb3V0ZSI6IlwvIiwibm9zY3JpcHQiOjF9&U=MBOAOBLGKE&K=cd1bbdbeea008fe23239932cd64d4efae9b521228c506fee8c1dafe19e7be8c1&R="></noscript><script>
+        (function (w,d) {
+            'use strict';
+            var l = function(el, type, listener, useCapture) {
+                el.addEventListener ?
+                el.addEventListener(type, listener, !!useCapture) :
+                el.attachEvent && el.attachEvent('on' + type, listener, !!useCapture);
+            };
+            var a = function () {
+                                if (d.getElementById('tumblr-cdx')) {
+                    return;
+                }
+                var s = d.createElement('script');
+                var el = d.getElementsByTagName('script')[0];
+                s.async = true;
+                s.src = 'http://assets.tumblr.com/assets/scripts/vendor/cedexis/cedexis.radar.min.js?_v=1360de60c9b05c6a55bd6a6e510e1699';
+                s.type = 'text/javascript';
+                s.id = 'tumblr-cdx';
+                d.body.appendChild(s);
+            };
+            l(w,'load',a);
+        }(window, document));
+</script><script type="text/javascript">!function(s){s.src='https://www.tumblr.com/impixu?T=1423592634&J=eyJ0eXBlIjoicG9zdCIsInVybCI6Imh0dHA6XC9cL2NoaWVmb2JyaWVuYXR3b3JrLmNvbVwvIiwicmVxdHlwZSI6MCwicm91dGUiOiJcLyIsInBvc3RzIjpbeyJwb3N0aWQiOiIxMTAxNDM4MTMzODEiLCJibG9naWQiOiIxOTkyMTMzMTkiLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjEwOTQ3NTc0NTk3NiIsImJsb2dpZCI6IjE5OTIxMzMxOSIsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiMTA4Nzc1Njg2NzM2IiwiYmxvZ2lkIjoiMTk5MjEzMzE5Iiwic291cmNlIjozM31dfQ==&U=EDLNOHCCLC&K=8532668d1fe30f6cdd26403fbbbc9e2170fb4e67aa0623cd6c4c54a269e1ff6d&R='.replace(/&R=[^&$]*/,'').concat('&R='+escape(document.referrer)).slice(0,2000).replace(/%.?.?$/,'');}(new Image());</script><noscript><img style="position:absolute;z-index:-3334;top:0px;left:0px;visibility:hidden;" src="https://www.tumblr.com/impixu?T=1423592634&J=eyJ0eXBlIjoicG9zdCIsInVybCI6Imh0dHA6XC9cL2NoaWVmb2JyaWVuYXR3b3JrLmNvbVwvIiwicmVxdHlwZSI6MCwicm91dGUiOiJcLyIsInBvc3RzIjpbeyJwb3N0aWQiOiIxMTAxNDM4MTMzODEiLCJibG9naWQiOiIxOTkyMTMzMTkiLCJzb3VyY2UiOjMzfSx7InBvc3RpZCI6IjEwOTQ3NTc0NTk3NiIsImJsb2dpZCI6IjE5OTIxMzMxOSIsInNvdXJjZSI6MzN9LHsicG9zdGlkIjoiMTA4Nzc1Njg2NzM2IiwiYmxvZ2lkIjoiMTk5MjEzMzE5Iiwic291cmNlIjozM31dLCJub3NjcmlwdCI6MX0=&U=EDLNOHCCLC&K=9b05042f4334af78fab025b0a5be6050bcd4bce9860e3309cc2c3c65a8271597&R="></noscript><script>
+                (function() {
+                    var s = document.createElement('script');
+                    var el = document.getElementsByTagName('script')[0];
+                                            s.src = ('https:' == document.location.protocol ? 'https://s' : 'http://l') + '.yimg.com/ss/rapid-3.18.1.js';
+                                        s.onload = function(){
+                        var YAHOO = window.YAHOO;
+                        if (YAHOO) {
+                            var keys = {
+                                pd:'/',
+                                _li:0,
+                                b_id:199213319,
+                                i_rad:0,
+                                i_strm:0
+                            };
+                            var conf = {
+                                                                spaceid:1197716038,
+                                client_only:1,
+                                yql_enabled:false,
+                                keys:keys,
+                                nol:1
+                            };
+                            YAHOO.rapid = new YAHOO.i13n.Rapid(conf);
+                        }
+                    };
+                    el.parentNode.insertBefore(s, el);
+                })();
+            </script><script>
+        (function (w,d) {
+            'use strict';
+            var l = function(el, type, listener, useCapture) {
+                el.addEventListener ?
+                el.addEventListener(type, listener, !!useCapture) :
+                el.attachEvent && el.attachEvent('on' + type, listener, !!useCapture);
+            };
+            var a = function () {
+                                if (d.getElementById('tumblr-cdx')) {
+                    return;
+                }
+                var s = d.createElement('script');
+                var el = d.getElementsByTagName('script')[0];
+                s.async = true;
+                s.src = 'http://assets.tumblr.com/assets/scripts/vendor/cedexis/cedexis.radar.min.js?_v=1360de60c9b05c6a55bd6a6e510e1699';
+                s.type = 'text/javascript';
+                s.id = 'tumblr-cdx';
+                d.body.appendChild(s);
+            };
+            l(w,'load',a);
+        }(window, document));
+</script><iframe id="tumblr_controls" class="tumblr_controls" width="1" height="1" frameborder="0" scrolling="no" src="https://secure.assets.tumblr.com/assets/html/iframe/o.html?_v=f20125f18510a3fb14186473395a357f#src=http%3A%2F%2Fchiefobrienatwork.com%2F&amp;lang=en_US&amp;name=chiefobrienatwork&amp;brag=false&amp;avatar=http%3A%2F%2F38.media.tumblr.com%2Favatar_4dfdeb91b2ed_64.png&amp;title=CHIEF+O%26%23039%3BBRIEN+AT+WORK&amp;url=http%3A%2F%2Fchiefobrienatwork.com%2F&amp;page_slide=slide"></iframe><div id="teaser_iframe_container" style="display:none;"><iframe scrolling="no" frameborder="0" src="http://assets.tumblr.com/assets/html/iframe/teaser.html?_v=edb8fbb93fd9030b8c4c6a945e25d6b0#src=http%3A%2F%2Fchiefobrienatwork.com%2F&amp;lang=en_US&amp;name=chiefobrienatwork&amp;brag=false&amp;avatar=http%3A%2F%2F38.media.tumblr.com%2Favatar_4dfdeb91b2ed_64.png&amp;title=CHIEF+O%26%23039%3BBRIEN+AT+WORK&amp;url=http%3A%2F%2Fchiefobrienatwork.com%2F&amp;page_slide=slide" id="teaser_iframe" width="1" height="1"></iframe></div><script type="text/javascript">
+    (function(Tumblr){
+        var follow_iframe_initialized = false;
+        if (Tumblr.FollowTeaser && Tumblr.PostMessageListener) {
+            // Don't do anything until the first initialize event
+            Tumblr.PostMessageListener.initialize(function(message, origin) {
+                if (follow_iframe_initialized || message.length < 2) return;
+
+                if (message[0] === 'follow_iframe' && message[1] === 'enable') {
+                    Tumblr.FollowTeaser.current_page = 1;
+                    Tumblr.FollowTeaser.infer_infinite_scroll = true;
+                    Tumblr.FollowTeaser.create_from_tumblr_controls("http:\/\/assets.tumblr.com\/assets\/html\/iframe\/follow.html?_v=b89f1481e1f620b0f19a16195816f6b4");
+                    Tumblr.FollowTeaser.scroll_listener(true);
+                    follow_iframe_initialized = true;
+                }
+            });
+        }
+    })(this.Tumblr || (this.Tumblr = {}));
+</script><!--[if IE]><script type="text/javascript">document.getElementById('tumblr_controls').allowTransparency=true;</script><![endif]--><!-- END TUMBLR CODE -->
+
+</body>
+</html>
+
+        
\ No newline at end of file