Start adding unit tests for backends

This commit is contained in:
Alexander Olofsson 2024-10-18 09:28:52 +02:00
parent 8dcb61154e
commit 545ceef7c3
Signed by: ace
GPG key ID: D439C9470CB04C73
14 changed files with 2908 additions and 10 deletions

View file

@ -5,10 +5,7 @@ source "https://rubygems.org"
# Specify your gem's dependencies in fic_tracker.gemspec
gemspec
gem "rake", "~> 13.0"
gem "minitest", "~> 5.16"
gem "rake", "~> 13.0"
gem "rubocop", "~> 1.21"
gem 'irb'
gem "webmock"

View file

@ -126,6 +126,8 @@ module FicTracker::Backends::Ao3
attrs = extract_chapter(doc.at_css('#chapters > div.chapter'))
chapter.set(**attrs)
chapter
end
def get_search_info
@ -144,6 +146,22 @@ module FicTracker::Backends::Ao3
slug.to_s
end
def parse_slug_type(slug)
return nil unless slug.is_a?(String) && slug.start_with?('http')
slug = URI(slug)
first_part = slug.path.split('/').reject(&:empty?).first
case first_part
when 'users'
:author
when 'works'
:story
else
raise "Unable to parse #{slug} (#{first_part}) as a slug"
end
end
private
def extract_story(doc)

View file

@ -102,7 +102,7 @@ module FicTracker::Util
Logging.logger[self]
end
attr_accessor :encoder, :compress
attr_accessor :encoder
ENCODING_FLAGS = 1 << 0 | 1 << 1 | 1 << 2
COMPRESSED_FLAG = 1 << 3

118
test/backends/test_ao3.rb Normal file
View file

@ -0,0 +1,118 @@
# frozen_string_literal: true
require 'test_helper'
require 'fic_tracker/backends/ao3/backend'
class TestAo3 < Minitest::Test
def setup
stub_request(:get, 'https://archiveofourown.org/works/1234567890?view_adult=true').to_return(
status: 302,
headers: { 'Location' => 'https://archiveofourown.org/works/1234567890/chapters/1234567890?view_adult=true' },
)
stub_request(:get, 'https://archiveofourown.org/works/1234567890/navigate').to_return(
status: 200,
body: File.read('test/fixtures/ao3/story_nav.html')
)
stub_request(:get, 'https://archiveofourown.org/works/1234567890/chapters/1234567890?view_adult=true').to_return(
status: 200,
body: File.read('test/fixtures/ao3/story_chapter.html')
)
stub_request(:get, 'https://archiveofourown.org/works/1234567890?view_full_work=true&view_adult=true').to_return(
status: 200,
body: File.read('test/fixtures/ao3/story_fullstory.html')
)
stub_request(:get, 'https://archiveofourown.org/users/Example/pseuds/Example').to_return(
status: 200,
body: File.read('test/fixtures/ao3/user.html')
)
stub_request(:get, 'https://archiveofourown.org/users/Example/pseuds/Example2').to_return(
status: 200,
body: File.read('test/fixtures/ao3/user.html')
)
FicTracker.test!
@backend = FicTracker::Backends::Ao3::Backend.new
end
def test_url_handling
klass = @backend.class
assert klass.supports_url? 'https://archiveofourown.org/works/1234567890'
assert klass.supports_url? 'https://archiveofourown.org/works/1234567890/chapters/1234567890'
assert klass.supports_url? 'https://archiveofourown.org/users/Example'
assert klass.supports_url? 'https://archiveofourown.org/users/Example/pseuds/Example'
refute klass.supports_url? 'https://example.com'
end
def test_slugging
assert_equal '1234567890', @backend.parse_slug('https://archiveofourown.org/works/1234567890')
assert_equal '1234567890', @backend.parse_slug('https://archiveofourown.org/works/1234567890/chapters/1234567890')
assert_equal :story, @backend.parse_slug_type('https://archiveofourown.org/works/1234567890')
assert_equal :story, @backend.parse_slug_type('https://archiveofourown.org/works/1234567890/chapters/1234567890')
assert_equal 'Example', @backend.parse_slug('https://archiveofourown.org/users/Example')
assert_equal 'Example', @backend.parse_slug('https://archiveofourown.org/users/Example/pseuds/Example')
assert_equal :author, @backend.parse_slug_type('https://archiveofourown.org/users/Example')
assert_equal :author, @backend.parse_slug_type('https://archiveofourown.org/users/Example/pseuds/Example')
end
def test_load_author
aut = @backend.load_author 'Example'
assert_nil aut.name
assert_equal 'https://s3.amazonaws.com/otw-ao3-icons/icons/1363284/standard.png?1668353161', aut.image
assert_equal 'https://archiveofourown.org/users/Example/pseuds/Example', aut.url
end
def test_load_chapter
story = FicTracker::Models::Story.new(slug: '1234567890', backend: @backend)
story.id = 0
chapter = @backend.load_chapter '1234567890', story
assert_equal 1, chapter.index
assert_equal "Gotham's Top Ten Memes", chapter.name
assert_equal 'https://archiveofourown.org/works/1234567890/chapters/1234567890', chapter.url
assert_equal 6213, chapter.content.size
assert_equal 'text/html', chapter.content_type
assert_equal 'f247c6ce215f2cf9398d6af29fafbb564220631a', chapter.etag
end
def test_load_story
story = @backend.load_story '1234567890'
assert_equal "Gotham's Top Ten Memes", story.name
assert_equal 1, story.authors.size
assert_equal 'Example', story.authors.first.slug
assert_equal 364, story.synopsis.size
assert_equal "https://archiveofourown.org/works/1234567890", story.url
assert_equal 'en', story.language
assert_equal 4, story.chapter_count
assert_equal 1333, story.word_count
refute story.completed?
end
def test_find_chapters
story = @backend.find_chapters '1234567890'
assert_equal 4, story.chapters.size
assert_equal [22, 48, 35, 10], story.chapters.map(&:name).map(&:size)
assert_equal '2019-06-19', story.chapters.first.published_at.strftime('%Y-%m-%d')
end
def test_load_full_story
story = @backend.load_full_story '1234567890'
assert_equal "Gotham's Top Ten Memes", story.name
assert_equal 1, story.authors.size
assert_equal 'Example', story.authors.first.slug
assert_equal 364, story.synopsis.size
assert_equal "https://archiveofourown.org/works/1234567890", story.url
assert_equal 'en', story.language
assert_equal 4, story.chapter_count
assert_equal 1333, story.word_count
refute story.completed?
assert_equal 4, story.chapters.size
assert_equal [22, 48, 35, 10], story.chapters.map(&:name).map(&:size)
end
end

View file

612
test/fixtures/ao3/story_chapter.html vendored Normal file
View file

@ -0,0 +1,612 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="keywords" content="fanfiction, transformative works, otw, fair use, archive" />
<meta name="language" content="en-US" />
<meta name="subject" content="fandom" />
<meta name="description" content="An Archive of Our Own, a project of the
Organization for Transformative Works" />
<meta name="distribution" content="GLOBAL" />
<meta name="classification" content="transformative works" />
<meta name="author" content="Organization for Transformative Works" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>
Gotham's Top Ten Memes - Chapter 1 - Example - Multifandom [Archive of Our Own]
</title>
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/01-core.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/02-elements.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/03-region-header.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/04-region-dashboard.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/05-region-main.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/06-region-footer.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/07-interactions.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/08-actions.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/09-roles-states.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/10-types-groups.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/11-group-listbox.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/12-group-meta.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/13-group-blurb.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/14-group-preface.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/15-group-comments.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/16-zone-system.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/17-zone-home.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/18-zone-searchbrowse.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/19-zone-tags.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/20-zone-translation.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/21-userstuff.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/22-system-messages.css" />
<link rel="stylesheet" type="text/css" media="only screen and (max-width: 62em), handheld" href="/stylesheets/site/2.0/25-media-midsize.css" />
<link rel="stylesheet" type="text/css" media="only screen and (max-width: 42em), handheld" href="/stylesheets/site/2.0/26-media-narrow.css" />
<link rel="stylesheet" type="text/css" media="speech" href="/stylesheets/site/2.0/27-media-aural.css" />
<link rel="stylesheet" type="text/css" media="print" href="/stylesheets/site/2.0/28-media-print.css" />
<!--[if lte IE 8]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/29-role-ie8_or_lower.css" /><![endif]-->
<!--[if IE 5]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/30-role-ie5.css" /><![endif]-->
<!--[if IE 6]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/31-role-ie6.css" /><![endif]-->
<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/32-role-ie7.css" /><![endif]-->
<link rel="stylesheet" href="/stylesheets/sandbox.css" />
<script src="/javascripts/livevalidation_standalone.js"></script>
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="XfA2JBYb7pDODjfd-F15OBbW6tGKpu8XPQQ90F-JrR4CmAchKN9hymN6hEgHfDWVQnm9UIe5Q18-9DEuJBzljQ" />
</head>
<body class="logged-out">
<div id="outer" class="wrapper">
<ul id="skiplinks"><li><a href="#main">Main Content</a></li></ul>
<noscript><p id="javascript-warning">While we&#39;ve done our best to make the core functionality of this site accessible without JavaScript, it will work better with it enabled. Please consider turning it on!</p></noscript>
<header id="header" class="region">
<h1 class="heading">
<a href="/"><span>Archive of Our Own</span><sup> beta</sup><img alt="Archive of Our Own" class="logo" src="/images/ao3_logos/logo_42.png" /></a>
</h1>
<div id="login" class="dropdown">
<p class="user actions">
<a id="login-dropdown" href="/users/login">Log In</a>
</p>
<div id="small_login" class="simple login">
<form class="new_user" id="new_user_session_small" action="/users/login" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="1q5AjKLqeuKOuSdojOwhFDfwCl9ksGdfiI9ROzkqm3LdLQnZ1VY3z1rXfnQuoEF6J3Yo-QgnGI_7hp53Lsgb7g" autocomplete="off" />
<dl>
<dt>
<label for="user_session_login_small">User name or email:</label></dt>
<dd><input id="user_session_login_small" type="text" name="user[login]" /></dd>
<dt><label for="user_session_password_small">Password:</label></dt>
<dd><input id="user_session_password_small" type="password" name="user[password]" /></dd>
</dl>
<p class="submit actions">
<label for="user_remember_me_small" class="action"><input type="checkbox" name="user[remember_me]" id="user_remember_me_small" value="1" />Remember Me</label>
<input type="submit" name="commit" value="Log In" />
</p>
</form>
<ul class="footnote actions">
<li><a href="/users/password/new">Forgot password?</a></li>
<li>
<a href="/invite_requests">Get an Invitation</a>
</li>
</ul>
</div>
</div>
<nav aria-label="Site">
<ul class="primary navigation actions">
<li class="dropdown">
<a href="/menu/fandoms">Fandoms</a>
<ul class="menu">
<li><a href="/media">All Fandoms</a></li>
<li id="medium_5"><a href="/media/Anime%20*a*%20Manga/fandoms">Anime &amp; Manga</a></li>
<li id="medium_3"><a href="/media/Books%20*a*%20Literature/fandoms">Books &amp; Literature</a></li>
<li id="medium_4"><a href="/media/Cartoons%20*a*%20Comics%20*a*%20Graphic%20Novels/fandoms">Cartoons &amp; Comics &amp; Graphic Novels</a></li>
<li id="medium_7"><a href="/media/Celebrities%20*a*%20Real%20People/fandoms">Celebrities &amp; Real People</a></li>
<li id="medium_2"><a href="/media/Movies/fandoms">Movies</a></li>
<li id="medium_6"><a href="/media/Music%20*a*%20Bands/fandoms">Music &amp; Bands</a></li>
<li id="medium_8"><a href="/media/Other%20Media/fandoms">Other Media</a></li>
<li id="medium_30198"><a href="/media/Theater/fandoms">Theater</a></li>
<li id="medium_1"><a href="/media/TV%20Shows/fandoms">TV Shows</a></li>
<li id="medium_476"><a href="/media/Video%20Games/fandoms">Video Games</a></li>
<li id="medium_9971"><a href="/media/Uncategorized%20Fandoms/fandoms">Uncategorized Fandoms</a></li>
</ul>
</li>
<li class="dropdown">
<a href="/menu/browse">Browse</a>
<ul class="menu">
<li><a href="/works">Works</a></li>
<li><a href="/bookmarks">Bookmarks</a></li>
<li><a href="/tags">Tags</a></li>
<li><a href="/collections">Collections</a></li>
</ul>
</li>
<li class="dropdown">
<a href="/menu/search">Search</a>
<ul class="menu">
<li><a href="/works/search">Works</a></li>
<li><a href="/bookmarks/search">Bookmarks</a></li>
<li><a href="/tags/search">Tags</a></li>
<li><a href="/people/search">People</a></li>
</ul>
</li>
<li class="dropdown">
<a href="/menu/about">About</a>
<ul class="menu">
<li><a href="/about">About Us</a></li>
<li><a href="/admin_posts">News</a></li>
<li><a href="/faq">FAQ</a></li>
<li><a href="/wrangling_guidelines">Wrangling Guidelines</a></li>
<li><a href="/donate">Donate or Volunteer</a></li>
</ul>
</li>
<li class="search"><form class="search" id="search" role="search" aria-label="Work" action="/works/search" accept-charset="UTF-8" method="get">
<fieldset>
<p>
<label class="landmark" for="site_search">Work Search</label>
<input class="text" id="site_search" aria-describedby="site_search_tooltip" type="text" name="work_search[query]" />
<span class="tip" role="tooltip" id="site_search_tooltip">tip: austen words:10000-50000 sort:title</span>
<span class="submit actions"><input type="submit" value="Search" class="button" /></span>
</p>
</fieldset>
</form></li>
</ul>
</nav>
<div class="clear"></div>
</header>
<div class="event announcement group" id="admin-banner">
<blockquote class="userstuff">
<p align="center"><a href="https://otw-news.org/y884aacn" rel="nofollow">Donate</a> at least US$10 and you'll become a member of the OTW! <a href="https://otw-news.org/yc7nue4b" rel="nofollow">Learn about Fanlore, one of the projects your membership will support, and about our new thank-you gifts! </a> So far we've raised US$46,902.92, and weve reached <strong><span class="progress">1,229</span></strong> new members out of our goal of <strong><span class="goal">4,500</span></strong></p>
</blockquote>
<p class="submit">
<a class="showme action" title="hide banner" href="/works/1234567890/chapters/1234567890?hide_banner=true&amp;view_adult=true">&times;</a>
</p>
</div>
<div id="inner" class="wrapper">
<div id="main" class="chapters-show region" role="main">
<div class="flash"></div>
<div class="work"><p class="landmark"><a name="top">&nbsp;</a></p>
<h3 class="landmark heading">Actions</h3>
<ul class="work navigation actions" role="menu">
<li class="chapter entire"><a href="/works/1234567890?view_full_work=true">Entire Work</a></li>
<li class="chapter next"><a href="/works/1234567890/chapters/46857787#workskin">Next Chapter &#8594;</a></li>
<li class="chapter" aria-haspopup="true">
<noscript>
<a href="/works/1234567890/navigate">Chapter Index</a>
</noscript>
<a class="hidden" href="#">Chapter Index</a>
<ul id="chapter_index" class="expandable secondary hidden">
<li>
<form action="/works/1234567890/chapters/1234567890" accept-charset="UTF-8" method="get">
<p>
<select name="selected_id" id="selected_id"><option selected="selected" value="1234567890">1. Gotham's Top Ten Memes</option>
<option value="46857787">2. 10 Meetings with the Bat - Stories from the GCPD...</option>
<option value="48021319">3. The Wayne (and affiliated) Twitters</option>
<option value="52795894">4. Party Time</option></select>
<span class="submit actions"><input type="submit" name="commit" value="Go" /></span>
</p>
</form> </li>
<li><a href="/works/1234567890/navigate">Full-page index</a></li>
</ul>
</li>
<li class="comments" id="show_comments_link_top">
<a data-remote="true" href="/comments/show_comments?chapter_id=1234567890">Comments </a>
</li>
<li class="share hidden">
<a class=" modal" title="Share Work" href="/works/1234567890/share">Share</a>
</li>
<li class="download" aria-haspopup="true">
<a href="#">Download</a>
<ul class="expandable secondary">
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.azw3?updated_at=1717922671">AZW3</a></li>
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.epub?updated_at=1717922671">EPUB</a></li>
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.mobi?updated_at=1717922671">MOBI</a></li>
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.pdf?updated_at=1717922671">PDF</a></li>
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.html?updated_at=1717922671">HTML</a></li>
</ul>
</li>
</ul>
<h3 class="landmark heading">Work Header</h3>
<div class="wrapper">
<dl class="work meta group">
<dt class="rating tags">
Rating:
</dt>
<dd class="rating tags">
<ul class="commas">
<li><a class="tag" href="/tags/Teen%20And%20Up%20Audiences/works">Teen And Up Audiences</a></li>
</ul>
</dd>
<dt class="warning tags">
<a href="/tos_faq#tags">Archive Warning</a>:
</dt>
<dd class="warning tags">
<ul class="commas">
<li><a class="tag" href="/tags/No%20Archive%20Warnings%20Apply/works">No Archive Warnings Apply</a></li>
</ul>
</dd>
<dt class="category tags">
Category:
</dt>
<dd class="category tags">
<ul class="commas">
<li><a class="tag" href="/tags/Gen/works">Gen</a></li>
</ul>
</dd>
<dt class="fandom tags">
Fandoms:
</dt>
<dd class="fandom tags">
<ul class="commas">
<li><a class="tag" href="/tags/Batman%20-%20All%20Media%20Types/works">Batman - All Media Types</a></li><li><a class="tag" href="/tags/Young%20Justice%20-%20All%20Media%20Types/works">Young Justice - All Media Types</a></li><li><a class="tag" href="/tags/The%20Batman%20(Cartoon)/works">The Batman (Cartoon)</a></li><li><a class="tag" href="/tags/Batman:%20The%20Animated%20Series/works">Batman: The Animated Series</a></li>
</ul>
</dd>
<dt class="relationship tags">
Relationships:
</dt>
<dd class="relationship tags">
<ul class="commas">
<li><a class="tag" href="/tags/Batman%20*a*%20Robin%20-%20Relationship/works">Batman &amp; Robin - Relationship</a></li><li><a class="tag" href="/tags/Batman%20*a*%20GCPD/works">Batman &amp; GCPD</a></li><li><a class="tag" href="/tags/Stephanie%20Brown%20*a*%20Jason%20Todd/works">Stephanie Brown &amp; Jason Todd</a></li><li><a class="tag" href="/tags/Stephanie%20Brown%20*a*%20Duke%20Thomas%20*a*%20Jason%20Todd/works">Stephanie Brown &amp; Duke Thomas &amp; Jason Todd</a></li><li><a class="tag" href="/tags/Cassandra%20Cain%20*a*%20Tim%20Drake%20*a*%20Dick%20Grayson%20*a*%20Duke%20Thomas%20*a*%20Jason%20Todd%20*a*%20Bruce%20Wayne%20*a*%20Damian%20Wayne/works">Cassandra Cain &amp; Tim Drake &amp; Dick Grayson &amp; Duke Thomas &amp; Jason Todd &amp; Bruce Wayne &amp; Damian Wayne</a></li>
</ul>
</dd>
<dt class="character tags">
Characters:
</dt>
<dd class="character tags">
<ul class="commas">
<li><a class="tag" href="/tags/Gotham%20City/works">Gotham City</a></li><li><a class="tag" href="/tags/Gotham%20City%20Police%20Department%20Officers/works">Gotham City Police Department Officers</a></li><li><a class="tag" href="/tags/Civilians%20-%20Character/works">Civilians - Character</a></li><li><a class="tag" href="/tags/Bruce%20Wayne/works">Bruce Wayne</a></li><li><a class="tag" href="/tags/Dick%20Grayson/works">Dick Grayson</a></li><li><a class="tag" href="/tags/Bl%C3%BCdhaven%20Police%20Department%20-%20Character/works">Blüdhaven Police Department - Character</a></li><li><a class="tag" href="/tags/Stephanie%20Brown/works">Stephanie Brown</a></li><li><a class="tag" href="/tags/Jason%20Todd/works">Jason Todd</a></li><li><a class="tag" href="/tags/Duke%20Thomas/works">Duke Thomas</a></li><li><a class="tag" href="/tags/Renee%20Montoya/works">Renee Montoya</a></li><li><a class="tag" href="/tags/Damian%20Wayne/works">Damian Wayne</a></li><li><a class="tag" href="/tags/Tim%20Drake/works">Tim Drake</a></li><li><a class="tag" href="/tags/Cassandra%20Cain/works">Cassandra Cain</a></li><li><a class="tag" href="/tags/Barbara%20Gordon/works">Barbara Gordon</a></li>
</ul>
</dd>
<dt class="freeform tags">
Additional Tags:
</dt>
<dd class="freeform tags">
<ul class="commas">
<li><a class="tag" href="/tags/Multimedia/works">Multimedia</a></li><li><a class="tag" href="/tags/Embedded%20Images/works">Embedded Images</a></li><li><a class="tag" href="/tags/Mobile%20Unfriendly/works">Mobile Unfriendly</a></li><li><a class="tag" href="/tags/Memes/works">Memes</a></li><li><a class="tag" href="/tags/POV%20Outsider/works">POV Outsider</a></li><li><a class="tag" href="/tags/Gotham%20City%20-%20Freeform/works">Gotham City - Freeform</a></li><li><a class="tag" href="/tags/Gotham%20City%20Police%20Department/works">Gotham City Police Department</a></li><li><a class="tag" href="/tags/Social%20Media/works">Social Media</a></li><li><a class="tag" href="/tags/Twitter/works">Twitter</a></li><li><a class="tag" href="/tags/Buzzfeed/works">Buzzfeed</a></li><li><a class="tag" href="/tags/Tumblr/works">Tumblr</a></li><li><a class="tag" href="/tags/Trans%20Bruce%20Wayne/works">Trans Bruce Wayne</a></li><li><a class="tag" href="/tags/Bat%20Family/works">Bat Family</a></li><li><a class="tag" href="/tags/Humor/works">Humor</a></li><li><a class="tag" href="/tags/YouTube/works">YouTube</a></li><li><a class="tag" href="/tags/News%20Media/works">News Media</a></li><li><a class="tag" href="/tags/Bl%C3%BCdhaven/works">Blüdhaven</a></li><li><a class="tag" href="/tags/Actual%20word%20count%20is%20much%20higher/works">Actual word count is much higher</a></li>
</ul>
</dd>
<dt class="language">
Language:
</dt>
<dd class="language" lang="en">
English
</dd>
<dt class="series">
Series:
</dt>
<dd class="series">
<span class="series"><a class="previous" href="/works/17953307">&#8592; Previous Work</a><span class="divider"> </span><span class="position">Part 2 of <a href="/series/1291124">But what I do</a></span><span class="divider"> </span><a class="next" href="/works/19336603">Next Work &#8594;</a></span>
</dd>
<dt class="collections">
Collections:
</dt>
<dd class="collections">
<a href="/collections/JusticeLeague">Justice League Suggested Fics</a>
</dd>
<dt class="stats">Stats:</dt>
<dd class="stats">
<dl class="stats"><dt class="published">Published:</dt><dd class="published">2019-06-19</dd><dt class="status">Updated:</dt><dd class="status">2020-01-04</dd><dt class="words">Words:</dt><dd class="words">1,333</dd><dt class="chapters">Chapters:</dt><dd class="chapters">4/?</dd><dt class="comments">Comments:</dt><dd class="comments">223</dd><dt class="kudos">Kudos:</dt><dd class="kudos">5,239</dd><dt class="bookmarks">Bookmarks:</dt><dd class="bookmarks"><a href="/works/1234567890/bookmarks">790</a></dd><dt class="hits">Hits:</dt><dd class="hits">44,725</dd></dl>
</dd>
</dl>
</div>
<div id="workskin">
<div class="preface group">
<h2 class="title heading">
Gotham's Top Ten Memes
</h2>
<h3 class="byline heading">
<a rel="author" href="/users/Example/pseuds/Example">Example</a>
</h3>
<div class="summary module">
<h3 class="heading">Summary:</h3>
<blockquote class="userstuff">
<p>Every city has its pride and Gotham isn't different. We love our “dark and gloomy” architecture (meet us in the Batburgers parking lot Metropolis) and our Waynes, our vigilantes and most importantly: Our memes.</p><p>So, without much further ado, we present you Gothams top ten memes.</p><p>Gotham, the Waynes and the Bats through the eyes of social media.</p>
</blockquote>
</div>
<div class="notes module">
<h3 class="heading">Notes:</h3>
<blockquote class="userstuff">
<p>Because I love world building, I love multimedia fanfics and I really wanted to make memes from the perspective of Gotham city civilians. No need to have read the other parts of this series. Have fun!</p>
</blockquote>
<p class="jump">(See the end of the work for <a href="/chapters/52795894#work_endnotes">more notes</a>.)</p>
</div>
</div>
<div id="chapters">
<div class="chapter" id="chapter-1">
<div class="chapter preface group">
<h3 class="title">
<a href="/works/1234567890/chapters/1234567890">Chapter 1</a>: Gotham's Top Ten Memes
</h3>
</div>
<div class="userstuff module" role="article">
<h3 class="landmark heading" id="work">Chapter Text</h3>
<p>Every city has its pride and Gotham isn't different. We love our “dark and gloomy” architecture (meet us in the Batburgers parking lot Metropolis) and our Waynes, our vigilantes and most importantly: Our memes.</p><p>So, without much further ado, we present you Gothams top ten memes.</p><p>
<strong>1) Child hoarders?</strong>
</p><div>
<p>
<img src="https://example.com/1234399658913759234/590615095781097484/image0.jpg" alt width="60%" />
</p>
</div><p>We all know Bruce Wayne has made it his personal goal to get a child for every room in Wayne manor, but what about Batman? Since he started, more and more masks have appeared on the field. Not that were complaining…</p><p>
<strong>2) Poor, poor foreigners</strong>
</p><p>
<u> <img src="https://example.com/1234399658913759234/5906112342183475210/image0.jpg" alt width="60%" /> </u>
</p><p>It is common knowledge that Batman is part of the Justice League, he even has his own <a href="https://en.wikipedia.org/wiki/Batman" rel="nofollow">Wikipedia article</a>! Yet people still have a hard time believing our dark knight is more than just a conspiracy theory started by cultists.</p><p>
<strong>3) Going to work? Not always easy!</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590936579628072961/image0.jpg" alt width="250" height="232" /> </u>
</p><p>Dont forget! Wayne Enterprises are still selling the latest gas masks. You can find them <a href="https://ambrosius-faust.tumblr.com/post/185705972192/okay-hear-me-out-gotham-city-memes" rel="nofollow">right here</a>. If youre unable to afford one, you can pick up one for free at WEs main office. The money earned by the sold gas masks goes straight into the research for the Anti-Joker-Venom vaccines and antidotes to Fear Gas.</p><p>
<strong>4) Its an aesthetic and we are willing to commit</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590936498115969047/image0.jpg" alt width="60%" /> </u>
</p><p>Fun fact! A lot of our architecture was actually based on spite! Mainly, Gothams wealthiest taking one look at Metropoliss architecture and deciding that we will be infinitely better. The events of the last decade have left their mark, but we have rebuilt Gotham in the same image (with some improvements! Rumor has it that Robin loves gargoyles, so one or two more are no harm, right?)</p><p>
<strong>5) A place for the future!</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/5909366224642371234/image0.jpg" alt width="60%" /> </u>
</p><p>Every students biggest fear is debt! So, despite our gloomy image, WE once again has decided to make Gotham much more attractive to outsiders by promising to pay part of your student debt. What do you have to do in turn? Well, be a (paid!) intern at any Wayne owned facility for a year. Does that include the little Cup Cape bakery on main street that Damian Wayne frequents? Yes, it does! So even if youre no STEM student, you can apply for support!</p><p>
<strong>6) Since were already talking Wayne…</strong>
</p><p>
<strong> <img src="https://example.com/1234400967633076224/590936471356047360/image0.jpg" alt width="300" height="400" /> </strong>
</p><p>Yes, Capitalism is bad and no, we should not support the rich. However, I dare you to say one word against Bruce Wayne, who pays one of the best wages in the country, gives more to charity than anybody else, starts up charities if he finds there arent enough, doesnt run off to a city with less problems, supports stricter gun laws and is just an all-around sunshine.</p><p>
<strong>7) Gothams Baby</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590989363987480640/image0.jpg" alt width="300" height="700" /> </u>
</p><p>If there is someone we love more than Bruce Wayne though, its Robin!!! No matter what shape or form or creepy laugh they come in, our punny bird is the absolute best. In the wise words of another meme:</p><p>
<u> <img src="https://example.com/1234400967633076224/590989419138252804/image0.jpg" alt width="60%" /> </u>
</p><p>
<strong>8) Yes, we have a lecture for that</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590989442253193249/image0.jpg" alt width="60%" /> </u>
</p><p>Okay, so in case you dont know it, Gothams education system is a little weird. Namely, that we have a mandatory class once a month in which we get updated on the latest villain statuses, which vaccines dont work anymore and etc. Pictures of the power points used in those classes hit the web <a href="https://ambrosius-faust.tumblr.com/post/185708889947/gotham-city-memes-2-part-1" rel="nofollow">about a month ago</a>, and of course, it became a meme of people adding weird situations they stumbled into in Gotham in power point format.</p><p>
<strong>9) Clowns</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590989391749709827/image0.jpg" alt width="60%" /> </u>
</p><p>Look, the Joker is simply the worst. And whats even more terrible than him breaking out? Its him breaking out during exam time. Since we deal with so many villains per month, their attacks arent a valid excuse to miss school anymore. Fun. (But if the teacher doesn't show up, you pass with 100%!)</p><p>
<strong>10) Conspiracy theory</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590989304377901060/image0.jpg" alt width="60%" /> </u>
</p><p>Gothams longest and best-running conspiracy theory of all time DO THE BUTTS MATCH!? In our quest to figure out the identity of our masked heroes, we have tried our best to discover to whom we should sing our praise and the <em>Do the butts match?</em>  theory has helped us come quite far! We have discovered that, while Officer Grayson looks absolutely great in his uniform, he is sadly no match for Nightwing.</p><p>You liked this article? Then you may also be interested in:</p><p>
<strong> <em>10 Projects Wayne Enterprises supports in Gotham</em> </strong>
</p><p>
<strong> <em>10 Meetings with the Bat Stories from the GCPD</em> </strong>
</p><p>
<strong> <em>10 Reasons why you should study at Gotham U</em> </strong>
</p>
</div>
</div>
</div>
</div>
</div>
<div id="feedback" class="feedback">
<h3 class="landmark heading">Actions</h3>
<ul class="actions" role="navigation">
<li><a href="#main">&#8593; Top</a></li>
<li><a href="/works/1234567890/chapters/46857787#workskin">Next Chapter &#8594;</a></li>
<li>
<form id="new_kudo" action="/kudos" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="YdpNvHJ4X4Y_cipg-XbV9kXFil1DqjOzM9fXwy_gtw3jQDHiJBIuedRiIE_ZTAxjODb1bHRfx9do_S-3wY3CBQ" autocomplete="off" />
<input value="1234567890" autocomplete="off" type="hidden" name="kudo[commentable_id]" id="kudo_commentable_id" />
<input value="Work" autocomplete="off" type="hidden" name="kudo[commentable_type]" id="kudo_commentable_type" />
<input type="submit" name="commit" value="Kudos ♥" id="kudo_submit" />
</form> </li>
<li id="show_comments_link"><a data-remote="true" href="/comments/show_comments?chapter_id=1234567890">Comments (58)</a></li>
</ul>
<div id="kudos_message"></div>
<h3 class="landmark heading">Kudos</h3>
<div id="kudos">
<p class="kudos">
<a href="/users/Freyija">Freyija</a>, <a href="/users/Kimiyona">Kimiyona</a>, <a href="/users/LAURIE_73856">LAURIE_73856</a>, <a href="/users/Cresentia">Cresentia</a>, <a href="/users/fulcrum_1029">fulcrum_1029</a>, <a href="/users/Kaikuroi">Kaikuroi</a>, <a href="/users/Smol_DangerNoodle">Smol_DangerNoodle</a>, <a href="/users/Xenia12">Xenia12</a>, <a href="/users/LocalFriendlyEldritchThing">LocalFriendlyEldritchThing</a>, <a href="/users/Jiji3ji">Jiji3ji</a>, <a href="/users/1_Dont_Need_Sleep_I_Need_Answers">1_Dont_Need_Sleep_I_Need_Answers</a>, <a href="/users/Giselia">Giselia</a>, <a href="/users/Horizon_blue">Horizon_blue</a>, <a href="/users/musical_adhd_BItch">musical_adhd_BItch</a>, <a href="/users/AndroidFrog">AndroidFrog</a>, <a href="/users/The__Second">The__Second</a>, <a href="/users/Stylesofpink">Stylesofpink</a>, <a href="/users/Person_with_a_cool_name">Person_with_a_cool_name</a>, <a href="/users/srirachacha">srirachacha</a>, <a href="/users/RandomPersonExisting">RandomPersonExisting</a>, <a href="/users/and_andromeda">and_andromeda</a>, <a href="/users/dangerhumming">dangerhumming</a>, <a href="/users/TheJasmineTurtleDuck">TheJasmineTurtleDuck</a>, <a href="/users/your_trans_boyfriend">your_trans_boyfriend</a>, <a href="/users/LuneWolf13">LuneWolf13</a>, <a href="/users/The_Dilara4951">The_Dilara4951</a>, <a href="/users/C4HET">C4HET</a>, <a href="/users/purityofpetrichor">purityofpetrichor</a>, <a href="/users/Phyazane">Phyazane</a>, <a href="/users/ifrainfalls">ifrainfalls</a>, <a href="/users/Juznifero">Juznifero</a>, <a href="/users/thecloudenthusiast">thecloudenthusiast</a>, <a href="/users/Aleksa0">Aleksa0</a>, <a href="/users/Cupcakes2022">Cupcakes2022</a>, <a href="/users/alighiericall">alighiericall</a>, <a href="/users/PagiNANI">PagiNANI</a>, <a href="/users/Tiny_Maze">Tiny_Maze</a>, <a href="/users/Fraanrmz">Fraanrmz</a>, <a href="/users/MyStory_48">MyStory_48</a>, <a href="/users/bacondestiny">bacondestiny</a>, <a href="/users/Letmesleeeeep">Letmesleeeeep</a>, <a href="/users/submergingboats">submergingboats</a>, <a href="/users/Nonsense_52">Nonsense_52</a>, <a href="/users/Evna">Evna</a>, <a href="/users/Cold_Star">Cold_Star</a>, <a href="/users/Annimals">Annimals</a>, <a href="/users/Analog2000">Analog2000</a>, <a href="/users/Dae15">Dae15</a>, <a href="/users/Panziku_Nox">Panziku_Nox</a>, <a href="/users/Spicy_Hot_Noodles">Spicy_Hot_Noodles</a><span id="kudos_more_connector">, and </span><a id="kudos_more_link" data-remote="true" href="/works/1234567890/kudos?before=6213580573">3429 more users</a>
as well as
1760 guests
left kudos on this work!
</p>
</div>
<h3 class="landmark heading"><a id="comments">Comments</a></h3>
<div id="add_comment_placeholder" title="top level comment">
<div id="add_comment">
<div class="post comment" id="comment_form_for_1234567890">
<form class="new_comment" id="comment_for_1234567890" action="/chapters/1234567890/comments" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="FGhd3UjU4t7k2piALl3KwdC9v51YYWEXrcQYfTnMqCk0MFPwfCIwAuq__RknSZxzMcOHlI3OHMFAj6Kt_9mJGQ" autocomplete="off" />
<fieldset>
<legend>Post Comment</legend>
<dl>
<dt class="landmark">Note:</dt>
<dd class="instructions comment_form">All fields are required. Your email address will not be published.</dd>
<dt><label for="comment_name_for_1234567890">Guest name</label></dt>
<dd>
<input id="comment_name_for_1234567890" type="text" name="comment[name]" />
<script>
//<![CDATA[
var validation_for_comment_name_for_1234567890 = new LiveValidation('comment_name_for_1234567890', { wait: 500, onlyOnBlur: false });
validation_for_comment_name_for_1234567890.add(Validate.Presence, {"failureMessage":"Please enter your name.","validMessage":""});
//]]>
</script>
</dd>
<dt><label for="comment_email_for_1234567890">Guest email</label></dt>
<dd>
<input id="comment_email_for_1234567890" type="text" name="comment[email]" />
<script>
//<![CDATA[
var validation_for_comment_email_for_1234567890 = new LiveValidation('comment_email_for_1234567890', { wait: 500, onlyOnBlur: false });
validation_for_comment_email_for_1234567890.add(Validate.Presence, {"failureMessage":"Please enter your email address.","validMessage":""});
//]]>
</script>
</dd>
</dl>
<p class="footnote">(Plain text with limited HTML <a class="help symbol question modal" title="Html help" href="/help/html-help.html"><span class="symbol question"><span>?</span></span></a>)</p>
<p>
<label for="comment_content_for_1234567890" class="landmark">Comment</label>
<textarea id="comment_content_for_1234567890" class="comment_form observe_textlength" title="Enter Comment" name="comment[comment_content]">
</textarea>
<input type="hidden" id="controller_name_for_1234567890" name="controller_name" value="chapters" />
</p>
<p class="character_counter" tabindex="0"><span id="comment_content_for_1234567890_counter" class="value" data-maxlength="10000">10000</span> characters left</p>
<script>
//<![CDATA[
var validation_for_comment_content_for_1234567890 = new LiveValidation('comment_content_for_1234567890', { wait: 500, onlyOnBlur: false });
validation_for_comment_content_for_1234567890.add(Validate.Presence, {"failureMessage":"Brevity is the soul of wit, but we need your comment to have text in it.","validMessage":""});
validation_for_comment_content_for_1234567890.add(Validate.Length, {"maximum":"10000","tooLongMessage":"must be less than 10000 characters long."});
//]]>
</script>
<p class="submit actions">
<input type="submit" name="commit" value="Comment" id="comment_submit_for_1234567890" data-disable-with="Please wait..." />
</p>
</fieldset>
</form></div>
<div class="clear"></div>
</div>
</div>
<div id="comments_placeholder" style="display:none;">
</div>
</div>
<script type="speculationrules">
{
"prerender": [
{
"source": "list",
"urls": ["/works/1234567890/chapters/46857787#workskin"]
}
]
}
</script>
<div class="clear"></div>
</div>
</div>
<div id="footer" role="contentinfo" class="region">
<h3 class="landmark heading">Footer</h3>
<ul class="navigation actions" role="navigation">
<li class="module group">
<h4 class="heading">About the Archive</h4>
<ul class="menu">
<li><a href="/site_map">Site Map</a></li>
<li><a href="/diversity">Diversity Statement</a></li>
<li><a href="/tos">Terms of Service</a></li>
<li><a href="/dmca">DMCA Policy</a> </li>
</ul>
</li>
<li class="module group">
<h4 class="heading">Contact Us</h4>
<ul class="menu">
<li><a href="/abuse_reports/new">Policy Questions &amp; Abuse Reports</a></li>
<li><a href="/support">Technical Support &amp; Feedback</a></li>
</ul>
</li>
<li class="module group">
<h4 class="heading">Development</h4>
<ul class="menu">
<li><a href="https://github.com/otwcode/otwarchive/commits/v0.9.379.1">otwarchive v0.9.379.1</a></li>
<li><a href="/known_issues">Known Issues</a></li>
<li><a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" title="View License">GPL-2.0-or-later</a> by the <a href="https://transformativeworks.org/" title="The Organization for Transformative Works">OTW</a></li>
</ul>
</li>
</ul>
</div>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined') {
document.write(unescape("%3Cscript src='/javascripts/jquery.min.js' type='text/javascript'%3E%3C/script%3E"));
document.write(unescape("%3Cscript src='/javascripts/jquery-ui.min.js' type='text/javascript'%3E%3C/script%3E"));
}
</script>
<script type="text/javascript">$j = jQuery.noConflict();</script>
<script src="/javascripts/jquery.scrollTo.min.js"></script>
<script src="/javascripts/jquery.livequery.min.js"></script>
<script src="/javascripts/rails.js"></script>
<script src="/javascripts/application.js"></script>
<script src="/javascripts/bootstrap/bootstrap-dropdown.min.js"></script>
<script src="/javascripts/jquery-shuffle.js"></script>
<script src="/javascripts/jquery.tokeninput.min.js"></script>
<script src="/javascripts/jquery.trap.min.js"></script>
<script src="/javascripts/ao3modal.min.js"></script>
<script src="/javascripts/js.cookie.min.js"></script>
<script src="/javascripts/filters.min.js"></script>
<script>
//<![CDATA[
// We can't rely on !window.localStorage to test localStorage support in
// browsers like Safari 9, which technically support it, but which have a
// storage length of 0 in private mode.
// Credit: https://github.com/getgrav/grav-plugin-admin/commit/cfe2188f10c4ca604e03c96f3e21537fda1cdf9a
function isSupported() {
var item = "localStoragePolyfill";
try {
localStorage.setItem(item, item);
localStorage.removeItem(item);
return true;
} catch (e) {
return false;
}
}
function acceptTOS() {
if (isSupported()) {
localStorage.setItem("accepted_tos", "20180523");
} else {
Cookies.set("accepted_tos", "20180523", { expires: 365 });
}
}
$j(document).ready(function() {
if (localStorage.getItem("accepted_tos") !== "20180523" && Cookies.get("accepted_tos") !== "20180523") {
$j("body").prepend("<div id=\"tos_prompt\" class=\"hidden\">\n <h2 class=\"heading\">\n <span>Archive of Our Own<\/span>\n <\/h2>\n <div class=\"agreement\">\n <p class=\"summary\">\n On Archive of Our Own (AO3), users can make profiles, create works and\n other Content, post comments, give Kudos, create Collections and \n Bookmarks, participate in Challenges, import works, and more. Any \n information you publish in a comment, profile, work, or Content that you \n post or import onto AO3 including in summaries, notes and tags, \n will be accessible by the public (unless you limit access to a work only \n to those with AO3 Accounts), and it will be available to \n AO3 personnel. Be mindful when sharing personal information, \n including your religious or political views, health, racial background, \n country of origin, sexual identity and/or personal relationships. To \n learn more, check out our <a href=\"/tos\">Terms of Service<\/a> and <a href=\"/tos#privacy\">Privacy Policy<\/a>.\n <\/p>\n\n <p class=\"confirmation\">\n <input type=\"checkbox\" id=\"tos_agree\" />\n <label for=\"tos_agree\">I have read &amp; understood the new Terms of Service and Privacy Policy<\/label>\n <\/p>\n\n <p class=\"submit\">\n <button name=\"button\" type=\"button\" disabled=\"disabled\" id=\"accept_tos\">I agree/consent to its terms<\/button>\n <\/p>\n\n <\/div>\n<\/div>\n\n<script>\n//<![CDATA[\n\n \$j(document).ready(function() {\n var container = \$j(\"#tos_prompt\");\n var outer = \$j(\"#outer\");\n var button = \$j(\"#accept_tos\");\n\n setTimeout(showTOSPrompt, 1500);\n\n function showTOSPrompt() {\n \$j.when(container.fadeIn(500)).done(function() {\n outer.addClass(\"hidden\").attr(\"aria-hidden\", \"true\");\n });\n\n \$j(\"#tos_agree\").on(\"click\", function() {\n button.attr(\"disabled\", !this.checked);\n if (this.checked) {\n button.on(\"click\", function() {\n acceptTOS();\n outer.removeClass(\"hidden\").removeAttr(\"aria-hidden\");\n \$j.when(container.fadeOut(500)).done(function() {\n container.remove();\n });\n });\n };\n }).change();\n };\n });\n\n//]]]]><![CDATA[>\n<\/script>");
}
});
//]]>
</script>
<script>
//<![CDATA[
$j(document).ready(function() {
var permitted_hosts = ["104.153.64.122","208.85.241.152","208.85.241.157","ao3.org","archiveofourown.com","archiveofourown.gay","archiveofourown.net","archiveofourown.org","download.archiveofourown.org","insecure.archiveofourown.org","secure.archiveofourown.org","www.archiveofourown.com","www.archiveofourown.net","www.archiveofourown.org","www.ao3.org","archive.transformativeworks.org"];
var current_host = window.location.hostname;
if (!permitted_hosts.includes(current_host) && Cookies.get("proxy_notice") !== "0" && window.location.protocol !== "file:") {
$j("#skiplinks").after("<div id=\"proxy-notice\">\n <div class=\"userstuff\">\n <p class=\"important\">Important message:<\/p>\n <ol>\n <li>You are using a proxy site that is not part of the Archive of Our Own.<\/li>\n <li>The entity that set up the proxy site can see what you submit, including your IP address. If you log in through the proxy site, it can see your password.<\/li>\n <\/ol>\n <p class=\"important\">重要提示:<\/p>\n <ol>\n <li>您使用的是第三方开发的反向代理网站此网站并非Archive of Our Own - AO3AO3作品库原站。<\/li>\n <li>代理网站的开发者能够获取您上传至该站点的全部内容包括您的ip地址。如您通过代理登录AO3对方将获得您的密码。<\/li>\n <\/ol>\n <p class=\"submit\"><button class=\"action\" type=\"button\" id=\"proxy-notice-dismiss\">Dismiss Notice<\/button><\/p>\n <\/div>\n<\/div>\n\n<script>\n//<![CDATA[\n\n \$j(document).ready(function() {\n \$j(\"#proxy-notice-dismiss\").on(\"click\", function() {\n Cookies.set(\"proxy_notice\", \"0\");\n \$j(\"#proxy-notice\").slideUp();\n });\n });\n\n//]]]]><![CDATA[>\n<\/script>");
}
});
//]]>
</script>
<script>
$j(document).on("loadedCSRF", function() {
function send() {
$j.post("/works/1234567890/hit_count.json")
}
// If a browser doesn't support prerendering, then document.prerendering
// will be undefined, and we'll just send the hit count immediately.
if (document.prerendering) {
document.addEventListener("prerenderingchange", send);
} else {
send();
}
})
</script>
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8d466e131b2f15e4',t:'MTcyOTIzMjUwNS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>

800
test/fixtures/ao3/story_fullstory.html vendored Normal file
View file

@ -0,0 +1,800 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="keywords" content="fanfiction, transformative works, otw, fair use, archive" />
<meta name="language" content="en-US" />
<meta name="subject" content="fandom" />
<meta name="description" content="An Archive of Our Own, a project of the
Organization for Transformative Works" />
<meta name="distribution" content="GLOBAL" />
<meta name="classification" content="transformative works" />
<meta name="author" content="Organization for Transformative Works" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>
Gotham's Top Ten Memes - Example - Multifandom [Archive of Our Own]
</title>
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/01-core.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/02-elements.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/03-region-header.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/04-region-dashboard.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/05-region-main.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/06-region-footer.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/07-interactions.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/08-actions.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/09-roles-states.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/10-types-groups.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/11-group-listbox.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/12-group-meta.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/13-group-blurb.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/14-group-preface.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/15-group-comments.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/16-zone-system.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/17-zone-home.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/18-zone-searchbrowse.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/19-zone-tags.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/20-zone-translation.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/21-userstuff.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/22-system-messages.css" />
<link rel="stylesheet" type="text/css" media="only screen and (max-width: 62em), handheld" href="/stylesheets/site/2.0/25-media-midsize.css" />
<link rel="stylesheet" type="text/css" media="only screen and (max-width: 42em), handheld" href="/stylesheets/site/2.0/26-media-narrow.css" />
<link rel="stylesheet" type="text/css" media="speech" href="/stylesheets/site/2.0/27-media-aural.css" />
<link rel="stylesheet" type="text/css" media="print" href="/stylesheets/site/2.0/28-media-print.css" />
<!--[if lte IE 8]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/29-role-ie8_or_lower.css" /><![endif]-->
<!--[if IE 5]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/30-role-ie5.css" /><![endif]-->
<!--[if IE 6]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/31-role-ie6.css" /><![endif]-->
<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/32-role-ie7.css" /><![endif]-->
<link rel="stylesheet" href="/stylesheets/sandbox.css" />
<script src="/javascripts/livevalidation_standalone.js"></script>
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="3lB1pccqTMMgAkc9fPlKiW7YG28jNn_JjVC_TZySJiyP5_ZV5oAi8IPFQG4bBB1HROeS2DeVwknuIDVXodRmyA" />
</head>
<body class="logged-out">
<div id="outer" class="wrapper">
<ul id="skiplinks"><li><a href="#main">Main Content</a></li></ul>
<noscript><p id="javascript-warning">While we&#39;ve done our best to make the core functionality of this site accessible without JavaScript, it will work better with it enabled. Please consider turning it on!</p></noscript>
<header id="header" class="region">
<h1 class="heading">
<a href="/"><span>Archive of Our Own</span><sup> beta</sup><img alt="Archive of Our Own" class="logo" src="/images/ao3_logos/logo_42.png" /></a>
</h1>
<div id="login" class="dropdown">
<p class="user actions">
<a id="login-dropdown" href="/users/login">Log In</a>
</p>
<div id="small_login" class="simple login">
<form class="new_user" id="new_user_session_small" action="/users/login" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="QLYwWzaAFZP-yTttACu9z_VzMoqyQfN9K2lcw0BFZiJrb911nzKBV2pUmfJBnTWYJy5guUUz9BiWMG91PvXz0w" autocomplete="off" />
<dl>
<dt>
<label for="user_session_login_small">User name or email:</label></dt>
<dd><input id="user_session_login_small" type="text" name="user[login]" /></dd>
<dt><label for="user_session_password_small">Password:</label></dt>
<dd><input id="user_session_password_small" type="password" name="user[password]" /></dd>
</dl>
<p class="submit actions">
<label for="user_remember_me_small" class="action"><input type="checkbox" name="user[remember_me]" id="user_remember_me_small" value="1" />Remember Me</label>
<input type="submit" name="commit" value="Log In" />
</p>
</form>
<ul class="footnote actions">
<li><a href="/users/password/new">Forgot password?</a></li>
<li>
<a href="/invite_requests">Get an Invitation</a>
</li>
</ul>
</div>
</div>
<nav aria-label="Site">
<ul class="primary navigation actions">
<li class="dropdown">
<a href="/menu/fandoms">Fandoms</a>
<ul class="menu">
<li><a href="/media">All Fandoms</a></li>
<li id="medium_5"><a href="/media/Anime%20*a*%20Manga/fandoms">Anime &amp; Manga</a></li>
<li id="medium_3"><a href="/media/Books%20*a*%20Literature/fandoms">Books &amp; Literature</a></li>
<li id="medium_4"><a href="/media/Cartoons%20*a*%20Comics%20*a*%20Graphic%20Novels/fandoms">Cartoons &amp; Comics &amp; Graphic Novels</a></li>
<li id="medium_7"><a href="/media/Celebrities%20*a*%20Real%20People/fandoms">Celebrities &amp; Real People</a></li>
<li id="medium_2"><a href="/media/Movies/fandoms">Movies</a></li>
<li id="medium_6"><a href="/media/Music%20*a*%20Bands/fandoms">Music &amp; Bands</a></li>
<li id="medium_8"><a href="/media/Other%20Media/fandoms">Other Media</a></li>
<li id="medium_30198"><a href="/media/Theater/fandoms">Theater</a></li>
<li id="medium_1"><a href="/media/TV%20Shows/fandoms">TV Shows</a></li>
<li id="medium_476"><a href="/media/Video%20Games/fandoms">Video Games</a></li>
<li id="medium_9971"><a href="/media/Uncategorized%20Fandoms/fandoms">Uncategorized Fandoms</a></li>
</ul>
</li>
<li class="dropdown">
<a href="/menu/browse">Browse</a>
<ul class="menu">
<li><a href="/works">Works</a></li>
<li><a href="/bookmarks">Bookmarks</a></li>
<li><a href="/tags">Tags</a></li>
<li><a href="/collections">Collections</a></li>
</ul>
</li>
<li class="dropdown">
<a href="/menu/search">Search</a>
<ul class="menu">
<li><a href="/works/search">Works</a></li>
<li><a href="/bookmarks/search">Bookmarks</a></li>
<li><a href="/tags/search">Tags</a></li>
<li><a href="/people/search">People</a></li>
</ul>
</li>
<li class="dropdown">
<a href="/menu/about">About</a>
<ul class="menu">
<li><a href="/about">About Us</a></li>
<li><a href="/admin_posts">News</a></li>
<li><a href="/faq">FAQ</a></li>
<li><a href="/wrangling_guidelines">Wrangling Guidelines</a></li>
<li><a href="/donate">Donate or Volunteer</a></li>
</ul>
</li>
<li class="search"><form class="search" id="search" role="search" aria-label="Work" action="/works/search" accept-charset="UTF-8" method="get">
<fieldset>
<p>
<label class="landmark" for="site_search">Work Search</label>
<input class="text" id="site_search" aria-describedby="site_search_tooltip" type="text" name="work_search[query]" />
<span class="tip" role="tooltip" id="site_search_tooltip">tip: katekyou &quot;alternate universe&quot; sort:&gt;words</span>
<span class="submit actions"><input type="submit" value="Search" class="button" /></span>
</p>
</fieldset>
</form></li>
</ul>
</nav>
<div class="clear"></div>
</header>
<div class="event announcement group" id="admin-banner">
<blockquote class="userstuff">
<p align="center"><a href="https://otw-news.org/y884aacn" rel="nofollow">Donate</a> at least US$10 and you'll become a member of the OTW! <a href="https://otw-news.org/yc7nue4b" rel="nofollow">Learn about Fanlore, one of the projects your membership will support, and about our new thank-you gifts! </a> So far we've raised US$46,902.92, and weve reached <strong><span class="progress">1,229</span></strong> new members out of our goal of <strong><span class="goal">4,500</span></strong></p>
</blockquote>
<p class="submit">
<a class="showme action" title="hide banner" href="/works/1234567890?hide_banner=true&amp;view_adult=true&amp;view_full_work=true">&times;</a>
</p>
</div>
<div id="inner" class="wrapper">
<div id="main" class="works-show region" role="main">
<div class="flash"></div>
<ul class="landmark skip">
<li><a name="top">&nbsp;</a></li>
<li><a href="#work">Skip header</a></li>
</ul>
<h3 class="landmark heading">Actions</h3>
<ul class="work navigation actions" role="menu">
<li class="chapter bychapter"><a href="/works/1234567890/chapters/1234567890">Chapter by Chapter</a></li>
<li class="comments" id="show_comments_link_top">
<a data-remote="true" href="/comments/show_comments?view_full_work=true&amp;work_id=1234567890">Comments </a>
</li>
<li class="share hidden">
<a class=" modal" title="Share Work" href="/works/1234567890/share">Share</a>
</li>
<li class="download" aria-haspopup="true">
<a href="#">Download</a>
<ul class="expandable secondary">
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.azw3?updated_at=1717922671">AZW3</a></li>
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.epub?updated_at=1717922671">EPUB</a></li>
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.mobi?updated_at=1717922671">MOBI</a></li>
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.pdf?updated_at=1717922671">PDF</a></li>
<li><a href="/downloads/1234567890/Gothams_Top_Ten_Memes.html?updated_at=1717922671">HTML</a></li>
</ul>
</li>
</ul>
<h3 class="landmark heading">Work Header</h3>
<div class="wrapper">
<dl class="work meta group">
<dt class="rating tags">
Rating:
</dt>
<dd class="rating tags">
<ul class="commas">
<li><a class="tag" href="/tags/Teen%20And%20Up%20Audiences/works">Teen And Up Audiences</a></li>
</ul>
</dd>
<dt class="warning tags">
<a href="/tos_faq#tags">Archive Warning</a>:
</dt>
<dd class="warning tags">
<ul class="commas">
<li><a class="tag" href="/tags/No%20Archive%20Warnings%20Apply/works">No Archive Warnings Apply</a></li>
</ul>
</dd>
<dt class="category tags">
Category:
</dt>
<dd class="category tags">
<ul class="commas">
<li><a class="tag" href="/tags/Gen/works">Gen</a></li>
</ul>
</dd>
<dt class="fandom tags">
Fandoms:
</dt>
<dd class="fandom tags">
<ul class="commas">
<li><a class="tag" href="/tags/Batman%20-%20All%20Media%20Types/works">Batman - All Media Types</a></li><li><a class="tag" href="/tags/Young%20Justice%20-%20All%20Media%20Types/works">Young Justice - All Media Types</a></li><li><a class="tag" href="/tags/The%20Batman%20(Cartoon)/works">The Batman (Cartoon)</a></li><li><a class="tag" href="/tags/Batman:%20The%20Animated%20Series/works">Batman: The Animated Series</a></li>
</ul>
</dd>
<dt class="relationship tags">
Relationships:
</dt>
<dd class="relationship tags">
<ul class="commas">
<li><a class="tag" href="/tags/Batman%20*a*%20Robin%20-%20Relationship/works">Batman &amp; Robin - Relationship</a></li><li><a class="tag" href="/tags/Batman%20*a*%20GCPD/works">Batman &amp; GCPD</a></li><li><a class="tag" href="/tags/Stephanie%20Brown%20*a*%20Jason%20Todd/works">Stephanie Brown &amp; Jason Todd</a></li><li><a class="tag" href="/tags/Stephanie%20Brown%20*a*%20Duke%20Thomas%20*a*%20Jason%20Todd/works">Stephanie Brown &amp; Duke Thomas &amp; Jason Todd</a></li><li><a class="tag" href="/tags/Cassandra%20Cain%20*a*%20Tim%20Drake%20*a*%20Dick%20Grayson%20*a*%20Duke%20Thomas%20*a*%20Jason%20Todd%20*a*%20Bruce%20Wayne%20*a*%20Damian%20Wayne/works">Cassandra Cain &amp; Tim Drake &amp; Dick Grayson &amp; Duke Thomas &amp; Jason Todd &amp; Bruce Wayne &amp; Damian Wayne</a></li>
</ul>
</dd>
<dt class="character tags">
Characters:
</dt>
<dd class="character tags">
<ul class="commas">
<li><a class="tag" href="/tags/Gotham%20City/works">Gotham City</a></li><li><a class="tag" href="/tags/Gotham%20City%20Police%20Department%20Officers/works">Gotham City Police Department Officers</a></li><li><a class="tag" href="/tags/Civilians%20-%20Character/works">Civilians - Character</a></li><li><a class="tag" href="/tags/Bruce%20Wayne/works">Bruce Wayne</a></li><li><a class="tag" href="/tags/Dick%20Grayson/works">Dick Grayson</a></li><li><a class="tag" href="/tags/Bl%C3%BCdhaven%20Police%20Department%20-%20Character/works">Blüdhaven Police Department - Character</a></li><li><a class="tag" href="/tags/Stephanie%20Brown/works">Stephanie Brown</a></li><li><a class="tag" href="/tags/Jason%20Todd/works">Jason Todd</a></li><li><a class="tag" href="/tags/Duke%20Thomas/works">Duke Thomas</a></li><li><a class="tag" href="/tags/Renee%20Montoya/works">Renee Montoya</a></li><li><a class="tag" href="/tags/Damian%20Wayne/works">Damian Wayne</a></li><li><a class="tag" href="/tags/Tim%20Drake/works">Tim Drake</a></li><li><a class="tag" href="/tags/Cassandra%20Cain/works">Cassandra Cain</a></li><li><a class="tag" href="/tags/Barbara%20Gordon/works">Barbara Gordon</a></li>
</ul>
</dd>
<dt class="freeform tags">
Additional Tags:
</dt>
<dd class="freeform tags">
<ul class="commas">
<li><a class="tag" href="/tags/Multimedia/works">Multimedia</a></li><li><a class="tag" href="/tags/Embedded%20Images/works">Embedded Images</a></li><li><a class="tag" href="/tags/Mobile%20Unfriendly/works">Mobile Unfriendly</a></li><li><a class="tag" href="/tags/Memes/works">Memes</a></li><li><a class="tag" href="/tags/POV%20Outsider/works">POV Outsider</a></li><li><a class="tag" href="/tags/Gotham%20City%20-%20Freeform/works">Gotham City - Freeform</a></li><li><a class="tag" href="/tags/Gotham%20City%20Police%20Department/works">Gotham City Police Department</a></li><li><a class="tag" href="/tags/Social%20Media/works">Social Media</a></li><li><a class="tag" href="/tags/Twitter/works">Twitter</a></li><li><a class="tag" href="/tags/Buzzfeed/works">Buzzfeed</a></li><li><a class="tag" href="/tags/Tumblr/works">Tumblr</a></li><li><a class="tag" href="/tags/Trans%20Bruce%20Wayne/works">Trans Bruce Wayne</a></li><li><a class="tag" href="/tags/Bat%20Family/works">Bat Family</a></li><li><a class="tag" href="/tags/Humor/works">Humor</a></li><li><a class="tag" href="/tags/YouTube/works">YouTube</a></li><li><a class="tag" href="/tags/News%20Media/works">News Media</a></li><li><a class="tag" href="/tags/Bl%C3%BCdhaven/works">Blüdhaven</a></li><li><a class="tag" href="/tags/Actual%20word%20count%20is%20much%20higher/works">Actual word count is much higher</a></li>
</ul>
</dd>
<dt class="language">
Language:
</dt>
<dd class="language" lang="en">
English
</dd>
<dt class="series">
Series:
</dt>
<dd class="series">
<span class="series"><a class="previous" href="/works/17953307">&#8592; Previous Work</a><span class="divider"> </span><span class="position">Part 2 of <a href="/series/1291124">But what I do</a></span><span class="divider"> </span><a class="next" href="/works/19336603">Next Work &#8594;</a></span>
</dd>
<dt class="collections">
Collections:
</dt>
<dd class="collections">
<a href="/collections/JusticeLeague">Justice League Suggested Fics</a>
</dd>
<dt class="stats">Stats:</dt>
<dd class="stats">
<dl class="stats"><dt class="published">Published:</dt><dd class="published">2019-06-19</dd><dt class="status">Updated:</dt><dd class="status">2020-01-04</dd><dt class="words">Words:</dt><dd class="words">1,333</dd><dt class="chapters">Chapters:</dt><dd class="chapters">4/?</dd><dt class="comments">Comments:</dt><dd class="comments">223</dd><dt class="kudos">Kudos:</dt><dd class="kudos">5,239</dd><dt class="bookmarks">Bookmarks:</dt><dd class="bookmarks"><a href="/works/1234567890/bookmarks">790</a></dd><dt class="hits">Hits:</dt><dd class="hits">44,725</dd></dl>
</dd>
</dl>
</div>
<div id="workskin">
<div class="preface group">
<h2 class="title heading">
Gotham's Top Ten Memes
</h2>
<h3 class="byline heading">
<a rel="author" href="/users/Example/pseuds/Example">Example</a>
</h3>
<div class="summary module">
<h3 class="heading">Summary:</h3>
<blockquote class="userstuff">
<p>Every city has its pride and Gotham isn't different. We love our “dark and gloomy” architecture (meet us in the Batburgers parking lot Metropolis) and our Waynes, our vigilantes and most importantly: Our memes.</p><p>So, without much further ado, we present you Gothams top ten memes.</p><p>Gotham, the Waynes and the Bats through the eyes of social media.</p>
</blockquote>
</div>
<div class="notes module">
<h3 class="heading">Notes:</h3>
<blockquote class="userstuff">
<p>Because I love world building, I love multimedia fanfics and I really wanted to make memes from the perspective of Gotham city civilians. No need to have read the other parts of this series. Have fun!</p>
</blockquote>
<p class="jump">(See the end of the work for <a href="#work_endnotes">more notes</a>.)</p>
</div>
</div>
<div id="chapters" role="article">
<div class="chapter" id="chapter-1">
<div class="chapter preface group">
<h3 class="title">
<a href="/works/1234567890/chapters/1234567890">Chapter 1</a>: Gotham's Top Ten Memes
</h3>
</div>
<div class="userstuff module" role="article">
<h3 class="landmark heading" id="work">Chapter Text</h3>
<p>Every city has its pride and Gotham isn't different. We love our “dark and gloomy” architecture (meet us in the Batburgers parking lot Metropolis) and our Waynes, our vigilantes and most importantly: Our memes.</p><p>So, without much further ado, we present you Gothams top ten memes.</p><p>
<strong>1) Child hoarders?</strong>
</p><div>
<p>
<img src="https://example.com/1234399658913759234/590615095781097484/image0.jpg" alt width="60%" />
</p>
</div><p>We all know Bruce Wayne has made it his personal goal to get a child for every room in Wayne manor, but what about Batman? Since he started, more and more masks have appeared on the field. Not that were complaining…</p><p>
<strong>2) Poor, poor foreigners</strong>
</p><p>
<u> <img src="https://example.com/1234399658913759234/5906112342183475210/image0.jpg" alt width="60%" /> </u>
</p><p>It is common knowledge that Batman is part of the Justice League, he even has his own <a href="https://en.wikipedia.org/wiki/Batman" rel="nofollow">Wikipedia article</a>! Yet people still have a hard time believing our dark knight is more than just a conspiracy theory started by cultists.</p><p>
<strong>3) Going to work? Not always easy!</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590936579628072961/image0.jpg" alt width="250" height="232" /> </u>
</p><p>Dont forget! Wayne Enterprises are still selling the latest gas masks. You can find them <a href="https://ambrosius-faust.tumblr.com/post/185705972192/okay-hear-me-out-gotham-city-memes" rel="nofollow">right here</a>. If youre unable to afford one, you can pick up one for free at WEs main office. The money earned by the sold gas masks goes straight into the research for the Anti-Joker-Venom vaccines and antidotes to Fear Gas.</p><p>
<strong>4) Its an aesthetic and we are willing to commit</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590936498115969047/image0.jpg" alt width="60%" /> </u>
</p><p>Fun fact! A lot of our architecture was actually based on spite! Mainly, Gothams wealthiest taking one look at Metropoliss architecture and deciding that we will be infinitely better. The events of the last decade have left their mark, but we have rebuilt Gotham in the same image (with some improvements! Rumor has it that Robin loves gargoyles, so one or two more are no harm, right?)</p><p>
<strong>5) A place for the future!</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/5909366224642371234/image0.jpg" alt width="60%" /> </u>
</p><p>Every students biggest fear is debt! So, despite our gloomy image, WE once again has decided to make Gotham much more attractive to outsiders by promising to pay part of your student debt. What do you have to do in turn? Well, be a (paid!) intern at any Wayne owned facility for a year. Does that include the little Cup Cape bakery on main street that Damian Wayne frequents? Yes, it does! So even if youre no STEM student, you can apply for support!</p><p>
<strong>6) Since were already talking Wayne…</strong>
</p><p>
<strong> <img src="https://example.com/1234400967633076224/590936471356047360/image0.jpg" alt width="300" height="400" /> </strong>
</p><p>Yes, Capitalism is bad and no, we should not support the rich. However, I dare you to say one word against Bruce Wayne, who pays one of the best wages in the country, gives more to charity than anybody else, starts up charities if he finds there arent enough, doesnt run off to a city with less problems, supports stricter gun laws and is just an all-around sunshine.</p><p>
<strong>7) Gothams Baby</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590989363987480640/image0.jpg" alt width="300" height="700" /> </u>
</p><p>If there is someone we love more than Bruce Wayne though, its Robin!!! No matter what shape or form or creepy laugh they come in, our punny bird is the absolute best. In the wise words of another meme:</p><p>
<u> <img src="https://example.com/1234400967633076224/590989419138252804/image0.jpg" alt width="60%" /> </u>
</p><p>
<strong>8) Yes, we have a lecture for that</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590989442253193249/image0.jpg" alt width="60%" /> </u>
</p><p>Okay, so in case you dont know it, Gothams education system is a little weird. Namely, that we have a mandatory class once a month in which we get updated on the latest villain statuses, which vaccines dont work anymore and etc. Pictures of the power points used in those classes hit the web <a href="https://ambrosius-faust.tumblr.com/post/185708889947/gotham-city-memes-2-part-1" rel="nofollow">about a month ago</a>, and of course, it became a meme of people adding weird situations they stumbled into in Gotham in power point format.</p><p>
<strong>9) Clowns</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590989391749709827/image0.jpg" alt width="60%" /> </u>
</p><p>Look, the Joker is simply the worst. And whats even more terrible than him breaking out? Its him breaking out during exam time. Since we deal with so many villains per month, their attacks arent a valid excuse to miss school anymore. Fun. (But if the teacher doesn't show up, you pass with 100%!)</p><p>
<strong>10) Conspiracy theory</strong>
</p><p>
<u> <img src="https://example.com/1234400967633076224/590989304377901060/image0.jpg" alt width="60%" /> </u>
</p><p>Gothams longest and best-running conspiracy theory of all time DO THE BUTTS MATCH!? In our quest to figure out the identity of our masked heroes, we have tried our best to discover to whom we should sing our praise and the <em>Do the butts match?</em>  theory has helped us come quite far! We have discovered that, while Officer Grayson looks absolutely great in his uniform, he is sadly no match for Nightwing.</p><p>You liked this article? Then you may also be interested in:</p><p>
<strong> <em>10 Projects Wayne Enterprises supports in Gotham</em> </strong>
</p><p>
<strong> <em>10 Meetings with the Bat Stories from the GCPD</em> </strong>
</p><p>
<strong> <em>10 Reasons why you should study at Gotham U</em> </strong>
</p>
</div>
</div>
<div class="chapter" id="chapter-2">
<div class="chapter preface group">
<h3 class="title">
<a href="/works/1234567890/chapters/12345678901">Chapter 2</a>: 10 Meetings with the Bat - Stories from the GCPD
</h3>
<div id="notes" class="notes module">
<h3 class="heading">Notes:</h3>
<blockquote class="userstuff"><p>I had so much fun I made more social media stuff!</p></blockquote>
<p>
(See the end of the chapter for <a href="#chapter_2_endnotes">more notes</a>.)
</p>
</div>
</div>
<div class="userstuff module" role="article">
<h3 class="landmark heading" id="work">Chapter Text</h3>
<p>Batman and the GCPD: Sometimes enemies, most of the time good friends (at least when the other federal agencies aren't looking). Here we present you the top 10 times social media witnessed the GCPD and the Bat interacting.</p><p>
<strong>1) Big Dad Energy</strong>
</p><p>Now, while there is no official number of Robins, were guessing there have been up to six different ones so far. The skip from the first to the second one being quite noticeably its not always that a roughly 5'6" bird suddenly shrinks to a 4'6" fledgling. And apparently, the shorter a bird is, the more does Batman care.</p><p>
<img src="https://example.com/599594576113565738/599616583891157033/image0.jpg" alt width="338" height="800" />
</p><p>
<img src="https://example.com/599594576113565738/599616596687847434/image0.jpg" alt width="368" height="700" />
</p><p>
<strong>2) Martha Park</strong>
</p><p>Okay, hands up and be honest: Who remembers what started the trend of new dads dressing up as Batman holding their babies? Noone? Alright, let me give you a tip:</p><p>a) Bruce Wayne and his then recently adopted son Jason Todd going trick or treating dressed as Robin and Batman</p><p>b) A picture of Batman holding a baby going viral</p><p>c) Copied the Metropolis trend of dressing up as Superman holding a baby</p><p>If you guessed b) you were correct! Back in 2015 the following pictures and article dominated the news.</p><p>
<img src="https://example.com/599594576113565738/599616712693776394/image0.jpg" alt width="400" height="225" />
</p><p>
<img src="https://example.com/599594576113565738/599615347481640960/unknown.png" alt width="374" height="493" />
</p><p>
<strong>3) Speeding Cars</strong>
</p><p>The GCPD is more and more becoming a police force to not only trust, but actually be proud of as well and they take doing their job very seriously.</p><p>
<img src="https://example.com/599594576113565738/599616699888566297/image0.png" alt width="60%" />
</p><p>
<strong>4) Not exactly the GCPD but they get enough of our criminals</strong>
</p><p>Our sister city Blüdhaven has a hard time being our sister city. They get all our runaway criminals and she only has Nightwing to protect her. And Nightwing has Officer Rohrbach.</p><p>
<img src="https://example.com/599594576113565738/599618251395301407/image0.png" alt width="300" />
</p><p>
<strong>5) DIY</strong>
</p><p>Batman is the representation for the “hands-on” approach in all matters.</p><p>
<img src="https://example.com/599594576113565738/599616621803208721/image0.jpg" alt width="300" height="527" />
</p><p>
<strong>6) Money, money, money</strong>
</p><p>Everyone loves legal loopholes, the GCPD is no different. Currently, theyre making use of one that allows them to accept cash from the Batman. Thats right, Batman, or with Batman Inc. now Bruce Wayne, comes by every three month to pay quarterly fees. Theyre supposed to cover the other vigilantes speeding tickets, officially, but Id like to know how much cash it is that the GCPD is celebrating like this:</p><p>
<img src="https://example.com/599594576113565738/599594692069425162/snapsr.com-d8a1c70efa781a366ed3a8869de88444.jpg" alt width="300" height="533" />
</p><p>
<strong>7) #BetterCars</strong>
</p><p>Everything in Gotham except the politicians and the drug market is criminally underfunded. Same goes for the GCPD, so they dont have the best equipment in town.</p><p>
<img src="https://example.com/599594576113565738/599599249193435146/MTc5OTkx.png" alt width="300" height="900" />
</p><p>
<strong>8) CHALLENGE ACCEPTED</strong>
</p><p>Despite the fact that the Batfamily has been declared criminal a few times, as seen by this post, they can get along masterfully with each other as well. The BPD, on the other hand, is still a work in progress.</p><p>
<img src="https://example.com/599594576113565738/599616639742246943/image0.jpg" alt width="300" height="612" />
</p><p>
<strong>9) Babysitting</strong>
</p><p>Lets be honest, being a police officer means a lot of waiting. Observing. Babysitting Robin.</p><p>
<img src="https://example.com/599594576113565738/599616678518849557/image0.jpg" alt width="300" height="309" />
</p><p>
<strong>10) Supreme Authority</strong>
</p><p>It isnt news that Batman has quite the authority in the GCPD as the Wayne family and friends can now testify.</p><p>
<img src="https://example.com/599594576113565738/599616654477099028/image0.jpg" alt width="300" height="1106" />
</p><p> </p><p> </p><div>
<p> </p>
<p> </p>
<div class="chapter">
<p> </p>
<p> </p>
<div class="userstuff module">
<p>You liked this article? Then you might also be interested in:</p>
<p>
<strong> <em>10 Projects Wayne Enterprises supports in Gotham</em> </strong>
</p>
<p>
<strong> <em>10 Reasons why you should study at Gotham U</em> </strong>
</p>
<p>
<em> <b>The Wayne Family Twitters</b> </em>
</p>
</div>
</div>
</div>
</div>
<div class="chapter preface group">
<div class="end notes module" id="chapter_2_endnotes">
<h3 class="heading">Notes:</h3>
<blockquote class="userstuff">
<p>Thanks for reading! I'd love to hear what you think!<br/>Shout out to my friend Garce for helping me with 6).<br/>Anything in particular you'd like to see?</p>
</blockquote>
</div>
</div>
</div>
<div class="chapter" id="chapter-3">
<div class="chapter preface group">
<h3 class="title">
<a href="/works/1234567890/chapters/12345678902">Chapter 3</a>: The Wayne (and affiliated) Twitters
</h3>
<div id="notes" class="notes module">
<h3 class="heading">Notes:</h3>
<blockquote class="userstuff"><p>You asked for the Wayne Twitters and here they are.</p></blockquote>
<p>
(See the end of the chapter for <a href="#chapter_3_endnotes">more notes</a>.)
</p>
</div>
</div>
<div class="userstuff module" role="article">
<h3 class="landmark heading" id="work">Chapter Text</h3>
<p>
<img src="https://example.com/611639286642507797/611639855692382220/image0.png" alt width="300" height="535" />
</p><p>
<img src="https://example.com/611639286642507797/611639855692382221/image1.jpg" alt width="300" height="472" />
</p><p> </p><p>
<img src="https://example.com/611639286642507797/611639467010424904/image0.png" alt width="300" height="536" />
</p><p> <img src="https://example.com/611639286642507797/611639467010424910/image1.jpg" alt width="300" height="512" /></p><p> </p><p>
<img src="https://example.com/611639286642507797/611639595934679127/image0.png" alt width="300" height="536" />
</p><p>
<img src="https://example.com/611639286642507797/611639596366954496/image1.jpg" alt width="300" height="619" />
</p><p> </p><p>
<img src="https://example.com/611639286642507797/611639548786507787/image0.png" alt width="300" height="533" />
</p><p>
<img src="https://example.com/611639286642507797/611639548786507788/image1.jpg" alt width="300" height="521" />
</p><p> </p><p>
<img src="https://example.com/611639286642507797/611639504583000065/image0.png" alt width="300" height="533" />
</p><p>
<img src="https://example.com/611639286642507797/611639505161682944/image1.jpg" alt width="300" height="612" />
</p><p> </p><p>
<img src="https://example.com/611639286642507797/611639726348304445/image0.png" alt width="300" height="527" />
</p><p>
<img src="https://example.com/611639286642507797/611639727103148032/image1.jpg" alt width="300" height="494" />
</p><p> </p><p>
<img src="https://example.com/611639286642507797/611639380943175730/image1.png" alt width="300" height="535" />
</p><p>
<img src="https://example.com/611639286642507797/611639380943175732/image0.jpg" alt width="300" height="528" />
</p><p> </p><p>
<img src="https://example.com/611639286642507797/611639341781090345/image1.png" alt width="300" height="536" />
</p><p>
<img src="https://example.com/611639286642507797/611639342355578902/image0.jpg" alt width="300" height="563" />
</p><p> </p><p>
<img src="https://example.com/611639286642507797/611639669599371271/image1.png" alt width="300" height="535" />
</p><p>
<img src="https://example.com/611639286642507797/611639670199025685/image0.jpg" alt width="300" height="591" />
</p><hr/><p>"Tim."</p><p>"Yes?"</p><p>"You spend way too much time on twitter."</p><p>"I'm sorry, all the other rich-kid-covers were already in use, so I took one for the team and became the social media addict. Feel free to switch with me, <em>reclusive nerd</em>."</p><p>"... Know what? I'm actually good, thanks. Anyway, did you hear this? That was totally B calling me to rant at me for my recklessness. I absolutely should go to him immediately and pay attention to whatever important thing he has to say."</p><p>"Really smooth, Jason. Totally unable to spot the lie."</p>
</div>
<div class="chapter preface group">
<div class="end notes module" id="chapter_3_endnotes">
<h3 class="heading">Notes:</h3>
<blockquote class="userstuff">
<p>I,,, did not expect this to blow up as much as it did lmao. Happy to see you all are enjoying this!<br/>Any other suggestions of stuff you want to see?<br/>Thanks for reading! Comments are more than welcome and make me cry very happy tears.</p>
</blockquote>
</div>
</div>
</div>
<div class="chapter" id="chapter-4">
<div class="chapter preface group">
<h3 class="title">
<a href="/works/1234567890/chapters/12345678903">Chapter 4</a>: Party Time
</h3>
</div>
<div class="userstuff module" role="article">
<h3 class="landmark heading" id="work">Chapter Text</h3>
<p>A story told across social media.</p><p>
<img src="https://example.com/611639286642507797/663130133808414781/image0.jpg" alt width="300" height="417" />
<br/>
<br/>
<img src="https://example.com/611639286642507797/663130134253142057/image1.jpg" alt width="300" height="466" />
<br/>
<br/>
<img src="https://example.com/611639286642507797/663130134253142067/image2.png" alt width="300" height="538" />
<br/>
<br/>
<img src="https://example.com/611639286642507797/663130134819110951/image3.jpg" alt width="300" height="497" />
<br/>
<br/>
<img src="https://example.com/611639286642507797/663130134819110952/image4.jpg" alt width="300" height="534" />
</p>
</div>
</div>
</div>
<div class="afterword preface group">
<div id="work_endnotes" class="end notes module">
<h3 class="heading">Notes:</h3>
<blockquote class="userstuff"><p>Thanks for reading!</p></blockquote>
</div>
<div id="series" class="series module">
<h3 class="heading">Series this work belongs to:</h3>
<ul>
<li><span class="series"><a class="previous" href="/works/17953307">&#8592; Previous Work</a><span class="divider"> </span><span class="position">Part 2 of <a href="/series/1291124">But what I do</a></span><span class="divider"> </span><a class="next" href="/works/19336603">Next Work &#8594;</a></span></li>
</ul>
</div>
</div>
</div>
<div id="feedback" class="feedback">
<h3 class="landmark heading">Actions</h3>
<ul class="actions" role="navigation">
<li><a href="#main">&#8593; Top</a></li>
<li>
<form id="new_kudo" action="/kudos" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="QpEObpAxvNjq4jO5a7IwQK1aS4nuouVP-Rx6oHKs7dUZJ3v4gidNYU6spWSulloC15tsU6sChSY8zoJdhIgS_w" autocomplete="off" />
<input value="1234567890" autocomplete="off" type="hidden" name="kudo[commentable_id]" id="kudo_commentable_id" />
<input value="Work" autocomplete="off" type="hidden" name="kudo[commentable_type]" id="kudo_commentable_type" />
<input type="submit" name="commit" value="Kudos ♥" id="kudo_submit" />
</form> </li>
<li id="show_comments_link"><a data-remote="true" href="/comments/show_comments?view_full_work=true&amp;work_id=1234567890">Comments (223)</a></li>
</ul>
<div id="kudos_message"></div>
<h3 class="landmark heading">Kudos</h3>
<div id="kudos">
<p class="kudos">
<a href="/users/Freyija">Freyija</a>, <a href="/users/Kimiyona">Kimiyona</a>, <a href="/users/LAURIE_73856">LAURIE_73856</a>, <a href="/users/Cresentia">Cresentia</a>, <a href="/users/fulcrum_1029">fulcrum_1029</a>, <a href="/users/Kaikuroi">Kaikuroi</a>, <a href="/users/Smol_DangerNoodle">Smol_DangerNoodle</a>, <a href="/users/Xenia12">Xenia12</a>, <a href="/users/LocalFriendlyEldritchThing">LocalFriendlyEldritchThing</a>, <a href="/users/Jiji3ji">Jiji3ji</a>, <a href="/users/1_Dont_Need_Sleep_I_Need_Answers">1_Dont_Need_Sleep_I_Need_Answers</a>, <a href="/users/Giselia">Giselia</a>, <a href="/users/Horizon_blue">Horizon_blue</a>, <a href="/users/musical_adhd_BItch">musical_adhd_BItch</a>, <a href="/users/AndroidFrog">AndroidFrog</a>, <a href="/users/The__Second">The__Second</a>, <a href="/users/Stylesofpink">Stylesofpink</a>, <a href="/users/Person_with_a_cool_name">Person_with_a_cool_name</a>, <a href="/users/srirachacha">srirachacha</a>, <a href="/users/RandomPersonExisting">RandomPersonExisting</a>, <a href="/users/and_andromeda">and_andromeda</a>, <a href="/users/dangerhumming">dangerhumming</a>, <a href="/users/TheJasmineTurtleDuck">TheJasmineTurtleDuck</a>, <a href="/users/your_trans_boyfriend">your_trans_boyfriend</a>, <a href="/users/LuneWolf13">LuneWolf13</a>, <a href="/users/The_Dilara4951">The_Dilara4951</a>, <a href="/users/C4HET">C4HET</a>, <a href="/users/purityofpetrichor">purityofpetrichor</a>, <a href="/users/Phyazane">Phyazane</a>, <a href="/users/ifrainfalls">ifrainfalls</a>, <a href="/users/Juznifero">Juznifero</a>, <a href="/users/thecloudenthusiast">thecloudenthusiast</a>, <a href="/users/Aleksa0">Aleksa0</a>, <a href="/users/Cupcakes2022">Cupcakes2022</a>, <a href="/users/alighiericall">alighiericall</a>, <a href="/users/PagiNANI">PagiNANI</a>, <a href="/users/Tiny_Maze">Tiny_Maze</a>, <a href="/users/Fraanrmz">Fraanrmz</a>, <a href="/users/MyStory_48">MyStory_48</a>, <a href="/users/bacondestiny">bacondestiny</a>, <a href="/users/Letmesleeeeep">Letmesleeeeep</a>, <a href="/users/submergingboats">submergingboats</a>, <a href="/users/Nonsense_52">Nonsense_52</a>, <a href="/users/Evna">Evna</a>, <a href="/users/Cold_Star">Cold_Star</a>, <a href="/users/Annimals">Annimals</a>, <a href="/users/Analog2000">Analog2000</a>, <a href="/users/Dae15">Dae15</a>, <a href="/users/Panziku_Nox">Panziku_Nox</a>, <a href="/users/Spicy_Hot_Noodles">Spicy_Hot_Noodles</a><span id="kudos_more_connector">, and </span><a id="kudos_more_link" data-remote="true" href="/works/1234567890/kudos?before=6213580573">3429 more users</a>
as well as
1760 guests
left kudos on this work!
</p>
</div>
<h3 class="landmark heading"><a id="comments">Comments</a></h3>
<div id="add_comment_placeholder" title="top level comment">
<div id="add_comment">
<div class="post comment" id="comment_form_for_1234567890">
<form class="new_comment" id="comment_for_1234567890" action="/works/1234567890/comments" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="D0s_Kme7-wsHZH9MOcytfJkRTTg44yFXowneYmpSPSQDrztb7lV3oZEWyRQYBWkPZ_a5if-u3rMPpXD8PZ6N-Q" autocomplete="off" />
<fieldset>
<legend>Post Comment</legend>
<input type="hidden" name="view_full_work" id="view_full_work" value="true" class="text" autocomplete="off" />
<dl>
<dt class="landmark">Note:</dt>
<dd class="instructions comment_form">All fields are required. Your email address will not be published.</dd>
<dt><label for="comment_name_for_1234567890">Guest name</label></dt>
<dd>
<input id="comment_name_for_1234567890" type="text" name="comment[name]" />
<script>
//<![CDATA[
var validation_for_comment_name_for_1234567890 = new LiveValidation('comment_name_for_1234567890', { wait: 500, onlyOnBlur: false });
validation_for_comment_name_for_1234567890.add(Validate.Presence, {"failureMessage":"Please enter your name.","validMessage":""});
//]]>
</script>
</dd>
<dt><label for="comment_email_for_1234567890">Guest email</label></dt>
<dd>
<input id="comment_email_for_1234567890" type="text" name="comment[email]" />
<script>
//<![CDATA[
var validation_for_comment_email_for_1234567890 = new LiveValidation('comment_email_for_1234567890', { wait: 500, onlyOnBlur: false });
validation_for_comment_email_for_1234567890.add(Validate.Presence, {"failureMessage":"Please enter your email address.","validMessage":""});
//]]>
</script>
</dd>
</dl>
<p class="footnote">(Plain text with limited HTML <a class="help symbol question modal" title="Html help" href="/help/html-help.html"><span class="symbol question"><span>?</span></span></a>)</p>
<p>
<label for="comment_content_for_1234567890" class="landmark">Comment</label>
<textarea id="comment_content_for_1234567890" class="comment_form observe_textlength" title="Enter Comment" name="comment[comment_content]">
</textarea>
<input type="hidden" id="controller_name_for_1234567890" name="controller_name" value="works" />
</p>
<p class="character_counter" tabindex="0"><span id="comment_content_for_1234567890_counter" class="value" data-maxlength="10000">10000</span> characters left</p>
<script>
//<![CDATA[
var validation_for_comment_content_for_1234567890 = new LiveValidation('comment_content_for_1234567890', { wait: 500, onlyOnBlur: false });
validation_for_comment_content_for_1234567890.add(Validate.Presence, {"failureMessage":"Brevity is the soul of wit, but we need your comment to have text in it.","validMessage":""});
validation_for_comment_content_for_1234567890.add(Validate.Length, {"maximum":"10000","tooLongMessage":"must be less than 10000 characters long."});
//]]>
</script>
<p class="submit actions">
<input type="submit" name="commit" value="Comment" id="comment_submit_for_1234567890" data-disable-with="Please wait..." />
</p>
</fieldset>
</form></div>
<div class="clear"></div>
</div>
</div>
<div id="comments_placeholder" style="display:none;">
</div>
</div>
<div class="clear"></div>
</div>
</div>
<div id="footer" role="contentinfo" class="region">
<h3 class="landmark heading">Footer</h3>
<ul class="navigation actions" role="navigation">
<li class="module group">
<h4 class="heading">About the Archive</h4>
<ul class="menu">
<li><a href="/site_map">Site Map</a></li>
<li><a href="/diversity">Diversity Statement</a></li>
<li><a href="/tos">Terms of Service</a></li>
<li><a href="/dmca">DMCA Policy</a> </li>
</ul>
</li>
<li class="module group">
<h4 class="heading">Contact Us</h4>
<ul class="menu">
<li><a href="/abuse_reports/new">Policy Questions &amp; Abuse Reports</a></li>
<li><a href="/support">Technical Support &amp; Feedback</a></li>
</ul>
</li>
<li class="module group">
<h4 class="heading">Development</h4>
<ul class="menu">
<li><a href="https://github.com/otwcode/otwarchive/commits/v0.9.379.1">otwarchive v0.9.379.1</a></li>
<li><a href="/known_issues">Known Issues</a></li>
<li><a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" title="View License">GPL-2.0-or-later</a> by the <a href="https://transformativeworks.org/" title="The Organization for Transformative Works">OTW</a></li>
</ul>
</li>
</ul>
</div>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined') {
document.write(unescape("%3Cscript src='/javascripts/jquery.min.js' type='text/javascript'%3E%3C/script%3E"));
document.write(unescape("%3Cscript src='/javascripts/jquery-ui.min.js' type='text/javascript'%3E%3C/script%3E"));
}
</script>
<script type="text/javascript">$j = jQuery.noConflict();</script>
<script src="/javascripts/jquery.scrollTo.min.js"></script>
<script src="/javascripts/jquery.livequery.min.js"></script>
<script src="/javascripts/rails.js"></script>
<script src="/javascripts/application.js"></script>
<script src="/javascripts/bootstrap/bootstrap-dropdown.min.js"></script>
<script src="/javascripts/jquery-shuffle.js"></script>
<script src="/javascripts/jquery.tokeninput.min.js"></script>
<script src="/javascripts/jquery.trap.min.js"></script>
<script src="/javascripts/ao3modal.min.js"></script>
<script src="/javascripts/js.cookie.min.js"></script>
<script src="/javascripts/filters.min.js"></script>
<script>
//<![CDATA[
// We can't rely on !window.localStorage to test localStorage support in
// browsers like Safari 9, which technically support it, but which have a
// storage length of 0 in private mode.
// Credit: https://github.com/getgrav/grav-plugin-admin/commit/cfe2188f10c4ca604e03c96f3e21537fda1cdf9a
function isSupported() {
var item = "localStoragePolyfill";
try {
localStorage.setItem(item, item);
localStorage.removeItem(item);
return true;
} catch (e) {
return false;
}
}
function acceptTOS() {
if (isSupported()) {
localStorage.setItem("accepted_tos", "20180523");
} else {
Cookies.set("accepted_tos", "20180523", { expires: 365 });
}
}
$j(document).ready(function() {
if (localStorage.getItem("accepted_tos") !== "20180523" && Cookies.get("accepted_tos") !== "20180523") {
$j("body").prepend("<div id=\"tos_prompt\" class=\"hidden\">\n <h2 class=\"heading\">\n <span>Archive of Our Own<\/span>\n <\/h2>\n <div class=\"agreement\">\n <p class=\"summary\">\n On Archive of Our Own (AO3), users can make profiles, create works and\n other Content, post comments, give Kudos, create Collections and \n Bookmarks, participate in Challenges, import works, and more. Any \n information you publish in a comment, profile, work, or Content that you \n post or import onto AO3 including in summaries, notes and tags, \n will be accessible by the public (unless you limit access to a work only \n to those with AO3 Accounts), and it will be available to \n AO3 personnel. Be mindful when sharing personal information, \n including your religious or political views, health, racial background, \n country of origin, sexual identity and/or personal relationships. To \n learn more, check out our <a href=\"/tos\">Terms of Service<\/a> and <a href=\"/tos#privacy\">Privacy Policy<\/a>.\n <\/p>\n\n <p class=\"confirmation\">\n <input type=\"checkbox\" id=\"tos_agree\" />\n <label for=\"tos_agree\">I have read &amp; understood the new Terms of Service and Privacy Policy<\/label>\n <\/p>\n\n <p class=\"submit\">\n <button name=\"button\" type=\"button\" disabled=\"disabled\" id=\"accept_tos\">I agree/consent to its terms<\/button>\n <\/p>\n\n <\/div>\n<\/div>\n\n<script>\n//<![CDATA[\n\n \$j(document).ready(function() {\n var container = \$j(\"#tos_prompt\");\n var outer = \$j(\"#outer\");\n var button = \$j(\"#accept_tos\");\n\n setTimeout(showTOSPrompt, 1500);\n\n function showTOSPrompt() {\n \$j.when(container.fadeIn(500)).done(function() {\n outer.addClass(\"hidden\").attr(\"aria-hidden\", \"true\");\n });\n\n \$j(\"#tos_agree\").on(\"click\", function() {\n button.attr(\"disabled\", !this.checked);\n if (this.checked) {\n button.on(\"click\", function() {\n acceptTOS();\n outer.removeClass(\"hidden\").removeAttr(\"aria-hidden\");\n \$j.when(container.fadeOut(500)).done(function() {\n container.remove();\n });\n });\n };\n }).change();\n };\n });\n\n//]]]]><![CDATA[>\n<\/script>");
}
});
//]]>
</script>
<script>
//<![CDATA[
$j(document).ready(function() {
var permitted_hosts = ["104.153.64.122","208.85.241.152","208.85.241.157","ao3.org","archiveofourown.com","archiveofourown.gay","archiveofourown.net","archiveofourown.org","download.archiveofourown.org","insecure.archiveofourown.org","secure.archiveofourown.org","www.archiveofourown.com","www.archiveofourown.net","www.archiveofourown.org","www.ao3.org","archive.transformativeworks.org"];
var current_host = window.location.hostname;
if (!permitted_hosts.includes(current_host) && Cookies.get("proxy_notice") !== "0" && window.location.protocol !== "file:") {
$j("#skiplinks").after("<div id=\"proxy-notice\">\n <div class=\"userstuff\">\n <p class=\"important\">Important message:<\/p>\n <ol>\n <li>You are using a proxy site that is not part of the Archive of Our Own.<\/li>\n <li>The entity that set up the proxy site can see what you submit, including your IP address. If you log in through the proxy site, it can see your password.<\/li>\n <\/ol>\n <p class=\"important\">重要提示:<\/p>\n <ol>\n <li>您使用的是第三方开发的反向代理网站此网站并非Archive of Our Own - AO3AO3作品库原站。<\/li>\n <li>代理网站的开发者能够获取您上传至该站点的全部内容包括您的ip地址。如您通过代理登录AO3对方将获得您的密码。<\/li>\n <\/ol>\n <p class=\"submit\"><button class=\"action\" type=\"button\" id=\"proxy-notice-dismiss\">Dismiss Notice<\/button><\/p>\n <\/div>\n<\/div>\n\n<script>\n//<![CDATA[\n\n \$j(document).ready(function() {\n \$j(\"#proxy-notice-dismiss\").on(\"click\", function() {\n Cookies.set(\"proxy_notice\", \"0\");\n \$j(\"#proxy-notice\").slideUp();\n });\n });\n\n//]]]]><![CDATA[>\n<\/script>");
}
});
//]]>
</script>
<script>
$j(document).on("loadedCSRF", function() {
function send() {
$j.post("/works/1234567890/hit_count.json")
}
// If a browser doesn't support prerendering, then document.prerendering
// will be undefined, and we'll just send the hit count immediately.
if (document.prerendering) {
document.addEventListener("prerenderingchange", send);
} else {
send();
}
})
</script>
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8d466f95e8770d42',t:'MTcyOTIzMjU2Ni4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>

282
test/fixtures/ao3/story_nav.html vendored Normal file
View file

@ -0,0 +1,282 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="keywords" content="fanfiction, transformative works, otw, fair use, archive" />
<meta name="language" content="en-US" />
<meta name="subject" content="fandom" />
<meta name="description" content="An Archive of Our Own, a project of the
Organization for Transformative Works" />
<meta name="distribution" content="GLOBAL" />
<meta name="classification" content="transformative works" />
<meta name="author" content="Organization for Transformative Works" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>
Navigate
Work
|
Archive of Our Own
</title>
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/01-core.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/02-elements.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/03-region-header.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/04-region-dashboard.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/05-region-main.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/06-region-footer.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/07-interactions.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/08-actions.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/09-roles-states.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/10-types-groups.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/11-group-listbox.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/12-group-meta.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/13-group-blurb.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/14-group-preface.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/15-group-comments.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/16-zone-system.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/17-zone-home.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/18-zone-searchbrowse.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/19-zone-tags.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/20-zone-translation.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/21-userstuff.css" />
<link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/22-system-messages.css" />
<link rel="stylesheet" type="text/css" media="only screen and (max-width: 62em), handheld" href="/stylesheets/site/2.0/25-media-midsize.css" />
<link rel="stylesheet" type="text/css" media="only screen and (max-width: 42em), handheld" href="/stylesheets/site/2.0/26-media-narrow.css" />
<link rel="stylesheet" type="text/css" media="speech" href="/stylesheets/site/2.0/27-media-aural.css" />
<link rel="stylesheet" type="text/css" media="print" href="/stylesheets/site/2.0/28-media-print.css" />
<!--[if lte IE 8]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/29-role-ie8_or_lower.css" /><![endif]-->
<!--[if IE 5]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/30-role-ie5.css" /><![endif]-->
<!--[if IE 6]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/31-role-ie6.css" /><![endif]-->
<!--[if IE 7]><link rel="stylesheet" type="text/css" media="screen" href="/stylesheets/site/2.0/32-role-ie7.css" /><![endif]-->
<link rel="stylesheet" href="/stylesheets/sandbox.css" />
<script src="/javascripts/livevalidation_standalone.js"></script>
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="s7o15DONlfpquEJEyC5-ZydEqWtTQznAivcoI5pMHee1vKYf8AZ-GdHO16Q2tJz8gkGHulR6tChFzpGJzNVpwQ" />
</head>
<body class="logged-out">
<div id="outer" class="wrapper">
<ul id="skiplinks"><li><a href="#main">Main Content</a></li></ul>
<noscript><p id="javascript-warning">While we&#39;ve done our best to make the core functionality of this site accessible without JavaScript, it will work better with it enabled. Please consider turning it on!</p></noscript>
<header id="header" class="region">
<h1 class="heading">
<a href="/"><span>Archive of Our Own</span><sup> beta</sup><img alt="Archive of Our Own" class="logo" src="/images/ao3_logos/logo_42.png" /></a>
</h1>
<div id="login" class="dropdown">
<p class="user actions">
<a id="login-dropdown" href="/users/login">Log In</a>
</p>
<div id="small_login" class="simple login">
<form class="new_user" id="new_user_session_small" action="/users/login" accept-charset="UTF-8" method="post"><input type="hidden" name="authenticity_token" value="KHp1nJZf3-XYKsJUiXoztLgtPBF7UCaz0EslkKY7SzQFy7oWldWK0ZCgqNCGyZcuykoxdO9-8SQTVyveRmm77g" autocomplete="off" />
<dl>
<dt>
<label for="user_session_login_small">User name or email:</label></dt>
<dd><input id="user_session_login_small" type="text" name="user[login]" /></dd>
<dt><label for="user_session_password_small">Password:</label></dt>
<dd><input id="user_session_password_small" type="password" name="user[password]" /></dd>
</dl>
<p class="submit actions">
<label for="user_remember_me_small" class="action"><input type="checkbox" name="user[remember_me]" id="user_remember_me_small" value="1" />Remember Me</label>
<input type="submit" name="commit" value="Log In" />
</p>
</form>
<ul class="footnote actions">
<li><a href="/users/password/new">Forgot password?</a></li>
<li>
<a href="/invite_requests">Get an Invitation</a>
</li>
</ul>
</div>
</div>
<nav aria-label="Site">
<ul class="primary navigation actions">
<li class="dropdown">
<a href="/menu/fandoms">Fandoms</a>
<ul class="menu">
<li><a href="/media">All Fandoms</a></li>
<li id="medium_5"><a href="/media/Anime%20*a*%20Manga/fandoms">Anime &amp; Manga</a></li>
<li id="medium_3"><a href="/media/Books%20*a*%20Literature/fandoms">Books &amp; Literature</a></li>
<li id="medium_4"><a href="/media/Cartoons%20*a*%20Comics%20*a*%20Graphic%20Novels/fandoms">Cartoons &amp; Comics &amp; Graphic Novels</a></li>
<li id="medium_7"><a href="/media/Celebrities%20*a*%20Real%20People/fandoms">Celebrities &amp; Real People</a></li>
<li id="medium_2"><a href="/media/Movies/fandoms">Movies</a></li>
<li id="medium_6"><a href="/media/Music%20*a*%20Bands/fandoms">Music &amp; Bands</a></li>
<li id="medium_8"><a href="/media/Other%20Media/fandoms">Other Media</a></li>
<li id="medium_30198"><a href="/media/Theater/fandoms">Theater</a></li>
<li id="medium_1"><a href="/media/TV%20Shows/fandoms">TV Shows</a></li>
<li id="medium_476"><a href="/media/Video%20Games/fandoms">Video Games</a></li>
<li id="medium_9971"><a href="/media/Uncategorized%20Fandoms/fandoms">Uncategorized Fandoms</a></li>
</ul>
</li>
<li class="dropdown">
<a href="/menu/browse">Browse</a>
<ul class="menu">
<li><a href="/works">Works</a></li>
<li><a href="/bookmarks">Bookmarks</a></li>
<li><a href="/tags">Tags</a></li>
<li><a href="/collections">Collections</a></li>
</ul>
</li>
<li class="dropdown">
<a href="/menu/search">Search</a>
<ul class="menu">
<li><a href="/works/search">Works</a></li>
<li><a href="/bookmarks/search">Bookmarks</a></li>
<li><a href="/tags/search">Tags</a></li>
<li><a href="/people/search">People</a></li>
</ul>
</li>
<li class="dropdown">
<a href="/menu/about">About</a>
<ul class="menu">
<li><a href="/about">About Us</a></li>
<li><a href="/admin_posts">News</a></li>
<li><a href="/faq">FAQ</a></li>
<li><a href="/wrangling_guidelines">Wrangling Guidelines</a></li>
<li><a href="/donate">Donate or Volunteer</a></li>
</ul>
</li>
<li class="search"><form class="search" id="search" role="search" aria-label="Work" action="/works/search" accept-charset="UTF-8" method="get">
<fieldset>
<p>
<label class="landmark" for="site_search">Work Search</label>
<input class="text" id="site_search" aria-describedby="site_search_tooltip" type="text" name="work_search[query]" />
<span class="tip" role="tooltip" id="site_search_tooltip">tip: buffy gen teen AND &quot;no archive warnings apply&quot;</span>
<span class="submit actions"><input type="submit" value="Search" class="button" /></span>
</p>
</fieldset>
</form></li>
</ul>
</nav>
<div class="clear"></div>
</header>
<div class="event announcement group" id="admin-banner">
<blockquote class="userstuff">
<p align="center"><a href="https://otw-news.org/y884aacn" rel="nofollow">Donate</a> at least US$10 and you'll become a member of the OTW! <a href="https://otw-news.org/yc7nue4b" rel="nofollow">Learn about Fanlore, one of the projects your membership will support, and about our new thank-you gifts! </a> So far we've raised US$46,902.92, and weve reached <strong><span class="progress">1,229</span></strong> new members out of our goal of <strong><span class="goal">4,500</span></strong></p>
</blockquote>
<p class="submit">
<a class="showme action" title="hide banner" href="/works/1234567890/navigate?hide_banner=true&amp;view_adult=true">&times;</a>
</p>
</div>
<div id="inner" class="wrapper">
<div id="main" class="works-navigate region" role="main">
<div class="flash"></div>
<h2 class="heading">Chapter Index for <a href="/works/1234567890">Gotham's Top Ten Memes</a> by <a rel="author" href="/users/loosingletters/pseuds/loosingletters">loosingletters</a></h2>
<ol class="chapter index group" role="navigation">
<li><a href="/works/1234567890/chapters/1234567890">1. Gotham's Top Ten Memes</a> <span class="datetime">(2019-06-19)</span></li>
<li><a href="/works/1234567890/chapters/12345678901">2. 10 Meetings with the Bat - Stories from the GCPD</a> <span class="datetime">(2019-07-13)</span></li>
<li><a href="/works/1234567890/chapters/12345678902">3. The Wayne (and affiliated) Twitters</a> <span class="datetime">(2019-08-15)</span></li>
<li><a href="/works/1234567890/chapters/12345678903">4. Party Time</a> <span class="datetime">(2020-01-04)</span></li>
</ol>
<div class="clear"></div>
</div>
</div>
<div id="footer" role="contentinfo" class="region">
<h3 class="landmark heading">Footer</h3>
<ul class="navigation actions" role="navigation">
<li class="module group">
<h4 class="heading">About the Archive</h4>
<ul class="menu">
<li><a href="/site_map">Site Map</a></li>
<li><a href="/diversity">Diversity Statement</a></li>
<li><a href="/tos">Terms of Service</a></li>
<li><a href="/dmca">DMCA Policy</a> </li>
</ul>
</li>
<li class="module group">
<h4 class="heading">Contact Us</h4>
<ul class="menu">
<li><a href="/abuse_reports/new">Policy Questions &amp; Abuse Reports</a></li>
<li><a href="/support">Technical Support &amp; Feedback</a></li>
</ul>
</li>
<li class="module group">
<h4 class="heading">Development</h4>
<ul class="menu">
<li><a href="https://github.com/otwcode/otwarchive/commits/v0.9.379.1">otwarchive v0.9.379.1</a></li>
<li><a href="/known_issues">Known Issues</a></li>
<li><a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html" title="View License">GPL-2.0-or-later</a> by the <a href="https://transformativeworks.org/" title="The Organization for Transformative Works">OTW</a></li>
</ul>
</li>
</ul>
</div>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js" type="text/javascript"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined') {
document.write(unescape("%3Cscript src='/javascripts/jquery.min.js' type='text/javascript'%3E%3C/script%3E"));
document.write(unescape("%3Cscript src='/javascripts/jquery-ui.min.js' type='text/javascript'%3E%3C/script%3E"));
}
</script>
<script type="text/javascript">$j = jQuery.noConflict();</script>
<script src="/javascripts/jquery.scrollTo.min.js"></script>
<script src="/javascripts/jquery.livequery.min.js"></script>
<script src="/javascripts/rails.js"></script>
<script src="/javascripts/application.js"></script>
<script src="/javascripts/bootstrap/bootstrap-dropdown.min.js"></script>
<script src="/javascripts/jquery-shuffle.js"></script>
<script src="/javascripts/jquery.tokeninput.min.js"></script>
<script src="/javascripts/jquery.trap.min.js"></script>
<script src="/javascripts/ao3modal.min.js"></script>
<script src="/javascripts/js.cookie.min.js"></script>
<script src="/javascripts/filters.min.js"></script>
<script>
//<![CDATA[
// We can't rely on !window.localStorage to test localStorage support in
// browsers like Safari 9, which technically support it, but which have a
// storage length of 0 in private mode.
// Credit: https://github.com/getgrav/grav-plugin-admin/commit/cfe2188f10c4ca604e03c96f3e21537fda1cdf9a
function isSupported() {
var item = "localStoragePolyfill";
try {
localStorage.setItem(item, item);
localStorage.removeItem(item);
return true;
} catch (e) {
return false;
}
}
function acceptTOS() {
if (isSupported()) {
localStorage.setItem("accepted_tos", "20180523");
} else {
Cookies.set("accepted_tos", "20180523", { expires: 365 });
}
}
$j(document).ready(function() {
if (localStorage.getItem("accepted_tos") !== "20180523" && Cookies.get("accepted_tos") !== "20180523") {
$j("body").prepend("<div id=\"tos_prompt\" class=\"hidden\">\n <h2 class=\"heading\">\n <span>Archive of Our Own<\/span>\n <\/h2>\n <div class=\"agreement\">\n <p class=\"summary\">\n On Archive of Our Own (AO3), users can make profiles, create works and\n other Content, post comments, give Kudos, create Collections and \n Bookmarks, participate in Challenges, import works, and more. Any \n information you publish in a comment, profile, work, or Content that you \n post or import onto AO3 including in summaries, notes and tags, \n will be accessible by the public (unless you limit access to a work only \n to those with AO3 Accounts), and it will be available to \n AO3 personnel. Be mindful when sharing personal information, \n including your religious or political views, health, racial background, \n country of origin, sexual identity and/or personal relationships. To \n learn more, check out our <a href=\"/tos\">Terms of Service<\/a> and <a href=\"/tos#privacy\">Privacy Policy<\/a>.\n <\/p>\n\n <p class=\"confirmation\">\n <input type=\"checkbox\" id=\"tos_agree\" />\n <label for=\"tos_agree\">I have read &amp; understood the new Terms of Service and Privacy Policy<\/label>\n <\/p>\n\n <p class=\"submit\">\n <button name=\"button\" type=\"button\" disabled=\"disabled\" id=\"accept_tos\">I agree/consent to its terms<\/button>\n <\/p>\n\n <\/div>\n<\/div>\n\n<script>\n//<![CDATA[\n\n \$j(document).ready(function() {\n var container = \$j(\"#tos_prompt\");\n var outer = \$j(\"#outer\");\n var button = \$j(\"#accept_tos\");\n\n setTimeout(showTOSPrompt, 1500);\n\n function showTOSPrompt() {\n \$j.when(container.fadeIn(500)).done(function() {\n outer.addClass(\"hidden\").attr(\"aria-hidden\", \"true\");\n });\n\n \$j(\"#tos_agree\").on(\"click\", function() {\n button.attr(\"disabled\", !this.checked);\n if (this.checked) {\n button.on(\"click\", function() {\n acceptTOS();\n outer.removeClass(\"hidden\").removeAttr(\"aria-hidden\");\n \$j.when(container.fadeOut(500)).done(function() {\n container.remove();\n });\n });\n };\n }).change();\n };\n });\n\n//]]]]><![CDATA[>\n<\/script>");
}
});
//]]>
</script>
<script>
//<![CDATA[
$j(document).ready(function() {
var permitted_hosts = ["104.153.64.122","208.85.241.152","208.85.241.157","ao3.org","archiveofourown.com","archiveofourown.gay","archiveofourown.net","archiveofourown.org","download.archiveofourown.org","insecure.archiveofourown.org","secure.archiveofourown.org","www.archiveofourown.com","www.archiveofourown.net","www.archiveofourown.org","www.ao3.org","archive.transformativeworks.org"];
var current_host = window.location.hostname;
if (!permitted_hosts.includes(current_host) && Cookies.get("proxy_notice") !== "0" && window.location.protocol !== "file:") {
$j("#skiplinks").after("<div id=\"proxy-notice\">\n <div class=\"userstuff\">\n <p class=\"important\">Important message:<\/p>\n <ol>\n <li>You are using a proxy site that is not part of the Archive of Our Own.<\/li>\n <li>The entity that set up the proxy site can see what you submit, including your IP address. If you log in through the proxy site, it can see your password.<\/li>\n <\/ol>\n <p class=\"important\">重要提示:<\/p>\n <ol>\n <li>您使用的是第三方开发的反向代理网站此网站并非Archive of Our Own - AO3AO3作品库原站。<\/li>\n <li>代理网站的开发者能够获取您上传至该站点的全部内容包括您的ip地址。如您通过代理登录AO3对方将获得您的密码。<\/li>\n <\/ol>\n <p class=\"submit\"><button class=\"action\" type=\"button\" id=\"proxy-notice-dismiss\">Dismiss Notice<\/button><\/p>\n <\/div>\n<\/div>\n\n<script>\n//<![CDATA[\n\n \$j(document).ready(function() {\n \$j(\"#proxy-notice-dismiss\").on(\"click\", function() {\n Cookies.set(\"proxy_notice\", \"0\");\n \$j(\"#proxy-notice\").slideUp();\n });\n });\n\n//]]]]><![CDATA[>\n<\/script>");
}
});
//]]>
</script>
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'8d466eb7da9a5efd',t:'MTcyOTIzMjUzMS4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
</html>

1066
test/fixtures/ao3/user.html vendored Normal file

File diff suppressed because it is too large Load diff

View file

View file

View file

View file

@ -6,8 +6,4 @@ class TestFicTracker < Minitest::Test
def test_that_it_has_a_version_number
refute_nil ::FicTracker::VERSION
end
def test_it_does_something_useful
assert false
end
end

View file

@ -4,3 +4,12 @@ $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
require "fic_tracker"
require "minitest/autorun"
require "webmock/minitest"
module FicTracker
def self.test!
FicTracker.database = FicTracker::Util::Database.connect :memory, migrate: true
FicTracker.cache = FicTracker::Util::Cache.create type: :none
FicTracker.logger.level = :error
end
end