Add test for “Girl Genius,” fix parsing
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 26 Aug 2015 19:34:33 +0000 (21:34 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Wed, 26 Aug 2015 19:34:33 +0000 (21:34 +0200)
src/main/java/net/pterodactylus/rhynodge/filters/comics/GirlGeniusComicFilter.java
src/test/java/net/pterodactylus/rhynodge/filters/comics/GirlGeniusComicFilterTest.java [new file with mode: 0644]
src/test/resources/net/pterodactylus/rhynodge/filters/comics/girl-genius.html [new file with mode: 0644]

index 1bda719..d2ed5aa 100644 (file)
 
 package net.pterodactylus.rhynodge.filters.comics;
 
+import static com.google.common.base.Optional.absent;
+import static com.google.common.base.Optional.of;
+
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 
-import com.google.common.base.Function;
 import com.google.common.base.Optional;
-import com.google.common.collect.FluentIterable;
 import org.jsoup.nodes.Document;
-import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 
 /**
@@ -38,23 +39,18 @@ public class GirlGeniusComicFilter extends ComicSiteFilter {
 
        @Override
        protected Optional<String> extractTitle(Document document) {
-               return Optional.of("");
+               return extractImageUrls(document).isEmpty() ? absent() : of("");
        }
 
        @Override
        protected List<String> extractImageUrls(Document document) {
-               Elements imageElements = document.select("#MainTable img[alt=Comic]");
-               return imageElements.hasAttr("src") ? FluentIterable.from(imageElements).transform(new Function<Element, String>() {
-
-                       @Override
-                       public String apply(Element imageElement) {
-                               return imageElement.attr("src");
-                       }
-               }).toList() : Collections.<String>emptyList();
+               Elements imageElements = document.select("#comicbody img[alt=Comic]");
+               return imageElements.stream().filter(e -> e.hasAttr("src")).map(e -> e.attr("src")).collect(Collectors.toList());
        }
 
        @Override
        protected List<String> extractImageComments(Document document) {
                return Collections.emptyList();
        }
+
 }
diff --git a/src/test/java/net/pterodactylus/rhynodge/filters/comics/GirlGeniusComicFilterTest.java b/src/test/java/net/pterodactylus/rhynodge/filters/comics/GirlGeniusComicFilterTest.java
new file mode 100644 (file)
index 0000000..a45f075
--- /dev/null
@@ -0,0 +1,41 @@
+package net.pterodactylus.rhynodge.filters.comics;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+
+import java.io.IOException;
+
+import net.pterodactylus.rhynodge.Filter;
+import net.pterodactylus.rhynodge.filters.ResourceLoader;
+import net.pterodactylus.rhynodge.states.ComicState;
+import net.pterodactylus.rhynodge.states.HtmlState;
+
+import org.jsoup.nodes.Document;
+import org.junit.Test;
+
+/**
+ * Unit test for {@link GirlGeniusComicFilterTest}.
+ *
+ * @author <a href="mailto:david.roden@bietr.de">David Roden</a>
+ */
+public class GirlGeniusComicFilterTest {
+
+       private final Filter filter = new GirlGeniusComicFilter();
+       private final HtmlState htmlState;
+
+       public GirlGeniusComicFilterTest() throws IOException {
+               Document document = ResourceLoader.loadDocument(GirlGeniusComicFilter.class, "girl-genius.html", "http://www.girlgeniusonline.com/comic.php");
+               htmlState = new HtmlState("http://www.girlgeniusonline.com/comic.php", document);
+       }
+
+       @Test
+       public void comicCanBeParsed() {
+               ComicState comicState = (ComicState) filter.filter(htmlState);
+               assertThat(comicState.comics(), contains(
+                               ComicMatchers.isComic("", contains(
+                                               ComicMatchers.isStrip("http://www.girlgeniusonline.com/ggmain/strips/ggmain20150824.jpg", "")
+                               ))
+               ));
+       }
+
+}
diff --git a/src/test/resources/net/pterodactylus/rhynodge/filters/comics/girl-genius.html b/src/test/resources/net/pterodactylus/rhynodge/filters/comics/girl-genius.html
new file mode 100644 (file)
index 0000000..f0cbc4a
--- /dev/null
@@ -0,0 +1,173 @@
+
+<!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">
+<head>
+       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+       <title>Girl Genius</title>
+       <link href="http://www.girlgeniusonline.com/styles.css" rel="stylesheet" type="text/css" />
+       <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-42979034-1', 'girlgenius.com');
+               ga('send', 'pageview');
+
+               function setPage(page){
+                       var exdate=new Date();
+                       exdate.setDate(exdate.getDate() + 30);
+                       document.cookie='ggcurpage=' + page + '; expires=' +exdate.toUTCString();
+               }
+               function loadBookmark(){
+                       var value = "; " + document.cookie;
+                       var name = 'ggcurpage';
+                       var parts = value.split("; " + name + "=");
+                       if (parts.length == 2) document.location = 'comic.php?date=' + parts.pop().split(";").shift();
+               }
+       </script>
+
+</head>
+<body>
+<div id="header">
+       <a href="http://www.girlgeniusonline.com/index.php" id="logo"></a><div id="leaderboard"><html><head></head><body><!-- Generated by OpenX 2.8.10 -->
+<script type='text/javascript' src='http://ads.thehiveworks.com/delivery/spcjs.php?id=71'></script>
+<script type='text/javascript'><!--// <![CDATA[
+/* [id198] www.girlgenius.com - Leaderboard */
+OA_show(198);
+// ]]> --></script><noscript><a target='_blank' href='http://ads.thehiveworks.com/delivery/ck.php?n=ff74d65'><img src='http://ads.thehiveworks.com/delivery/avw.php?zoneid=198&amp;n=ff74d65' border='0' alt='' /></a></noscript>
+</body>
+</html></div>
+       <div id="menu"><a href="http://www.girlgeniusonline.com/comic.php" id="menucomic"></a><a href="http://www.girlgeniusonline.com/books.php" id="menubooks"></a><a href="http://www.girlgeniusonline.com/shop.php" id="menushop"></a><a href="http://girlgeniusadventures.com/" id="menublog"></a><a href="http://www.girlgeniusonline.com/newreaders.php" id="menunewreaders"></a><a href="http://www.girlgeniusonline.com/funextras.php" id="menufunextras"></a></div>
+</div>
+<div id="wrapper">     <div id="comicarea">
+       <div id="comictop"></div>
+       <div id="comicrepeat">
+               <div id="topnav"><a href="http://www.girlgeniusonline.com/comic.php?date=20021104" id="topfirst" title="The First Comic"></a><a href="http://www.girlgeniusonline.com/comic.php?date=20150821" id="topprev" title="The Previous Comic"></a></div>
+               <div id="topbookmark"><div id="datestring">Monday, August 24, 2015</div><div class="floatit">|</div><a href="javascript:setPage(20150824);" id="savebookmark">Save Bookmark</a><div class="floatit">|</div><a href="javascript:loadBookmark();" id="loadbookmark">Load Bookmark</a></div>
+               <div id="comicbody"><table width="700" height="92" border="0">
+                       <td><script language="JavaScript"><!--
+
+                       //Javascript Created by Computerhope http://www.computerhope.com
+
+                       //store the quotations in arrays
+
+                       images = new Array(2);
+
+                       images[0] = "<a href = 'http://www.topatoco.com/merchant.mvc?Screen=CTGY&Store_Code=TO&Category_Code=GEN'><img src='../!.images.ads/comicad/comicad_topatoco.jpgg' alt='Girl Genius Books' border='0'></a>";
+                       images[1] = "<a href = 'https://www.etsy.com/listing/197100578/standard-orange-wasp-eater-licenced-girl?ref=shop_home_active_6'><img src='../!.images.ads/comicad/comicad_waspeater.jpg' alt='Cute wasp eater plushies!' border='0'></a>";
+
+
+
+                       index = Math.floor(Math.random() * images.length);
+
+                       document.write(images[index]);
+
+                       //done
+
+                       // --></script></td>
+               </table>
+                       <img src='http://www.girlgeniusonline.com/ggmain/strips/ggmain20150824.jpg' ALT='Comic' BORDER=0 WIDTH='700' HEIGHT='1038'/></div>
+               <div style="clear:both"></div>
+               <div id="bottombookmark"><div id="datestring">Monday, August 24, 2015</div><div class="floatit">|</div><a href="javascript:setPage(20150824);" id="savebookmark">Save Bookmark</a><div class="floatit">|</div><a href="javascript:loadBookmark();" id="loadbookmark">Load Bookmark</a></div>
+               <div id="bottomnav"><a href="http://www.girlgeniusonline.com/comic.php?date=20021104" id="bottomfirst" title="The First Comic"></a><a href="http://www.girlgeniusonline.com/comic.php?date=20150821" id="bottomprev" title="The Previous Comic"></a></div>
+       </div>
+       <div id="comicbottom"></div>
+</div>
+
+
+       <div id="sidebar">
+               <div id="sidebartop"></div>
+               <div id="sidebarrepeat">
+                       <div id="sidebarcontainer">
+                               <div id="sociallinks">
+
+
+                                       <!--/* OpenX iFrame Tag v2.8.11 */-->
+
+                                       <iframe id='a744264d' name='a744264d' src='http://ads.thehiveworks.com/delivery/afr.php?zoneid=333&amp;target=_blank&amp;cb=INSERT_RANDOM_NUMBER_HERE' frameborder='0' scrolling='no' width='160' height='347' allowtransparency='true'><a href='http://ads.thehiveworks.com/delivery/ck.php?n=a52e3788&amp;cb=INSERT_RANDOM_NUMBER_HERE' target='_blank'><img src='http://ads.thehiveworks.com/delivery/avw.php?zoneid=333&amp;cb=INSERT_RANDOM_NUMBER_HERE&amp;n=a52e3788' border='0' alt='' /></a></iframe><br /><br />
+                                       <a href="http://www.thehiveworks.com/" target=new>
+                                               <img src="../!.images.ads/hiveworks/hiveworkslogo_gg.png" /></a><br />
+
+                               </div>s<div id="towerad">
+                               <script type='text/javascript'><!--// <![CDATA[
+                               /* [id230] www.girlgenius.com - Tower */
+                               OA_show(230);
+                               // ]]> --></script><noscript><a target='_blank' href='http://ads.thehiveworks.com/delivery/ck.php?n=0cb07c1'><img src='http://ads.thehiveworks.com/delivery/avw.php?zoneid=230&amp;n=0cb07c1' border='0' alt='' /></a></noscript>
+                       </div>
+
+                       </div>
+                       <div style="clear:both"></div>
+
+                       <div id="sociallinks">Follow us!<div style="height:10px;"></div>
+                               <a href="https://www.facebook.com/pages/Girl-Genius-Webcomic/28371352860"><img src="images/facebook.jpg" /></a><br />
+                               <a href="https://twitter.com/girlgenius"><img src="images/twitter.jpg" /></a>
+                       </div>
+
+               </div>
+               <div id="sidebarbottom"></div>
+       </div>
+       <div style="clear:both"></div>
+</div>
+
+
+<div id="comicdiv">
+       <div id="shareinfo"><div id="storylines"><form method=GET name='storyline' action='http://www.girlgeniusonline.com/comic.php'><select name='date' onchange='this.form.submit()'>
+               <option value='20021104'>---First Page of VOLUME ONE---</option><option value='20021104'>The Streets of Beetleburg</option><option value='20021108'>Agatha Gets Mugged</option><option value='20021125'>Late for Class</option><option value='20021204'>Wulfenbach's Visit</option><option value='20021218'>Gil Chews the Scenery</option><option value='20021227'>Merlot Goes Spare</option><option value='20030131'>Agatha Goes Home</option><option value='20030219'>Omar is Very Sick</option><option value='20030228'>Agatha Wakes Up</option><option value='20030307'>The Baron Finds a Clank</option><option value='20030407'>The Baron Visits Clay Mechanical</option><option value='20030423'>Clank vs. Jagers!</option><option value='20030512'>---First Page of VOLUME TWO---</option><option value='20030512'>Agatha Awakens in a Strange Place</option><option value='20030526'>Meeting the Wulfenbach Students</option><option value='20030611'>Meeting with Gil</option><option value='20030620'>The Infamous Falling Machine!</option><option value='20030716'>Meet Von Pinn</option><option value='20030804'>The Dragon From Mars</option><option value='20030910'>Sneaking Into the Baron's Lab</option><option value='20031006'>Othar Tryggvassen, Gentleman Adventurer!</option><option value='20031017'>Any Plan Where You Lose Your Hat...</option><option value='20031027'>Tea with the Generals</option><option value='20031110'>Back to the Dorm</option><option value='20031119'>Agatha is Given the Locket (Flashback)</option><option value='20031124'>In the Lab / Moloch's Story</option><option value='20031205'>Dr. Dim</option><option value='20031212'>Fencing with Royalty</option><option value='20031217'>Agatha Has Had Enough</option><option value='20031229'>It's a Talking Cat...</option><option value='20031231'>---First Page of VOLUME THREE---</option><option value='20040105'>The Baron and Othar</option><option value='20040121'>Bangladesh DuPree</option><option value='20040130'>Gil's Lab</option><option value='20040213'>The Fencing Clank</option><option value='20040225'>Othar Spoils the Mood</option><option value='20040312'>Krosp's Story</option><option value='20040324'>Activating the Engine</option><option value='20040329'>Agatha is Dreaming</option><option value='20040331'>Agatha Wakes Up</option><option value='20040412'>The Alarm</option><option value='20040421'>Rescuing Othar</option><option value='20040430'>The Baron Gets News</option><option value='20040505'>Agatha & Gil vs. the Wasps</option><option value='20040521'>The Students Notice Something Odd</option><option value='20040528'>Von Pinn Gives a Pep Talk</option><option value='20040602'>Agatha & Gil Find the Engine</option><option value='20040614'>Little Clanks to the Rescue!</option><option value='20040623'>Agatha Discovers She Enjoys Adventures</option><option value='20040705'>Gil Gets Himself in Trouble</option><option value='20040709'>Othar Gets Himself in Trouble</option><option value='20040719'>Adam & Lilith Help Out</option><option value='20040728'>Adam & Lilith Meet Klaus (Again)</option><option value='20040804'>Klaus' Story</option><option value='20040820'>Agatha Escapes</option><option value='20040827'>Zulenna Delays the Pursuit</option><option value='20040913'>Agatha and Othar Have a Talk</option><option value='20041004'>---First Page of VOLUME FOUR---</option><option value='20041004'>Crashing the Airship</option><option value='20041011'>Krosp Lacks Mad Cat Skillz</option><option value='20041015'>A Traveling Show</option><option value='20041027'>Agatha Meets Zeetha</option><option value='20041101'>Zeetha's History</option><option value='20041110'>Shove Off</option><option value='20041117'>Crab Monster Attack!</option><option value='20041206'>That Naughty Flashback Scene</option><option value='20041213'>Gil and Klaus Talk</option><option value='20041220'>The Circus Meets Bang</option><option value='20050103'>Gil is Having a Bad Day</option><option value='20050126'>Circus On the Road</option><option value='20050209'>The Baron is Not Pleased</option><option value='20050216'>Warrior Training Begins</option><option value='20050223'>Circus Life</option><option value='20050321'>Geisterdamen On Patrol</option><option value='20050328'>The New Kid Gets Baba Yaga</option><option value='20050404'>---"ADVANCED CLASS" BEGINS---</option><option value='20050404'>Monster Horse Beastie</option><option value='20050415'>Everybody's Sparky!</option><option value='20050504'>On The Road</option><option value='20050513'>Hanging Jagers in Town</option><option value='20050525'>The Heterodyne Play</option><option value='20050603'>Trouble at the Town Gate</option><option value='20050627'>---First Page of Volume FIVE---</option><option value='20050627'>Bridgemonsters</option><option value='20050727'>Agatha's Bad Plan</option><option value='20050805'>Jagermonsters Join the Circus</option><option value='20050810'>Lars Falls in Love</option><option value='20050819'>Krosp Meets Moxana</option><option value='20050829'>The Clank in the Woods</option><option value='20050914'>The Silverodeon is Repaired</option><option value='20050923'>Agatha Meets Moxana</option><option value='20051005'>Agatha vs the Jagers</option><option value='20051012'>Balan's Gap</option><option value='20051028'>Off to the Palace</option><option value='20051109'>A Handy and Enlightening Recap</option><option value='20051116'>The Lady's Chapel</option><option value='20051123'>The Circus is Sent Away</option><option value='20051128'>The Royal Children's Lab</option><option value='20051205'>In the Dungeons</option><option value='20051212'>Short Story Break: "FanFiction"</option><option value='20051228'>Lucrezia the Goddess</option><option value='20060106'>The Storm King</option><option value='20060113'>"Rescued!"</option><option value='20060125'>The Real Rescue Party</option><option value='20060201'>Lucrezia Greets Her Priestesses</option><option value='20060210'>Back to Castle Wulfenbach! Woohoo!</option><option value='20060222'>Klaus is REALLY Mad</option><option value='20060301'>She's ALIVE!</option><option value='20060310'>---First Page of Volume SIX---</option><option value='20060313'>DuPree is Brought up to Speed</option><option value='20060331'>Agatha Wakes Up</option><option value='20060410'>The Rescue Party at Work</option><option value='20060425'>Two New Pages</option><option value='20060426'>Tarvek Gets a Brief Rest</option><option value='20060501'>The Rescue Party in the Deepdown</option><option value='20060515'>Short Story Break: "Personal Trainer"</option><option value='20060524'>Tarvek Shoots his Big Fat Mouth Off</option><option value='20060529'>Anevka and Selnikov</option><option value='20060602'>Agatha's Backup</option><option value='20060626'>An Airship is Spotted</option><option value='20060630'>The Rescue Party Rescued</option><option value='20060707'>Glowy Monsters</option><option value='20060719'>Elevators</option><option value='20060728'>Other Slavers 01</option><option value='20060802'>Other Slavers 02</option><option value='20060809'>The Moat Comes Down</option><option value='20060818'>Tarvek is Left Hanging</option><option value='20060906'>Anevka Learns What She Is</option><option value='20060915'>Lucrezia x 2</option><option value='20060922'>The Baron Arrives</option><option value='20061002'>Wooster Arrives</option><option value='20061006'>Agatha's Signal Activates</option><option value='20061011'>The Really Nice View of Agatha's Signal</option><option value='20061018'>Agatha vs. Vrin</option><option value='20061025'>The Baron's Soldiers</option><option value='20061110'>Lucrezia vs. Everybody</option><option value='20061115'>Rescued!</option><option value='20061127'>Caught!</option><option value='20061211'>Opera Week Begins</option><option value='20061216'>New Page</option><option value='20061220'>Agatha Flips Out (Big Fight)</option><option value='20070115'>The Circus Escapes</option><option value='20070117'>Calming Pie Perfected!</option><option value='20070129'>The Weirdness Escalates</option><option value='20070205'>Leaving NOW!</option><option value='20070212'>Agatha Flips Out (Reprise)</option><option value='20070219'>Zeetha Has a Clue</option><option value='20070226'>---First Page of Volume SEVEN---</option><option value='20070226'>The Rumor Mill</option><option value='20070307'>Yes, it's on Purpose</option><option value='20070312'>What Next?</option><option value='20070316'>Entering Mechanicsburg</option><option value='20070321'>Castle Heterodyne</option><option value='20070326'>Grumpy Jagers</option><option value='20070328'>Gil Lands at the Hospital</option><option value='20070402'>Airman Higgs</option><option value='20070413'>Gil Deludes Himself</option><option value='20070416'>Playing Tourist</option><option value='20070420'>About the Castle</option><option value='20070427'>Another Heir</option><option value='20070511'>Gil protects Klaus</option><option value='20070516'>Agatha Meets Von Mekkan</option><option value='20070525'>The Coffee Engine is Broken?!?</option><option value='20070611'>Report at the Hospital</option><option value='20070618'>Coffee's Ready!</option><option value='20070627'>Troops Storm the Shop</option><option value='20070706'>Klaus Wakes Up</option><option value='20070718'>DuPree on Guard Duty</option><option value='20070723'>Inside the Castle</option><option value='20070808'>History Lesson</option><option value='20070827'>Radio Theater Break: Revenge of the Weasel Queen pt.1</option><option value='20071001'>Back to the Main Story</option><option value='20071005'>Meeting the Castle</option><option value='20071015'>Spark Roast Coffee Ad</option><option value='20071022'>Agatha Faces Down the Castle</option><option value='20071031'>Vole Reports to Gil</option><option value='20071107'>Our Jagers Meet Some New Friends</option><option value='20071109'>Big Stompy War Clanks Spread</option><option value='20071112'>Everybody Fusses About the War Clanks</option><option value='20071116'>Gil Deals With It</option><option value='20071205'>Agatha Notices a Problem</option><option value='20071221'>Agatha Enters the Castle</option><option value='20071225'>Santa Klaus</option><option value='20071226'>Final Page of Volume 7</option><option value='20071228'>Radio Theater Break: Revenge of the Weasel Queen pt.2</option><option value='20080109'>Zeetha Paper Doll</option><option value='20080204'>---First Page of Volume EIGHT---</option><option value='20080204'>The "Storm King" Opera Synopsis</option><option value='20080208'>Agatha in the Castle</option><option value='20080213'>Wilhelm</option><option value='20080225'>Vole Arrives to Take Charge</option><option value='20080312'>Agatha Learns about the Kitchen</option><option value='20080326'>Zola and Agatha Meet Again</option><option value='20080407'>Gil Wakes Up</option><option value='20080416'>Zeetha Brings Gil Up To Speed</option><option value='20080421'>"J�ger Girls" and Mamma</option><option value='20080507'>Gil Paper Doll</option><option value='20080514'>A Diplomatic Meeting</option><option value='20080523'>Klaus Takes a Stroll</option><option value='20080602'>Gil Works it Out</option><option value='20080604'>Barfight! Also: Higgs</option><option value='20080616'>Mechanicsburg Tourism</option><option value='20080625'>Back in the Castle</option><option value='20080707'>The Test</option><option value='20080716'>Gil's Great Plan</option><option value='20080721'>On the Pink Airship</option><option value='20080806'>Gil Makes a New Plan</option><option value='20080813'>Got the Job?</option><option value='20080827'>Do You Have a Boyfriend?</option><option value='20080905'>Don't Move, or it Will See You</option><option value='20080912'>Riding the Tiger</option><option value='20080926'>Violetta is Displeased</option><option value='20081001'>Gil Catches Up With Old Friends</option><option value='20081008'>We Forgot the Crowd!</option><option value='20081013'>Now We Must Fight!</option><option value='20081022'>Always Wear Under Wear</option><option value='20081103'>Gil Introduces Himself</option><option value='20081107'>Agatha Catches the Show</option><option value='20081114'>Gil is Surprised</option><option value='20081117'>An Old Friend Returns</option><option value='20081119'>Final Page of Volume 8 (SPOILER!)</option><option value='20081121'>Fairy Tale Theater Break: Cinderella</option><option value='20090114'>Volume Nine Web Cover & Wallpaper</option><option value='20090116'>---First Page of Volume NINE---</option><option value='20090119'>Mole Machine</option><option value='20090126'>Delivery for the Baron</option><option value='20090206'>Agatha in the Castle</option><option value='20090218'>Gil in the Castle</option><option value='20090225'>Zola's Evil Plan (Muhahaha)</option><option value='20090306'>Agatha Oversleeps</option><option value='20090311'>Agatha Hides Her Embarrassment Poorly</option><option value='20090313'>Gil is Working on Repairs</option><option value='20090320'>How Gil Knows Zola</option><option value='20090325'>Let's Split Up!</option><option value='20090401'>The Castle Finds Gil</option><option value='20090406'>More of Zola's Evil Plan</option><option value='20090415'>Agatha Gets Wound Up</option><option value='20090422'>Agatha Finds Gil</option><option value='20090506'>Mad Social Science</option><option value='20090511'>Smoochus Interruptus</option><option value='20090601'>Radio Theater Break: Revenge of the Weasel Queen pt.3</option><option value='20090701'>Agatha Settles Pinkie's Hash</option><option value='20090706'>I Love Christmas!</option><option value='20090708'>Nanny Attack!</option><option value='20090717'>Get Going, Hero Boy</option><option value='20090727'>An Attempt at Conversation</option><option value='20090805'>An Attempt at Romance</option><option value='20090810'>An Attempt at Medicine</option><option value='20090817'>Phil & Kaja's Hugo Acceptance Speech</option><option value='20090819'>Hold Still. This'll be Fun!</option><option value='20090824'>Violetta Gets a New Job</option><option value='20090902'>Mad Science</option><option value='20090909'>Tarvek Sturmvoraus, Boy Detective</option><option value='20090923'>Agatha and Her Guinea Pigs</option><option value='20090930'>Dingbot Fight!</option><option value='20091014'>They're Gone?!</option><option value='20091019'>Elevator Madness!</option><option value='20091027'>Ad Interrupt</option><option value='20091030'>The Great Movement Chamber</option><option value='20091106'>Agatha Feels Green</option><option value='20091113'>The Castle Flips Out</option><option value='20091120'>Gil & Tarvek "Help"</option><option value='20091202'>The Castle REALLY Flips Out</option><option value='20091209'>Final Page of Volume 9</option><option value='20091211'>Holiday Hilarity Break</option><option value='20091214'>---First Page of Volume TEN---</option><option value='20091218'>What Klaus is Up To</option><option value='20091228'>What Agatha is Up To</option><option value='20100108'>Lucrezia Visits</option><option value='20100120'>The Thing from the Pit</option><option value='20100210'>Zeetha!</option><option value='20100224'>Zeetha and Violetta Bond</option><option value='20100310'>Agatha Wins</option><option value='20100315'>Othar!</option><option value='20100329'>What Secondary Process?</option><option value='20100405'>Have a Drink...</option><option value='20100412'>Nova Albion Comic</option><option value='20100414'>Get Him!</option><option value='20100428'>I Know, Let's Fight!</option><option value='20100503'>Blowing a Gasket</option><option value='20100507'>Lucrezia's Secret Lab</option><option value='20100519'>Elsewhere: Maxim Buys a Hat</option><option value='20100616'>Flirting Minions</option><option value='20100621'>Knocked Out</option><option value='20100705'>Deal With the Devil</option><option value='20100712'>Zola Takes Over</option><option value='20100721'>Nice "Death Trap"</option><option value='20100802'>Frustrated Sparks</option><option value='20100809'>BOOM!</option><option value='20100816'>Time to Get Moving</option><option value='20100820'>General Teatime with Boris</option><option value='20100901'>Higgs Knows Secret Passages</option><option value='20100910'>Aaaah! It's Zola!</option><option value='20100924'>The Castle Seraglio</option><option value='20101001'>It's A Big Awesome Plant! Neat!</option><option value='20101008'>Zeetha!</option><option value='20101015'>Zeetha!!</option><option value='20101022'>Final Page of Volume 10</option><option value='20101025'>---First Page of Volume ELEVEN---</option><option value='20101025'>Zola Goes up to Eleven</option><option value='20101103'>The Library</option><option value='20101115'>Theo Works in Unstable Conditions</option><option value='20101124'>Agatha is Mean to Tarvek</option><option value='20101203'>Transfering VonPinn</option><option value='20101222'>Back in the Great Movement Chamber</option><option value='20101224'>Who Gets to Throw the Switch</option><option value='20101227'>Duck! It's Zola...</option><option value='20110105'>A Nice Baby Drawing</option><option value='20110107'>Back to the Fight</option><option value='20110112'>Those Flying Coats NEVER Work Properly</option><option value='20110119'>Zola Leaves the Castle</option><option value='20110126'>Higgs Requests Leave</option><option value='20110202'>A Star Witness is Revived</option><option value='20110209'>Repairs and Quibbling Continue Apace</option><option value='20110216'>ZOMG! FIRE!</option><option value='20110221'>Zola in Hospital</option><option value='20110302'>Wandering Heroes</option><option value='20110309'>Amazonian Flirting</option><option value='20110311'>Jager Meeting</option><option value='20110323'>Tarvek Explains Some Things</option><option value='20110404'>Van Has a Visitor</option><option value='20110415'>Second Hugo Acceptance Speech! (Jager-style)</option><option value='20110418'>Back to Van and His Jolly Friends</option><option value='20110420'>Back to Agatha and Her Jolly Friends</option><option value='20110502'>The Baron, The Storyteller, and Stories</option><option value='20110518'>Meanwhile, at Mamma's</option><option value='20110520'>Castle Wulfenbach War Room</option><option value='20110530'>On the Ground in Mechanicsburg</option><option value='20110603'>Agatha Finds the Last Repair Site</option><option value='20110629'>Tiktoffen Makes His Move</option><option value='20110720'>Vole Makes His Move</option><option value='20110805'>"Krosp" Saves the Day</option><option value='20110812'>Gil Makes a New Friend</option><option value='20110817'>That Kissing Scene</option><option value='20110824'>Coming to Gil's Rescue</option><option value='20110831'>Third Hugo Acceptance Speech!</option><option value='20110907'>Violetta's Reasoning</option><option value='20110916'>Rescuing the Prince</option><option value='20110921'>Oublenmach Climbs the Doom Bell Tower</option><option value='20110923'>The Town Council Meets</option><option value='20111003'>Castle Fixing Complete?</option><option value='20111007'>Gil Leaves the Castle</option><option value='20111102'>Agatha and the Doom Bell</option><option value='20111104'>Final Page of Volume 11</option><option value='20111107'>---First Page of Volume TWELVE---</option><option value='20111107'>Repairing the Great Movement Chamber</option><option value='20111111'>The Doom Bell Rings All Over Town</option><option value='20111130'>Welcome Home Lady Heterodyne</option><option value='20111212'>Welcome Home Jagers</option><option value='20111219'>Welcome Home...uh...Gilgamesh Wulfenbach?</option><option value='20111221'>Castle Heterodyne Releases its Prisoners</option><option value='20111223'>Dragons Wake</option><option value='20111228'>Agatha Meets Some Friends</option><option value='20120104'>Agatha and Friends Make Plans</option><option value='20120113'>Gil Returns</option><option value='20120125'>Someone's Been Sitting on MY Empire!</option><option value='20120201'>On the Walls of Mechanicsburg</option><option value='20120208'>Stories and...RUN!</option><option value='20120222'>Bang Finds Her Favorite Toy</option><option value='20120224'>Bang Falls in Lurve!</option><option value='20120229'>Gil's Double-Secret Lab</option><option value='20120312'>Gil Gets to Work</option><option value='20120323'>Falling!</option><option value='20120330'>Celebrating at the Castle</option><option value='20120404'>Gil has a Bad Day</option><option value='20120410'>The Cover of the Second Girl Genius Novel</option><option value='20120413'>Nuts and Squirrels and Grad Students</option><option value='20120418'>Agatha Working: full page art</option><option value='20120420'>Agatha and Zeetha try on Armor</option><option value='20120504'>Tarvek Demonstrates the Futility</option><option value='20120511'>Tarvek and the Generals</option><option value='20120601'>The Vespiary Squad Rescue</option><option value='20120704'>Big Horrible Monster!</option><option value='20120713'>More of that Kissing Stuff</option><option value='20120720'>Adventures with Boris</option><option value='20120725'>Repairs in Town</option><option value='20120810'>Giant Apes and Everything Else</option><option value='20120827'>I Require a Spark</option><option value='20120914'>The Battering Ram</option><option value='20121001'>Dragons</option><option value='20121012'>The Storm King</option><option value='20121017'>Hero in a Jar</option><option value='20121025'>Airship Regatta Poster</option><option value='20121026'>Evacuation?</option><option value='20121031'>More of Tarvek's family</option><option value='20121112'>Getting Across Town</option><option value='20121121'>Othar! Also, Agatha blows stuff up.</option><option value='20121130'>Franz Proves he can Fly</option><option value='20121212'>Gil to the Rescue</option><option value='20121219'>BOOM</option><option value='20121219'>Final Page of Volume 12</option><option value='20121221'>---First Page of Volume THIRTEEN---</option><option value='20121222'>Gizmocracy Thanks</option><option value='20121224'>Lover's Spat</option><option value='20130114'>The Castle is Back!</option><option value='20130128'>Higgs and Zeetha <3</option><option value='20130213'>The Castle Gets Down to Business</option><option value='20130227'>The Baron Hatches a Plan</option><option value='20130313'>Higgs and Zeetha Again</option><option value='20130322'>Agatha Returns to her Friends</option><option value='20130405'>The Storm King Rides Up</option><option value='20130410'>The Heterodyne Requires Cake</option><option value='20130415'>Hideous Arcane Rituals</option><option value='20130419'>The Hugo Award Nominees</option><option value='20130422'>Something Falls from the Sky</option><option value='20130429'>Agatha Takes a Side Trip</option><option value='20130506'>Through a Door</option><option value='20130529'>Wakey Wakey</option><option value='20130614'>Martellus Is In The House</option><option value='20130701'>Xerxsephina</option><option value='20130717'>Let's Play With Paper dolls!</option><option value='20130729'>A Most Beautiful Creation</option><option value='20130812'>The Master Is A Hunting</option><option value='20130902'>Activate The Wave Motion Swan</option><option value='20130911'>Gilgamesh Gets Word</option><option value='20131004'>Jagermonsters To The Rescue</option><option value='20131023'>Doink</option><option value='20131028'>No Time For Mechanicsburg</option><option value='20131108'>Gil Meets Martellus</option><option value='20131120'>The Boys Have A Lightning Duel</option><option value='20131202'>A Happier Reunion</option><option value='20131216'>Gil Awakens</option><option value='20131227'>Final Page of Volume 13</option><option value='20140101'>Radio Theater Break: Small Problems</option><option value='20140303'>---First Page of Act 2: BOOK ONE---</option><option value='20140303'>Catching the Train</option><option value='20140314'>A Discussion About Family</option><option value='20140331'>A Boy And His Empire</option><option value='20140409'>Martellus Has Been Busy</option><option value='20140423'>Jager PaperDollinks</option><option value='20140430'>Politics</option><option value='20140505'>Some Ladies Come To Dinner</option><option value='20140516'>Gil Enters Mechanicsburg</option><option value='20140519'>Knock, knock</option><option value='20140609'>An Instructive Detour</option><option value='20140620'>A Snowy Impediment</option><option value='20140725'>Reviving Vole</option><option value='20140808'>Gil and Bang have a Talk</option><option value='20140813'>Cheyenne Wright's Homecoming King story</option><option value='20140827'>2014 Hugo Wrap-up</option><option value='20140829'>Back to the Main Story</option><option value='20140917'>Flying Escape</option><option value='20140917'>Flying Escape</option><option value='20140922'>Bears Like Pickles</option><option value='20140924'>Back in Gil's Lab</option><option value='20141001'>Saint Szpac</option><option value='20141013'>Pickle Man Awake!</option><option value='20141022'>In the Vaults</option><option value='20141027'>Smite!</option><option value='20141105'>Church and State</option><option value='20141110'>The Train Arrives</option><option value='20141121'>The Kitchen and What Happened There</option><option value='20141201'>To the Vaults!</option><option value='20141205'>What Lady Selnikov Did</option><option value='20141215'>Martellus Again</option><option value='20141226'>Arming Dinosaurs Wallpaper</option><option value='20141229'>Final Page of Act 2, Book One</option><option value='20141231'>Cinderella Paper Doll Fun</option><option value='20150119'>---First Page of Act 2: BOOK TWO---</option><option value='20150119'>Talking To The Beast</option><option value='20150130'>Not in Fact a Transformer</option><option value='20150211'>Monk Tech</option><option value='20150220'>Hail to the King</option><option value='20150306'>Fun With Magnetics</option><option value='20150316'>Humongulus Is Impressed</option><option value='20150325'>A Very Well Drawn Panoramic Shot</option><option value='20150403'>The New Train</option><option value='20150410'>The Fighting Girls Tea and Cake Society</option><option value='20150417'>Lucrezia Comes to Visit</option><option value='20150501' selected>On the Train to Paris</option></select></form>
+       </div><div id="buyasprint"><a href="http://www.topatoco.com/merchant.mvc?Screen=CTGY&Category_Code=GEN"><img src="http://www.girlgeniusonline.com/images/buyinprint.png" /></a></div><div id="sharebuttons">
+               <a href="http://www.girlgeniusonline.com/ggmain.rss" style="float:left; margin-right:2px;"><img src="http://www.girlgeniusonline.com/images/rss.jpg" /></a><!-- AddThis Button BEGIN -->
+               <div class="addthis_toolbox addthis_default_style addthis_32x32_style">
+                       <a class="addthis_button_facebook"></a>
+                       <a class="addthis_button_twitter"></a>
+                       <a class="addthis_button_tumblr"></a>
+                       <a class="addthis_button_pinterest_share"></a>
+                       <a class="addthis_button_google_plusone_share"></a>
+                       <a class="addthis_button_email"></a>
+                       <a class="addthis_button_compact"></a><a class="addthis_counter addthis_bubble_style"></a>
+               </div>
+               <script type="text/javascript">var addthis_config = {"data_track_addressbar":true};</script>
+               <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-537069ab3563f384"></script>
+               <!-- AddThis Button END --></div></div>
+       <div id="transcriptionbox"><div style="float:right"><!-- Begin Ohnorobot.com Comic Transcription code for Girl Genius -->
+               <script language="JavaScript" type="text/javascript" src="http://www.ohnorobot.com/js/2134.js"></script>
+               <script language="JavaScript" type="text/javascript"><!--
+               transcribe('app3dc859RRPM2134');
+               // -->
+               </script>
+               <!-- End Ohnorobot.com code --></div>
+               <!-- Begin Ohnorobot.com Comic Search Box for Girl Genius -->
+               <form action="http://www.ohnorobot.com/" method="get" style="float:left;"><table border="0">
+                       <tr><td>Search Girl Genius: <input type="text" name="s" value="">
+                               <input type="hidden" name="comic" value="2134">
+                               <input type="submit" name="search" value="Search"></td></tr>
+                       <tr><td align="center">Powered by <a href="http://www.ohnorobot.com/">OhNoRobot.com</a></td></tr>
+               </table></form>
+               <!-- End Ohnorobot.com code -->
+       </div>
+       <div id="ibar"></div>
+       <script type="text/javascript" src="http://www.thehiveworks.com/jumpbar.js"></script>
+       <div id="bottomleader">
+               <div id="bottomleadercontainer"><script type='text/javascript'><!--// <![CDATA[
+               /* [id231] www.girlgenius.com - Bottom Leader */
+               OA_show(231);
+               // ]]> --></script><noscript><a target='_blank' href='http://ads.thehiveworks.com/delivery/ck.php?n=bdd9962'><img src='http://ads.thehiveworks.com/delivery/avw.php?zoneid=231&amp;n=bdd9962' border='0' alt='' /></a></noscript>
+               </div>
+       </div></div>
+<div id="newsarea">
+       <div id="newstop"></div>
+       <div id="newsrepeat">
+               <div id="newscontent">
+                       Girl Genius is written by Professors Phil & Kaja Foglio of TPU, with drawings by Prof. P. Foglio.
+                       Volume One was inked by Brian Snoddy. Volumes Two and Three were colored by Mark McNabb. Volume Four was colored by Laurie E. Smith. Cheyenne Wright is our current colorist. His work begins with Volume Five.<br /><br />
+
+                       Girl Genius is a registered trademark of <a href="http://girlgeniusonline.com/info/contact.php">Studio Foglio, LLC</a>. Agatha Heterodyne, Transylvania Polygnostic and all Girl Genius art, characters, design elements and logos™ & ©2000-2015 Studio Foglio, LLC., All rights reserved. Airship Entertainment™ is an imprint of Studio Foglio LLC, and publishes Girl Genius Graphic Novels on a yearly basis. Look for them in your favorite bookstore!
+                       <br /><br />
+                       AutoKeen Lite programmed by <a href="http://www.nukees.com/">Darren Bleuel</a>, as a service of <a href="http://www.keenspot.com/">Keenspot Comics</a>.
+                       Special thanks to RB "Sparks" who took it apart and made it work.<br /><br />
+               </div>
+               <div style="clear:both"></div>
+       </div>
+       <div id="newsbottom"><a id="contactbutton" href="contact.php"></a></div>
+</div>
+</body>
+</html>