summaryrefslogtreecommitdiff
path: root/test/test-pages
diff options
context:
space:
mode:
authorAndres Rey <[email protected]>2017-11-08 20:32:33 +0000
committerAndres Rey <[email protected]>2017-11-08 20:32:33 +0000
commita114e64fd703eaeec1314650b65f6590aafafdb8 (patch)
tree281409d1f6c4ba95058b512d5f9f01c8c2d5c454 /test/test-pages
parentff6da019319e323c520dcab958dcd2c7c96fc2fd (diff)
Fix test cases for the new code
Diffstat (limited to 'test/test-pages')
-rw-r--r--test/test-pages/002/expected-metadata.json2
-rw-r--r--test/test-pages/002/expected.html244
-rw-r--r--test/test-pages/ars-1/expected.html2
-rw-r--r--test/test-pages/base-url/expected.html2
-rw-r--r--test/test-pages/bbc-1/expected-metadata.json3
-rw-r--r--test/test-pages/blogger/expected.html184
-rw-r--r--test/test-pages/breitbart/config.json3
-rw-r--r--test/test-pages/breitbart/expected.html67
-rw-r--r--test/test-pages/buzzfeed-1/expected.html80
-rw-r--r--test/test-pages/clean-links/expected.html1644
-rw-r--r--test/test-pages/cnet/expected.html24
-rw-r--r--test/test-pages/cnn/expected.html118
-rw-r--r--test/test-pages/daringfireball-1/expected.html27
-rw-r--r--test/test-pages/gmw/expected.html10
-rw-r--r--test/test-pages/herald-sun-1/expected-metadata.json2
-rw-r--r--test/test-pages/iab-1/expected-metadata.json2
-rw-r--r--test/test-pages/iab-1/expected.html54
-rw-r--r--test/test-pages/ietf-1/expected.html2
-rw-r--r--test/test-pages/keep-images/expected-metadata.json2
-rw-r--r--test/test-pages/keep-images/expected.html542
-rw-r--r--test/test-pages/liberation-1/expected.html29
-rw-r--r--test/test-pages/links-in-tables/expected.html341
-rw-r--r--test/test-pages/lwn-1/config.json3
-rw-r--r--test/test-pages/lwn-1/expected.html945
-rw-r--r--test/test-pages/medium-1/expected-metadata.json2
-rw-r--r--test/test-pages/medium-1/expected.html21
-rw-r--r--test/test-pages/medium-2/expected-metadata.json2
-rw-r--r--test/test-pages/medium-2/expected.html2
-rw-r--r--test/test-pages/mozilla-1/expected-metadata.json2
-rw-r--r--test/test-pages/mozilla-1/expected.html7
-rw-r--r--test/test-pages/msn/expected.html4
-rw-r--r--test/test-pages/needs-entity-normalization/expected.html2
-rw-r--r--test/test-pages/remove-extra-brs/expected.html29
-rw-r--r--test/test-pages/remove-extra-paragraphs/expected.html34
-rw-r--r--test/test-pages/reordering-paragraphs/expected.html31
-rw-r--r--test/test-pages/replace-brs/expected-metadata.json2
-rw-r--r--test/test-pages/replace-brs/expected.html25
-rw-r--r--test/test-pages/replace-font-tags/expected.html2
-rw-r--r--test/test-pages/rtl-1/expected.html8
-rw-r--r--test/test-pages/rtl-2/expected.html8
-rw-r--r--test/test-pages/rtl-3/expected.html8
-rw-r--r--test/test-pages/rtl-4/expected.html8
-rw-r--r--test/test-pages/salon-1/expected-metadata.json2
-rw-r--r--test/test-pages/salon-1/expected.html2
-rw-r--r--test/test-pages/social-buttons/expected.html42
-rw-r--r--test/test-pages/style-tags-removal/expected.html2
-rw-r--r--test/test-pages/svg-parsing/expected.html2
-rw-r--r--test/test-pages/tmz-1/expected.html2
-rw-r--r--test/test-pages/webmd-1/expected-metadata.json6
-rw-r--r--test/test-pages/webmd-1/expected.html4
-rw-r--r--test/test-pages/webmd-1/source.html312
-rw-r--r--test/test-pages/webmd-2/expected.html4
-rw-r--r--test/test-pages/yahoo-1/expected.html96
-rw-r--r--test/test-pages/yahoo-2/expected.html65
-rw-r--r--test/test-pages/yahoo-3/expected.html83
-rw-r--r--test/test-pages/youth/expected.html70
56 files changed, 2074 insertions, 3147 deletions
diff --git a/test/test-pages/002/expected-metadata.json b/test/test-pages/002/expected-metadata.json
index d7b95e8..9b020e4 100644
--- a/test/test-pages/002/expected-metadata.json
+++ b/test/test-pages/002/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "title": "This API is so Fetching!",
+ "title": "This API is so Fetching! ✩ Mozilla Hacks – the Web developer blog",
"byline": "Nikhil Marathe",
"excerpt": "For more than a decade the Web has used XMLHttpRequest (XHR) to achieve asynchronous requests in JavaScript. While very useful, XHR is not a very ...",
"readerable": true
diff --git a/test/test-pages/002/expected.html b/test/test-pages/002/expected.html
index 964d7d6..d836b60 100644
--- a/test/test-pages/002/expected.html
+++ b/test/test-pages/002/expected.html
@@ -1,4 +1,4 @@
-<article class="post" role="article"><p>For more than a decade the Web has used XMLHttpRequest (XHR) to achieve
+<div><article class="post" role="article"><p>For more than a decade the Web has used XMLHttpRequest (XHR) to achieve
asynchronous requests in JavaScript. While very useful, XHR is not a very
nice API. It suffers from lack of separation of concerns. The input, output
and state are all managed by interacting with one object, and state is
@@ -30,37 +30,37 @@
In its simplest form it takes a URL and returns a promise that resolves
to the response. The response is captured as a <code>Response</code> object.</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;">fetch<span style="color: #009900;">(</span><span style="color: #3366CC;">"/data.json"</span><span style="color: #009900;">)</span>.<span style="color: #660066;">then</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>res<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- <span style="color: #006600; font-style: italic;">// res instanceof Response == true.</span>
- <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">(</span>res.<span style="color: #660066;">ok</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- res.<span style="color: #660066;">json</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span>.<span style="color: #660066;">then</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>data<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>data.<span style="color: #660066;">entries</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
- <span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
- <span style="color: #009900;">}</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">{</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Looks like the response wasn't perfect, got status"</span><span style="color: #339933;">,</span> res.<span style="color: #660066;">status</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
- <span style="color: #009900;">}</span>
-<span style="color: #009900;">}</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Fetch failed!"</span><span style="color: #339933;">,</span> e<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript">fetch<span>(</span><span>"/data.json"</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>res<span>)</span> <span>{</span>
+ <span>// res instanceof Response == true.</span>
+ <span>if</span> <span>(</span>res.<span>ok</span><span>)</span> <span>{</span>
+ res.<span>json</span><span>(</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>data<span>)</span> <span>{</span>
+ console.<span>log</span><span>(</span>data.<span>entries</span><span>)</span><span>;</span>
+ <span>}</span><span>)</span><span>;</span>
+ <span>}</span> <span>else</span> <span>{</span>
+ console.<span>log</span><span>(</span><span>"Looks like the response wasn't perfect, got status"</span><span>,</span> res.<span>status</span><span>)</span><span>;</span>
+ <span>}</span>
+<span>}</span><span>,</span> <span>function</span><span>(</span>e<span>)</span> <span>{</span>
+ console.<span>log</span><span>(</span><span>"Fetch failed!"</span><span>,</span> e<span>)</span><span>;</span>
+<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>Submitting some parameters, it would look like this:</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;">fetch<span style="color: #009900;">(</span><span style="color: #3366CC;">"http://www.example.org/submit.php"</span><span style="color: #339933;">,</span> <span style="color: #009900;">{</span>
- method<span style="color: #339933;">:</span> <span style="color: #3366CC;">"POST"</span><span style="color: #339933;">,</span>
- headers<span style="color: #339933;">:</span> <span style="color: #009900;">{</span>
- <span style="color: #3366CC;">"Content-Type"</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">"application/x-www-form-urlencoded"</span>
- <span style="color: #009900;">}</span><span style="color: #339933;">,</span>
- body<span style="color: #339933;">:</span> <span style="color: #3366CC;">"firstName=Nikhil&amp;favColor=blue&amp;password=easytoguess"</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span>.<span style="color: #660066;">then</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>res<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">(</span>res.<span style="color: #660066;">ok</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- alert<span style="color: #009900;">(</span><span style="color: #3366CC;">"Perfect! Your settings are saved."</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
- <span style="color: #009900;">}</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">(</span>res.<span style="color: #660066;">status</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">401</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- alert<span style="color: #009900;">(</span><span style="color: #3366CC;">"Oops! You are not authorized."</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
- <span style="color: #009900;">}</span>
-<span style="color: #009900;">}</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- alert<span style="color: #009900;">(</span><span style="color: #3366CC;">"Error submitting form!"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript">fetch<span>(</span><span>"http://www.example.org/submit.php"</span><span>,</span> <span>{</span>
+ method<span>:</span> <span>"POST"</span><span>,</span>
+ headers<span>:</span> <span>{</span>
+ <span>"Content-Type"</span><span>:</span> <span>"application/x-www-form-urlencoded"</span>
+ <span>}</span><span>,</span>
+ body<span>:</span> <span>"firstName=Nikhil&amp;favColor=blue&amp;password=easytoguess"</span>
+<span>}</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>res<span>)</span> <span>{</span>
+ <span>if</span> <span>(</span>res.<span>ok</span><span>)</span> <span>{</span>
+ alert<span>(</span><span>"Perfect! Your settings are saved."</span><span>)</span><span>;</span>
+ <span>}</span> <span>else</span> <span>if</span> <span>(</span>res.<span>status</span> <span>==</span> <span>401</span><span>)</span> <span>{</span>
+ alert<span>(</span><span>"Oops! You are not authorized."</span><span>)</span><span>;</span>
+ <span>}</span>
+<span>}</span><span>,</span> <span>function</span><span>(</span>e<span>)</span> <span>{</span>
+ alert<span>(</span><span>"Error submitting form!"</span><span>)</span><span>;</span>
+<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>The <code>fetch()</code> function’s arguments are the same as those passed
@@ -79,36 +79,36 @@
<p>The <a href="https://fetch.spec.whatwg.org/#headers-class">Headers interface</a> is
a simple multi-map of names to values:</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> content <span style="color: #339933;">=</span> <span style="color: #3366CC;">"Hello World"</span><span style="color: #339933;">;</span>
-<span style="color: #000066; font-weight: bold;">var</span> reqHeaders <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Headers<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-reqHeaders.<span style="color: #660066;">append</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Content-Type"</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">"text/plain"</span>
-reqHeaders.<span style="color: #660066;">append</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Content-Length"</span><span style="color: #339933;">,</span> content.<span style="color: #660066;">length</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-reqHeaders.<span style="color: #660066;">append</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"X-Custom-Header"</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">"ProcessThisImmediately"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> content <span>=</span> <span>"Hello World"</span><span>;</span>
+<span>var</span> reqHeaders <span>=</span> <span>new</span> Headers<span>(</span><span>)</span><span>;</span>
+reqHeaders.<span>append</span><span>(</span><span>"Content-Type"</span><span>,</span> <span>"text/plain"</span>
+reqHeaders.<span>append</span><span>(</span><span>"Content-Length"</span><span>,</span> content.<span>length</span>.<span>toString</span><span>(</span><span>)</span><span>)</span><span>;</span>
+reqHeaders.<span>append</span><span>(</span><span>"X-Custom-Header"</span><span>,</span> <span>"ProcessThisImmediately"</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>The same can be achieved by passing an array of arrays or a JS object
literal
<br></br>to the constructor:</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;">reqHeaders <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Headers<span style="color: #009900;">(</span><span style="color: #009900;">{</span>
- <span style="color: #3366CC;">"Content-Type"</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">"text/plain"</span><span style="color: #339933;">,</span>
- <span style="color: #3366CC;">"Content-Length"</span><span style="color: #339933;">:</span> content.<span style="color: #660066;">length</span>.<span style="color: #660066;">toString</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">,</span>
- <span style="color: #3366CC;">"X-Custom-Header"</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">"ProcessThisImmediately"</span><span style="color: #339933;">,</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript">reqHeaders <span>=</span> <span>new</span> Headers<span>(</span><span>{</span>
+ <span>"Content-Type"</span><span>:</span> <span>"text/plain"</span><span>,</span>
+ <span>"Content-Length"</span><span>:</span> content.<span>length</span>.<span>toString</span><span>(</span><span>)</span><span>,</span>
+ <span>"X-Custom-Header"</span><span>:</span> <span>"ProcessThisImmediately"</span><span>,</span>
+<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>The contents can be queried and retrieved:</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;">console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>reqHeaders.<span style="color: #660066;">has</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Content-Type"</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span>
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>reqHeaders.<span style="color: #660066;">has</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Set-Cookie"</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// false</span>
-reqHeaders.<span style="color: #000066; font-weight: bold;">set</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Content-Type"</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">"text/html"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-reqHeaders.<span style="color: #660066;">append</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"X-Custom-Header"</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">"AnotherValue"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
+ <table><tbody><tr><td class="code"><pre class="javascript">console.<span>log</span><span>(</span>reqHeaders.<span>has</span><span>(</span><span>"Content-Type"</span><span>)</span><span>)</span><span>;</span> <span>// true</span>
+console.<span>log</span><span>(</span>reqHeaders.<span>has</span><span>(</span><span>"Set-Cookie"</span><span>)</span><span>)</span><span>;</span> <span>// false</span>
+reqHeaders.<span>set</span><span>(</span><span>"Content-Type"</span><span>,</span> <span>"text/html"</span><span>)</span><span>;</span>
+reqHeaders.<span>append</span><span>(</span><span>"X-Custom-Header"</span><span>,</span> <span>"AnotherValue"</span><span>)</span><span>;</span>
 
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>reqHeaders.<span style="color: #000066; font-weight: bold;">get</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Content-Length"</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// 11</span>
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>reqHeaders.<span style="color: #660066;">getAll</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"X-Custom-Header"</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// ["ProcessThisImmediately", "AnotherValue"]</span>
+console.<span>log</span><span>(</span>reqHeaders.<span>get</span><span>(</span><span>"Content-Length"</span><span>)</span><span>)</span><span>;</span> <span>// 11</span>
+console.<span>log</span><span>(</span>reqHeaders.<span>getAll</span><span>(</span><span>"X-Custom-Header"</span><span>)</span><span>)</span><span>;</span> <span>// ["ProcessThisImmediately", "AnotherValue"]</span>
 
-reqHeaders.<span style="color: #000066; font-weight: bold;">delete</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"X-Custom-Header"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>reqHeaders.<span style="color: #660066;">getAll</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"X-Custom-Header"</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// []</span></pre>
+reqHeaders.<span>delete</span><span>(</span><span>"X-Custom-Header"</span><span>)</span><span>;</span>
+console.<span>log</span><span>(</span>reqHeaders.<span>getAll</span><span>(</span><span>"X-Custom-Header"</span><span>)</span><span>)</span><span>;</span> <span>// []</span></pre>
</td>
</tr></tbody></table></div>
<p>Some of these operations are only useful in ServiceWorkers, but they provide
@@ -136,12 +136,12 @@ console.<span style="color: #660066;">log</span><span style="color: #009900;">(<
<a href="https://fetch.spec.whatwg.org/#concept-header-name">valid HTTP Header name</a>. The mutation operations will throw TypeError
if there is an immutable guard. Otherwise they fail silently. For example:</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> res <span style="color: #339933;">=</span> Response.<span style="color: #660066;">error</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">{</span>
- res.<span style="color: #660066;">headers</span>.<span style="color: #000066; font-weight: bold;">set</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Origin"</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">"http://mybank.com"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span> <span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">(</span>e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Cannot pretend to be a bank!"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> res <span>=</span> Response.<span>error</span><span>(</span><span>)</span><span>;</span>
+<span>try</span> <span>{</span>
+ res.<span>headers</span>.<span>set</span><span>(</span><span>"Origin"</span><span>,</span> <span>"http://mybank.com"</span><span>)</span><span>;</span>
+<span>}</span> <span>catch</span><span>(</span>e<span>)</span> <span>{</span>
+ console.<span>log</span><span>(</span><span>"Cannot pretend to be a bank!"</span><span>)</span><span>;</span>
+<span>}</span></pre>
</td>
</tr></tbody></table></div>
@@ -153,9 +153,9 @@ console.<span style="color: #660066;">log</span><span style="color: #009900;">(<
<p>The simplest Request is of course, just a URL, as you may do to GET a
resource.</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> req <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Request<span style="color: #009900;">(</span><span style="color: #3366CC;">"/index.html"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>req.<span style="color: #660066;">method</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// "GET"</span>
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>req.<span style="color: #660066;">url</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// "http://example.com/index.html"</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> req <span>=</span> <span>new</span> Request<span>(</span><span>"/index.html"</span><span>)</span><span>;</span>
+console.<span>log</span><span>(</span>req.<span>method</span><span>)</span><span>;</span> <span>// "GET"</span>
+console.<span>log</span><span>(</span>req.<span>url</span><span>)</span><span>;</span> <span>// "http://example.com/index.html"</span></pre>
</td>
</tr></tbody></table></div>
<p>You may also pass a Request to the <code>Request()</code> constructor to
@@ -164,9 +164,9 @@ console.<span style="color: #660066;">log</span><span style="color: #009900;">(<
is covered in
<br></br>the “Reading bodies” section.).</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> copy <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Request<span style="color: #009900;">(</span>req<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>copy.<span style="color: #660066;">method</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// "GET"</span>
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>copy.<span style="color: #660066;">url</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// "http://example.com/index.html"</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> copy <span>=</span> <span>new</span> Request<span>(</span>req<span>)</span><span>;</span>
+console.<span>log</span><span>(</span>copy.<span>method</span><span>)</span><span>;</span> <span>// "GET"</span>
+console.<span>log</span><span>(</span>copy.<span>url</span><span>)</span><span>;</span> <span>// "http://example.com/index.html"</span></pre>
</td>
</tr></tbody></table></div>
<p>Again, this form is probably only useful in ServiceWorkers.</p>
@@ -174,13 +174,13 @@ console.<span style="color: #660066;">log</span><span style="color: #009900;">(<
initial
<br></br>values as a second argument to the constructor. This argument is a dictionary.</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> uploadReq <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Request<span style="color: #009900;">(</span><span style="color: #3366CC;">"/uploadImage"</span><span style="color: #339933;">,</span> <span style="color: #009900;">{</span>
- method<span style="color: #339933;">:</span> <span style="color: #3366CC;">"POST"</span><span style="color: #339933;">,</span>
- headers<span style="color: #339933;">:</span> <span style="color: #009900;">{</span>
- <span style="color: #3366CC;">"Content-Type"</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">"image/png"</span><span style="color: #339933;">,</span>
- <span style="color: #009900;">}</span><span style="color: #339933;">,</span>
- body<span style="color: #339933;">:</span> <span style="color: #3366CC;">"image data"</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> uploadReq <span>=</span> <span>new</span> Request<span>(</span><span>"/uploadImage"</span><span>,</span> <span>{</span>
+ method<span>:</span> <span>"POST"</span><span>,</span>
+ headers<span>:</span> <span>{</span>
+ <span>"Content-Type"</span><span>:</span> <span>"image/png"</span><span>,</span>
+ <span>}</span><span>,</span>
+ body<span>:</span> <span>"image data"</span>
+<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>The Request’s mode is used to determine if cross-origin requests lead
@@ -192,12 +192,12 @@ console.<span style="color: #660066;">log</span><span style="color: #009900;">(<
this to ensure that
<br></br>a request is always being made to your origin.</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> arbitraryUrl <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"url-input"</span><span style="color: #009900;">)</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
-fetch<span style="color: #009900;">(</span>arbitraryUrl<span style="color: #339933;">,</span> <span style="color: #009900;">{</span> mode<span style="color: #339933;">:</span> <span style="color: #3366CC;">"same-origin"</span> <span style="color: #009900;">}</span><span style="color: #009900;">)</span>.<span style="color: #660066;">then</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>res<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Response succeeded?"</span><span style="color: #339933;">,</span> res.<span style="color: #660066;">ok</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Please enter a same-origin URL!"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> arbitraryUrl <span>=</span> document.<span>getElementById</span><span>(</span><span>"url-input"</span><span>)</span>.<span>value</span><span>;</span>
+fetch<span>(</span>arbitraryUrl<span>,</span> <span>{</span> mode<span>:</span> <span>"same-origin"</span> <span>}</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>res<span>)</span> <span>{</span>
+ console.<span>log</span><span>(</span><span>"Response succeeded?"</span><span>,</span> res.<span>ok</span><span>)</span><span>;</span>
+<span>}</span><span>,</span> <span>function</span><span>(</span>e<span>)</span> <span>{</span>
+ console.<span>log</span><span>(</span><span>"Please enter a same-origin URL!"</span><span>)</span><span>;</span>
+<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>The <code>"no-cors"</code> mode captures what the web platform does by default
@@ -218,31 +218,31 @@ fetch<span style="color: #009900;">(</span>arbitraryUrl<span style="color: #3399
you could get a list of Flickr’s <a href="https://www.flickr.com/services/api/flickr.interestingness.getList.html">most interesting</a> photos
today like this:</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> u <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> URLSearchParams<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-u.<span style="color: #660066;">append</span><span style="color: #009900;">(</span><span style="color: #3366CC;">'method'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'flickr.interestingness.getList'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-u.<span style="color: #660066;">append</span><span style="color: #009900;">(</span><span style="color: #3366CC;">'api_key'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'&lt;insert api key here&gt;'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-u.<span style="color: #660066;">append</span><span style="color: #009900;">(</span><span style="color: #3366CC;">'format'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'json'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-u.<span style="color: #660066;">append</span><span style="color: #009900;">(</span><span style="color: #3366CC;">'nojsoncallback'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'1'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> u <span>=</span> <span>new</span> URLSearchParams<span>(</span><span>)</span><span>;</span>
+u.<span>append</span><span>(</span><span>'method'</span><span>,</span> <span>'flickr.interestingness.getList'</span><span>)</span><span>;</span>
+u.<span>append</span><span>(</span><span>'api_key'</span><span>,</span> <span>'&lt;insert api key here&gt;'</span><span>)</span><span>;</span>
+u.<span>append</span><span>(</span><span>'format'</span><span>,</span> <span>'json'</span><span>)</span><span>;</span>
+u.<span>append</span><span>(</span><span>'nojsoncallback'</span><span>,</span> <span>'1'</span><span>)</span><span>;</span>
 
-<span style="color: #000066; font-weight: bold;">var</span> apiCall <span style="color: #339933;">=</span> fetch<span style="color: #009900;">(</span><span style="color: #3366CC;">'https://api.flickr.com/services/rest?'</span> <span style="color: #339933;">+</span> u<span style="color: #009900;">)</span><span style="color: #339933;">;</span>
+<span>var</span> apiCall <span>=</span> fetch<span>(</span><span>'https://api.flickr.com/services/rest?'</span> <span>+</span> u<span>)</span><span>;</span>
 
-apiCall.<span style="color: #660066;">then</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>response<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- <span style="color: #000066; font-weight: bold;">return</span> response.<span style="color: #660066;">json</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span>.<span style="color: #660066;">then</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>json<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- <span style="color: #006600; font-style: italic;">// photo is a list of photos.</span>
- <span style="color: #000066; font-weight: bold;">return</span> json.<span style="color: #660066;">photos</span>.<span style="color: #660066;">photo</span><span style="color: #339933;">;</span>
- <span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span>.<span style="color: #660066;">then</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>photos<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- photos.<span style="color: #660066;">forEach</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>photo<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>photo.<span style="color: #660066;">title</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
- <span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+apiCall.<span>then</span><span>(</span><span>function</span><span>(</span>response<span>)</span> <span>{</span>
+ <span>return</span> response.<span>json</span><span>(</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>json<span>)</span> <span>{</span>
+ <span>// photo is a list of photos.</span>
+ <span>return</span> json.<span>photos</span>.<span>photo</span><span>;</span>
+ <span>}</span><span>)</span><span>;</span>
+<span>}</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>photos<span>)</span> <span>{</span>
+ photos.<span>forEach</span><span>(</span><span>function</span><span>(</span>photo<span>)</span> <span>{</span>
+ console.<span>log</span><span>(</span>photo.<span>title</span><span>)</span><span>;</span>
+ <span>}</span><span>)</span><span>;</span>
+<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>You may not read out the “Date” header since Flickr does not allow it
via
<br></br><code>Access-Control-Expose-Headers</code>.</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;">response.<span style="color: #660066;">headers</span>.<span style="color: #000066; font-weight: bold;">get</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Date"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// null</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript">response.<span>headers</span>.<span>get</span><span>(</span><span>"Date"</span><span>)</span><span>;</span> <span>// null</span></pre>
</td>
</tr></tbody></table></div>
<p>The <code>credentials</code> enumeration determines if cookies for the other
@@ -297,11 +297,11 @@ apiCall.<span style="color: #660066;">then</span><span style="color: #009900;">(
<br></br>idiomatic way to return a Response to an intercepted request in ServiceWorkers
is:</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;">addEventListener<span style="color: #009900;">(</span><span style="color: #3366CC;">'fetch'</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>event<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- event.<span style="color: #660066;">respondWith</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">new</span> Response<span style="color: #009900;">(</span><span style="color: #3366CC;">"Response body"</span><span style="color: #339933;">,</span> <span style="color: #009900;">{</span>
- headers<span style="color: #339933;">:</span> <span style="color: #009900;">{</span> <span style="color: #3366CC;">"Content-Type"</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">"text/plain"</span> <span style="color: #009900;">}</span>
- <span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript">addEventListener<span>(</span><span>'fetch'</span><span>,</span> <span>function</span><span>(</span>event<span>)</span> <span>{</span>
+ event.<span>respondWith</span><span>(</span><span>new</span> Response<span>(</span><span>"Response body"</span><span>,</span> <span>{</span>
+ headers<span>:</span> <span>{</span> <span>"Content-Type"</span> <span>:</span> <span>"text/plain"</span> <span>}</span>
+ <span>}</span><span>)</span><span>;</span>
+<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>As you can see, Response has a two argument constructor, where both arguments
@@ -348,17 +348,17 @@ apiCall.<span style="color: #660066;">then</span><span style="color: #009900;">(
non-text data!</p>
<p>Request bodies can be set by passing <code>body</code> parameters:</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> form <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> FormData<span style="color: #009900;">(</span>document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">(</span><span style="color: #3366CC;">'login-form'</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-fetch<span style="color: #009900;">(</span><span style="color: #3366CC;">"/login"</span><span style="color: #339933;">,</span> <span style="color: #009900;">{</span>
- method<span style="color: #339933;">:</span> <span style="color: #3366CC;">"POST"</span><span style="color: #339933;">,</span>
- body<span style="color: #339933;">:</span> form
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> form <span>=</span> <span>new</span> FormData<span>(</span>document.<span>getElementById</span><span>(</span><span>'login-form'</span><span>)</span><span>)</span><span>;</span>
+fetch<span>(</span><span>"/login"</span><span>,</span> <span>{</span>
+ method<span>:</span> <span>"POST"</span><span>,</span>
+ body<span>:</span> form
+<span>}</span><span>)</span></pre>
</td>
</tr></tbody></table></div>
<p>Responses take the first argument as the body.</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> res <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Response<span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">new</span> File<span style="color: #009900;">(</span><span style="color: #009900;">[</span><span style="color: #3366CC;">"chunk"</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">"chunk"</span><span style="color: #009900;">]</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">"archive.zip"</span><span style="color: #339933;">,</span>
- <span style="color: #009900;">{</span> type<span style="color: #339933;">:</span> <span style="color: #3366CC;">"application/zip"</span> <span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> res <span>=</span> <span>new</span> Response<span>(</span><span>new</span> File<span>(</span><span>[</span><span>"chunk"</span><span>,</span> <span>"chunk"</span><span>]</span><span>,</span> <span>"archive.zip"</span><span>,</span>
+ <span>{</span> type<span>:</span> <span>"application/zip"</span> <span>}</span><span>)</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>Both Request and Response (and by extension the <code>fetch()</code> function),
@@ -372,16 +372,16 @@ fetch<span style="color: #009900;">(</span><span style="color: #3366CC;">"/login
read once! Both interfaces have a boolean attribute <code>bodyUsed</code> to
determine if it is safe to read or not.</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">var</span> res <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Response<span style="color: #009900;">(</span><span style="color: #3366CC;">"one time use"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>res.<span style="color: #660066;">bodyUsed</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// false</span>
-res.<span style="color: #660066;">text</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span>.<span style="color: #660066;">then</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>v<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>res.<span style="color: #660066;">bodyUsed</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>res.<span style="color: #660066;">bodyUsed</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span>
+ <table><tbody><tr><td class="code"><pre class="javascript"><span>var</span> res <span>=</span> <span>new</span> Response<span>(</span><span>"one time use"</span><span>)</span><span>;</span>
+console.<span>log</span><span>(</span>res.<span>bodyUsed</span><span>)</span><span>;</span> <span>// false</span>
+res.<span>text</span><span>(</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>v<span>)</span> <span>{</span>
+ console.<span>log</span><span>(</span>res.<span>bodyUsed</span><span>)</span><span>;</span> <span>// true</span>
+<span>}</span><span>)</span><span>;</span>
+console.<span>log</span><span>(</span>res.<span>bodyUsed</span><span>)</span><span>;</span> <span>// true</span>
 
-res.<span style="color: #660066;">text</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span>.<span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span><span style="color: #3366CC;">"Tried to read already consumed Response"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+res.<span>text</span><span>(</span><span>)</span>.<span>catch</span><span>(</span><span>function</span><span>(</span>e<span>)</span> <span>{</span>
+ console.<span>log</span><span>(</span><span>"Tried to read already consumed Response"</span><span>)</span><span>;</span>
+<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
<p>This decision allows easing the transition to an eventual <a href="https://streams.spec.whatwg.org/">stream-based</a> Fetch
@@ -398,20 +398,20 @@ res.<span style="color: #660066;">text</span><span style="color: #009900;">(</sp
be called before the body of the corresponding object has been used. That
is, <code>clone()</code> first, read later.</p>
<div class="wp_syntax">
- <table><tbody><tr><td class="code"><pre class="javascript" style="font-family:monospace;">addEventListener<span style="color: #009900;">(</span><span style="color: #3366CC;">'fetch'</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>evt<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- <span style="color: #000066; font-weight: bold;">var</span> sheep <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">new</span> Response<span style="color: #009900;">(</span><span style="color: #3366CC;">"Dolly"</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>sheep.<span style="color: #660066;">bodyUsed</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// false</span>
- <span style="color: #000066; font-weight: bold;">var</span> clone <span style="color: #339933;">=</span> sheep.<span style="color: #660066;">clone</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>clone.<span style="color: #660066;">bodyUsed</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// false</span>
+ <table><tbody><tr><td class="code"><pre class="javascript">addEventListener<span>(</span><span>'fetch'</span><span>,</span> <span>function</span><span>(</span>evt<span>)</span> <span>{</span>
+ <span>var</span> sheep <span>=</span> <span>new</span> Response<span>(</span><span>"Dolly"</span><span>)</span><span>;</span>
+ console.<span>log</span><span>(</span>sheep.<span>bodyUsed</span><span>)</span><span>;</span> <span>// false</span>
+ <span>var</span> clone <span>=</span> sheep.<span>clone</span><span>(</span><span>)</span><span>;</span>
+ console.<span>log</span><span>(</span>clone.<span>bodyUsed</span><span>)</span><span>;</span> <span>// false</span>
 
- clone.<span style="color: #660066;">text</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>sheep.<span style="color: #660066;">bodyUsed</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// false</span>
- console.<span style="color: #660066;">log</span><span style="color: #009900;">(</span>clone.<span style="color: #660066;">bodyUsed</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// true</span>
+ clone.<span>text</span><span>(</span><span>)</span><span>;</span>
+ console.<span>log</span><span>(</span>sheep.<span>bodyUsed</span><span>)</span><span>;</span> <span>// false</span>
+ console.<span>log</span><span>(</span>clone.<span>bodyUsed</span><span>)</span><span>;</span> <span>// true</span>
 
- evt.<span style="color: #660066;">respondWith</span><span style="color: #009900;">(</span>cache.<span style="color: #660066;">add</span><span style="color: #009900;">(</span>sheep.<span style="color: #660066;">clone</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span>.<span style="color: #660066;">then</span><span style="color: #009900;">(</span><span style="color: #000066; font-weight: bold;">function</span><span style="color: #009900;">(</span>e<span style="color: #009900;">)</span> <span style="color: #009900;">{</span>
- <span style="color: #000066; font-weight: bold;">return</span> sheep<span style="color: #339933;">;</span>
- <span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>
-<span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre>
+ evt.<span>respondWith</span><span>(</span>cache.<span>add</span><span>(</span>sheep.<span>clone</span><span>(</span><span>)</span><span>)</span>.<span>then</span><span>(</span><span>function</span><span>(</span>e<span>)</span> <span>{</span>
+ <span>return</span> sheep<span>;</span>
+ <span>}</span><span>)</span><span>;</span>
+<span>}</span><span>)</span><span>;</span></pre>
</td>
</tr></tbody></table></div>
@@ -429,4 +429,4 @@ res.<span style="color: #660066;">text</span><span style="color: #009900;">(</sp
<p><em>The author would like to thank Andrea Marchesini, Anne van Kesteren and Ben<br></br>
Kelly for helping with the specification and implementation.</em>
</p>
- </article> \ No newline at end of file
+ </article></div> \ No newline at end of file
diff --git a/test/test-pages/ars-1/expected.html b/test/test-pages/ars-1/expected.html
index 2ed436e..a00aa37 100644
--- a/test/test-pages/ars-1/expected.html
+++ b/test/test-pages/ars-1/expected.html
@@ -1,5 +1,5 @@
<div class="article-content clearfix" itemprop="articleBody">
- <figure class="intro-image image center full-width" style="width:640px"><img height="331" src="http://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x426.jpg" width="640"></img><figcaption class="caption">
+ <figure class="intro-image image center full-width"><img height="331" src="http://cdn.arstechnica.net/wp-content/uploads/2015/04/server-crash-640x426.jpg" width="640"></img><figcaption class="caption">
</figcaption></figure><p>A flaw in the wildly popular online game <em>Minecraft</em> makes it easy for just about anyone to crash the server hosting the game, according to a computer programmer who has released proof-of-concept code that exploits the vulnerability.</p>
<p>"I thought a lot before writing this post," Pakistan-based developer Ammar Askar wrote in a <a href="http://blog.ammaraskar.com/minecraft-vulnerability-advisory">blog post published Thursday</a>, 21 months, he said, after privately reporting the bug to <em>Minecraft</em> developer Mojang. "On the one hand I don't want to expose thousands of servers to a major vulnerability, yet on the other hand Mojang has failed to act on it."</p>
<p>The bug resides in the <a href="https://github.com/ammaraskar/pyCraft">networking internals of the <em>Minecraft </em>protocol</a>. It allows the contents of inventory slots to be exchanged, so that, among other things, items in players' hotbars are displayed automatically after logging in. <em>Minecraft</em> items can also store arbitrary metadata in a file format known as <a href="http://wiki.vg/NBT">Named Binary Tag (NBT)</a>, which allows complex data structures to be kept in hierarchical nests. Askar has released <a href="https://github.com/ammaraskar/pyCraft/tree/nbt_exploit">proof-of-concept attack code</a> he said exploits the vulnerability to crash any server hosting the game. Here's how it works.</p>
diff --git a/test/test-pages/base-url/expected.html b/test/test-pages/base-url/expected.html
index dcdd7cf..36981e1 100644
--- a/test/test-pages/base-url/expected.html
+++ b/test/test-pages/base-url/expected.html
@@ -22,7 +22,7 @@
<p><img src="http://fakehost/foo/bar/baz.png"></img></p>
<p><img src="http://test/foo/bar/baz.png"></img></p>
<p><img src="https://test/foo/bar/baz.png"></img></p>
-
+ <h2>Foo</h2>
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
diff --git a/test/test-pages/bbc-1/expected-metadata.json b/test/test-pages/bbc-1/expected-metadata.json
index 481659c..028bc58 100644
--- a/test/test-pages/bbc-1/expected-metadata.json
+++ b/test/test-pages/bbc-1/expected-metadata.json
@@ -1,7 +1,6 @@
{
- "title": "Obama admits US gun laws are his 'biggest frustration' - BBC News",
+ "title": "Obama admits US gun laws are his 'biggest frustration'",
"byline": null,
- "dir": "ltr",
"excerpt": "President Barack Obama tells the BBC his failure to pass",
"readerable": true
}
diff --git a/test/test-pages/blogger/expected.html b/test/test-pages/blogger/expected.html
index 6dfed38..7b55749 100644
--- a/test/test-pages/blogger/expected.html
+++ b/test/test-pages/blogger/expected.html
@@ -1,57 +1,127 @@
-<div class="post-body entry-content" id="post-body-932306423056216142" itemprop="description articleBody"><p>
- I've written a couple of posts in the past few months but they were all for </p><a href="http://blog.ioactive.com/search/label/Andrew%20Zonenberg">the blog at work</a><p> so I figured I'm long overdue for one on Silicon Exposed.</p><p><h2>
- So what's a GreenPak?</h2>
- </p><p> Silego Technology is a fabless semiconductor company located in the SF Bay area, which makes (among other things) a line of programmable logic devices known as GreenPak. Their </p><a href="http://www.silego.com/products/greenpak5.html">5th generation parts</a><p> were just announced, but I started this project before that happened so I'm still targeting the </p><a href="http://www.silego.com/products/greenpak4.html">4th generation</a><p>.</p><p> GreenPak devices are kind of like itty bitty <a href="http://www.cypress.com/products/32-bit-arm-cortex-m-psoc">PSoCs</a> - they have a mixed signal fabric with an ADC, DACs, comparators, voltage references, plus a digital LUT/FF fabric and some typical digital MCU peripherals like counters and oscillators (but no CPU).<p> It's actually an interesting architecture - FPGAs (including some devices marketed as CPLDs) are a 2D array of LUTs connected via wires to adjacent cells, and true (product term) CPLDs are a star topology of AND-OR arrays connected by a crossbar. GreenPak, on the other hand, is a star topology of LUTs, flipflops, and analog/digital hard IP connected to a crossbar.<p> Without further ado, here's a block diagram showing all the cool stuff you get in the SLG46620V:<p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;">
- <a href="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s1600/block-diagram.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="512" src="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s640/block-diagram.png" width="640"></img></a>
- </td>
- </tr><tr><td class="tr-caption" style="text-align: center;">SLG46620V block diagram (from device datasheet)</td>
- </tr></tbody></table>
- They're also tiny (the SLG46620V is a 20-pin 0.4mm pitch STQFN measuring 2x3 mm, and the lower gate count SLG46140V is a mere 1.6x2 mm) and probably the cheapest programmable logic device on the market - $0.50 in low volume and less than $0.40 in larger quantities.<p> The Vdd range of GreenPak4 is huge, more like what you'd expect from an MCU than an FPGA! It can run on anything from 1.8 to 5V, although performance is only specified at 1.8, 3.3, and 5V nominal voltages. There's also a dual-rail version that trades one of the GPIO pins for a second power supply pin, allowing you to interface to logic at two different voltage levels.<p> To support low-cost/space-constrained applications, they even have the configuration memory on die. It's one-time programmable and needs external Vpp to program (presumably Silego didn't want to waste die area on charge pumps that would only be used once) but has a SRAM programming mode for prototyping.<p> The best part is that the development software (GreenPak Designer) is free of charge and provided for all major operating systems including Linux! Unfortunately, the only supported design entry method is schematic entry and there's no way to write your design in a HDL.<p> While schematics may be fine for quick tinkering on really simple designs, they quickly get unwieldy. The nightmare of a circuit shown below is just a bunch of counters hooked up to LEDs that blink at various rates.<p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;">
- <a href="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s1600/schematic-from-hell.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="334" src="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s640/schematic-from-hell.png" width="640"></img></a>
- </td>
- </tr><tr><td class="tr-caption" style="text-align: center;">Schematic from hell!</td>
- </tr></tbody></table>
- As if this wasn't enough of a problem, the largest GreenPak4 device (the SLG46620V) is split into two halves with limited routing between them, and the GUI doesn't help the user manage this complexity at all - you have to draw your schematic in two halves and add "cross connections" between them.<p> The icing on the cake is that schematics are a pain to diff and collaborate on. Although GreenPak schematics are XML based, which is a touch better than binary, who wants to read a giant XML diff and try to figure out what's going on in the circuit?<p> This isn't going to be a post on the quirks of Silego's software, though - that would be boring. As it turns out, there's one more exciting feature of these chips that I didn't mention earlier: the configuration bitstream is 100% documented in the device datasheet! This is unheard of in the programmable logic world. As Nick of Arachnid Labs <a href="http://www.arachnidlabs.com/blog/2015/03/30/greenpak/">says</a>, the chip is "just dying for someone to write a VHDL or Verilog compiler for it". As you can probably guess by from the title of this post, I've been busy doing exactly that.<p><h2>
- Great! How does it work?</h2>
- </p></p></p></p></p></p></p></p></p></p></p></p><p> Rather than wasting time writing a synthesizer, I decided to write a GreenPak technology library for Clifford Wolf's excellent open source synthesis tool, </p><a href="http://www.clifford.at/yosys/">Yosys</a><p>, and then make a place-and-route tool to turn that into a final netlist. The post-PAR netlist can then be loaded into GreenPak Designer in order to program the device.</p><p> The first step of the process is to run the "synth_greenpak4" Yosys flow on the Verilog source. This runs a generic RTL synthesis pass, then some coarse-grained extraction passes to infer shift register and counter cells from behavioral logic, and finally maps the remaining logic to LUT/FF cells and outputs a JSON-formatted netlist.<p> Once the design has been synthesized, my tool (named, surprisingly, gp4par) is then launched on the netlist. It begins by parsing the JSON and constructing a directed graph of cell objects in memory. A second graph, containing all of the primitives in the device and the legal connections between them, is then created based on the device specified on the command line. (As of now only the SLG46620V is supported; the SLG46621V can be added fairly easily but the SLG46140V has a slightly different microarchitecture which will require a bit more work to support.)<p> After the graphs are generated, each node in the netlist graph is assigned a numeric label identifying the type of cell and each node in the device graph is assigned a list of legal labels: for example, an I/O buffer site is legal for an input buffer, output buffer, or bidirectional buffer.<p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody><tr><td style="text-align: center;">
- <a href="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s1600/graph-labels.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="141" src="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s400/graph-labels.png" width="400"></img></a>
- </td>
- </tr><tr><td class="tr-caption" style="text-align: center;">Example labeling for a subset of the netlist and device graphs</td>
- </tr></tbody></table>
- The labeled nodes now need to be placed. The initial placement uses a simple greedy algorithm to create a valid (although not necessarily optimal or even routable) placement:</p></p></p></p><br></br><ol><li>Loop over the cells in the netlist. If any cell has a LOC constraint, which locks the cell to a specific physical site, attempt to assign the node to the specified site. If the specified node is the wrong type, doesn't exist, or is already used by another constrained node, the constraint is invalid so fail with an error.</li>
- <li>Loop over all of the unconstrained cells in the netlist and assign them to the first unused site with the right label. If none are available, the design is too big for the device so fail with an error.</li>
- </ol><p>
- Once the design is placed, the placement optimizer then loops over the design and attempts to improve it. A simulated annealing algorithm is used, where changes to the design are accepted unconditionally if they make the placement better, and with a random, gradually decreasing probability if they make it worse. The optimizer terminates when the design receives a perfect score (indicating an optimal placement) or if it stops making progress for several iterations. Each iteration does the following:</p><br></br><ol><li>Compute a score for the current design based on the number of unroutable nets, the amount of routing congestion (number of nets crossing between halves of the device), and static timing analysis (not yet implemented, always zero).</li>
- <li>Make a list of nodes that contributed to this score in some way (having some attached nets unroutable, crossing to the other half of the device, or failing timing).</li>
- <li>Remove nodes from the list that are LOC'd to a specific location since we're not allowed to move them.</li>
- <li>Remove nodes from the list that have only one legal placement in the device (for example, oscillator hard IP) since there's nowhere else for them to go.</li>
- <li>Pick a node from the remainder of the list at random. Call this our pivot.</li>
- <li>Find a list of candidate placements for the pivot: </li>
- <ol><li>Consider all routable placements in the other half of the device.</li>
- <li>If none were found, consider all routable placements anywhere in the device.</li>
- <li>If none were found, consider all placements anywhere in the device even if they're not routable.</li>
- </ol><li>Pick one of the candidates at random and move the pivot to that location. If another cell in the netlist is already there, put it in the vacant site left by the pivot.</li>
- <li>Re-compute the score for the design. If it's better, accept this change and start the next iteration.</li>
- <li>If the score is worse, accept it with a random probability which decreases as the iteration number goes up. If the change is not accepted, restore the previous placement.</li>
- </ol><p>
- After optimization, the design is checked for routability. If any edges in the netlist graph don't correspond to edges in the device graph, the user probably asked for something impossible (for example, trying to hook a flipflop's output to a comparator's reference voltage input) so fail with an error.</p><p> The design is then routed. This is quite simple due to the crossbar structure of the device. For each edge in the netlist:</p><br></br><ol><li>If dedicated (non-fabric) routing is used for this path, configure the destination's input mux appropriately and stop.</li>
- <li>If the source and destination are in the same half of the device, configure the destination's input mux appropriately and stop.</li>
- <li>A cross-connection must be used. Check if we already used one to bring the source signal to the other half of the device. If found, configure the destination to route from that cross-connection and stop.</li>
- <li>Check if we have any cross-connections left going in this direction. If they're all used, the design is unroutable due to congestion so fail with an error.</li>
- <li>Pick the next unused cross-connection and configure it to route from the source. Configure the destination to route from the cross-connection and stop.</li>
- </ol><p>
- Once routing is finished, run a series of post-PAR design rule checks. These currently include the following:</p><br></br><ul><li>If any node has no loads, generate a warning</li>
- <li>If an I/O buffer is connected to analog hard IP, fail with an error if it's not configured in analog mode.</li>
- <li>Some signals (such as comparator inputs and oscillator power-down controls) are generated by a shared mux and fed to many loads. If different loads require conflicting settings for the shared mux, fail with an error.</li>
- </ul><p>
- If DRC passes with no errors, configure all of the individual cells in the netlist based on the HDL parameters. Fail with an error if an invalid configuration was requested.</p><p> Finally, generate the bitstream from all of the per-cell configuration and write it to a file.<p><h2>
- Great, let's get started!</h2>
- If you don't already have one, you'll need to buy a <a href="http://www.silego.com/buy/index.php?main_page=product_info&amp;products_id=388">GreenPak4 development kit</a>. The kit includes samples of the SLG46620V (among other devices) and a programmer/emulation board. While you're waiting for it to arrive, install <a href="http://www.silego.com/softdoc/software.html">GreenPak Designer</a>.<p> Download and install Yosys. Although Clifford is pretty good at merging my pull requests, only <a href="https://github.com/azonenberg/yosys/">my fork on Github</a> is guaranteed to have the most up-to-date support for GreenPak devices so don't be surprised if you can't use a bleeding-edge feature with mainline Yosys.<p> Download and install gp4par. You can get it from <a href="https://github.com/azonenberg/openfpga/">the Github repository</a>.<p> Write your HDL, compile with Yosys, P&amp;R with gp4par, and import the bitstream into GreenPak Designer to program the target device. The most current gp4par manual is included in LaTeX source form in the source tree and is automatically built as part of the compile process. If you're just browsing, there's a <a href="http://thanatos.virtual.antikernel.net/unlisted/gp4-hdl.pdf">relatively recent PDF version</a> on my web server.<p> If you'd like to see the Verilog that produced the nightmare of a schematic I showed above, <a href="https://github.com/azonenberg/openfpga/blob/master/tests/greenpak4/Blinky/Blinky.v">here it is</a>.<p> Be advised that this project is still very much a work in progress and there are still a number of SLG46620V features I don't support (see the manual for exact details).<p><h2>
- I love it / it segfaulted / there's a problem in the manual!</h2>
- Hop in our IRC channel (##openfpga on Freenode) and let me know. Feedback is great, pull requests are even better,<p><h2>
- You're competing with Silego's IDE. Have they found out and sued you yet?</h2>
- Nope. They're fully aware of what I'm doing and are rolling out the red carpet for me. They love the idea of a HDL flow as an alternative to schematic entry and are pretty amazed at how fast it's coming together.<p> After I reported a few bugs in their datasheets they decided to skip the middleman and give me direct access to the engineer who writes their documentation so that I can get faster responses. The last time I found a problem (two different parts of the datasheet contradicted each other) an updated datasheet was in my inbox and on their website by the next day. I only wish Xilinx gave me that kind of treatment!<p> They've even <a href="https://twitter.com/SilegoTech/status/717018987771469824">offered me free hardware</a> to help me add support for their latest product family, although I plan to get GreenPak4 support to a more stable state before taking them up on the offer.<p><h2>
- So what's next?</h2>
- </p></p></p></p></p></p></p></p></p></p></p></p><p> Better testing, for starters. I have to verify functionality by hand with a DMM and oscilloscope, which is time consuming.</p><p> My contact at Silego says they're going to be giving me documentation on the SRAM emulation interface soon, so I'm going to make a hardware-in-loop test platform that connects to my desktop and the Silego ZIF socket, and lets me load new bitstreams via a scriptable interface. It'll have FPGA-based digital I/O as well as an ADC and DAC on every device pin, plus an adjustable voltage regulator for power, so I can feed in arbitrary mixed-signal test waveforms and write PC-based unit tests to verify correct behavior.<p> Other than that, I want to finish support for the SLG46620V in the next month or two. The SLG46621V will be an easy addition since only one pin and the relevant configuration bits have changed from the 46620 (I suspect they're the same die, just bonded out differently).<p> Once that's done I'll have to do some more extensive work to add the SLG46140V since the architecture is a bit different (a lot of the combinatorial logic is merged into multi-function blocks). Luckily, the 46140 has a lot in common architecturally with the GreenPak5 family, so once that's done GreenPak5 will probably be a lot easier to add support for.<p> My thanks go out to Clifford Wolf, whitequark, the IRC users in ##openfpga, and everyone at Silego I've worked with to help make this possible. I hope that one day this project will become mature enough that Silego will ship it as an officially supported extension to GreenPak Designer, making history by becoming the first modern programmable logic vendor to ship a fully open source synthesis and P&amp;R suite.
-
- </p></p></p></p></div> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <div class="post-body entry-content" id="post-body-932306423056216142" itemprop="description articleBody">
+ <p style="display: inline;" class="readability-styled"> I've written a couple of posts in the past few months but they were all for </p><a href="http://blog.ioactive.com/search/label/Andrew%20Zonenberg">the blog at work</a>
+ <p style="display: inline;" class="readability-styled"> so I figured I'm long overdue for one on Silicon Exposed.</p>
+ <p>
+ <h2> So what's a GreenPak?</h2>
+ </p>
+ <p style="display: inline;" class="readability-styled"> Silego Technology is a fabless semiconductor company located in the SF Bay area, which makes (among other things) a line of programmable logic devices known as GreenPak. Their </p><a href="http://www.silego.com/products/greenpak5.html">5th generation parts</a>
+ <p style="display: inline;" class="readability-styled"> were just announced, but I started this project before that happened so I'm still targeting the </p><a href="http://www.silego.com/products/greenpak4.html">4th generation</a>
+ <p style="display: inline;" class="readability-styled">.</p>
+ <p> GreenPak devices are kind of like itty bitty <a href="http://www.cypress.com/products/32-bit-arm-cortex-m-psoc">PSoCs</a> - they have a mixed signal fabric with an ADC, DACs, comparators, voltage references, plus a digital LUT/FF fabric and some typical digital MCU peripherals like counters and oscillators (but no CPU).</p>
+ <p> It's actually an interesting architecture - FPGAs (including some devices marketed as CPLDs) are a 2D array of LUTs connected via wires to adjacent cells, and true (product term) CPLDs are a star topology of AND-OR arrays connected by a crossbar. GreenPak, on the other hand, is a star topology of LUTs, flipflops, and analog/digital hard IP connected to a crossbar.</p>
+ <p> Without further ado, here's a block diagram showing all the cool stuff you get in the SLG46620V:</p>
+ <p>
+ <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container">
+ <tbody>
+ <tr>
+ <td>
+ <a href="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s1600/block-diagram.png" imageanchor="1"><img border="0" height="512" src="https://1.bp.blogspot.com/-YIPC5jkXkDE/Vy7YPSqFKWI/AAAAAAAAAxI/a7D6Ji2GxoUvcrwUkI4RLZcr2LFQEJCTACLcB/s640/block-diagram.png" width="640" /></a>
+ </td>
+ </tr>
+ <tr>
+ <td class="tr-caption">SLG46620V block diagram (from device datasheet)</td>
+ </tr>
+ </tbody>
+ </table> They're also tiny (the SLG46620V is a 20-pin 0.4mm pitch STQFN measuring 2x3 mm, and the lower gate count SLG46140V is a mere 1.6x2 mm) and probably the cheapest programmable logic device on the market - $0.50 in low volume and less than $0.40 in larger quantities.</p>
+ <p> The Vdd range of GreenPak4 is huge, more like what you'd expect from an MCU than an FPGA! It can run on anything from 1.8 to 5V, although performance is only specified at 1.8, 3.3, and 5V nominal voltages. There's also a dual-rail version that trades one of the GPIO pins for a second power supply pin, allowing you to interface to logic at two different voltage levels.</p>
+ <p> To support low-cost/space-constrained applications, they even have the configuration memory on die. It's one-time programmable and needs external Vpp to program (presumably Silego didn't want to waste die area on charge pumps that would only be used once) but has a SRAM programming mode for prototyping.</p>
+ <p> The best part is that the development software (GreenPak Designer) is free of charge and provided for all major operating systems including Linux! Unfortunately, the only supported design entry method is schematic entry and there's no way to write your design in a HDL.</p>
+ <p> While schematics may be fine for quick tinkering on really simple designs, they quickly get unwieldy. The nightmare of a circuit shown below is just a bunch of counters hooked up to LEDs that blink at various rates.</p>
+ <p>
+ <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container">
+ <tbody>
+ <tr>
+ <td>
+ <a href="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s1600/schematic-from-hell.png" imageanchor="1"><img border="0" height="334" src="https://1.bp.blogspot.com/-k3naUT3uXao/Vy7WFac246I/AAAAAAAAAw8/mePy_ostO8QJra5ZJrbP2WGhTlJ0B_r8gCLcB/s640/schematic-from-hell.png" width="640" /></a>
+ </td>
+ </tr>
+ <tr>
+ <td class="tr-caption">Schematic from hell!</td>
+ </tr>
+ </tbody>
+ </table> As if this wasn't enough of a problem, the largest GreenPak4 device (the SLG46620V) is split into two halves with limited routing between them, and the GUI doesn't help the user manage this complexity at all - you have to draw your schematic in two halves and add "cross connections" between them.</p>
+ <p> The icing on the cake is that schematics are a pain to diff and collaborate on. Although GreenPak schematics are XML based, which is a touch better than binary, who wants to read a giant XML diff and try to figure out what's going on in the circuit?</p>
+ <p> This isn't going to be a post on the quirks of Silego's software, though - that would be boring. As it turns out, there's one more exciting feature of these chips that I didn't mention earlier: the configuration bitstream is 100% documented in the device datasheet! This is unheard of in the programmable logic world. As Nick of Arachnid Labs <a href="http://www.arachnidlabs.com/blog/2015/03/30/greenpak/">says</a>, the chip is "just dying for someone to write a VHDL or Verilog compiler for it". As you can probably guess by from the title of this post, I've been busy doing exactly that.</p>
+ <p>
+ <h2> Great! How does it work?</h2>
+ </p>
+ <p style="display: inline;" class="readability-styled"> Rather than wasting time writing a synthesizer, I decided to write a GreenPak technology library for Clifford Wolf's excellent open source synthesis tool, </p><a href="http://www.clifford.at/yosys/">Yosys</a>
+ <p style="display: inline;" class="readability-styled">, and then make a place-and-route tool to turn that into a final netlist. The post-PAR netlist can then be loaded into GreenPak Designer in order to program the device.</p>
+ <p> The first step of the process is to run the "synth_greenpak4" Yosys flow on the Verilog source. This runs a generic RTL synthesis pass, then some coarse-grained extraction passes to infer shift register and counter cells from behavioral logic, and finally maps the remaining logic to LUT/FF cells and outputs a JSON-formatted netlist.</p>
+ <p> Once the design has been synthesized, my tool (named, surprisingly, gp4par) is then launched on the netlist. It begins by parsing the JSON and constructing a directed graph of cell objects in memory. A second graph, containing all of the primitives in the device and the legal connections between them, is then created based on the device specified on the command line. (As of now only the SLG46620V is supported; the SLG46621V can be added fairly easily but the SLG46140V has a slightly different microarchitecture which will require a bit more work to support.)</p>
+ <p> After the graphs are generated, each node in the netlist graph is assigned a numeric label identifying the type of cell and each node in the device graph is assigned a list of legal labels: for example, an I/O buffer site is legal for an input buffer, output buffer, or bidirectional buffer.</p>
+ <p>
+ <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container">
+ <tbody>
+ <tr>
+ <td>
+ <a href="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s1600/graph-labels.png" imageanchor="1"><img border="0" height="141" src="https://2.bp.blogspot.com/-kIekczO693g/Vy7dBqYifXI/AAAAAAAAAxc/hMNJBs5bedIQOrBzzkhq4gbmhR-n58EQwCLcB/s400/graph-labels.png" width="400" /></a>
+ </td>
+ </tr>
+ <tr>
+ <td class="tr-caption">Example labeling for a subset of the netlist and device graphs</td>
+ </tr>
+ </tbody>
+ </table> The labeled nodes now need to be placed. The initial placement uses a simple greedy algorithm to create a valid (although not necessarily optimal or even routable) placement:</p><br/>
+ <ol>
+ <li>Loop over the cells in the netlist. If any cell has a LOC constraint, which locks the cell to a specific physical site, attempt to assign the node to the specified site. If the specified node is the wrong type, doesn't exist, or is already used by another constrained node, the constraint is invalid so fail with an error.</li>
+ <li>Loop over all of the unconstrained cells in the netlist and assign them to the first unused site with the right label. If none are available, the design is too big for the device so fail with an error.</li>
+ </ol>
+ <p style="display: inline;" class="readability-styled"> Once the design is placed, the placement optimizer then loops over the design and attempts to improve it. A simulated annealing algorithm is used, where changes to the design are accepted unconditionally if they make the placement better, and with a random, gradually decreasing probability if they make it worse. The optimizer terminates when the design receives a perfect score (indicating an optimal placement) or if it stops making progress for several iterations. Each iteration does the following:</p><br/>
+ <ol>
+ <li>Compute a score for the current design based on the number of unroutable nets, the amount of routing congestion (number of nets crossing between halves of the device), and static timing analysis (not yet implemented, always zero).</li>
+ <li>Make a list of nodes that contributed to this score in some way (having some attached nets unroutable, crossing to the other half of the device, or failing timing).</li>
+ <li>Remove nodes from the list that are LOC'd to a specific location since we're not allowed to move them.</li>
+ <li>Remove nodes from the list that have only one legal placement in the device (for example, oscillator hard IP) since there's nowhere else for them to go.</li>
+ <li>Pick a node from the remainder of the list at random. Call this our pivot.</li>
+ <li>Find a list of candidate placements for the pivot: </li>
+ <ol>
+ <li>Consider all routable placements in the other half of the device.</li>
+ <li>If none were found, consider all routable placements anywhere in the device.</li>
+ <li>If none were found, consider all placements anywhere in the device even if they're not routable.</li>
+ </ol>
+ <li>Pick one of the candidates at random and move the pivot to that location. If another cell in the netlist is already there, put it in the vacant site left by the pivot.</li>
+ <li>Re-compute the score for the design. If it's better, accept this change and start the next iteration.</li>
+ <li>If the score is worse, accept it with a random probability which decreases as the iteration number goes up. If the change is not accepted, restore the previous placement.</li>
+ </ol>
+ <p style="display: inline;" class="readability-styled"> After optimization, the design is checked for routability. If any edges in the netlist graph don't correspond to edges in the device graph, the user probably asked for something impossible (for example, trying to hook a flipflop's output to a comparator's reference voltage input) so fail with an error.</p>
+ <p> The design is then routed. This is quite simple due to the crossbar structure of the device. For each edge in the netlist:</p><br/>
+ <ol>
+ <li>If dedicated (non-fabric) routing is used for this path, configure the destination's input mux appropriately and stop.</li>
+ <li>If the source and destination are in the same half of the device, configure the destination's input mux appropriately and stop.</li>
+ <li>A cross-connection must be used. Check if we already used one to bring the source signal to the other half of the device. If found, configure the destination to route from that cross-connection and stop.</li>
+ <li>Check if we have any cross-connections left going in this direction. If they're all used, the design is unroutable due to congestion so fail with an error.</li>
+ <li>Pick the next unused cross-connection and configure it to route from the source. Configure the destination to route from the cross-connection and stop.</li>
+ </ol>
+ <p style="display: inline;" class="readability-styled"> Once routing is finished, run a series of post-PAR design rule checks. These currently include the following:</p><br/>
+ <ul>
+ <li>If any node has no loads, generate a warning</li>
+ <li>If an I/O buffer is connected to analog hard IP, fail with an error if it's not configured in analog mode.</li>
+ <li>Some signals (such as comparator inputs and oscillator power-down controls) are generated by a shared mux and fed to many loads. If different loads require conflicting settings for the shared mux, fail with an error.</li>
+ </ul>
+ <p style="display: inline;" class="readability-styled"> If DRC passes with no errors, configure all of the individual cells in the netlist based on the HDL parameters. Fail with an error if an invalid configuration was requested.</p>
+ <p> Finally, generate the bitstream from all of the per-cell configuration and write it to a file.</p>
+ <p>
+ <h2> Great, let's get started!</h2> If you don't already have one, you'll need to buy a <a href="http://www.silego.com/buy/index.php?main_page=product_info&amp;products_id=388">GreenPak4 development kit</a>. The kit includes samples of the SLG46620V (among other devices) and a programmer/emulation board. While you're waiting for it to arrive, install <a href="http://www.silego.com/softdoc/software.html">GreenPak Designer</a>.</p>
+ <p> Download and install Yosys. Although Clifford is pretty good at merging my pull requests, only <a href="https://github.com/azonenberg/yosys/">my fork on Github</a> is guaranteed to have the most up-to-date support for GreenPak devices so don't be surprised if you can't use a bleeding-edge feature with mainline Yosys.</p>
+ <p> Download and install gp4par. You can get it from <a href="https://github.com/azonenberg/openfpga/">the Github repository</a>.</p>
+ <p> Write your HDL, compile with Yosys, P&amp;R with gp4par, and import the bitstream into GreenPak Designer to program the target device. The most current gp4par manual is included in LaTeX source form in the source tree and is automatically built as part of the compile process. If you're just browsing, there's a <a href="http://thanatos.virtual.antikernel.net/unlisted/gp4-hdl.pdf">relatively recent PDF version</a> on my web server.</p>
+ <p> If you'd like to see the Verilog that produced the nightmare of a schematic I showed above, <a href="https://github.com/azonenberg/openfpga/blob/master/tests/greenpak4/Blinky/Blinky.v">here it is</a>.</p>
+ <p> Be advised that this project is still very much a work in progress and there are still a number of SLG46620V features I don't support (see the manual for exact details).</p>
+ <p>
+ <h2> I love it / it segfaulted / there's a problem in the manual!</h2> Hop in our IRC channel (##openfpga on Freenode) and let me know. Feedback is great, pull requests are even better,</p>
+ <p>
+ <h2> You're competing with Silego's IDE. Have they found out and sued you yet?</h2> Nope. They're fully aware of what I'm doing and are rolling out the red carpet for me. They love the idea of a HDL flow as an alternative to schematic entry and are pretty amazed at how fast it's coming together.</p>
+ <p> After I reported a few bugs in their datasheets they decided to skip the middleman and give me direct access to the engineer who writes their documentation so that I can get faster responses. The last time I found a problem (two different parts of the datasheet contradicted each other) an updated datasheet was in my inbox and on their website by the next day. I only wish Xilinx gave me that kind of treatment!</p>
+ <p> They've even <a href="https://twitter.com/SilegoTech/status/717018987771469824">offered me free hardware</a> to help me add support for their latest product family, although I plan to get GreenPak4 support to a more stable state before taking them up on the offer.</p>
+ <p>
+ <h2> So what's next?</h2>
+ </p>
+ <p style="display: inline;" class="readability-styled"> Better testing, for starters. I have to verify functionality by hand with a DMM and oscilloscope, which is time consuming.</p>
+ <p> My contact at Silego says they're going to be giving me documentation on the SRAM emulation interface soon, so I'm going to make a hardware-in-loop test platform that connects to my desktop and the Silego ZIF socket, and lets me load new bitstreams via a scriptable interface. It'll have FPGA-based digital I/O as well as an ADC and DAC on every device pin, plus an adjustable voltage regulator for power, so I can feed in arbitrary mixed-signal test waveforms and write PC-based unit tests to verify correct behavior.</p>
+ <p> Other than that, I want to finish support for the SLG46620V in the next month or two. The SLG46621V will be an easy addition since only one pin and the relevant configuration bits have changed from the 46620 (I suspect they're the same die, just bonded out differently).</p>
+ <p> Once that's done I'll have to do some more extensive work to add the SLG46140V since the architecture is a bit different (a lot of the combinatorial logic is merged into multi-function blocks). Luckily, the 46140 has a lot in common architecturally with the GreenPak5 family, so once that's done GreenPak5 will probably be a lot easier to add support for.</p>
+ <p> My thanks go out to Clifford Wolf, whitequark, the IRC users in ##openfpga, and everyone at Silego I've worked with to help make this possible. I hope that one day this project will become mature enough that Silego will ship it as an officially supported extension to GreenPak Designer, making history by becoming the first modern programmable logic vendor to ship a fully open source synthesis and P&amp;R suite. </p>
+ </div>
+</div> \ No newline at end of file
diff --git a/test/test-pages/breitbart/config.json b/test/test-pages/breitbart/config.json
new file mode 100644
index 0000000..6441edf
--- /dev/null
+++ b/test/test-pages/breitbart/config.json
@@ -0,0 +1,3 @@
+{
+ "articleByLine": true
+} \ No newline at end of file
diff --git a/test/test-pages/breitbart/expected.html b/test/test-pages/breitbart/expected.html
index 7f4a8ff..b574235 100644
--- a/test/test-pages/breitbart/expected.html
+++ b/test/test-pages/breitbart/expected.html
@@ -1,26 +1,41 @@
-<div id="readability-page-1" class="page">
- <div class="articleheader">
- <figure class="figurearticlefeatured">
- <div class="featured-container"><img itemprop="image" src="http://media.breitbart.com/media/2016/11/GettyImages-621866810-640x480.jpg" class="attachment-isc-bbn-full size-isc-bbn-full wp-post-image" alt="Supporters of Republican presidential nominee Donald Trump cheer during election night at the New York Hilton Midtown in New York on November 9, 2016. / AFP / JIM WATSON (Photo credit should read JIM WATSON/AFP/Getty Images)" width="640" height="480" />
- <p class="attribution">JIM WATSON/AFP/Getty Images</p>
- </div>
- </figure>
- <time class="op-published H" datetime="2016-12-22T10:43:37Z">22 Dec, 2016</time>
- <time class="op-modified H" datetime="2016-12-22T18:59:12Z">22 Dec, 2016</time>
- </div>
- <div class="entry-content">
- <div class="desktop" id="EmailOptin">
- <p class="sh2"><span>SIGN UP</span> FOR OUR NEWSLETTER</p>
- </div>
- <h2><span>Snopes fact checker and staff writer David Emery posted to Twitter asking if there were “any un-angry Trump supporters?”</span></h2>
- <p><span>Emery, a writer for partisan “fact-checking” website Snopes.com which soon will be in charge of labelling </span><a href="http://www.breitbart.com/tech/2016/12/15/facebook-introduce-warning-labels-stories-deemed-fake-news/"><span>“fake news”</span></a><span> alongside ABC News and Politifact, retweeted an article by Vulture magazine relating to the </span><a href="http://www.breitbart.com/big-hollywood/2016/11/19/boycotthamilton-trends-hamilton-cast-members-harass-mike-pence/"><span>protests</span></a><span> of the <em>Hamilton</em> musical following the decision by the cast of the show to make a </span><a href="http://www.breitbart.com/big-hollywood/2016/11/19/tolerance-hamilton-cast-lectures-mike-pence-broadway-stage/"><span>public announcement</span></a><span> to Vice-president elect Mike Pence while he watched the performance with his family.</span></p>
- <div class="mobile" id="EmailOptinM">
- <p class="sh2"><span>SIGN UP</span> FOR OUR NEWSLETTER</p>
- </div>
- <p><span>The tweet from Vulture magazine reads, “</span><a href="https://twitter.com/hashtag/Hamilton?src=hash" target="_blank" rel="noopener" class=" x5l"><span>#Hamilton</span></a><span> Chicago show interrupted by angry Trump supporter.” Emery retweeted the story, saying, “Are there un-angry Trump supporters?”</span></p>
- <p><span>This isn’t the first time the Snopes.com writer has expressed anti-Trump sentiment on his Twitter page. In another tweet in which Emery links to an article that falsely attributes a quote to President-elect Trump, Emery states, “Incredibly, some people actually think they have to put words in Trump’s mouth to make him look bad.”</span></p>
- <p><span>Emery also retweeted an article by <em>New York</em> magazine that claimed President-elect Trump relied on lies to win during his campaign and that we now lived in a “post-truth” society. “Before long we’ll all have forgotten what it was like to live in the same universe; or maybe we already have,” Emery tweeted.</span></p>
- <p><span>Facebook believe that Emery, along with other Snopes writers, ABC News, and </span><a href="http://www.breitbart.com/tech/2016/12/16/flashback-weekly-standard-data-shows-politifact-has-it-out-for-republicans/"><span>Politifact</span></a><span> are impartial enough to label and silence what they believe to be “fake news” on social media. </span></p>
- <p><i><span>Lucas Nolan is a reporter for Breitbart Tech covering issues of free speech and online censorship. Follow him on Twitter </span></i><a href="http://twitter.com/lucasnolan_" target="_blank" rel="noopener" class=" x5l"><i><span>@LucasNolan_</span></i></a><i><span> or email him at </span></i><a href="http://www.breitbart.com/wp-admin/blank"><i><span>[email protected]</span></i></a></p>
- </div>
-</div>
+<div>
+
+
+ <figure class="figurearticlefeatured"><div class="featured-container"><img alt="Supporters of Republican presidential nominee Donald Trump cheer during election night at the New York Hilton Midtown in New York on November 9, 2016. / AFP / JIM WATSON (Photo credit should read JIM WATSON/AFP/Getty Images)" class="attachment-isc-bbn-full size-isc-bbn-full wp-post-image" height="480" itemprop="image" src="http://media.breitbart.com/media/2016/11/GettyImages-621866810-640x480.jpg" width="640"></img><p>JIM WATSON/AFP/Getty Images</p>
+ </div>
+ </figure> <time class="op-published H" datetime="2016-12-22T10:43:37Z">22 Dec, 2016</time><time class="op-modified H" datetime="2016-12-22T18:59:12Z">22 Dec, 2016</time></div><div class="entry-content">
+
+ <div class="desktop" id="EmailOptin">
+ <p class="sh2"><span>SIGN UP</span> FOR OUR NEWSLETTER</p>
+
+ </div>
+ <h2><span>Snopes fact checker and staff writer David Emery posted to Twitter asking if there were “any un-angry Trump supporters?”</span></h2>
+ <p><span>Emery, a writer for partisan “fact-checking” website Snopes.com which soon will be in charge of labelling </span><a href="http://www.breitbart.com/tech/2016/12/15/facebook-introduce-warning-labels-stories-deemed-fake-news/"><span>“fake news”</span></a><span> alongside ABC News and Politifact, retweeted an article by Vulture magazine relating to the </span><a href="http://www.breitbart.com/big-hollywood/2016/11/19/boycotthamilton-trends-hamilton-cast-members-harass-mike-pence/"><span>protests</span></a><span> of the <em>Hamilton</em> musical following the decision by the cast of the show to make a </span><a href="http://www.breitbart.com/big-hollywood/2016/11/19/tolerance-hamilton-cast-lectures-mike-pence-broadway-stage/"><span>public announcement</span></a><span> to Vice-president elect Mike Pence while he watched the performance with his family.</span></p>
+ <div class="mobile" id="EmailOptinM">
+ <p class="sh2"><span>SIGN UP</span> FOR OUR NEWSLETTER</p>
+
+ </div>
+ <p><span>The tweet from Vulture magazine reads, “</span><a class=" x5l" href="https://twitter.com/hashtag/Hamilton?src=hash" rel="noopener" target="_blank"><span>#Hamilton</span></a><span> Chicago show interrupted by angry Trump supporter.” Emery retweeted the story, saying, “Are there un-angry Trump supporters?”</span></p>
+
+
+
+
+
+
+ <p><span>This isn’t the first time the Snopes.com writer has expressed anti-Trump sentiment on his Twitter page. In another tweet in which Emery links to an article that falsely attributes a quote to President-elect Trump, Emery states, “Incredibly, some people actually think they have to put words in Trump’s mouth to make him look bad.”</span></p>
+
+
+ <p><span>Emery also retweeted an article by <em>New York</em> magazine that claimed President-elect Trump relied on lies to win during his campaign and that we now lived in a “post-truth” society. “Before long we’ll all have forgotten what it was like to live in the same universe; or maybe we already have,” Emery tweeted.</span></p>
+
+
+
+
+
+
+ <p><span>Facebook believe that Emery, along with other Snopes writers, ABC News, and </span><a href="http://www.breitbart.com/tech/2016/12/16/flashback-weekly-standard-data-shows-politifact-has-it-out-for-republicans/"><span>Politifact</span></a><span> are impartial enough to label and silence what they believe to be “fake news” on social media. </span></p>
+ <p><i><span>Lucas Nolan is a reporter for Breitbart Tech covering issues of free speech and online censorship. Follow him on Twitter </span></i><a class=" x5l" href="http://twitter.com/lucasnolan_" rel="noopener" target="_blank"><i><span>@LucasNolan_</span></i></a><i><span> or email him at </span></i><a href="http://www.breitbart.com/wp-admin/blank"><i><span>[email protected]</span></i></a></p>
+
+
+
+
+ </div> \ No newline at end of file
diff --git a/test/test-pages/buzzfeed-1/expected.html b/test/test-pages/buzzfeed-1/expected.html
index 3e477ae..bb632f7 100644
--- a/test/test-pages/buzzfeed-1/expected.html
+++ b/test/test-pages/buzzfeed-1/expected.html
@@ -1,42 +1,38 @@
-<div class="c suplist_article suplist_list_show " id="buzz_sub_buzz">
- <div class="buzz_superlist_item buzz_superlist_item_image buzz_superlist_item_wide image_hit no_caption " id="superlist_3758406_5547137" rel:buzz_num="1">
- <h2>The mother of a woman who took suspected diet pills bought online has described how her daughter was “literally burning up from within” moments before her death.</h2>
-
- <p class="article_caption_w_attr"> <span class="sub_buzz_source_via buzz_attribution buzz_attr_no_caption">West Merica Police</span></p>
- </div>
- <div class="buzz_superlist_item buzz_superlist_item_text buzz_superlist_item_wide " id="superlist_3758406_5547213" rel:buzz_num="2">
- <p class="sub_buzz_desc">Eloise Parry, 21, was taken to Royal Shrewsbury hospital on 12 April after taking a lethal dose of highly toxic “slimming tablets”. </p>
- <p>“The drug was in her system, there was no anti-dote, two tablets was a lethal dose – and she had taken eight,” her mother, Fiona, <a href="https://www.westmercia.police.uk/article/9501/A-tribute-to-Eloise-Aimee-Parry-written-by-her-mother-Fiona-Parry">said in a statement</a> yesterday.</p>
- <p>“As Eloise deteriorated, the staff in A&amp;E did all they could to stabilise her. As the drug kicked in and started to make her metabolism soar, they attempted to cool her down, but they were fighting an uphill battle.</p>
- <p>“She was literally burning up from within.”</p>
- <p>She added: “They never stood a chance of saving her. She burned and crashed.”</p>
- </div>
- <div class="buzz_superlist_item buzz_superlist_item_grid_row buzz_superlist_item_wide no_caption " id="superlist_3758406_5547140" rel:buzz_num="3">
- <div class="grid_row two_pl grid_height_l">
- <div class="grid_cell cell_1">
- <div class="grid_cell_image_wrapper">
- <img height="412" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" width="203"></img>
- </div>
- <p class="sub_buzz_grid_source_via">Facebook</p>
- </div>
- <div class="grid_cell cell_2">
- <div class="grid_cell_image_wrapper">
- <img height="412" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" width="412"></img>
- </div>
- <p class="sub_buzz_grid_source_via">Facebook</p>
- </div>
-
- </div>
- </div>
- <div class="buzz_superlist_item buzz_superlist_item_text buzz_superlist_item_wide " id="superlist_3758406_5547284" rel:buzz_num="4">
- <p class="sub_buzz_desc">West Mercia police <a href="https://www.westmercia.police.uk/article/9500/Warning-Issued-As-Shrewsbury-Woman-Dies-After-Taking-Suspected-Diet-Pills">said the tablets were believed to contain dinitrophenol</a>, known as DNP, which is a highly toxic industrial chemical. </p>
- <p>“We are undoubtedly concerned over the origin and sale of these pills and are working with partner agencies to establish where they were bought from and how they were advertised,” said chief inspector Jennifer Mattinson from the West Mercia police.</p>
- <p>The Food Standards Agency warned people to stay away from slimming products that contained DNP.</p>
- <p>“We advise the public not to take any tablets or powders containing DNP, as it is an industrial chemical and not fit for human consumption,” it said in a statement.</p>
- </div>
- <div class="buzz_superlist_item buzz_superlist_item_text buzz_superlist_item_wide " id="superlist_3758406_5547219" rel:buzz_num="5">
- <h2>Fiona Parry issued a plea for people to stay away from pills containing the chemical.</h2>
- <p class="sub_buzz_desc">“[Eloise] just never really understood how dangerous the tablets that she took were,” she said. “Most of us don’t believe that a slimming tablet could possibly kill us.</p>
- <p>“DNP is not a miracle slimming pill. It is a deadly toxin.”</p>
- </div>
- </div> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <div id="buzz_sub_buzz" class="c suplist_article suplist_list_show ">
+ <div class="buzz_superlist_item buzz_superlist_item_image buzz_superlist_item_wide image_hit no_caption " id="superlist_3758406_5547137" rel:buzz_num="1">
+ <h2>The mother of a woman who took suspected diet pills bought online has described how her daughter was “literally burning up from within” moments before her death.</h2>
+ <p class="article_caption_w_attr"> <span class="sub_buzz_source_via buzz_attribution buzz_attr_no_caption">West Merica Police</span></p>
+ </div>
+ <div class="buzz_superlist_item buzz_superlist_item_text buzz_superlist_item_wide " id="superlist_3758406_5547213" rel:buzz_num="2">
+ <p class="sub_buzz_desc">Eloise Parry, 21, was taken to Royal Shrewsbury hospital on 12 April after taking a lethal dose of highly toxic “slimming tablets”. </p>
+ <p>“The drug was in her system, there was no anti-dote, two tablets was a lethal dose – and she had taken eight,” her mother, Fiona, <a href="https://www.westmercia.police.uk/article/9501/A-tribute-to-Eloise-Aimee-Parry-written-by-her-mother-Fiona-Parry">said in a statement</a> yesterday.</p>
+ <p>“As Eloise deteriorated, the staff in A&amp;E did all they could to stabilise her. As the drug kicked in and started to make her metabolism soar, they attempted to cool her down, but they were fighting an uphill battle.</p>
+ <p>“She was literally burning up from within.”</p>
+ <p>She added: “They never stood a chance of saving her. She burned and crashed.”</p>
+ </div>
+ <div class="buzz_superlist_item buzz_superlist_item_grid_row buzz_superlist_item_wide no_caption " id="superlist_3758406_5547140" rel:buzz_num="3">
+ <div class="grid_row two_pl grid_height_l">
+ <div class="grid_cell cell_1">
+ <div class="grid_cell_image_wrapper"><img src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608056-15.jpg" height="412" width="203"/></div>
+ <p class="sub_buzz_grid_source_via">Facebook</p>
+ </div>
+ <div class="grid_cell cell_2">
+ <div class="grid_cell_image_wrapper"><img src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" rel:bf_image_src="http://ak-hdl.buzzfed.com/static/2015-04/21/5/enhanced/webdr12/grid-cell-2501-1429608057-18.jpg" height="412" width="412"/></div>
+ <p class="sub_buzz_grid_source_via">Facebook</p>
+ </div>
+ </div>
+ </div>
+ <div class="buzz_superlist_item buzz_superlist_item_text buzz_superlist_item_wide " id="superlist_3758406_5547284" rel:buzz_num="4">
+ <p class="sub_buzz_desc">West Mercia police <a href="https://www.westmercia.police.uk/article/9500/Warning-Issued-As-Shrewsbury-Woman-Dies-After-Taking-Suspected-Diet-Pills">said the tablets were believed to contain dinitrophenol</a>, known as DNP, which is a highly toxic industrial chemical. </p>
+ <p>“We are undoubtedly concerned over the origin and sale of these pills and are working with partner agencies to establish where they were bought from and how they were advertised,” said chief inspector Jennifer Mattinson from the West Mercia police.</p>
+ <p>The Food Standards Agency warned people to stay away from slimming products that contained DNP.</p>
+ <p>“We advise the public not to take any tablets or powders containing DNP, as it is an industrial chemical and not fit for human consumption,” it said in a statement.</p>
+ </div>
+ <div class="buzz_superlist_item buzz_superlist_item_text buzz_superlist_item_wide " id="superlist_3758406_5547219" rel:buzz_num="5">
+ <h2>Fiona Parry issued a plea for people to stay away from pills containing the chemical.</h2>
+ <p class="sub_buzz_desc">“[Eloise] just never really understood how dangerous the tablets that she took were,” she said. “Most of us don’t believe that a slimming tablet could possibly kill us.</p>
+ <p>“DNP is not a miracle slimming pill. It is a deadly toxin.”</p>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/test/test-pages/clean-links/expected.html b/test/test-pages/clean-links/expected.html
index a836d91..3cb093e 100644
--- a/test/test-pages/clean-links/expected.html
+++ b/test/test-pages/clean-links/expected.html
@@ -1,1386 +1,264 @@
-<div><td>
- <h3 align="center ">Study Webtext</h3>
- <h2 align="center "><span color="Maroon&#xA; " face="Lucida Handwriting ">"Bartleby the Scrivener: A Story of Wall-Street " </span>(1853) <br></br>
+<div id="readability-page-1" class="page">
+ <div>
+ <table width="675 " border="0 " cellpadding="2 "><tbody><tr><td>
+ <h3 align="center ">Study Webtext</h3>
+ <h2 align="center "><span face="Lucida Handwriting " color="Maroon
+ ">"Bartleby the Scrivener: A Story of Wall-Street " </span>(1853)&nbsp;<br/>
Herman Melville</h2>
- <h2 align="center "><a href="http://www.vcu.edu/engweb/webtexts/bartleby.html&#xA; " target="_blank "><img align="absmiddle " alt="To the story text without notes&#xA; " height="38 " src="http://fakehost/test/hmhome.gif " width="38 "></img></a>
+ <h2 align="center "><a href="http://www.vcu.edu/engweb/webtexts/bartleby.html
+ " target="_blank "><img src="http://fakehost/test/hmhome.gif " alt="To the story text without notes
+ " height="38 " width="38 " align="absmiddle "/></a>
</h2>
- <h3 align="center ">Prepared by <a href="http://www.vcu.edu/engweb ">Ann
+ <h3 align="center ">Prepared by <a href="http://www.vcu.edu/engweb ">Ann
Woodlief,</a> Virginia Commonwealth University</h3>
- <h5 align="center ">Click on text in red for hypertext notes and questions</h5>
- I
- am a <a class="popup&#xA; " href="javascript:void(0); " onclick="return overlib(&#xA; 'Why does he stress that he is elderly? To show that he has had a wide range of experience? To suggest that he is very set in his ways?', STICKY) " onmouseout="nd(); ">rather elderly</a> man. The nature of my avocations
- for the last thirty years has brought me into more than ordinary contact
- with what <a class="popup&#xA; " href="javascript:void(0); " onclick="return overlib(&#xA; 'Notice how he qualifies his statement, as if he is not quite sure they are so interesting.', STICKY) " onmouseout="nd(); ">would seem</a> an interesting and somewhat singular set of men of whom as yet
- nothing that I know of has ever been written:-- I mean the law-copyists
- or <a class="popup" href="javascript:void(0); " onclick="return overlib(&#xA; 'The word means &quot;writers.&quot; Some critics have looked at this story as Melville\'s lament that the work of (creative) writers is so little appreciated,&#xA; especially in financial terms. He struggled all his life to make a living&#xA; by writing, whereas his brother Gansevoort, who worked on Wall Street,&#xA; led a very comfortable life and never really understood why his brother&#xA; bothered to write.&#xA; ', STICKY)" onmouseout="nd();">scriveners</a>.
- I have known very many of them, professionally and privately, and if I
- pleased, could relate divers histories, at which good-natured gentlemen
- might smile, and sentimental souls might weep. But I waive the biographies
- of all other scriveners for a few passages
- in the life of Bartleby, who was a scrivener the <a class="popup " href="javascript:void(0);&#xA; " onclick="return overlib(&#xA; 'Immediately he judges Bartleby, causing the reader to accept the judgment without knowing more at this point about the person.', STICKY) " onmouseout="nd(); ">strangest</a>
- I ever saw or heard of. While of other law-copyists I might write the
- complete life, of Bartleby nothing of that sort can be done. I believe that
- no materials exist for a full and <a class="popup " href="javascript:void(0);&#xA; " onclick="return overlib(&#xA; 'Satisfactory to whom? to the lawyer? to the reader? to both?', STICKY) " onmouseout="nd(); ">satisfactory biography </a> of this man. It is an irreparable loss to literature. Bartleby
- was one of those beings of whom nothing is ascertainable, except from
- the original sources, and in his case those are very small. What my own
- astonished eyes saw of Bartleby, that is all I know of him, except, indeed,
- one vague report which will appear in the sequel.
- <p>Ere introducing the scrivener, as he first appeared to me, it is fit
- I make some mention of myself, my employees, my business, my chambers,
- and general surroundings; because some such description is indispensable
- to an adequate understanding of the chief character about to be presented.
- </p><p> <i>Imprimis</i>: I am a man who, from his youth upwards, has been
- filled with a profound conviction that <a class="popup" href="javascript:void(0);" onclick="return overlib('What sort of person is he, according to this statement? How will this&#xA; change or be challenged in the story?&#xA; ', STICKY)" onmouseout="nd();">the easiest way of life is the best.</a>. Hence, though I belong to a profession
- proverbially energetic and nervous, even to turbulence, at times, yet
- nothing of that sort have I ever suffered to invade
- my peace. I am one of those unambitious lawyers who never addresses
- a jury, or in any way draws down public applause; but in the cool tranquillity
- of a snug retreat, do a <a class="popup" href="javascript:void(0);" onclick="return overlib('What does &quot;snug&quot; suggest about him? He seems to be unwilling&#xA; to take risks in his work; how does this apply to his personal life?&#xA; ', STICKY)" onmouseout="nd();">snug business</a> among rich men's bonds and mortgages and title-deeds. The late John Jacob Astor, a personage little given to poetic enthusiasm, had
- no hesitation in pronouncing my <a class="popup" href="javascript:void(0);" onclick="return overlib('Note how he builds a description of himself. How would you describe him? Would you consider him a &quot;typical&quot; lawyer, businessman, or &quot;boss&quot;?', STICKY)" onmouseout="nd();">first
- grand point</a> to be prudence; my next, method. I do not speak
- it in vanity, but simply record the fact, that I was not
- unemployed in my profession by the last John Jacob Astor; a name which,
- I admit, I love to repeat, for it hath a rounded and orbicular sound to
- it, and <a class="popup" href="javascript:void(0);" onclick="return overlib('gold. Clearly the lawyer is rather entranced by Astor\'s wealth. . As a &quot;hero&quot; for the narrator, he represents rapacious materialism.', STICKY)" onmouseout="nd();">rings
- like unto bullion.</a> I will freely add, that I was not
- insensible to the late John Jacob Astor's good opinion.</p>
- <p>Some time prior to the period at which this little history begins, my
- avocations had been largely increased. The good old office, <a class="popup" href="javascript:void(0);" onclick="return overlib(' Evidently the job was abolished because it was a sinecure, requiring little of the holder of the job for a great deal of money. Very likely it was a political appointment. New York did abolish this office in 1846 as part of an outdated court system.  This would be a perfect kind of job for a writer, supporting his true vocation, but Melville was unable to find such work. His job at the Customs House was too demanding for him to write much and did not pay very much.', STICKY)" onmouseout="nd();">now
- extinct</a> in the State of New York, of a Master in Chancery,
- had been conferred upon me. It was not a very arduous office, but very
- pleasantly remunerative. I
- seldom lose my temper; much more seldom indulge in dangerous
- indignation at wrongs and outrages; but I must be permitted to be rash
- here and declare, that I consider the sudden and violent abrogation of
- the office of Master of Chancery, by the new Constitution, as a----<a class="popup" href="javascript:void(0);" onclick="return overlib('Note that he does not challenge the reason for abolishing the office, only that it was premature, and should have been done later (after his pockets were &quot;pleasantly&quot; filled.).', STICKY)" onmouseout="nd();">premature
- act</a>; inasmuch as I had counted upon a life-lease of the
- profits, whereas I only received those of a few short years. But this is
- by the way.</p>
- <p>My chambers were up stairs at No.--Wall-street. At one end they looked
- upon the white wall of the interior of a spacious sky-light shaft, penetrating
- the building from top to bottom. This view might have been considered rather
- tame than otherwise, <a class="popup" href="javascript:void(0);" onclick="return overlib('Landscape painters wouldn\'t be the only ones to find this blocked view not &quot;life&quot;! This seems to be an example of his kind of humor, tongue-in-cheek and a little factitious. On the other hand, perhaps the air of death in his chambers is more than a matter of setting.', STICKY)" onmouseout="nd();">deficient
- in what landscape painters call "life."</a> But if so, the view
- from the other end of my chambers offered, at least, a contrast, if nothing
- more. In that direction my windows commanded an unobstructed view of a
- lofty brick wall,black by age and everlasting shade; which wall required
- no spy-glass to bring out its lurking beauties, but for the benefit of
- all near-sighted spectators, was pushed up to within ten feet of my window
- panes. Owing to the great height of the surrounding buildings, and my chambers
- being on the second floor, the interval between this wall and mine not
- a little resembled a huge square <a class="popup" href="javascript:void(0);" onclick="return overlib('An interesting comparison, since a cistern holds water, which is frequently an image for life. This one, of course, is dry. ', STICKY)" onmouseout="nd();">cistern</a>.</p>
- <p>At the period just preceding the advent of Bartleby, I had two persons
- as copyists in my employment, and a promising lad as an office-boy. First,
- Turkey; second, Nippers; third, Ginger Nut.These may seem names, the like
- of which are not usually found in the Directory. In truth they were nicknames, mutually conferred upon
- each other by my three clerks, and were deemed expressive of their respective
- persons or characters. Turkey was a short, pursy Englishman of about my
- own age, that is, somewhere not far from sixty. In the morning, one might
- say, his face was of a fine florid hue, but after twelve o'clock, meridian--
- <a class="popup" href="javascript:void(0);" onclick="return overlib('This is the first of many references to eating (although probably not the most important one!). How do these references play out in the story (culminating in &quot;he lives without eating?&quot;)? The only person who does not eat--although we may assume that he is well-fed--is the lawyer/narrator. Is this significant?', STICKY)" onmouseout="nd();">his dinner hour</a>-- it blazed like a grate full of Christmas coals;
- and continued blazing--but, as it were, with a gradual wane--till 6 o'clock,
- P.M. or thereabouts, after which I saw no more of the proprietor of the
- face, which gaining its meridian with the sun, seemed to set with it, to
- rise, culminate, and decline the following day, with the like regularity
- and undiminished glory. There are many singular coincidences I have known
- in the course of my life, not the least among which was the fact that exactly
- when Turkey displayed his fullest beams from his red and radiant countenance,
- just then, too, at the critical moment, began the daily period when I considered
- his business capacities as seriously disturbed for the remainder of the
- twenty-four hours. Not that he was absolutely idle, or averse to business
- then; far from it. The difficulty was, he was apt to be altogether too
- energetic. There was a strange, inflamed, flurried, flighty
- recklessness of activity about him. He would be incautious in dipping his
- pen into his inkstand. All his blots upon my documents, were dropped there
- after twelve o'clock, meridian. Indeed, not only would he be reckless and
- sadly given to making blots in the afternoon, but some days he went further,
- and was rather <a class="popup" href="javascript:void(0);" onclick="return overlib('Evidently the lawyer does not like to be disturbed with noise, especially noise of his clerks\' frustration.', STICKY)" onmouseout="nd();">noisy</a>. At such times, too, his face
- flamed with augmented blazonry, as if cannel
- coal had been heaped on anthracite. He made an unpleasant
- racket with his chair; spilled his sand-box; in mending his pens, impatiently
- split them all to pieces, and threw them on the floor in a sudden passion;
- stood up and leaned over his table, boxing his papers about in a most
- <a class="popup" href="javascript:void(0);" onclick="return overlib('He does not behave in an orderly fashion, something the lawyer prizes. He is elderly, like the lawyer! In other words, they should both be more settled and calm because of their age?', STICKY)" onmouseout="nd();">indecorous manner, very sad to behold in an elderly man</a>like him. Nevertheless,
- as he was in many ways a most valuable person to me, and all the time before
- twelve o'clock, meridian, was the quickest, steadiest creature too, accomplishing
- a great deal of work in a style not easy to be matched--for these reasons,
- I was willingto overlook his eccentricities, though indeed, occasionally,
- I remonstrated with him. I did this very gently, however, because, though
- the civilest, nay, the blandest and most reverential of men in the morning,
- yet in the afternoon he was disposed, upon provocation, to be slightly
- rash with his tongue, in fact, insolent. Now, valuing his morning services
- as I did, and resolved not to lose them; yet, at the same time made uncomfortable
- by his inflamed ways after twelve o'clock; and being a <a class="popup" href="javascript:void(0);" onclick="return overlib('or at least a man who does not like to have his peace disturbed! Note his willingness to live with a worker who functions well only half of the time. He seems to have some sympathetic perception of Turkey\'s frustration.', STICKY)" onmouseout="nd();">man
- of peace</a>, unwilling by my admonitions to call forth unseemingly
- retorts from him; I took upon me, one Saturday noon (he was always worse
- on Saturdays), to hint to him, very kindly, that perhaps now that he was
- growing old, it might be well to abridge his labors; in short, he need
- not come to my chambers after twelve o'clock, but, dinner over, had best
- go home to his lodgings and rest himself till tea-time. But no; he insisted
- upon his afternoon devotions. His countenance became
- intolerably fervid, as he oratorically assured me--gesticulating with a
- long ruler at the other end of the room--that if his services in the morning
- were useful, how indispensible, then, in the afternoon?</p>
- <p>"<a class="popup" href="javascript:void(0);" onclick="return overlib('Turkey is careful to &quot;keep his place&quot; with his boss, though his &quot;submission&quot; actually seems to be more suited to his morning than his afternoon work.', STICKY)" onmouseout="nd();">With
- submission, sir,</a>" said Turkey on this occasion, "I consider
- myself your right-hand man. In the morning I but marshal and deploy my
- columns; but in the afternoon I
- put myself at their head, and gallantly charge the foe,
- thus!"--and he made a <a class="popup" href="javascript:void(0);" onclick="return overlib('Look out for more &quot;violent thrusts&quot; in the story. ', STICKY)" onmouseout="nd();">violent
- thrust</a> with the ruler.</p>
- <p>"But the blots, Turkey," intimated I.</p>
- <p>"True,--but, with submission, sir, behold these hairs! I am getting old.
- Surely, sir, a blot or two of a warm afternoon is not the page--is honorable.
- With submission, sir, we both are getting old."</p>
- <p>This
- appeal to my fellow-feeling was hardly to be resisted. At
- all events, I saw that go he would not. So I made up my mind to let him
- stay, resolving, nevertheless, to see to it, that during the afternoon
- he had to do with my less important papers.</p>
- <p>Nippers, the second on my list, was a whiskered, sallow, and, upon the
- whole, rather <a class="popup" href="javascript:void(0);" onclick="return overlib('Pirates rarely suffer from indigestion, do they? In what way could Nippers be considered like a pirate?', STICKY)" onmouseout="nd();">piratical-looking</a> young man of about
- five and twenty. I always deemed him the victim of two evil powers-- ambition
- and indigestion. The ambition was evinced by a certain impatience of the
- duties of a mere
- copyist, an unwarrantable usurpation of strictly profession
- affairs, such as the <a class="popup" href="javascript:void(0);" onclick="return overlib('taking over without permission In other words, he took it upon himself to draw up legal documents, which he is evidently able to do. Very likely he feels fully capable of doing the lawyer\'s work, though he is not &quot;properly qualified&quot; to do so.', STICKY)" onmouseout="nd();">original
- drawing up</a> of legal documents. The indigestion seemed betokened
- in an occasional nervous testiness and grinning irritability, causing the
- teeth to audibly grind together over mistakes committed in copying; unnecessary
- maledictions, hissed, rather than spoken, in the heat of business; and
- especially by a continual
- discontent with the height of the table where he worked.
- Though of a very ingenious mechanical turn, Nippers could never get this
- table to suit him. He put chips under it, blocks of various sorts, bits
- of pasteboard, and at last went so far as to attempt an exquisite adjustment
- by final pieces of folded blotting-paper. But no invention would answer.
- If, for the sake of easing his back, he brought the table lid at a sharp
- angle well up towards his chin, and wrote there like a man using the steep
- roof of a Dutch house for his desk:--then he declared that it stopped the
- circulation in his arms. If now he lowered the table to his waistbands,
- and stooped over it in writing, then there was a sore aching in his back.
- In short, the truth of the matter was, Nippers knew not what he wanted.
- Or, <a class="popup" href="javascript:void(0);" onclick="return overlib('This observation is probably quite true, and rather perceptive of the lawyer. He does seem to understand and sympathize with his employee\'s situation, but that does not mean he makes any move to change it (except to try rearranging so there are fewer blots for him to deal with).', STICKY)" onmouseout="nd();">if
- he wanted anything</a>, it was to be rid of a scrivener's table
- altogether. Among the manifestations of his diseased ambition was a fondness
- he had for receiving visits from certain ambiguous-looking fellows in seedy
- coats, whom he called his clients. Indeed I was aware that not only was
- he, at times, considerable of a ward-politician, but he occasionally did
- a little businessat the Justices' courts, and was not unknown on the
- steps of the Tombs. I have good reason to believe, however, that one individual
- who called upon him at my chambers, and who, with a grand air, he insisted
- was his client, was no other than a dun, and the alleged title-deed, a
- bill. But with all his failings, and the annoyances he caused me, Nippers,
- like his compatriot Turkey, was a very <a class="popup" href="javascript:void(0);" onclick="return overlib('This is probably his prime value as a human being, in the lawyer\'s eyes.', STICKY)" onmouseout="nd();">useful
- man </a>to me; wrote a neat, swift hand; and, when he chose,
- was not deficient in a gentlemanly sort of deportment. Added to this, he
- always dressedin a gentlemanly sort of way; and so, incidentally,
- reflected credit upon my chambers. Whereas with respect to Turkey, I had
- much ado to keep him from being a reproach to me. His clothes were apt
- to look oily and smell of eating-houses. He wore his pantaloons very loose
- and baggy in summer. His coats were execrable; his hat not to be handled.
- But while the <a class="popup" href="javascript:void(0);" onclick="return overlib('In other words, the hat is okay because he doffs it as a sign of respect for his boss.', STICKY)" onmouseout="nd();">hat</a> was a thing of indifference to
- me, inasmuch as his natural civility and deference, as a dependent Englishman,
- always led him to doff it the moment he entered the room, yet his coat
- was another matter. Concerning his coats, I reasoned with him; but with
- no effect. The truth was, I suppose, that a man with so small an income,
- could not afford to sport such a lustrous face and a lustrous coat at one
- and the same time. As Nippers once observed, Turkey's money went chiefly
- for red ink. One winter day
- I presented Turkey with a highly-respectable looking coat
- of my own, a padded gray coat, of a most comfortable warmth, and which
- buttoned straight up from the knee to the neck. I thought Turkey would
- appreciate the favor, and abate his rashness and obstreperousness of afternoons.
- But no. I verily believe that buttoning himself up in so downy and blanket-like
- a coat had a pernicious effect upon him; upon the same principle that too
- much oats are bad for horses. In fact, precisely as a rash, restive <a class="popup" href="javascript:void(0);" onclick="return overlib(' &quot;Feelings one\'s oats&quot; has become a cliche today, for it has lost its original metaphorical force. Here, however, Melville is very aware of the original comparison. Evidently a horse with overabundant oats gets very frisky and out of control, even as Turkey seems to be beyond the lawyer\'s control with his new coat. Does Turkey resent this gift, even though he needs it? Is that what makes him &quot;insolent&quot; to his boss? Why would he resent it? ', STICKY)" onmouseout="nd();">horse
- is said to feel his oats</a>, so Turkey felt his coat. It made
- him insolent. He was a man whom prosperity harmed.</p>
- <p>Though concerning the self-indulgent habits of Turkey I had my own private
- surmises, yet touching Nippers I was well persuaded that whatever might
- be his faults in other respects, he was, at least, a temperate young man.
- But indeed, nature herself seemed to have been his vintner, and at his birth charged
- him so thoroughly with an irritable, brandy-like disposition, that all
- subsequent potations were needless. When I consider how, amid the stillness
- of my chambers, Nippers would sometimes impatiently rise from his seat,
- and stooping over his table, spread his arms wide apart, seize the whole
- desk, and move it, and jerk it, with a grim, grinding motion on the floor,
- as if the table were a <a class="popup" href="javascript:void(0);" onclick="return overlib('What or whom is he substituting the table for? ', STICKY)" onmouseout="nd();">perverse
- voluntary agent</a>, intent on thwarting and vexing him; I plainly
- perceive that for Nippers, brandy and water were altogether superfluous.</p>
- <p>It was fortunate for me that, owing to its course--indigestion--the irritability
- and consequent nervousness of Nippers, were mainly observable in the morning,
- while in the afternoon he was comparatively mild. So that Turkey's paroxysms
- only coming on about twelve o'clock, I never had to do with their eccentricities
- at one time. Their fits relieved each other like guards. When Nippers'
- was on, Turkey's was off, and vice versa. This was a good
- natural arrangement under the circumstances.</p>
- <p>Ginger Nut, the third on my list, was a lad some twelve years old. His
- father was a carman, ambitious of seeing his son on the bench instead of
- a cart, before he died. So he sent him to my office as a student at law,
- errand boy, and cleaner and sweeper, at the rate of one dollar a week.
- He had a little desk to himself, but he did not use it much. Upon inspection,
- the drawer exhibited a great array of the shells of various sorts of nuts.
- Indeed, to this quick-witted youth the whole noble science of the law was
- <a class="popup" href="javascript:void(0);" onclick="return overlib('Again he uses a cliche to make a joke at the expense of one of his employees.', STICKY)" onmouseout="nd();">contained in a nut-shell</a>. Not the least among the employments of Ginger
- Nut, as well as one which he discharged with the most alacrity, was his
- duty as cake and apple purveyor for Turkey and Nippers. Copying law papers
- being proverbially a dry,
- husky sort of business, my two scriveners were fain to moisten
- their mouths very often with Spitzenbergs to be had at the numerous stalls
- nigh the Custom House and Post Office. Also, they sent Ginger Nut very
- frequently for that peculiar cake--small, flat, round, and very spicy--after
- which he had been named by them. Of a cold morning when business was but
- dull, Turkey would gobble up scores of these cakes, as if they were mere
- wafers--indeed they sell them at the rate of six or eight for a penny--the
- scrape of his pen blending with the crunching of the crisp particles in
- his mouth. Of all the fiery afternoon blunders and flurried rashnesses
- of Turkey, was his once moistening a ginger-cake between his lips, and
- clapping it on to a mortgage for a seal. <a class="popup" href="javascript:void(0);" onclick="return overlib('Would this have been adequate cause for firing a long-time employee? Does this show that the lawyer has a temper? Is he upset because he thinks that Turkey is not taking his business seriously enough?', STICKY)" onmouseout="nd();">I
- came within an ace </a>of dismissing him then. But he mollified
- me by making an oriental bow, and saying--"With submission, sir, it was
- generous of me to
- find you in stationery on my own account."</p>
- <p>Now my original business--that of a <a class="popup" href="javascript:void(0);" onclick="return overlib('A conveyancer does the paper work to legally transfer property; a title hunter makes certain that titles of ownership are free and clear. Note that his business deals strictly with legal paperwork, not with matters of justice. Such paperwork is necessary only in a society where a person\'s word is likely not to be trustworthy, in other words, a world with flawed and dishonest communications.', STICKY)" onmouseout="nd();">conveyancer
- and title hunter</a>, and drawer-up of recondite documents of
- all sorts--was considerably increased by receiving the master's office.
- There was now great work for scriveners. Not only must I push the clerks
- already with me, but I must have additional help. In answer to my advertisement,
- a motionless young man one morning, stood upon my office threshold, the
- door being open, for it was summer. I can see that figure now--pallidly
- neat, pitiably respectable, incurably forlorn! It was Bartleby.</p>
- <p>After a few words touching his qualifications, I engaged him, glad to
- have among <a class="popup" href="javascript:void(0);" onclick="return overlib('here is used as a military image, appropriate for the hierarchy which clearly exists in this office.', STICKY)" onmouseout="nd();">my
- corps</a> of copyists a man of so singularly
- sedate an aspect, which I thought might operate beneficially
- upon the flighty temper of Turkey, and the fiery one of Nippers.</p>
- <p>I should have stated before that ground glass folding-doors divided my
- premises into two parts, one of which was occupied by my scriveners, the
- other by myself. <a class="popup" href="javascript:void(0);" onclick="return overlib('He has full control over the doors, and thus over the ability to communicate in the office. But he opens them not for logical reasons but almost on whim, depending on his mood or &quot;humor.&quot;', STICKY)" onmouseout="nd();">According
- to my humor</a> I threw open these doors, or closed them. I resolved
- to assign Bartleby a corner by the folding-doors, but on my side of them,
- so as to have this quiet man within easy call, in case any trifling
- thing was to be done. I placed his desk close up to a small
- side window in that part of the room, a window which originally had afforded
- a lateral view of certain grimy back-yards and bricks, but which, owing
- to <a class="popup" href="javascript:void(0);" onclick="return overlib('At this point, the reader is reminded that they are in New York City, and that the tall buildings block views from windows. (no glimpses of the green of Central Park in this office!) The connection of walls and the urban setting seems important in this story.', STICKY)" onmouseout="nd();">subsequent
- erections,</a> commanded at present no view at all, though it
- gave some light. Within three feet of the panes was a wall, and the light
- came down from far above, between two lofty buildings, as from a very small
- opening in a dome. Still further to a satisfactory arrangement, I procured
- a high green folding screen, which might entirely isolate Bartleby
- from my sight, though not remove him from <a class="popup" href="javascript:void(0);" onclick="return overlib('And the primary function of that &quot;voice&quot; is to summon Bartleby to do &quot;trifling things.&quot;', STICKY)" onmouseout="nd();">my
- voice</a>. And thus, in a manner, privacy and society were
- conjoined.
- </p>
- <p>At first Bartleby did an extraordinary quantity of writing. As if long
- <a class="popup" href="javascript:void(0);" onclick="return overlib('This is the first of many references to eating (although probably not the most important one!). How do these references play out in the story (culminating in &quot;he lives without eating?&quot;)? The only person who does not eat--although we may assume that he is well-fed--is the lawyer/narrator. Is this significant?', STICKY)" onmouseout="nd();">famishing</a>for something to copy, he seemed to gorge himself on my documents. There
- was no pause for digestion. He ran a day and night line, copying by sun-light
- and by candle-light. I should have been quite delighted with his application,
- had be been <a class="popup" href="javascript:void(0);" onclick="return overlib('He\'s a tough boss to please! Not only does he like Bartleby\'s extraordinary devotion to his job but he wants him to be happy in the process. Such a man--and the assumptions he has about the ideal employee (not unlike a &quot;happy slave&quot;?) would be most difficult to work for, for there\'s no way he would be pleased with any sort of normal work and attitude.', STICKY)" onmouseout="nd();">cheerfully
- industrious</a>. But he wrote on silently, palely, mechanically.
- </p>
- <p>It is, of course, an indispensable part of a scrivener's business to verify
- the accuracy of his copy, word by word. Where there are two or more scriveners
- in an office, they assist each other in this examination, one reading from
- the copy, the other holding the original. It is a <a class="popup" href="javascript:void(0);" onclick="return overlib('He is certainly correct, but how would he know? Surely he has never had to do such work!', STICKY)" onmouseout="nd();">very
- dull, wearisome, and lethargic</a> affair. I can readily imagine
- that to some sanguine temperaments it would be altogether
- intolerable. For example, I cannot credit that the <a class="popup" href="javascript:void(0);" onclick="return overlib('He has chosen a romantic poet, famed for his adventuresome spirit (although &quot;mettlesome&quot; suggests he doesn\'t care much for poets.) Some interpret this passage as suggesting that no creative person could survive such work, even though it might be necessary for making a decent living. He seems to recognize that legal copying is blinding, cramping, uncreativework. ', STICKY)" onmouseout="nd();">mettlesome
- poet Byron</a> would have contentedly sat down with Bartleby
- to examine a law document of, say five hundred pages, closely written in
- a crimpy hand.</p>
- <p>Now and then, in the haste of business, it had been my habit to assist
- in comparing some brief document myself, calling Turkey or Nippers for
- this purpose. One object I had in placing Bartleby so handy to me behind
- the screen, was to avail myself of his services on such trivial
- occasions. It was on the third day, I think, of his being
- with me, and before any necessity had arisen for having his own writing
- examined, that, being much hurried to complete a small affair I had in
- hand, I abruptly called to Bartleby. In my haste and <a class="popup" href="javascript:void(0);" onclick="return overlib('According to his theory of management, when the boss says &quot;jump,&quot; his employees should say &quot;how high?&quot;', STICKY)" onmouseout="nd();">natural
- expectancy of instant compliance</a>, I sat with my head bent
- over the original on my desk, and my right hand sideways, and somewhat
- nervously extended with the copy, so that immediately upon emerging from
- his retreat, Bartleby might snatch it and proceed to business without
- the least delay.</p>
- <p>In this very attitude did I sit when I called to him, rapidly stating
- what it was I wanted him to do--namely, to examine a small paper with me.
- Imagine my surprise, nay, my consternation, when without moving from his
- privacy, Bartleby in a singularly <a class="popup" href="javascript:void(0);" onclick="return overlib('These would seem to be very significant adjectives and they are used frequently to describe his voice and demeanor', STICKY)" onmouseout="nd();">mild,
- firm voice</a>, replied,"I
- would prefer not to."
- </p>
- <p>I sat awhile in perfect silence, rallying my stunned faculties. Immediately
- it occurred to me that my ears had deceived me, or Bartleby had entirely
- misunderstood my meaning. I repeated my request in the clearest tone I
- could assume. But in quite as clear a one came the previous reply, "I would
- prefer not to."</p>
- <p>"Prefer not to," echoed I, rising in high excitement, and crossing the
- room with a stride, "What do you mean? Are you <a class="popup" href="javascript:void(0);" onclick="return overlib('i.e. &quot;looney&quot; (from &quot;lune-ey&quot;). For some reason, there is a common tie between the moon and mild madness! Actually it\'s the lawyer who seems to be &quot;struck,&quot; psychologically anyhow. Notice that the imagery of blows and thrusts (like fencing?) will be repeated. ', STICKY)" onmouseout="nd();">moon-struck</a>? I want you to help me
- compare this sheet here--take it," and I thrust it towards him.</p>
- <p>"I would prefer not to," said he.</p>
- <p>I looked at him steadfastly. His face was leanly composed; his gray eye
- dimly calm. Not a wrinkle of agitation rippled him. Had there been the
- least uneasiness, anger, impatience or impertinence in his manner; in other
- words, had there been any thing ordinarily
- human about him, doubtless <a class="popup" href="javascript:void(0);" onclick="return overlib('Perhaps this is standard business behavior (although the &quot;violence&quot; might not be).', STICKY)" onmouseout="nd();">I
- should have violently dismissed</a> him from the premises. But
- as it was, I should have as soon thought of turning my pale plaster-of-paris
- bust of Cicero out of doors. I stood gazing at him awhile,
- as he went on with his own writing, and then reseated myself at my desk.
- This is very strange, thought I. What had <a class="popup" href="javascript:void(0);" onclick="return overlib('Why does he use the impersonal pronoun here? After all, the real question is what should HE do. ', STICKY)" onmouseout="nd();">one</a> best do? But my business hurried
- me. I concluded to forget the matter for the present, reserving it for
- my future leisure. So calling Nippers from the other room, the paper was
- speedily examined.</p>
- <p>A few days after this, Bartleby concluded four lengthy documents, being
- quadruplicates of a week's testimony taken before me in my High Court of
- Chancery. It became necessary to examine them. It was an important suit,
- and great accuracy was imperative. Having all things arranged I called
- Turkey, Nippers and Ginger Nut from the next room, meaning to place the
- four copies in the hands of my four clerks, while I should read from the
- original. Accordingly Turkey, Nippers and Ginger Nut had taken their seats
- in a row, each with his document in hand, when I called to Bartleby to
- join this interesting
- group.</p>
- <p>"Bartleby! quick, I am waiting."</p>
- <p>I heard a low scrape of his chair legs on the unscraped floor, and soon
- he appeared standing at the entrance of his <a class="popup" href="javascript:void(0);" onclick="return overlib('A telling word which will be used repeatedly. A hermitage is a secluded or hidden residence, in which a hermit may reside (although not necessarily). But the seclusion was actually arranged by the lawyer, not Bartleby (so maybe it encourages his being a &quot;hermit&quot;?) ', STICKY)" onmouseout="nd();">hermitage.</a>
- </p>
- <p>"What is wanted?" said he mildly.</p>
- <p>"The copies, the copies," said I hurriedly. "We are going to examine them.
- There"--and I held towards him the fourth quadruplicate.</p>
- <p>"I would prefer not to," he said, and gently disappeared behind the screen.</p>
- <p>For a few moments I was turned into a
- pillar of salt, standing at the head of my seated column
- of clerks. Recovering myself, I <a class="popup" href="javascript:void(0);" onclick="return overlib('a military term again. Note that he advances to the screen, not to the man. ', STICKY)" onmouseout="nd();">advanced</a> towards the screen, and demanded
- the reason for such extraordinary conduct.</p>
- <p>"<i>Why</i> do you refuse?"</p>
- <p>"I would prefer not to."</p>
- <p>With any other man I should have flown
- outright into a dreadful passion, scorned all further words,
- and thrust him ignominiously from my presence. But there was something
- about Bartleby that not only strangely disarmed me, but in a wonderful
- manner touched and disconcerted me. I began to reason with him.</p>
- <p>"These are your own copies we are about to examine. It is labor saving
- to you, because one examination will answer for your four papers. <a class="popup" href="javascript:void(0);" onclick="return overlib('Just because something is &quot;common usage&quot;, does that make it humane or right?', STICKY)" onmouseout="nd();">It
- is common usage.</a> Every copyist is bound to help examine his
- copy. Is it not so? Will you not speak? Answer!"</p>
- <p>"I prefer not to," he replied in a flute-like tone. It seemed to me that
- while I had been addressing him, he carefully revolved every statement
- that I made; fully comprehended the meaning; could not gainsay the irresistible
- conclusion; but, at the same time, some paramount consideration prevailed
- with him to reply as he did.</p>
- <p>"You are decided, then, not to comply with my request--a request made
- according to common usage and common sense?"</p>
- <p>He briefly gave me to understand that on that point my
- judgment was sound. Yes: his decision was irreversible.</p>
- <p>It is not seldom the case that when a man is <a class="popup" href="javascript:void(0);" onclick="return overlib('Has he been browbeaten? (think about that word!) Why is he overreacting?', STICKY)" onmouseout="nd();">browbeaten</a> in some unprecedented and
- violently unreasonable way, he
- begins to stagger in his own plainest faith. He begins, as
- it were, vaguely to surmise that, wonderful as it may be, all the justice
- and all the reason is on the other side. Accordingly, if any disinterested
- persons are present, he turns to them for some reinforcement for his own
- <a class="popup" href="javascript:void(0);" onclick="return overlib('Note his response here of self-doubt. Why is that? Why would he then turn to support to his other employees, whom he does not appear to respect very much? Is there desperation in his appeal?', STICKY)" onmouseout="nd();">faltering mind.</a>
- </p>
- <p>"Turkey," said I, "what do you think of this? Am I not right?"</p>
- <p>"With submission, sir," said Turkey, with his blandest tone, "I think
- that you are."</p>
- <p>"Nippers," said I, "what do<i> you</i> think of it?"</p>
- <p>"I think I should kick him out of the office."</p>
- <p>(The reader of nice perceptions will here perceive that, it being morning,
- Turkey's answer is couched in polite and tranquil terms, but Nippers replies
- in ill-tempered ones. Or, to repeat a previous sentence, Nipper's ugly
- mood was on duty, and Turkey's off.)</p>
- <p>"Ginger Nut," said I, willing to enlist the smallest suffrage in my behalf,
- "what do<i> you</i> think of it?"</p>
- <p>"I think, sir, he's a little<i> luny</i>," replied Ginger Nut, with a
- grin.</p>
- <p>"You hear what they say," said I, turning towards the screen, "come forth
- and do
- your duty."</p>
- <p>But he vouchsafed no reply. I pondered a moment in sore perplexity. But
- once more business hurried me. I determined <a class="popup" href="javascript:void(0);" onclick="return overlib('This makes twice he decides to &quot;think about it.&quot; This will become a pattern in his response to Bartleby. ', STICKY)" onmouseout="nd();">again</a> to postpone the consideration
- of this dilemma to my future leisure. With a little trouble we made out
- to examine the papers without Bartleby, though at every page or two, Turkey
- deferentially dropped his opinion that this proceeding was quite out of
- the common; while Nippers, twitching in his chair with a dyspeptic nervousness,
- ground out between his set teeth occasional hissing maledictions against
- the stubborn oaf behind the screen. And for his (Nipper's) part, this was
- the first and the last time he would do another man's business without
- pay.</p>
- <p>Meanwhile Bartleby sat in his hermitage, oblivious to every thing but
- his own peculiar business there.</p>
- <p>Some days passed, the scrivener being employed upon another lengthy work.
- His late remarkable conduct led me to regard his way narrowly. I observed
- that he never went to dinner; indeed that he never went any where. As yet
- I had never of my personal knowledge known him to be outside of my office.
- He was a perpetual
- sentry in the corner. At about eleven o'clock though, in
- the morning, I noticed that Ginger Nut would advance toward the opening
- in Bartleby's screen, as if silently beckoned thither by a gesture invisible
- to me where I sat. That boy would then leave the office jingling a few
- pence, and reappear with a handful of ginger-nuts which he delivered in
- the hermitage, receiving two of the cakes for his trouble.</p>
- <p>He lives, then, on ginger-nuts, thought I; never eats a dinner, properly
- speaking; he must be a vegetarian then, but no; he never eats even vegetables,
- he <a class="popup" href="javascript:void(0);" onclick="return overlib('At this point he doesn\'t actually know that this is true, so why does he imagine that it is?', STICKY)" onmouseout="nd();">eats
- nothing but ginger-nuts</a>. My mind then ran on in reveries
- concerning the probable effects upon the human constitution of living entirely
- on ginger-nuts. Ginger-nuts are so called because they contain ginger as
- one of their peculiar constituents, and the final flavoring one. Now what
- was ginger? A hot, spicy thing. Was Bartleby hot and spicy? Not at all.
- Ginger, then, had no effect upon Bartleby. Probably
- he preferred it should have none.
- </p>
- <p>Nothing so aggravates an earnest person as a <a class="popup" href="javascript:void(0);" onclick="return overlib('Some readers see a reflection of Henry David Thoreau, author of &quot;Civil Disobedience,&quot; in this stance. However, Thoreau was not passive; he just did not act violently. He refused to compromise to the business world, choosing to live cheaply as possible so that he would be able to write.', STICKY)" onmouseout="nd();">passive
- resistance.</a> If the individual so resisted be of a not inhumane
- temper, and the resisting one perfectly harmless in his passivity; then,
- in the better moods of the former, he will endeavor charitably to construe
- to his imagination what proves impossible to be solved by
- his judgment. Even so, for the most part, I regarded Bartleby and his ways.
- Poor fellow! thought I, he means no mischief; it is plain he intends no
- insolence; his aspect sufficiently evinces that his eccentricities are
- involuntary. <a class="popup" href="javascript:void(0);" onclick="return overlib('This, of course, is the primary reason he keeps him at this point, not because of any respect or compassion.', STICKY)" onmouseout="nd();">He
- is useful to me</a>. I can get along with him. If I turn him
- away, the chances are he will fall in with some less indulgent employer,
- and then he will be rudely treated, and perhaps driven forth miserably
- to starve. Yes. Here I
- can cheaply purchase a delicious self-approval. To befriend
- Bartleby; to humor him in his strange willfulness, will cost me little
- or nothing, while I lay up in my soul what will eventually prove a <a class="popup" href="javascript:void(0);" onclick="return overlib('An interesting instance of food imagery!', STICKY)" onmouseout="nd();">sweet
- morsel</a> for my conscience. But this mood was not invariable
- with me. The passiveness of Bartleby sometimes irritated me. I felt strangely
- goaded on to encounter him in new opposition, to elicit some angry spark
- from him answerable to my own. But indeed I might as well have essayed
- to strike fire with my knuckles against a bit of Windsor
- soap. But one afternoon the evil impulse in me mastered
- me, and the following little scene ensued:</p>
- <p>"Bartleby," said I, "when those papers are all copied, I will compare
- them with you."</p>
- <p>"I would prefer not to."</p>
- <p>"How? Surely you do not mean to persist in that <a class="popup" href="javascript:void(0);" onclick="return overlib('so he\'s a mule? No wonder there is no answer to this insult. ', STICKY)" onmouseout="nd();">mulish
- vagary?</a>"</p>
- <p>No answer.</p>
- <p>I threw open the folding-doors near by, and turning upon Turkey and Nippers,
- exclaimed in an excited manner--</p>
- <p>"He says, a second time, he won't examine his papers. What do you think
- of it, Turkey?"</p>
- <p>It was afternoon, be it remembered. Turkey sat glowing like a brass boiler,
- his bald head steaming, his hands reeling among his blotted papers.</p>
- <p>"Think of it?" roared Turkey; "I think I'll just step behind his screen,
- and black his eyes for him!"</p>
- <p>So saying, Turkey rose to his feet and threw his arms into a pugilistic
- position. He was hurrying away to make good his promise,
- when I detained him, alarmed at the effect of incautiously rousing Turkey's
- combativeness after dinner.</p>
- <p>"Sit down, Turkey," said I, "and hear what Nippers has to say. What do
- you think of it, Nippers? Would I not be justified in immediately dismissing
- Bartleby?"</p>
- <p>"Excuse me, that is for you to decide, sir. I think his conduct quite
- unusual, and indeed unjust, as regards Turkey and myself. But it may only
- be a passing whim."</p>
- <p>"Ah," exclaimed I, "you have strangely changed your mind then--you speak
- very gently of him now."</p>
- <p>"All beer," cried Turkey; "gentleness is effects of beer--Nippers and
- I dined together to-day. You see how gentle I am, sir. Shall I go and black
- his eyes?"</p>
- <p>"You refer to Bartleby, I suppose. No, not to-day, Turkey," I replied;
- "pray, put up your fists."</p>
- <p>I closed the doors, and again advanced towards Bartleby. I felt additional
- incentives tempting me to my fate. <a class="popup" href="javascript:void(0);" onclick="return overlib('He is provoking Bartleby to fulfill some personal needs of his own. What might they be?', STICKY)" onmouseout="nd();">I
- burned to be rebelled against again.</a> I remembered that Bartleby
- never left the office.</p>
- <p>"Bartleby," said I, "Ginger Nut is away; just step round to the Post
- Office, won't you? (it was but a three minutes walk,) and
- see if there is any thing for me."</p>
- <p>"I would prefer not to."</p>
- <p>"You<i> will</i> not?"</p>
- <p>"I <i>prefer</i> not."</p>
- <p>I <a class="popup" href="javascript:void(0);" onclick="return overlib('He is clearly deeply shaken.', STICKY)" onmouseout="nd();">staggered</a> to my desk, and sat there
- in a deep study. My blind
- inveteracy returned. Was there any other thing in which I
- could procure myself to be <a class="popup" href="javascript:void(0);" onclick="return overlib('dishonorably, disgracefully. Evidently he is sensitive about being humiliated.', STICKY)" onmouseout="nd();">ignominiously</a> repulsed by this lean,
- penniless with?--my
- hired clerk? What added thing is there, perfectly reasonable,
- that he will be sure to refuse to do?</p>
- <p>"Bartleby!"</p>
- <p>No answer.</p>
- <p>"Bartleby," in a louder tone.</p>
- <p>No answer.</p>
- <p>"Bartleby," I roared.</p>
- <p>Like <a class="popup" href="javascript:void(0);" onclick="return overlib('There will be several references to him as ghostly, perhaps showing death-in-life.', STICKY)" onmouseout="nd();">a
- very ghost</a>, agreeably to the laws of magical invocation,
- at the third summons, he appeared at the entrance of his hermitage.</p>
- <p>"Go to the next room, and tell Nippers to come to me."</p>
- <p>"I prefer not to," he respectfully
- and slowly said, and mildly disappeared.</p>
- <p>"Very good, Bartleby," said I, in a quiet sort of serenely severe self-possessed
- tone, intimating the unalterable purpose of some <a class="popup" href="javascript:void(0);" onclick="return overlib('What could he have in mind? Oh well, he\'s hungry and doesn\'t want to bother punishing Bartleby.', STICKY)" onmouseout="nd();">terrible
- retribution</a> very close at hand. At the moment I half intended
- something of the kind. But upon the whole, as it was drawing towards my
- dinner-hour, I thought it best to put on my hat and walk home for the day,
- suffering much from perplexity and distress of mind.</p>
- <p> <a class="popup" href="javascript:void(0);" onclick="return overlib('Here he is openly appealing to the reader, perhaps even confessing. Is this whole story an effort to justify what he has done?', STICKY)" onmouseout="nd();">Shall
- I acknowledge it?</a> The conclusion of this whole business was
- that it soon became a fixed fact of my chambers, that a pale young scrivener,
- by the name of Bartleby, had a desk there; that he copied for me at the
- usual rate of four
- cents a folio (one hundred words); but he was permanently
- exempt from examining the work done by him, that duty being transferred
- to Turkey and Nippers, one of compliment doubtless to their superior acuteness;
- moreover, said Bartleby was never on any account to be dispatched on the
- most trivial errand of any sort; and that even if entreated to take upon
- him such a matter, it was generally understood that he would prefer not
- to--in other words, that he would refuse <a class="popup" href="javascript:void(0);" onclick="return overlib('Though he certainly refuses, is it &quot;point blank&quot;? ', STICKY)" onmouseout="nd();">point-blank.</a>
- </p>
- <p>32 As days passed on, I became considerably reconciled to Bartleby. His
- steadiness, his freedom from all dissipation, his incessant industry (except
- when he chose to throw himself into a standing revery behind his screen),
- his great stillness, his unalterableness of demeanor under all circumstances,
- made him a
- valuable acquisition. One prime thing was this,--he was
- always there;--first in the morning, continually through the day, and the
- last at night. I had a singular confidence in his honesty. I felt my most
- precious papers perfectly safe in his hands. Sometimes to be sure I could
- not, <a class="popup" href="javascript:void(0);" onclick="return overlib('what a curious statement! Is Bartleby in some way connected with the lawyer\'s soul?', STICKY)" onmouseout="nd();">for
- the very soul of me</a>, avoid falling into sudden spasmodic
- passions with him. For it was exceeding difficult to bear in mind all the
- time those strange peculiarities, privileges, and unheard of exemptions,
- forming the tacit stipulations on Bartleby's part under which he remained
- in my office. Now and then, in the eagerness of dispatching pressing business,
- I would inadvertently summon Bartleby, in a short, rapid tone, to put his
- finger, say, on the incipient tie of a bit of red tape with which I was
- about compressing some papers. Of course, from behind the screen the usual
- answer, "I prefer not to," was sure to come; and then, how
- could a human creature with the common infirmities of our
- nature, refrain from bitterly exclaiming upon such perverseness--such unreasonableness.
- However, every added repulse of this sort which I received only <a class="popup" href="javascript:void(0);" onclick="return overlib('Bartleby seems to be conditioning him very well. ', STICKY)" onmouseout="nd();">tended
- to lessen</a> the probability of my repeating the inadvertence.</p>
- <p>Here is must be said, that according to the custom of most legal gentlemen
- occupying chambers in densely-populated law buildings, there were several
- keys to my door. One was kept by a woman residing in the attic, which person
- weekly scrubbed and daily swept and dusted my apartments. Another was kept
- by Turkey for convenience sake. The third I sometimes carried in my own
- pocket. The fourth I knew not who had.</p>
- <p>Now, one Sunday morning I happened to go to Trinity Church, to
- hear a celebrated preacher, and finding myself rather early
- on the ground, I thought I would walk round to my chambers for a while.
- Luckily I had my key with me; but upon applying it to the lock, I found
- it resisted by something inserted from the inside. Quite surprised, I called
- out; when to my consternation a key was turned from within; and thrusting
- his lean visage at me, and holding the door ajar, <a class="popup" href="javascript:void(0);" onclick="return overlib('Recall that he has already called him a ghost', STICKY)" onmouseout="nd();">the
- apparition</a> of Bartleby appeared, in his shirt sleeves, and
- otherwise in a strangely tattered dishabille, saying quietly that he was
- sorry, but he was deeply engaged just then, and--preferred not admitting
- me at present. In a brief word or two, he moreover added, that perhaps
- I had better walk round the block two or three times, and by that time
- he would probably have concluded his affairs. Now, the utterly unsurmised
- appearance of Bartleby, tenanting my law-chambers of a Sunday
- morning, with his <a class="popup" href="javascript:void(0);" onclick="return overlib('This description adds to the idea of Bartleby as being somehow a &quot;living dead&quot; person.', STICKY)" onmouseout="nd();">cadaverously</a> gentlemanly nonchalance,
- yet withal firm and self-possessed, had such a strange effect upon me,
- that incontinently I slunk away from my own door, and did as desired. But
- not without sundry twinges of impotent rebellion against the mild effrontery
- of this unaccountable scrivener. Indeed, it was his wonderful mildness
- chiefly, which not only disarmed me, but unmanned me, as it were. For I consider
- that one, for the time, is a sort of unmanned when he tranquilly permits
- his hired clerk to dictate to him, and <a class="popup" href="javascript:void(0);" onclick="return overlib('Was what Bartleby said an &quot;order&quot;? Or does he just take it that way because his &quot;inferior&quot; is not showing proper respect for his property and rights?', STICKY)" onmouseout="nd();">order
- him</a> away from his own premises. Furthermore, I was full of
- uneasiness as to what Bartleby could possibly be doing in my office in
- his shirt sleeves, and in an otherwise dismantled condition of a Sunday
- morning. Was any thing amiss going on? Nay, that was out of the question.
- It was not to be thought of for a moment that Bartleby was an immoral person.
- But what could he be doing there?--copying? Nay again, whatever might be
- his eccentricities, Bartleby was an eminently decorous person. He would
- be the last man to sit down to his desk in any state approaching to nudity.
- Besides, it was Sunday; and there was something about Bartleby that forbade
- the supposition that we would by any secular occupation violate the
- proprieties of the day.</p>
- <p>Nevertheless, my mind was not pacified; and full of a restless curiosity,
- at last I returned to the door. Without hindrance I inserted my key, opened
- it, and entered. Bartleby was not to be seen. I looked round anxiously,
- peeped behind his screen; but it was very plain that he was gone. Upon
- more closely examining the place, I surmised that for an indefinite period
- Bartleby must have ate, dressed, and slept in my office, and that too without
- plate, mirror, or bed. The cushioned seat of a rickety old sofa in one
- corner bore t faint impress of a lean, reclining form. Rolled away under
- his desk, I found a blanket; under the empty grate, a blacking box and
- brush; on a chair, a tin basin, with soap and a ragged towel; in a newspaper
- a few crumbs of ginger-nuts and a morsel of cheese. Yet, thought I, it
- is evident enough that Bartleby has been making his home here, keeping
- <a class="popup" href="javascript:void(0);" onclick="return overlib('Presumably the lawyer is also a bachelor. They may have more in common than immediately appears to be! Both are probably well acquainted with loneliness.', STICKY)" onmouseout="nd();">bachelor's hall</a>all by himself. Immediately then the thought came sweeping
- across me, What miserable friendlessness and loneliness are here revealed!
- His poverty is great; but his solitude, how
- horrible! Think of it. Of a Sunday, Wall-street is deserted
- as <a class="popup" href="javascript:void(0);" onclick="return overlib('an ancient ruined city', STICKY)" onmouseout="nd();">Petra</a>; and every night of every day
- it is an emptiness. This building too, which of week-days hums with industry
- and life, at nightfall echoes with sheer vacancy, and all through Sunday
- is forlorn. And here Bartleby makes his home; sole spectator of a solitude
- which he has seen all populous--a sort of innocent and transformed Marius
- brooding among the ruins of Carthage!
- </p>
- <p>For the <a class="popup" href="javascript:void(0);" onclick="return overlib('The lawyer is changing, having feelingsof melancholy (about the human condition?) he never admitted to himself before.', STICKY)" onmouseout="nd();">first
- time in my life</a> a feeling of overpowering stinging melancholy
- seized me. Before, I had never experienced aught but a not-unpleasing sadness.
- The bond of a common humanity now drew me irresistibly to gloom. A fraternal
- melancholy! For both I and Bartleby were sons
- of Adam. I remembered the bright silks and sparkling faces
- I had seen that day in gala trim, swan-like sailing down the Mississippi
- of Broadway; and I contrasted them with the pallid copyist, and thought
- to myself, Ah, happiness courts the light, so we deem the world is gay;
- but misery hides aloof, so we deem that misery there is none. These sad
- fancyings-- <a class="popup" href="javascript:void(0);" onclick="return overlib('fancies, illusions', STICKY)" onmouseout="nd();">chimeras</a>, doubtless, of a sick and
- silly brain--led on to other and more special thoughts, concerning the
- eccentricities of Bartleby. Presentiments of strange discoveries hovered
- round me. The scrivener's pale form appeared to me laid
- out, among uncaring strangers, in its shivering winding
- sheet.</p>
- <p>Suddenly I was attracted by Bartleby's closed desk, the key in open sight
- left in the lock.</p>
- <p> <a class="popup" href="javascript:void(0);" onclick="return overlib('Again, he is quite defensive before the reader. Isn\'t he invading Bartleby\'s territory? Or is he justified in poking around his desk? Does that explain the change that will come in Bartleby?', STICKY)" onmouseout="nd();">I
- mean no mischief, </a>seek the gratification of no heartless
- curiosity, thought I; besides, the desk is mine, and its contents too,
- so I will make bold to look within. Every thing was methodically arranged,
- the papers smoothly placed. The pigeon holes were deep, and removing the
- files of documents, I groped into their recesses. Presently I felt something
- there, and dragged it out. It was an old bandanna handkerchief, heavy and
- knotted. I opened it, and saw it was a savings' bank.</p>
- <p>I now recalled all the quiet mysteries which I had noted in the man. I
- remembered that he never spoke but to answer; that though at intervals
- he had considerable time to himself, yet I had never seen him reading--no,
- not even a newspaper; that for long periods he would stand looking out,
- at his pale window behind the screen, upon the dead brick wall; I was quite
- sure he never visited any refectory or eating house; while his pale face
- clearly indicated that he never drank beer like Turkey, or tea and coffee
- even, like other men; that he never went any where in particular that I
- could learn; never went out for a walk, unless indeed that was the case
- at present; that he had declined telling who he was, or whence he came,
- or whether he had any relatives in the world; that though so thin and pale,
- he never complained of ill health. And more than all, I remembered a certain
- unconscious air of pallid--how shall I call it?--of pallid
- haughtiness, say, or rather an austere reserve about him,
- which had positively awed me into my tame compliance with his eccentricities,
- when I had feared to ask him to do the slightest incidental thing for me,
- even though I might know, from his long-continued motionlessness, that
- behind his screen he must be standing in one of those <a class="popup" href="javascript:void(0);" onclick="return overlib('This is the first time he seems to have personally confronted the &quot;view&quot; that Bartleby sees, as well as its significance. He has evidently been watching Bartleby closely in his &quot;hermitage.&quot; ', STICKY)" onmouseout="nd();">dead-wall
- reveries</a> of his.</p>
- <p>Revolving all these things, and coupling them with the recently discovered
- fact that he made my office his constant abiding place and home, and not
- forgetful of his morbid moodiness; revolving all these things, a prudential
- feeling began to steal over me. My first emotions had been
- those of pure melancholy and sincerest pity; but just in proportion as
- the forlornness of Bartleby grew and grew to my imagination, did that same
- melancholy merge into <a class="popup" href="javascript:void(0);" onclick="return overlib('What is it that he is afraid of?', STICKY)" onmouseout="nd();">fear</a>, that pity into repulsion. So
- true it is, and so terrible too, that up to a certain point the thought
- or sight of misery enlists our best affections; but, in certain special
- cases, beyond that point it does not. They err who would assert that invariably
- this is owing to the inherent selfishness of the human heart. It rather
- proceeds from a certain hopelessness of remedying excessive and organic
- ill. To a sensitive being, pity is not seldom pain. And when at last it
- is perceived that such pity cannot lead to effectual succor, common sense
- bids the soul be rid of it. What I saw that morning persuaded me that the
- scrivener was the victim of
- innate and incurable disorder. I might give alms to his body;
- but his body did not pain him; it was his soul that suffered, and <a class="popup" href="javascript:void(0);" onclick="return overlib('This is a touching sentence, and probably an accurate observation of Bartleby\'s state. What is interesting is that the lawyer wishes, even desperately, to somehow touch his soul. Is it because his own soul is tied up in Bartleby\'s condition at this point? ', STICKY)" onmouseout="nd();">his
- soul I could not reach.</a>
- </p>
- <p>I did not accomplish the purpose of going to Trinity Church that morning.
- Somehow, the
- things I had seen disqualified me for the time from church-going.
- I walked homeward, thinking what I would do with Bartleby. Finally, I
- <a class="popup" href="javascript:void(0);" onclick="return overlib('He\'s quite happy that he\'s found a &quot;reasonable&quot; yet compassionate solution to this problem--fire him with severance pay and a promise of a recommendation. Yet he has just concluded that Bartleby\'s problems are not of the body but the soul. Why would he think this could possibly work?', STICKY)" onmouseout="nd();">resolved</a>upon this;--I would put certain calm questions to him the
- next morning, touching his history, &amp;c., and if he declined to answer
- then openly and reservedly (and I supposed he would prefer not), then to
- give him a twenty dollar bill over and above whatever I might owe him,
- and tell him his services were no longer required; but that if in any other
- way I could assist him, I would be happy to do so, especially if he desired
- to return to his native place, wherever that might be, I would willingly
- help to defray the expenses. Moreover, if after reaching home, he found
- himself at any time in want of aid, a letter from him would be sure of
- a reply.</p>
- <p>The next morning came.</p>
- <p>"Bartleby," said I, gently calling to him behind the screen.</p>
- <p>No reply.</p>
- <p>"Bartleby," said I, in a still gentler tone, "come here; I am not going
- to ask you to do any thing you would prefer not to do--I simply wish to
- speak to you."</p>
- <p>Upon this he noiselessly slid into view.</p>
- <p>"Will you tell me, Bartleby, where
- you were born?"
- </p>
- <p>"I would prefer not to."</p>
- <p>"Will you tell me <i>anything </i>about yourself?"</p>
- <p>"I would prefer not to."</p>
- <p>"But what <a class="popup" href="javascript:void(0);" onclick="return overlib('Again, there\'s emphasis on &quot;reason.&quot; Yet people--even the lawyer--often behave from unreasonable motivation (see his prudence and his consciousness of appearances, for example).', STICKY)" onmouseout="nd();">reasonable
- objection</a> can you have to speak to me? I feel friendly towards
- you."</p>
- <p>He did not look at me while I spoke, but kept his glance fixed upon my
- bust of Cicero, which as I then sat, was directly behind me, some
- six inches above my head. "What is your answer, Bartleby?" said I, after
- waiting a considerable time for a reply, during which his countenance remained
- immovable, only there was the <a class="popup" href="javascript:void(0);" onclick="return overlib('Bartleby\'s first expression of emotion. What do you think has caused this? ', STICKY)" onmouseout="nd();">faintest
- conceivable tremor</a> of the white attenuated mouth.</p>
- <p>"At present I prefer to give no answer," he said, and retired into his
- hermitage.</p>
- <p>It was rather weak in me I confess, but his manner on this occasion nettled
- me. Not only did there seem to lurk in it a certain disdain, but his
- perverseness seemed ungrateful, considering the undeniable
- good usage and indulgence he had received from me.</p>
- <p>Again I sat ruminating what I should do.<a class="popup" href="javascript:void(0);" onclick="return overlib('Very upset (but note that he uses a word with the Latin word for &quot;death&quot; in it)', STICKY)" onmouseout="nd();">Mortified</a> as I was at his behavior,
- and resolved as I had been to dismiss him when I entered my office, nevertheless
- I strangely felt something superstitious knocking at my heart, and forbidding
- me to carry out my purpose, and denouncing me for a villain if I dared
- to breathe one bitter word against this forlornest of mankind. At last,
- familiarly drawing my chair behind his screen, I sat down and said: "Bartleby,
- never mind then about revealing your history; but let me entreat you,
- as a friend, to comply as far as may be with the usages of this office.
- Say now you will help to examine papers tomorrow or next day: in short,
- say now that in a day or two you will begin to be a little reasonable:--say
- so, Bartleby."</p>
- <p>"At present I would prefer not to be a little <a class="popup" href="javascript:void(0);" onclick="return overlib('Note the repetition and linking of these words.', STICKY)" onmouseout="nd();">reasonable
- was his idly cadaverous reply.</a>,"</p>
- <p>Just then the folding-doors opened, and Nippers approached. He seemed
- suffering from an unusually bad night's rest, induced by severer indigestion
- than common. He overheard those final words of Bartleby.</p>
- <p><i>"Prefer</i> not,
- eh?" gritted Nippers--"I'd<i> prefer</i> him, if I were you, sir," addressing
- me--"I'd <i>prefer</i> him; I'd give him preferences, the stubborn mule!
- What is it, sir, pray, that he <i>prefers</i> not to do now?"</p>
- <p>Bartleby moved not a limb.</p>
- <p><a class="popup" href="javascript:void(0);" onclick="return overlib('This is the first time that the lawyer uses Bartleby&quot;s phrase in the story.', STICKY)" onmouseout="nd();">"Mr.
- Nippers," said I, "I'd prefer that you would withdraw for the present."</a>
- </p>
- <p>Somehow, of late I had got into the way of involuntary using this word
- "prefer" upon all sorts of not exactly suitable occasions. And I trembled
- to think that my contact with the scrivener had already and seriously affected
- me in a mental way. And what further and deeper aberration might it not yet produce?
- This apprehension had not been without <a class="popup" href="javascript:void(0);" onclick="return overlib('effectiveness. Why is this sentence so complicated? Is he trying to avoid saying exactly what he means?', STICKY)" onmouseout="nd();">efficacy</a> in determining me to summary
- means.</p>
- <p>As Nippers, looking very sour and sulky, was departing, Turkey blandly
- and deferentially approached.</p>
- <p>"With submission, sir," said he, "yesterday I was thinking about Bartleby
- here, and I think that if he would but prefer to take a quart of good ale
- every day, it would do much towards mending him, and enabling him to assist
- in examining his papers."</p>
- <p>"So you have got the word too," said I, slightly excited.</p>
- <p>"With submission, what word, sir," asked Turkey, respectfully crowding
- himself into the contracted space behind the screen, and by so doing, making
- me jostle
- the scrivener. "What word, sir?"</p>
- <p>"I would prefer to be left alone here," said Bartleby, as if offended
- at being <a class="popup" href="javascript:void(0);" onclick="return overlib('In a sense, Bartleby is being ridiculed. Turkey doesn\'t seem to have any idea that he has adopted the word--or the concept of preferring.', STICKY)" onmouseout="nd();">mobbed
- in his privacy.</a>
- </p>
- <p>"<i>That's</i> the word, Turkey," said I--<i>"that's</i> it."</p>
- <p>"Oh,<i> prefer</i> oh yes--queer word. I never use it myself. But, sir
- as I was saying, if he would but prefer--"</p>
- <p>"Turkey," interrupted I, "you will please withdraw."</p>
- <p>"Oh, certainly, sir, if
- you prefer that I should."</p>
- <p>As he opened the folding-door to retire, Nippers at his desk caught a
- glimpse of me, and asked whether I would prefer to have a certain paper
- copied on blue paper or white. He did not in the least roguishly accent
- the word prefer. It was plain that it involuntarily rolled from his tongue.
- I thought to myself, surely I must get rid of a <a class="popup" href="javascript:void(0);" onclick="return overlib(' By this definition, is Bartleby &quot;demented&quot;? Just because others start picking up his phrase? (Then we are all in trouble!) But this is a man who loves order and hierarchy; all of a sudden, his employees are getting quite &quot;uppity&quot; and hard to control.', STICKY)" onmouseout="nd();">demented</a> man, who already has in some
- degree turned the tongues, if not the heads of myself and clerks. But I
- thought it prudent not to break the dismission
- at once.</p>
- <p>The next day I noticed that <a class="popup" href="javascript:void(0);" onclick="return overlib('Obviously the intrusive encounter of the previous day has turned Bartleby\'s polite defiance into a fatal direction. Do you think he would have continued to work as before had the lawyer not confronted him?', STICKY)" onmouseout="nd();">Bartleby
- did nothing </a>but stand at his window in his dead-wall revery.
- Upon asking him why he did not write, he said that he had decided upon
- doing no more writing.</p>
- <p>"Why, how now? what next?" exclaimed I, "do no more writing?"</p>
- <p>"No more."</p>
- <p>"And what is the reason?"</p>
- <p>"Do
- you not see the reason for yourself," he indifferently replied.</p>
- <p>I looked steadfastly at him, and perceived that his eyes looked dull and
- glazed. Instantly it occurred to me, that his unexampled diligence in copying
- by his dim window for the first few weeks of his stay with me might have
- temporarily <a class="popup" href="javascript:void(0);" onclick="return overlib('He immediately assumes that the problem is a physical one. Evidently his understanding of &quot;seeing&quot; is quite different from Bartleby\'s. Note that Bartleby is now the one talking about &quot;reason.&quot; Why does he say it &quot;indifferently&quot;? Does he know the answer?', STICKY)" onmouseout="nd();">impaired
- his vision</a>.</p>
- <p>I was touched. I said something in condolence with him. I hinted that
- of course he did wisely in abstaining from writing for a while; and urged
- him to embrace that opportunity of taking wholesome exercise in the open
- air. This, however, he
- did not do. A few days after this, my other clerks being
- absent, and being in a great hurry to dispatch certain letters by the mail,
- I thought that, having nothing else earthly to do, Bartleby would surely
- be less inflexible than usual, and carry these letters <a class="popup" href="javascript:void(0);" onclick="return overlib('again, he wants to send him here. He seems desperate to get Bartleby out of the office, but Bartleby refuses to go anywhere. ', STICKY)" onmouseout="nd();">to
- the post-office</a>. But he blankly declined. So, much to my
- inconvenience, I went myself.</p>
- <p>Still added
- days went by. Whether Bartleby's eyes improved or not, I
- could not say. To all appearance, I thought they did. But when I asked
- him if they did, he vouchsafed no answer. At all events, he would do no
- copying. At last, in reply to my urgings, he informed me that he had permanently
- given up copying.</p>
- <p>"What!" exclaimed I; "suppose your eyes should get entirely well- better
- than ever before--would you not copy then?"</p>
- <p>"I have given up copying," he answered, and <a class="popup" href="javascript:void(0);" onclick="return overlib('No direct confrontation here! This action seems to reflect the willingness of the lawyer to &quot;let things slide&quot; also. ', STICKY)" onmouseout="nd();">slid
- aside.</a>
- </p>
- <p>He remained as ever, a
- fixture in my chamber. Nay--if that were possible--he became
- still more of a fixture than before. What was to be done? He would do nothing
- in the office: why should he stay there? In plain fact, he had now become
- a millstone to me, not only useless as a necklace, but afflictive to bear.
- Yet I was sorry for him. I speak less than truth when I say that, on his
- own account, he occasioned me uneasiness. If he would but have named a
- single relative or friend, I would instantly have written, and urged their
- taking the poor fellow away to some convenient retreat. But he seemed alone,
- absolutely alone in the universe. <a class="popup" href="javascript:void(0);" onclick="return overlib('Again the image of ruin and utter loneliness. Yet Bartleby is in a busy office, separated only by a green &quot;wall&quot; of a screen. The narrator seems to be overdramatizing; why might that be? ', STICKY)" onmouseout="nd();">A
- bit of wreck&lt;</a>/font&gt; in the mid Atlantic. At length,
- necessities connected with my business tyrannized over all other considerations.
- Decently as I could, I told Bartleby that in six days' time he must unconditionally
- leave the office. I warned him to take measures, in the interval, for procuring
- some other abode. I offered to assist him in this endeavor, if he himself
- would but take the first step towards a removal. "And when you finally
- quit me, Bartleby," added I, "I shall see that you go not away entirely
- unprovided. Six days from this hour, remember."</p>
- <p>At the expiration of that period, I peeped behind the screen, and lo!
- Bartleby was there.
- </p>
- <p>I <a class="popup" href="javascript:void(0);" onclick="return overlib('and his courage! This is not easy for him. ', STICKY)" onmouseout="nd();">buttoned
- up my coat</a>, balanced myself; advanced slowly towards him,
- touched his shoulder, and said, "The time has come; you must quit this
- place; I am sorry for you; here is money; but you must go."</p>
- <p>"I would prefer not," he replied, with his back still towards me.</p>
- <p>"You<i> must</i>."</p>
- <p>He remained silent.</p>
- <p>Now I had an unbounded confidence in this man's common honesty. He had
- frequently restored to me six pences and shillings carelessly dropped upon
- the floor, for I am apt to be very reckless in such shirt-button
- affairs. The proceeding then which followed will not be
- deemed extraordinary. "<a class="popup" href="javascript:void(0);" onclick="return overlib('This sounds like a speech he has practiced for some time. In fact, he seems rather proud that he has wrapped up the situation, and Bartleby, paid him off and kept his conscience clean.', STICKY)" onmouseout="nd();">Bartleby,"
- said I, "I owe you twelve dollars on account; here are thirty-two; the
- odd twenty are yours.--Will you take it?</a> and I handed the
- bills towards him.</p>
- <p>But he made no motion.</p>
- <p>"I will leave them here then," putting them under a weight on the table.
- Then taking my hat and cane and going to the door I tranquilly turned and
- added--"After you have removed your things from these offices, Bartleby,
- you will of course lock the door--since every one is now gone for the day
- but you--and if you please, slip your key underneath the mat, so that I
- may have it in the morning. I shall not see you again; so good-bye to you.
- If hereafter in your new place of abode I can be of any service to you,
- do not fail to advise me by letter. Good-bye, Bartleby, and fare you well."</p>
- <p>But he answered not a word; like the
- last column of some ruined temple, he remained standing
- mute and solitary in the middle of the otherwise deserted room.</p>
- <p>As I walked home in a pensive mood, my <a class="popup" href="javascript:void(0);" onclick="return overlib('These two emotions have been very prominent in his relation with Bartleby. He is extremely proud of what he has done. &quot;Masterly&quot; seems very significant, as he feels he has established his rightful authority over Bartleby and mollified his conscience with the money.', STICKY)" onmouseout="nd();">vanity
- got the better of my pity</a>. I could not but highly plume
- myself on my masterly management in getting rid of Bartleby. Masterly I
- call it, and such it must appear to any dispassionate thinker. The beauty
- of my procedure seemed to consist in its perfect quietness. There was
- no vulgar bullying, no bravado of any sort, no choleric hectoring
- and striding to and fro across the apartment, jerking out vehement commands
- for Bartleby to bundle himself off with his beggarly traps. Nothing of
- the kind. Without loudly bidding Bartleby depart--as <a class="popup" href="javascript:void(0);" onclick="return overlib('Wow, he IS proud of himself. Such pride &quot;goeth before a fall.&quot;', STICKY)" onmouseout="nd();">an
- inferior genius</a> might have done--I assumed the ground that
- depart he must; and upon the assumption built all I had to say. The more
- I thought over my procedure, the more I was charmed with it. Nevertheless,
- next morning, upon awakening, I had my doubts,--I had somehow slept off
- the fumes of vanity. One of the coolest and wisest hours a man has, is
- just after he awakes in the morning. My procedure seemed as sagacious as
- ever,--but only in theory. How it would prove in practice--there was the
- rub. It was truly a beautiful thought to have assumed Bartleby's departure;
- but, after all, that assumption was simply my own, and none of Bartleby's.
- The great point was, not whether I had assumed that he would quit me, but
- whether he would prefer so to do. He was more a man
- of preferences than assumptions.</p>
- <p>After breakfast, I walked down town, arguing the probabilities pro and
- con. One moment I thought it would prove a miserable failure, and Bartleby
- would be found all alive at my office as usual; the next moment it seemed
- certain that I should see his chair empty. And so I kept veering about.
- At the corner of Broadway and Canal- street, I saw quite an excited group
- of people standing in earnest conversation.</p>
- <p>"I'll take odds he doesn't," said a voice as I passed.</p>
- <p>"Doesn't go?--done!" said I, "put up your money."</p>
- <p>I was instinctively putting my hand in my pocket to produce my own, when
- I remembered that this was an election day. The words I had overheard bore
- no reference to Bartleby, but to the success or non-success of some candidate
- for the mayoralty. In my intent frame of mind, I had, as it were, <a class="popup" href="javascript:void(0);" onclick="return overlib('His obsession with Bartleby has led him to assume it is shared by everyone.', STICKY)" onmouseout="nd();">imagined
- that all Broadway shared in my excitement</a>, and were debating
- the same question with me. I passed on, very thankful that the uproar of
- the street screened my momentary absent-mindedness.</p>
- <p>As I had intended, I was earlier than usual at my office door. I stood
- listening for a moment. All was still. He must be gone. I tried the knob.
- The door was locked. Yes, my procedure had worked to a charm; he indeed
- must be vanished. Yet a certain melancholy mixed with this: I was almost
- sorry for my brilliant success. I was fumbling under the
- door mat for the key, which Bartleby was to have left there for me, when
- accidentally my knee knocked against a panel, producing a summoning sound,
- and in response a voice came to me from within--"Not yet; I am occupied."</p>
- <p>It was Bartleby.</p>
- <p>I was thunderstruck. For an instant I stood <a class="popup" href="javascript:void(0);" onclick="return overlib('This happened at Berkeley plantation to the young statesman, Benjamin Harrison. He was holding a child and another was hanging on to his leg as he lowered a window; all were killed by the lightning. Perhaps Melville knew this story.', STICKY)" onmouseout="nd();">like
- the man who, pipe in mouth, was killed</a> one cloudless afternoon
- long ago in Virginia, by summer lightning; at his own warm open window
- he was killed, and remained leaning out there upon the dreamy afternoon,
- till some one touched him, when he fell. "Not gone!" I murmured at last.
- But again obeying that wondrous
- ascendancy which the inscrutable scrivener had over me, and
- from which ascendancy, for all my chafing, I could not completely escape,
- I slowly went down stairs and out into the street, and while walking round
- the block, considered what I should next do in this unheard-of-perplexity.
- Turn the man out by an actual thrusting I could not; to drive him away
- by calling him hard names would not do; calling in the police was an unpleasant
- idea; and yet, <a class="popup" href="javascript:void(0);" onclick="return overlib('Here it becomes quite clear that this has been a power struggle, and that Bartleby in some way is winning. Yet he is &quot;cadaverous,&quot; deathlike. Does he represent a death-in-life? Is this what terrifies the lawyer?', STICKY)" onmouseout="nd();">permit
- him</a> to enjoy his cadaverous triumph over me,--this too I
- could not think of. What was to be done? or, if nothing could be done,
- was there any thing further that I could assume in the matter? Yes, as before
- I had prospectively assumed that Bartleby would depart, so now I might
- retrospectively assume that departed he was. In the legitimate carrying
- out of this assumption, I might enter my office in a great hurry, and pretending
- not to see Bartleby at all, walk straight against him as if he were air.
- Such a proceeding would in a singular degree have the appearance of a
- <a class="popup" href="javascript:void(0);" onclick="return overlib('This is the second time this word has been used in the paragraph. Some readers see sexual undertones in this struggle between the two. Or it could be military imagery again (the thrust of the sword?) ', STICKY)" onmouseout="nd();">home-thrust</a>. It was hardly possible that Bartleby could withstand
- such an application of the doctrine of assumptions. But upon second thoughts
- the success of the plan seemed rather dubious. I resolved to argue the
- matter over with him again.</p>
- <p>Bartleby," said I, entering the office, with a quietly severe expression.
- "I am seriously displeased. I am pained, Bartleby. I had thought better
- of you. I had imagined you of such a gentlemanly
- organization, that in any delicate dilemma a slight hint
- would suffice--in short, an assumption. But it appears I am deceived. Why,"
- I added, <a class="popup" href="javascript:void(0);" onclick="return overlib('His shock at seeing the money lying there shows that he just now realizes that he cannot buy Bartleby off.', STICKY)" onmouseout="nd();">unaffectedly
- starting</a>, "you have not even touched the money yet," pointing
- to it, just where I had left it the evening previous.</p>
- <p>He answered nothing.</p>
- <p>"Will you, or will you not, quit me?" I now demanded in a sudden
- passion, advancing close to him.</p>
- <p>"I would prefer <i>not</i> to quit you," he replied, <a class="popup" href="javascript:void(0);" onclick="return overlib('Notice the contrasting emotion here. In fact, the word &quot;gentle&quot; has been applied to him several times already. He is no raving maniac!', STICKY)" onmouseout="nd();">gently
- emphasizing</a> the<i> not</i>.</p>
- <p>"What earthly
- right have you to stay here? do you pay any rent? Do you
- pay my taxes? Or is this property yours?"</p>
- <p>He answered nothing.</p>
- <p>"Are you ready to go on and write now? Are your eyes recovered? Could
- you copy a small paper for me this morning? or help examine a few lines?
- or step round to the post-office? In a word, will you do any thing at all,
- to give a coloring to your refusal to depart the premises?"</p>
- <p>He <a class="popup" href="javascript:void(0);" onclick="return overlib('Bartleby has no answer to these questions because he does not recognize their validity. Note that hermitage is used again. ', STICKY)" onmouseout="nd();">silently
- retired into his hermitage</a>.</p>
- <p>I was now in such a state of nervous resentment that I thought it but
- prudentto check myself at present from further demonstrations. Bartleby
- and I were alone. <a class="popup" href="javascript:void(0);" onclick="return overlib('The printer Samuel Adams was ax murdered by John C. Colt in 1841 when Adams tried to collect a debt. Colt apparently crated Adams\'s body to ship to New Orleans. Shortly before he was scheduled to hang, he married his mistress in his jail cell and was found stabbed to death soon afterward. Colt would seem to have led a far more interesting life than the lawyer!', STICKY)" onmouseout="nd();">I
- remembered</a> the tragedy of the unfortunate Adams and the still
- more unfortunate Colt in the solitary office of the latter; and how poor
- Colt, being dreadfully incensed by Adams, and imprudently permitting himself
- to get wildly excited, was at unawares hurried into his fatal
- act--an act which certainly <a class="popup" href="javascript:void(0);" onclick="return overlib('This is his assumption; there\'s no particular evidence that it was true for Colt (as it would have been true for the lawyer had he done something similar).', STICKY)" onmouseout="nd();">no
- man could possibly deplore</a> more than the actor himself. Often
- it had occurred to me in my ponderings upon the subject, that had
- that altercation taken place in the public street, or at a private residence,
- it would not have terminated as it did. It was the circumstance of being
- alone in a solitary office, up stairs, of a building entirely unhallowed
- by humanizing domestic associations--an <a class="popup" href="javascript:void(0);" onclick="return overlib('Undoubtedly he sees parallels here. He seems to be learning how to imagine a situation of someone quite different from himself very vividly. ', STICKY)" onmouseout="nd();">uncarpeted
- office</a>, doubtless of a dusty, haggard sort of appearance;--this
- it must have been, which greatly helped to enhance the irritable desperation
- of the hapless Colt.</p>
- <p>But when this old
- Adam of resentment rose in me and tempted me concerning Bartleby,
- I grappled him and threw him. How? Why, simply by recalling the <a class="popup" href="javascript:void(0);" onclick="return overlib('This Christian injunction conflicts with the principles of private property, ownership, and power he has been operating from previously. He is reminded that he is Bartleby\'s brother, in a sense, not a vengeful god', STICKY)" onmouseout="nd();">divine
- injunction</a>: "A new commandment give I unto you, that ye
- love one another." Yes, this it was that saved me. Aside from higher considerations,
- charity often operates as a
- vastly wise and prudent principle--a great safeguard to its
- possessor. Men have committed murder for jealousy's sake, and anger's sake,
- and hatred's sake, and selfishness' sake, and spiritual pride's sake; but
- no man that ever I heard of, ever <a class="popup" href="javascript:void(0);" onclick="return overlib('which he seems to feel he is on the ver', STICKY)" onmouseout="nd();">committed
- a diabolical murder</a> for sweet charity's sake. Mere
- self-interest, then, if no better motive can be enlisted,
- should, especially with high-tempered men, prompt all beings to charity
- and philanthropy. At any rate, upon the occasion in question, I strove
- to <a class="popup" href="javascript:void(0);" onclick="return overlib('He may say that Bartleby is a &quot;poor fellow,&quot; but at this point he is primarily interested in calming himself down so that he won\'t murder him. ', STICKY)" onmouseout="nd();">drown
- my exasperated feelings</a> towards the scrivener by benevolently
- construing his conduct. Poor fellow, poor fellow! thought I, he don't mean
- any thing; and besides, he has seen hard times, and ought to be indulged.</p>
- <p>I endeavored also immediately to occupy myself, and at the same time
- to comfort my despondency.I tried to fancy that in the course of the
- morning, at such time as might prove agreeable to him, Bartleby, of his
- own free accord, would emerge from his hermitage, and take up some decided
- line of march in the direction of the door. But no. Half-past twelve o'clock
- came; Turkey began to glow in the face, overturn his inkstand, and become
- generally obstreperous; Nippers abated down into quietude and courtesy;
- Ginger Nut munched his noon apple; and Bartleby remained standing at his
- window in one of his profoundest <a class="popup" href="javascript:void(0);" onclick="return overlib('These two words are completely linked by this point. Bartleby is facing a real wall; the lawyer is facing the equally immovable wall that Bartleby presents him.', STICKY)" onmouseout="nd();">deadwall</a> reveries. Will
- it be credited? Ought I to acknowledge it? That afternoon
- I left the office without saying one further word to him.</p>
- <p>Some days now passed, during which, at leisure intervals I looked a little
- into <a class="popup" href="javascript:void(0);" onclick="return overlib('Neither Jonathan Edwards, a Puritan minister, or Joseph Priestley, an English scientist, believed that man has totally free will. Perhaps the lawyer would like to believe that none of this is his fault, and that it was fated to happen. This way he would have to take no responsibility for what has happened and will happen.', STICKY)" onmouseout="nd();">Edwards
- on the Will,</a>" and "Priestly on Necessity." Under the circumstances,
- those books induced a salutary feeling. Gradually I slid
- into the persuasion that these troubles of mine touching
- the scrivener, had been all <a class="popup" href="javascript:void(0);" onclick="return overlib('By whom? God? fate? natural law? That does get him off the hook though.', STICKY)" onmouseout="nd();">predestinated
- from eternity</a>, and Bartleby was billeted upon me for some mysterious
- purpose of an all-wise Providence, which it was not for a mere mortal like
- me to fathom. Yes, Bartleby, stay there behind your screen, <a class="popup" href="javascript:void(0);" onclick="return overlib('However, he does not say this.', STICKY)" onmouseout="nd();">thought
- I</a>; I shall persecute you no more; you are harmless and noiseless
- as any of these old chairs; in short, I never feel so private as when I
- know you are here. At least I see it, I feel it; I penetrate to the predestinated
- purpose of my life. I am content. Others may have loftier parts to enact;
- but my
- mission in this world, Bartleby, is to furnish you with office-room
- for such period as you may see fit to remain.</p>
- <p>I believe that this wise and blessed frame of mind would have continued
- with me, had it not been for the unsolicited and uncharitable remarks obtruded
- upon me by <a class="popup" href="javascript:void(0);" onclick="return overlib('The lawyer is very aware of the opinions of others (recall his feelings about how his clerks dressed). Since his benevolence is primarily based on self-interest, it seems logical that it will also be challenged by other self-interests.', STICKY)" onmouseout="nd();">my
- professional friends</a> who visited the rooms. But thus it often
- is, that the constant friction of illiberal minds wears out at last the
- best resolves of the more generous. Though to be sure, when
- I reflected upon it, it was not strange that people entering my office
- should be struck by the peculiar aspect of the unaccountable Bartleby,
- and so be tempted to throw out some sinister observations concerning him.
- Sometimes an attorney having business with me, and calling at my office,
- and finding no one but the scrivener there, would undertake to obtain some
- sort of precise information from him touching my whereabouts; but without
- heeding his <a class="popup" href="javascript:void(0);" onclick="return overlib('&quot;Idle&quot; is very much like &quot;trivial,&quot; the sort of business Bartleby will have nothing to do with.', STICKY)" onmouseout="nd();">idle
- talk,</a> Bartleby would remain standing immovable in the middle
- of the room. So after contemplating him in that position for a time, the
- attorney would depart, no wiser than he came.</p>
- <p>Also, when a Reference was going on, and the room full of lawyers and
- witnesses and business was driving fast; some deeply occupied legal gentleman
- present, seeing Bartleby wholly unemployed, would request him to run round
- to his (the legal gentleman's) office and fetch some papers for him. Thereupon,
- Bartleby would tranquilly decline, and remain idle as before. Then the
- lawyer would give a great stare, and turn to me. And what could I say?
- At last I was made aware that all through the circle of my professional
- acquaintance, a whisper of wonder was running round, having reference to
- the strange creature I kept at my office. This worried
- me very much. And as the idea came upon me of his possibly
- turning out a long-lived man, and keep occupying my chambers, and <a class="popup" href="javascript:void(0);" onclick="return overlib('Is this the crux of the problem', STICKY)" onmouseout="nd();">denying
- my authority</a>; and perplexing my visitors; and scandalizing
- my professional reputation; and casting a general gloom over the premises;
- keeping soul and body together to the last upon his savings (for doubtless
- he spent but half a dime a day), and in the end perhaps outlive
- me, and claim possession of my office by right of his perpetual
- occupancy: as all these dark anticipations crowded upon me more and more,
- and my friends continually intruded their relentless remarks upon the apparition
- in my room; a great change was wrought in me. I resolved to gather all
- my faculties together, and for ever rid me of this <a class="popup" href="javascript:void(0);" onclick="return overlib('an evil spirit or person who oppresses like a nightmare. Clearly he\'s not feeling Christian brotherhood at this point, for he has demonized him. ', STICKY)" onmouseout="nd();">intolerable
- incubus</a>.</p>
- <p>Ere revolving any complicated project, however, adapted to this end, I
- first simply suggested to Bartleby the propriety of his permanent departure.
- In a calm and serious tone, I commended the idea to his careful and mature
- consideration. But having taken three days to meditate upon it, he apprised
- me that his original determination remained the same; in short, that he
- still preferred to <a class="popup" href="javascript:void(0);" onclick="return overlib('Note the Biblical language here. Is that significant?', STICKY)" onmouseout="nd();">abide
- with me</a>.</p>
- <p>What shall I do? I now said to myself, buttoning
- up my coat to the last button. What shall I do? what ought
- I to do? what does conscience say I should do with this man, or rather
- ghost. Rid myself of him, I must; go, he shall. But how? You will not thrust
- him, the poor, pale, passive mortal,--you will not thrust such a helpless
- creature out of your door? you will not <a class="popup" href="javascript:void(0);" onclick="return overlib('His primary concern here seems to be dishonor to himself, not true conscience about the moral way to act. Again, he is most concerned about how others will judge him.', STICKY)" onmouseout="nd();">dishonor
- yourself</a> by such cruelty? No, I will not, I cannot do that.
- Rather would I let him live and die here, and then mason
- up his remains in the wall. What then will you do? For all
- your coaxing, he will not budge. <a class="popup" href="javascript:void(0);" onclick="return overlib('At least he acknowledges that\'s what he\'s trying to do! Yet he also reluctantly admires Bartleby for his resisting temptation and sticking to his &quot;preferences.&quot;', STICKY)" onmouseout="nd();">Bribes</a> he leaves under your own paperweight
- on your table; in short, it is quite plain that he prefers
- to cling to you.</p>
- <p>Then something severe, something unusual must be done. What! surely you
- will not have him collared by a constable, and commit his innocent pallor
- to the common jail? And upon what ground could you procure such a thing
- to be done?--a vagrant, is he? <a class="popup" href="javascript:void(0);" onclick="return overlib('His inner struggle goes on, as he considers possible legal, but inhumane, ways of solving the problem. It\'s true: he\'s not a vagrant! His answer is a legal one, based on the idea of trespassing on private property, which is the only legal answer. ', STICKY)" onmouseout="nd();">What!</a> he a vagrant, a wanderer, who
- refuses to budge? It is because he will not be a vagrant, then, that you
- seek to count him as a vagrant. That is too absurd. No visible means of
- support: there I have him. Wrong again: for indubitably he does support
- himself, and that is the only unanswerable proof that any man can show
- of his possessing the means so to do. No more then. Since he will not quit
- me, I must quit him. I will change my offices; I will move elsewhere; and
- give him fair notice, that if I find him on my new premises I will then
- proceed against him as a common trespasser.</p>
- <p>Acting accordingly, next day I thus addressed him: "I find these chambers
- too far from the City Hall; the air is unwholesome. In a word, I propose
- to remove my offices next week, and shall no longer require your services.
- I tell you this now, in order that you may seek another place."</p>
- <p>He made no reply, and nothing more was said.</p>
- <p>On the appointed day I engaged carts and men, proceeded to my chambers,
- and having but little furniture, every thing was removed in a few hours.
- Throughout, the scrivener remained standing behind the
- screen, which I directed to be removed the last thing. It
- was withdrawn; and being folded up like a huge folio, left him the <a class="popup" href="javascript:void(0);" onclick="return overlib('Only at this point is the wall taken down, both in the room and to some degree, in the lawyer. Again, note the conjunction of immobility and aloneness.', STICKY)" onmouseout="nd();">motionless
- occupant of a naked room.</a> I stood in the entry watching him
- a moment, while something from within me upbraided me.</p>
- <p>I re-entered, with my hand
- in my pocket--and--and my heart in my mouth.
- </p>
- <p>"Good-bye, Bartleby; I am going--good-bye, and God some way bless you;
- and take that," slipping something in his hand. But it dropped to the floor,
- and then,<a class="popup" href="javascript:void(0);" onclick="return overlib('Why is it &quot;strange to say&quot;? What is this strong bond between them? Here we see his great conflict in feelings toward Bartleby. ', STICKY)" onmouseout="nd();">--strange
- to say</a>--I tore myself from him whom I had so longed to be
- rid of.</p>
- <p>Established in my new quarters, for a day or two I kept the door locked,
- and started at every footfall in the passages. When I returned to my rooms
- after any little absence, I would pause at the threshold for an instant,
- and attentively listen, ere applying my key. But these fears were needless.
- Bartleby never came nigh me.</p>
- <p>I thought all was going well, when a perturbed looking stranger visited
- me, inquiring whether I was the person who had recently occupied rooms
- at No.--Wall-street.</p>
- <p>Full of forebodings, I replied that I was.</p>
- <p>"Then, sir," said the stranger,
- who proved a lawyer, "you are responsible for the man you
- left there. He refuses to do any copying; he refuses to do any thing; he
- says he prefers not to; and he refuses to quit the premises."</p>
- <p>"I am very sorry, sir," said I, with assumed tranquillity, but an inward
- tremor, "but, really, <a class="popup" href="javascript:void(0);" onclick="return overlib('Is this true? Does he feel no responsibility for Bartleby? Even though technically he has none, is that how he feels? His statement here is said to echo Saint Peter\'s denial of Christ in Mark 14:68, 70-71).', STICKY)" onmouseout="nd();">the
- man you allude to is nothing to me</a> --he is no relation or
- apprentice of mine, that you should hold me responsible for him."</p>
- <p>"In mercy's name, who is he?"</p>
- <p>"I certainly cannot inform you. I know nothing about him. Formerly I employed
- him as a copyist; but he has done nothing for me now for some time past."</p>
- <p>"I
- shall settle him then,--good morning, sir."</p>
- <p>Several days passed, and I heard nothing more; and though I often felt
- a charitable prompting to call at the place and see poor Bartleby, yet
- a certain <a class="popup" href="javascript:void(0);" onclick="return overlib('For whatever reason, we have seen many examples of this &quot;squeamish&quot; unwillingness to confront Bartleby.', STICKY)" onmouseout="nd();">squeamishness</a> of I know not what withheld
- me.</p>
- <p>All is over with him, by this time, thought I at last, when through another
- week no further intelligence reached me. But coming to my room the day
- after, I found several persons waiting at my door in a high state of nervous
- excitement.</p>
- <p>"That's the man--here he comes," cried the foremost one, whom recognized
- as the lawyer who had previously called upon me alone.</p>
- <p>"You must take him away, sir, at once," cried a portly person among them,
- advancing upon me, and whom I knew to be the landlord of No.--Wall-street.
- "These gentlemen, my tenants, cannot stand it any longer; Mr. B--" pointing
- to the lawyer, "has turned him out of his room, and he now persists in
- haunting the buildinggenerally, sitting upon the banisters of the
- stairs by day, and sleeping in the entry by night. Every body is concerned;
- clients are leaving the offices; <a class="popup" href="javascript:void(0);" onclick="return overlib('Doesn\'t this seem a bit exaggerated? They seem to be as desperate as the lawyer was. ', STICKY)" onmouseout="nd();">some
- fears are entertained of a mob</a>; something you must do, and
- that without delay."</p>
- <p> Aghast
- at this torment, I fell back before it, and would fain have
- <a class="popup" href="javascript:void(0);" onclick="return overlib('They will not let him hide this time. Note that he wishes to hide behind the walls of his office to escape the problem.', STICKY)" onmouseout="nd();">locked myself</a>in my new quarters. In vain I persisted that Bartleby
- was nothing to me--no more than to any one else. In vain:--I was the last
- person known to have any thing to do with him, and they held me to the
- terrible account. Fearful
- then of being exposed in the papers (as one person present
- obscurely threatened) I considered the matter, and at length said, that
- if the lawyer would give me a confidential interview with the scrivener,
- in his (the lawyer's) own room, I would that afternoon strive my best to
- rid them of the nuisance they complained of.</p>
- <p>Going up stairs to my old haunt, there was Bartleby silently sitting upon
- the banister at the landing.</p>
- <p>"What are you doing here, Bartleby?" said I.</p>
- <p>"Sitting upon the banister," he mildly replied.</p>
- <p>I motioned him into the lawyer's room, who then left us.</p>
- <p>"<a class="popup" href="javascript:void(0);" onclick="return overlib('This interchange is the most extended one they have ever had. Why does Bartleby say he is not particular? Is the problem that the lawyer cannot come up with a job that would suit Bartleby? Is there such a job? Note that he gets increasingly ironic, but Bartleby remains calm and serious, and adamant as ever.', STICKY)" onmouseout="nd();">Bartleby,"
- said I</a>, "are you aware that you are the cause of great tribulation
- to me, by persisting in occupying the entry after being dismissed from
- the office?"</p>
- <p>No answer.</p>
- <p>"Now one of two things must take place. Either you must do something or
- something must be done to you. Now what sort of business would you like
- to engage in? Would you like to re-engage in copying for some one?"</p>
- <p>"No; I would prefer not to make any change."</p>
- <p>"Would you like a clerkship in a dry-goods store?"</p>
- <p>"There is too much confinement about that. No, I would not like a clerkship;
- but I am not particular."</p>
- <p>"Too much confinement," I cried, "why you keep yourself confined all the
- time!"</p>
- <p>"I would prefer not to take a clerkship," he rejoined, as if to settle
- that little item at once.</p>
- <p>"How would a bar-tender's business suit you? There is no trying of the
- eyesight in that."</p>
- <p>"I would not like it at all; though, as I said before, I am not particular."</p>
- <p>His unwonted wordiness inspirited me. I returned to the charge.</p>
- <p>"Well then, would you like to travel through the country collecting bills
- for the merchants? That would improve your health."</p>
- <p>"No, I would prefer to be doing something else."</p>
- <p>"How then would going as a companion to Europe, to entertain some young
- gentleman with your conversation,--how would that suit you?"</p>
- <p>"Not at all. It does not strike me that there is any thing definite about
- that. I like to be stationary. But I am not particular.</p>
- <p>"Stationary you shall be then," I cried, now losing all patience, and
- for the first time in all my exasperating connection with him fairly flying
- into a passion. "If you do not go away from these premises before night,
- I shall feel bound--indeed I am bound--to-- to--to quit the premises
- myself!" I rather absurdly concluded, knowing not with what <a class="popup" href="javascript:void(0);" onclick="return overlib('Again, he tries to use psychological force, wanting compliance but met but immobility.', STICKY)" onmouseout="nd();">possible
- threat to try to frighten</a> his immobility into compliance.
- Despairing of all further efforts, I was precipitately leaving him, when
- a final thought occurred to me--one
- which had not been wholly unindulged before.
- </p>
- <p>"Bartleby," said I, in the kindest <a class="popup" href="javascript:void(0);" onclick="return overlib('This indicates that his hospitality is all a ruse, an act. Perhaps Bartleby senses that. He\'s not going to give him an easy way out which will ease his conscience.', STICKY)" onmouseout="nd();">tone
- I could assume</a> under such exciting circumstances, "will you
- go home with me now--not to my office, but my dwelling--and remain there
- till we can conclude upon some convenient arrangement for you at our leisure?
- Come, let us start now, right away."</p>
- <p>"No: at present I would prefer not to make any change at all."</p>
- <p>I answered nothing; but effectualy dodging every one by the suddenness
- and rapidity of my flight, rushed from the building, ran
- up Wall-street towards Broadway, and jumping into the first omnibus was
- soon removed from pursuit. As soon as tranquility returned I distinctly
- perceived that I had now done all that I possibly could, both in respect
- to the demands of the landlord and his tenants, and with regard to my own
- desire and sense of duty, to benefit Bartleby, and shield him from rude
- persecution. I now strove to be entirely care-free and quiescent; and my
- conscience justified me in the attempt; though indeed it was not so successful
- as I could have wished. So fearful was I of being again hunted out by the
- incensed landlord and his exasperated tenants, that, surrendering my business
- to Nippers, for a few days I drove about the upper part of the town and
- through the suburbs, in my rockaway; crossed over to Jersey City and Hoboken,
- and paid fugitive visits to Manhattanville and Astoria. In fact I almost
- lived in my <a class="popup" href="javascript:void(0);" onclick="return overlib('a carriage with open sides and top--not perhaps the most comfortable place to live! It is interesting that he meets Bartleby\'s &quot;stationary&quot; stance with pointless motion of his own. Also, note that he needs this because he lives in the suburbs, away from the callous materialism and injustices of the city.', STICKY)" onmouseout="nd();">rockaway</a> for the time.</p>
- <p>When again I entered my office, lo, a note from the landlord lay upon
- desk. opened it with trembling hands. informed me that writer had sent
- to police, and Bartleby removed the
- Tombs as a <a class="popup" href="javascript:void(0);" onclick="return overlib('This is ironic, since the word means &quot;a wanderer,&quot; and Bartleby is anything but that (although he is homeless). Note the previous comments the lawyer made on this subject.', STICKY)" onmouseout="nd();">vagrant</a>. Moreover, since I knew more
- about him than any one else, he wished me to appear at that place, and
- make a suitable statement of the facts. These tidings had a conflicting
- effect upon me. At first I was indignant; but at last almost approved.
- The landlord's energetic, summary disposition, had led him to adopt a procedure
- which I do not think I would have decided upon myself; and yet as a last
- resort, under such peculiar circumstances, it seemed the only plan.</p>
- <p>As I afterwards learned, the poor scrivener, when told that he must be
- conducted to the Tombs, offered not the slightest obstacle, but in his
- pale unmoving way, silently
- acquiesced.
- </p>
- <p>Some of the compassionate and curious bystanders joined the party; and
- headed by one of the constables arm in arm with Bartleby, <a class="popup" href="javascript:void(0);" onclick="return overlib('Note the contrast between their (funereal?) silence and the city noises. ', STICKY)" onmouseout="nd();">the
- silent procession</a> filed its way through all the noise, and
- heat, and joy of the roaring thoroughfares at noon.</p>
- <p>The same day I received the note I went to the Tombs, or to speak more
- properly, the Halls of Justice. Seeking the right officer, I stated the
- purpose of my call, and was informed that the individual I described was
- indeed within. I then assured the functionary that Bartleby was a perfectly
- honest man, and greatly to be compassionated, however unaccountably eccentric.
- I narrated all I knew,and closed by suggesting the idea of letting
- him remain in as indulgent confinement as possible till something less
- harsh might be done--though indeed I hardly knew what. At all events, if
- nothing else could be decided upon, the alms-house must receive him. I
- then begged to have an interview.</p>
- <p>Being under no disgraceful charge, and quite serene and harmless in all
- his ways, they had permitted him freely to wander about the prison, and
- especially in the inclosed grass-platted yards thereof. And so I found
- him there, standing all alone in the quietest of the yards, his face
- <a class="popup" href="javascript:void(0);" onclick="return overlib('He is outside, yet even in this natural setting he is enclosed and facing a wall. There is grass here though (remember the green screen?)', STICKY)" onmouseout="nd();">towards a high wall</a>, while all around, from the narrow slits of the
- jail windows, I thought I
- saw peering out upon him the eyes of murderers and thieves.
- </p>
- <p>"Bartleby!"</p>
- <p>"<a class="popup" href="javascript:void(0);" onclick="return overlib('Perhaps he does, even better than the lawyer knows himself.', STICKY)" onmouseout="nd();">I
- know you</a>," he said, without looking round,--"and I want
- nothing to say to you."</p>
- <p>"It was not I that brought you here, Bartleby," said I, keenly
- pained at his implied suspicion. "And to you, this should
- not be so vile a place. Nothing reproachful attaches to you by being here.
- And see, <a class="popup" href="javascript:void(0);" onclick="return overlib('Who does he think he\'s fooling? ', STICKY)" onmouseout="nd();">it
- is not so sad</a> a place as one might think. Look, there is
- the sky, and here is the grass."</p>
- <p>"I know where I am," he replied, but would say nothing more, and so I
- left him.</p>
- <p>As I entered the corridor again, a broad meat-like
- man in an apron, accosted me, and jerking his thumb over
- his shoulder said--"Is that <a class="popup" href="javascript:void(0);" onclick="return overlib('Notice that he is now claiming Bartleby as a friend, not a former employee.', STICKY)" onmouseout="nd();">your
- friend</a>?"</p>
- <p>"Yes."</p>
- <p>"Does he want to starve? If he does, let him live on the prison fare,
- that's all.</p>
- <p>"Who are you?" asked I, not knowing what to make of such an unofficially
- speaking person in such a place.</p>
- <p>"I am the grub-man. Such gentlemen as have friends here, hire me to provide
- them with something good to eat."</p>
- <p>"Is this so?" said I, turning to the turnkey.</p>
- <p>He said it was.</p>
- <p>"Well then," said I, slipping some silver into the grub-man's hands (for
- so they called him). "I want you to give particular attention to my friend
- there; let him have the best dinner you can get. And you must be as polite
- to him as possible."</p>
- <p>"Introduce me, will you?" said the grub-man, looking at me with an expression
- which seemed to say he was all impatience for an opportunity to give a
- specimen of his breeding.</p>
- <p>Thinking it would prove of benefit to the scrivener, I acquiesced; and
- <a class="popup" href="javascript:void(0);" onclick="return overlib('But he doesn\'t use the name, and keeps calling him the &quot;grub-man.&quot;', STICKY)" onmouseout="nd();">asking the grub-man his name</a>, went up with him to Bartleby.</p>
- <p>"Bartleby, this is a
- friend; you will find him very useful to you."</p>
- <p>"<a class="popup" href="javascript:void(0);" onclick="return overlib('Like Turkey, he makes all the sounds of subservience.', STICKY)" onmouseout="nd();">Your
- sarvant</a>, sir, your sarvant," said the grub-man, making a
- low salutation behind his apron. "Hope you find it pleasant
- here, sir;--spacious grounds--cool apartments, sir--hope
- you'll stay with us some time--try to make it agreeable. What will you
- have for dinner today?"</p>
- <p>"I prefer not to dine to-day," said Bartleby, turning away. "It would
- disagree with me; I am unused to dinners." So saying he slowly moved to
- the other side of the inclosure, and took up <a class="popup" href="javascript:void(0);" onclick="return overlib('Just like the position he had assumed in the lawyer\'s office (although at the beginning, the placement of the desk forced him to look at the dead wall). Now it is clearly voluntary. ', STICKY)" onmouseout="nd();">a
- position</a> fronting the dead-wall.</p>
- <p>"How's this?" said the grub-man, addressing me with a stare of astonishment.
- "He's odd, aint he?"</p>
- <p>"I think he is a little deranged," said I, sadly.</p>
- <p>"Deranged? deranged is it? Well now, upon my word, I thought that friend
- of yourn was a gentleman
- forger; they are always pale and genteel-like, them forgers.
- <a class="popup" href="javascript:void(0);" onclick="return overlib('He is like the lawyer here, except that the lawyer would not pity a dishonest person. Perhaps the grub-man is even more compassionate. ', STICKY)" onmouseout="nd();">I can't help pity 'em</a>--can't help it, sir. Did you know Monroe Edwards?"
- he added touchingly, and paused. Then, laying his hand pityingly on my
- shoulder, sighed, "he died of consumption at Sing-Sing. so you weren't
- acquainted with Monroe?"</p>
- <p>"No, I was never socially acquainted with any forgers. But I cannot stop
- longer. Look to my friend yonder. You will not lose by it. I will see you
- again."</p>
- <p>Some few days after this, I again obtained admission to the Tombs, and
- went through the corridors in quest of Bartleby; but without finding him.</p>
- <p>"I saw him coming from his cell not long ago," said a turnkey, "may be
- he's gone to loiter in the yards."</p>
- <p>So I went in that direction.</p>
- <p>"Are you looking for the silent man?" said another turnkey passing me.
- "Yonder he lies--sleeping in the yard there. 'Tis not twenty minutes since
- I saw him lie down."</p>
- <p>The yard was entirely quiet. It was not accessible to the common prisoners.
- The surrounding walls, of amazing thickness, kept
- off all sound behind them. The <a class="popup" href="javascript:void(0);" onclick="return overlib('The Egyptians, of course, were obsessed with death (and masonry). This is appropriate architecture for the Tombs.', STICKY)" onmouseout="nd();">Egyptian
- character</a> of the masonry weighed upon me with its gloom.
- But a soft imprisoned
- turf grew under foot. The heart of the eternal pyramids,
- it seemed, wherein, by some strange magic, through the clefts, grass-seed,
- dropped by birds, had sprung.</p>
- <p>Strangely huddled at the base of the wall, <a class="popup" href="javascript:void(0);" onclick="return overlib('He\'s in a fetal position, and at the base of the impenetrable wall. In the Brittanica film, his hands are pressed together, as if praying---obviously an interpretive directorial decision.', STICKY)" onmouseout="nd();">his
- knees drawn up</a>, and lying on his side, his head touching
- the cold stones, I saw the wasted Bartleby. But nothing stirred. I paused;
- then went close up to him; stooped over, and saw that his dim eyes were
- open; otherwise he seemed profoundly sleeping. Something prompted me
- to touch him. I felt his hand, when a tingling shiver ran up my arm
- and down my spine to my feet.</p>
- <p>The round face of the grub-man peered upon me now. "His dinner is ready.
- Won't he dine to-day, either? Or does he live without dining?"</p>
- <p>"Lives without dining," said I, and closed the eyes.</p>
- <p>"Eh!--He's asleep, aint he?"</p>
- <p>"<a class="popup" href="javascript:void(0);" onclick="return overlib('In other words, he is dead and with the great. The phrase comes from Job 3:14 where Job, in his sufferings, wishes he were &quot;at rest, With kings and counsellors of the earth which built desolate places for themselve', STICKY)" onmouseout="nd();">With
- kings and counsellors</a>," murmured I.</p>
- <p>* * * * * * * *</p>
- <p>There would seem little need for proceeding further in this history. Imagination
- will readily supply the meagre recital of poor Bartleby's interment. But
- ere parting with the reader, let me say, that if this little narrative
- has sufficiently interested him, to awaken curiosity as to who Bartleby
- was, and what manner of life he led prior to the present narrator's making
- his acquaintance, I can only reply, that in such curiosity I fully share,
- but am wholly unable to gratify it. Yet here I hardly know whether I should
- divulge one
- little item of rumor, which came to my ear a few months
- after the scrivener's decease. Upon what basis it rested, I could never
- ascertain; and hence how true it is I cannot now tell. But inasmuch as
- this vague report has not been without a certain strange <a class="popup" href="javascript:void(0);" onclick="return overlib('In other words, it elicits ideas and feelings which reverberate with his own.', STICKY)" onmouseout="nd();">suggestive
- interest</a> to me, however said, it may prove the same with
- some others; and so I will briefly mention it. The report was this: that
- Bartleby had been a subordinate clerk in the Dead
- Letter Office at <a href="http://raven.cc.ukans.edu/%7Ezeke/bartleby/parker.html" target="_blank">Washington</a>, from which he had been suddenly removed
- by a change in the administration. When I think over this rumor, I cannot
- adequately express the emotions which seize me. Dead
- letters! does it not sound like dead men? Conceive a man
- by nature and misfortune prone to a pallid hopelessness, can any business
- seem more fitted to heighten it than that of continually handling these
- dead letters and assorting them for the flames? For by the cart-load they
- are annually burned. <a class="popup" href="javascript:void(0);" onclick="return overlib('Notice the stories which the narrator associates with these letters--all tragic stories of blocked communications. Since he is creating the stories, it seems clear that he has been touched deeply by his experience with Bartleby. Could the lawyer at the beginning of the story, as he pictured himself, have imagined such personal tragedies?', STICKY)" onmouseout="nd();">Sometimes</a> from out the folded paper
- the pale clerk takes a ring:--the bank-note sent in swiftest charity:--he
- whom it would relieve, nor eats nor hungers any more; pardon for those
- who died despairing; hope for those who died unhoping; good tidings for
- those who died stifled by unrelieved calamities. On
- errands of life, these letters speed to death.
- </p>
- <p> <a class="popup" href="javascript:void(0);" onclick="return overlib('Why does he equate Bartleby with humanity? What does the &quot;Ah&quot; suggest? This statement, which seems to be very emotional, seems to reveal a person quite changed from the one who began this story. Has he been transformed? Some readers think not, and that he despairs for the fate of humanity. Others find this a mockery of the typical sentimental ending of stories published in&lt;i> Harper\'s&lt;/i> (as this one was.) Your decision.', STICKY)" onmouseout="nd();">Ah
- Bartleby! Ah humanity</a>!</p>
- </td>
- </div> \ No newline at end of file
+ <h5 align="center ">Click on text in red for hypertext notes and questions</h5> I am a rather elderly man. The nature of my avocations for the last thirty years has brought me into more than ordinary contact with what would seem an interesting and somewhat singular set of men of whom as yet nothing that I know of has ever been written:-- I mean the law-copyists or scriveners. I have known very many of them, professionally and privately, and if I pleased, could relate divers histories, at which good-natured gentlemen might smile, and sentimental souls might weep. But I waive the biographies of all other scriveners for a few passages in the life of Bartleby, who was a scrivener the strangest I ever saw or heard of. While of other law-copyists I might write the complete life, of Bartleby nothing of that sort can be done. I believe that no materials exist for a full and satisfactory biography of this man. It is an irreparable loss to literature. Bartleby was one of those beings of whom nothing is ascertainable, except from the original sources, and in his case those are very small. What my own astonished eyes saw of Bartleby, that is all I know of him, except, indeed, one vague report which will appear in the sequel.
+ <p>Ere introducing the scrivener, as he first appeared to me, it is fit I make some mention of myself, my employees, my business, my chambers, and general surroundings; because some such description is indispensable to an adequate understanding of the chief character about to be presented. </p>
+ <p> <i>Imprimis</i>: I am a man who, from his youth upwards, has been filled with a profound conviction that the easiest way of life is the best.. Hence, though I belong to a profession proverbially energetic and nervous, even to turbulence, at times, yet nothing of that sort have I ever suffered to invade my peace. I am one of those unambitious lawyers who never addresses a jury, or in any way draws down public applause; but in the cool tranquillity of a snug retreat, do a snug business among rich men's bonds and mortgages and title-deeds. The late John Jacob Astor, a personage little given to poetic enthusiasm, had no hesitation in pronouncing my first grand point to be prudence; my next, method. I do not speak it in vanity, but simply record the fact, that I was not unemployed in my profession by the last John Jacob Astor; a name which, I admit, I love to repeat, for it hath a rounded and orbicular sound to it, and rings like unto bullion. I will freely add, that I was not insensible to the late John Jacob Astor's good opinion.</p>
+ <p>Some time prior to the period at which this little history begins, my avocations had been largely increased. The good old office, now extinct in the State of New York, of a Master in Chancery, had been conferred upon me. It was not a very arduous office, but very pleasantly remunerative. I seldom lose my temper; much more seldom indulge in dangerous indignation at wrongs and outrages; but I must be permitted to be rash here and declare, that I consider the sudden and violent abrogation of the office of Master of Chancery, by the new Constitution, as a----premature act; inasmuch as I had counted upon a life-lease of the profits, whereas I only received those of a few short years. But this is by the way.</p>
+ <p>My chambers were up stairs at No.--Wall-street. At one end they looked upon the white wall of the interior of a spacious sky-light shaft, penetrating the building from top to bottom. This view might have been considered rather tame than otherwise, deficient in what landscape painters call "life." But if so, the view from the other end of my chambers offered, at least, a contrast, if nothing more. In that direction my windows commanded an unobstructed view of a lofty brick wall,black by age and everlasting shade; which wall required no spy-glass to bring out its lurking beauties, but for the benefit of all near-sighted spectators, was pushed up to within ten feet of my window panes. Owing to the great height of the surrounding buildings, and my chambers being on the second floor, the interval between this wall and mine not a little resembled a huge square cistern.</p>
+ <p>At the period just preceding the advent of Bartleby, I had two persons as copyists in my employment, and a promising lad as an office-boy. First, Turkey; second, Nippers; third, Ginger Nut.These may seem names, the like of which are not usually found in the Directory. In truth they were nicknames, mutually conferred upon each other by my three clerks, and were deemed expressive of their respective persons or characters. Turkey was a short, pursy Englishman of about my own age, that is, somewhere not far from sixty. In the morning, one might say, his face was of a fine florid hue, but after twelve o'clock, meridian-- his dinner hour-- it blazed like a grate full of Christmas coals; and continued blazing--but, as it were, with a gradual wane--till 6 o'clock, P.M. or thereabouts, after which I saw no more of the proprietor of the face, which gaining its meridian with the sun, seemed to set with it, to rise, culminate, and decline the following day, with the like regularity and undiminished glory. There are many singular coincidences I have known in the course of my life, not the least among which was the fact that exactly when Turkey displayed his fullest beams from his red and radiant countenance, just then, too, at the critical moment, began the daily period when I considered his business capacities as seriously disturbed for the remainder of the twenty-four hours. Not that he was absolutely idle, or averse to business then; far from it. The difficulty was, he was apt to be altogether too energetic. There was a strange, inflamed, flurried, flighty recklessness of activity about him. He would be incautious in dipping his pen into his inkstand. All his blots upon my documents, were dropped there after twelve o'clock, meridian. Indeed, not only would he be reckless and sadly given to making blots in the afternoon, but some days he went further, and was rather noisy. At such times, too, his face flamed with augmented blazonry, as if cannel coal had been heaped on anthracite. He made an unpleasant racket with his chair; spilled his sand-box; in mending his pens, impatiently split them all to pieces, and threw them on the floor in a sudden passion; stood up and leaned over his table, boxing his papers about in a most indecorous manner, very sad to behold in an elderly manlike him. Nevertheless, as he was in many ways a most valuable person to me, and all the time before twelve o'clock, meridian, was the quickest, steadiest creature too, accomplishing a great deal of work in a style not easy to be matched--for these reasons, I was willingto overlook his eccentricities, though indeed, occasionally, I remonstrated with him. I did this very gently, however, because, though the civilest, nay, the blandest and most reverential of men in the morning, yet in the afternoon he was disposed, upon provocation, to be slightly rash with his tongue, in fact, insolent. Now, valuing his morning services as I did, and resolved not to lose them; yet, at the same time made uncomfortable by his inflamed ways after twelve o'clock; and being a man of peace, unwilling by my admonitions to call forth unseemingly retorts from him; I took upon me, one Saturday noon (he was always worse on Saturdays), to hint to him, very kindly, that perhaps now that he was growing old, it might be well to abridge his labors; in short, he need not come to my chambers after twelve o'clock, but, dinner over, had best go home to his lodgings and rest himself till tea-time. But no; he insisted upon his afternoon devotions. His countenance became intolerably fervid, as he oratorically assured me--gesticulating with a long ruler at the other end of the room--that if his services in the morning were useful, how indispensible, then, in the afternoon?</p>
+ <p>"With submission, sir," said Turkey on this occasion, "I consider myself your right-hand man. In the morning I but marshal and deploy my columns; but in the afternoon I put myself at their head, and gallantly charge the foe, thus!"--and he made a violent thrust with the ruler.</p>
+ <p>"But the blots, Turkey," intimated I.</p>
+ <p>"True,--but, with submission, sir, behold these hairs! I am getting old. Surely, sir, a blot or two of a warm afternoon is not the page--is honorable. With submission, sir, we both are getting old."</p>
+ <p>This appeal to my fellow-feeling was hardly to be resisted. At all events, I saw that go he would not. So I made up my mind to let him stay, resolving, nevertheless, to see to it, that during the afternoon he had to do with my less important papers.</p>
+ <p>Nippers, the second on my list, was a whiskered, sallow, and, upon the whole, rather piratical-looking young man of about five and twenty. I always deemed him the victim of two evil powers-- ambition and indigestion. The ambition was evinced by a certain impatience of the duties of a mere copyist, an unwarrantable usurpation of strictly profession affairs, such as the original drawing up of legal documents. The indigestion seemed betokened in an occasional nervous testiness and grinning irritability, causing the teeth to audibly grind together over mistakes committed in copying; unnecessary maledictions, hissed, rather than spoken, in the heat of business; and especially by a continual discontent with the height of the table where he worked. Though of a very ingenious mechanical turn, Nippers could never get this table to suit him. He put chips under it, blocks of various sorts, bits of pasteboard, and at last went so far as to attempt an exquisite adjustment by final pieces of folded blotting-paper. But no invention would answer. If, for the sake of easing his back, he brought the table lid at a sharp angle well up towards his chin, and wrote there like a man using the steep roof of a Dutch house for his desk:--then he declared that it stopped the circulation in his arms. If now he lowered the table to his waistbands, and stooped over it in writing, then there was a sore aching in his back. In short, the truth of the matter was, Nippers knew not what he wanted. Or, if he wanted anything, it was to be rid of a scrivener's table altogether. Among the manifestations of his diseased ambition was a fondness he had for receiving visits from certain ambiguous-looking fellows in seedy coats, whom he called his clients. Indeed I was aware that not only was he, at times, considerable of a ward-politician, but he occasionally did a little businessat the Justices' courts, and was not unknown on the steps of the Tombs. I have good reason to believe, however, that one individual who called upon him at my chambers, and who, with a grand air, he insisted was his client, was no other than a dun, and the alleged title-deed, a bill. But with all his failings, and the annoyances he caused me, Nippers, like his compatriot Turkey, was a very useful man to me; wrote a neat, swift hand; and, when he chose, was not deficient in a gentlemanly sort of deportment. Added to this, he always dressedin a gentlemanly sort of way; and so, incidentally, reflected credit upon my chambers. Whereas with respect to Turkey, I had much ado to keep him from being a reproach to me. His clothes were apt to look oily and smell of eating-houses. He wore his pantaloons very loose and baggy in summer. His coats were execrable; his hat not to be handled. But while the hat was a thing of indifference to me, inasmuch as his natural civility and deference, as a dependent Englishman, always led him to doff it the moment he entered the room, yet his coat was another matter. Concerning his coats, I reasoned with him; but with no effect. The truth was, I suppose, that a man with so small an income, could not afford to sport such a lustrous face and a lustrous coat at one and the same time. As Nippers once observed, Turkey's money went chiefly for red ink. One winter day I presented Turkey with a highly-respectable looking coat of my own, a padded gray coat, of a most comfortable warmth, and which buttoned straight up from the knee to the neck. I thought Turkey would appreciate the favor, and abate his rashness and obstreperousness of afternoons. But no. I verily believe that buttoning himself up in so downy and blanket-like a coat had a pernicious effect upon him; upon the same principle that too much oats are bad for horses. In fact, precisely as a rash, restive horse is said to feel his oats, so Turkey felt his coat. It made him insolent. He was a man whom prosperity harmed.</p>
+ <p>Though concerning the self-indulgent habits of Turkey I had my own private surmises, yet touching Nippers I was well persuaded that whatever might be his faults in other respects, he was, at least, a temperate young man. But indeed, nature herself seemed to have been his vintner, and at his birth charged him so thoroughly with an irritable, brandy-like disposition, that all subsequent potations were needless. When I consider how, amid the stillness of my chambers, Nippers would sometimes impatiently rise from his seat, and stooping over his table, spread his arms wide apart, seize the whole desk, and move it, and jerk it, with a grim, grinding motion on the floor, as if the table were a perverse voluntary agent, intent on thwarting and vexing him; I plainly perceive that for Nippers, brandy and water were altogether superfluous.</p>
+ <p>It was fortunate for me that, owing to its course--indigestion--the irritability and consequent nervousness of Nippers, were mainly observable in the morning, while in the afternoon he was comparatively mild. So that Turkey's paroxysms only coming on about twelve o'clock, I never had to do with their eccentricities at one time. Their fits relieved each other like guards. When Nippers' was on, Turkey's was off, and vice versa. This was a good natural arrangement under the circumstances.</p>
+ <p>Ginger Nut, the third on my list, was a lad some twelve years old. His father was a carman, ambitious of seeing his son on the bench instead of a cart, before he died. So he sent him to my office as a student at law, errand boy, and cleaner and sweeper, at the rate of one dollar a week. He had a little desk to himself, but he did not use it much. Upon inspection, the drawer exhibited a great array of the shells of various sorts of nuts. Indeed, to this quick-witted youth the whole noble science of the law was contained in a nut-shell. Not the least among the employments of Ginger Nut, as well as one which he discharged with the most alacrity, was his duty as cake and apple purveyor for Turkey and Nippers. Copying law papers being proverbially a dry, husky sort of business, my two scriveners were fain to moisten their mouths very often with Spitzenbergs to be had at the numerous stalls nigh the Custom House and Post Office. Also, they sent Ginger Nut very frequently for that peculiar cake--small, flat, round, and very spicy--after which he had been named by them. Of a cold morning when business was but dull, Turkey would gobble up scores of these cakes, as if they were mere wafers--indeed they sell them at the rate of six or eight for a penny--the scrape of his pen blending with the crunching of the crisp particles in his mouth. Of all the fiery afternoon blunders and flurried rashnesses of Turkey, was his once moistening a ginger-cake between his lips, and clapping it on to a mortgage for a seal. I came within an ace of dismissing him then. But he mollified me by making an oriental bow, and saying--"With submission, sir, it was generous of me to find you in stationery on my own account."</p>
+ <p>Now my original business--that of a conveyancer and title hunter, and drawer-up of recondite documents of all sorts--was considerably increased by receiving the master's office. There was now great work for scriveners. Not only must I push the clerks already with me, but I must have additional help. In answer to my advertisement, a motionless young man one morning, stood upon my office threshold, the door being open, for it was summer. I can see that figure now--pallidly neat, pitiably respectable, incurably forlorn! It was Bartleby.</p>
+ <p>After a few words touching his qualifications, I engaged him, glad to have among my corps of copyists a man of so singularly sedate an aspect, which I thought might operate beneficially upon the flighty temper of Turkey, and the fiery one of Nippers.</p>
+ <p>I should have stated before that ground glass folding-doors divided my premises into two parts, one of which was occupied by my scriveners, the other by myself. According to my humor I threw open these doors, or closed them. I resolved to assign Bartleby a corner by the folding-doors, but on my side of them, so as to have this quiet man within easy call, in case any trifling thing was to be done. I placed his desk close up to a small side window in that part of the room, a window which originally had afforded a lateral view of certain grimy back-yards and bricks, but which, owing to subsequent erections, commanded at present no view at all, though it gave some light. Within three feet of the panes was a wall, and the light came down from far above, between two lofty buildings, as from a very small opening in a dome. Still further to a satisfactory arrangement, I procured a high green folding screen, which might entirely isolate Bartleby from my sight, though not remove him from my voice. And thus, in a manner, privacy and society were conjoined. </p>
+ <p>At first Bartleby did an extraordinary quantity of writing. As if long famishingfor something to copy, he seemed to gorge himself on my documents. There was no pause for digestion. He ran a day and night line, copying by sun-light and by candle-light. I should have been quite delighted with his application, had be been cheerfully industrious. But he wrote on silently, palely, mechanically. </p>
+ <p>It is, of course, an indispensable part of a scrivener's business to verify the accuracy of his copy, word by word. Where there are two or more scriveners in an office, they assist each other in this examination, one reading from the copy, the other holding the original. It is a very dull, wearisome, and lethargic affair. I can readily imagine that to some sanguine temperaments it would be altogether intolerable. For example, I cannot credit that the mettlesome poet Byron would have contentedly sat down with Bartleby to examine a law document of, say five hundred pages, closely written in a crimpy hand.</p>
+ <p>Now and then, in the haste of business, it had been my habit to assist in comparing some brief document myself, calling Turkey or Nippers for this purpose. One object I had in placing Bartleby so handy to me behind the screen, was to avail myself of his services on such trivial occasions. It was on the third day, I think, of his being with me, and before any necessity had arisen for having his own writing examined, that, being much hurried to complete a small affair I had in hand, I abruptly called to Bartleby. In my haste and natural expectancy of instant compliance, I sat with my head bent over the original on my desk, and my right hand sideways, and somewhat nervously extended with the copy, so that immediately upon emerging from his retreat, Bartleby might snatch it and proceed to business without the least delay.</p>
+ <p>In this very attitude did I sit when I called to him, rapidly stating what it was I wanted him to do--namely, to examine a small paper with me. Imagine my surprise, nay, my consternation, when without moving from his privacy, Bartleby in a singularly mild, firm voice, replied,"I would prefer not to." </p>
+ <p>I sat awhile in perfect silence, rallying my stunned faculties. Immediately it occurred to me that my ears had deceived me, or Bartleby had entirely misunderstood my meaning. I repeated my request in the clearest tone I could assume. But in quite as clear a one came the previous reply, "I would prefer not to."</p>
+ <p>"Prefer not to," echoed I, rising in high excitement, and crossing the room with a stride, "What do you mean? Are you moon-struck? I want you to help me compare this sheet here--take it," and I thrust it towards him.</p>
+ <p>"I would prefer not to," said he.</p>
+ <p>I looked at him steadfastly. His face was leanly composed; his gray eye dimly calm. Not a wrinkle of agitation rippled him. Had there been the least uneasiness, anger, impatience or impertinence in his manner; in other words, had there been any thing ordinarily human about him, doubtless I should have violently dismissed him from the premises. But as it was, I should have as soon thought of turning my pale plaster-of-paris bust of Cicero out of doors. I stood gazing at him awhile, as he went on with his own writing, and then reseated myself at my desk. This is very strange, thought I. What had one best do? But my business hurried me. I concluded to forget the matter for the present, reserving it for my future leisure. So calling Nippers from the other room, the paper was speedily examined.</p>
+ <p>A few days after this, Bartleby concluded four lengthy documents, being quadruplicates of a week's testimony taken before me in my High Court of Chancery. It became necessary to examine them. It was an important suit, and great accuracy was imperative. Having all things arranged I called Turkey, Nippers and Ginger Nut from the next room, meaning to place the four copies in the hands of my four clerks, while I should read from the original. Accordingly Turkey, Nippers and Ginger Nut had taken their seats in a row, each with his document in hand, when I called to Bartleby to join this interesting group.</p>
+ <p>"Bartleby! quick, I am waiting."</p>
+ <p>I heard a low scrape of his chair legs on the unscraped floor, and soon he appeared standing at the entrance of his hermitage. </p>
+ <p>"What is wanted?" said he mildly.</p>
+ <p>"The copies, the copies," said I hurriedly. "We are going to examine them. There"--and I held towards him the fourth quadruplicate.</p>
+ <p>"I would prefer not to," he said, and gently disappeared behind the screen.</p>
+ <p>For a few moments I was turned into a pillar of salt, standing at the head of my seated column of clerks. Recovering myself, I advanced towards the screen, and demanded the reason for such extraordinary conduct.</p>
+ <p>"<i>Why</i> do you refuse?"</p>
+ <p>"I would prefer not to."</p>
+ <p>With any other man I should have flown outright into a dreadful passion, scorned all further words, and thrust him ignominiously from my presence. But there was something about Bartleby that not only strangely disarmed me, but in a wonderful manner touched and disconcerted me. I began to reason with him.</p>
+ <p>"These are your own copies we are about to examine. It is labor saving to you, because one examination will answer for your four papers. It is common usage. Every copyist is bound to help examine his copy. Is it not so? Will you not speak? Answer!"</p>
+ <p>"I prefer not to," he replied in a flute-like tone. It seemed to me that while I had been addressing him, he carefully revolved every statement that I made; fully comprehended the meaning; could not gainsay the irresistible conclusion; but, at the same time, some paramount consideration prevailed with him to reply as he did.</p>
+ <p>"You are decided, then, not to comply with my request--a request made according to common usage and common sense?"</p>
+ <p>He briefly gave me to understand that on that point my judgment was sound. Yes: his decision was irreversible.</p>
+ <p>It is not seldom the case that when a man is browbeaten in some unprecedented and violently unreasonable way, he begins to stagger in his own plainest faith. He begins, as it were, vaguely to surmise that, wonderful as it may be, all the justice and all the reason is on the other side. Accordingly, if any disinterested persons are present, he turns to them for some reinforcement for his own faltering mind. </p>
+ <p>"Turkey," said I, "what do you think of this? Am I not right?"</p>
+ <p>"With submission, sir," said Turkey, with his blandest tone, "I think that you are."</p>
+ <p>"Nippers," said I, "what do<i> you</i> think of it?"</p>
+ <p>"I think I should kick him out of the office."</p>
+ <p>(The reader of nice perceptions will here perceive that, it being morning, Turkey's answer is couched in polite and tranquil terms, but Nippers replies in ill-tempered ones. Or, to repeat a previous sentence, Nipper's ugly mood was on duty, and Turkey's off.)</p>
+ <p>"Ginger Nut," said I, willing to enlist the smallest suffrage in my behalf, "what do<i> you</i> think of it?"</p>
+ <p>"I think, sir, he's a little<i> luny</i>," replied Ginger Nut, with a grin.</p>
+ <p>"You hear what they say," said I, turning towards the screen, "come forth and do your duty."</p>
+ <p>But he vouchsafed no reply. I pondered a moment in sore perplexity. But once more business hurried me. I determined again to postpone the consideration of this dilemma to my future leisure. With a little trouble we made out to examine the papers without Bartleby, though at every page or two, Turkey deferentially dropped his opinion that this proceeding was quite out of the common; while Nippers, twitching in his chair with a dyspeptic nervousness, ground out between his set teeth occasional hissing maledictions against the stubborn oaf behind the screen. And for his (Nipper's) part, this was the first and the last time he would do another man's business without pay.</p>
+ <p>Meanwhile Bartleby sat in his hermitage, oblivious to every thing but his own peculiar business there.</p>
+ <p>Some days passed, the scrivener being employed upon another lengthy work. His late remarkable conduct led me to regard his way narrowly. I observed that he never went to dinner; indeed that he never went any where. As yet I had never of my personal knowledge known him to be outside of my office. He was a perpetual sentry in the corner. At about eleven o'clock though, in the morning, I noticed that Ginger Nut would advance toward the opening in Bartleby's screen, as if silently beckoned thither by a gesture invisible to me where I sat. That boy would then leave the office jingling a few pence, and reappear with a handful of ginger-nuts which he delivered in the hermitage, receiving two of the cakes for his trouble.</p>
+ <p>He lives, then, on ginger-nuts, thought I; never eats a dinner, properly speaking; he must be a vegetarian then, but no; he never eats even vegetables, he eats nothing but ginger-nuts. My mind then ran on in reveries concerning the probable effects upon the human constitution of living entirely on ginger-nuts. Ginger-nuts are so called because they contain ginger as one of their peculiar constituents, and the final flavoring one. Now what was ginger? A hot, spicy thing. Was Bartleby hot and spicy? Not at all. Ginger, then, had no effect upon Bartleby. Probably he preferred it should have none. </p>
+ <p>Nothing so aggravates an earnest person as a passive resistance. If the individual so resisted be of a not inhumane temper, and the resisting one perfectly harmless in his passivity; then, in the better moods of the former, he will endeavor charitably to construe to his imagination what proves impossible to be solved by his judgment. Even so, for the most part, I regarded Bartleby and his ways. Poor fellow! thought I, he means no mischief; it is plain he intends no insolence; his aspect sufficiently evinces that his eccentricities are involuntary. He is useful to me. I can get along with him. If I turn him away, the chances are he will fall in with some less indulgent employer, and then he will be rudely treated, and perhaps driven forth miserably to starve. Yes. Here I can cheaply purchase a delicious self-approval. To befriend Bartleby; to humor him in his strange willfulness, will cost me little or nothing, while I lay up in my soul what will eventually prove a sweet morsel for my conscience. But this mood was not invariable with me. The passiveness of Bartleby sometimes irritated me. I felt strangely goaded on to encounter him in new opposition, to elicit some angry spark from him answerable to my own. But indeed I might as well have essayed to strike fire with my knuckles against a bit of Windsor soap. But one afternoon the evil impulse in me mastered me, and the following little scene ensued:</p>
+ <p>"Bartleby," said I, "when those papers are all copied, I will compare them with you."</p>
+ <p>"I would prefer not to."</p>
+ <p>"How? Surely you do not mean to persist in that mulish vagary?"</p>
+ <p>No answer.</p>
+ <p>I threw open the folding-doors near by, and turning upon Turkey and Nippers, exclaimed in an excited manner--</p>
+ <p>"He says, a second time, he won't examine his papers. What do you think of it, Turkey?"</p>
+ <p>It was afternoon, be it remembered. Turkey sat glowing like a brass boiler, his bald head steaming, his hands reeling among his blotted papers.</p>
+ <p>"Think of it?" roared Turkey; "I think I'll just step behind his screen, and black his eyes for him!"</p>
+ <p>So saying, Turkey rose to his feet and threw his arms into a pugilistic position. He was hurrying away to make good his promise, when I detained him, alarmed at the effect of incautiously rousing Turkey's combativeness after dinner.</p>
+ <p>"Sit down, Turkey," said I, "and hear what Nippers has to say. What do you think of it, Nippers? Would I not be justified in immediately dismissing Bartleby?"</p>
+ <p>"Excuse me, that is for you to decide, sir. I think his conduct quite unusual, and indeed unjust, as regards Turkey and myself. But it may only be a passing whim."</p>
+ <p>"Ah," exclaimed I, "you have strangely changed your mind then--you speak very gently of him now."</p>
+ <p>"All beer," cried Turkey; "gentleness is effects of beer--Nippers and I dined together to-day. You see how gentle I am, sir. Shall I go and black his eyes?"</p>
+ <p>"You refer to Bartleby, I suppose. No, not to-day, Turkey," I replied; "pray, put up your fists."</p>
+ <p>I closed the doors, and again advanced towards Bartleby. I felt additional incentives tempting me to my fate. I burned to be rebelled against again. I remembered that Bartleby never left the office.</p>
+ <p>"Bartleby," said I, "Ginger Nut is away; just step round to the Post Office, won't you? (it was but a three minutes walk,) and see if there is any thing for me."</p>
+ <p>"I would prefer not to."</p>
+ <p>"You<i> will</i> not?"</p>
+ <p>"I <i>prefer</i> not."</p>
+ <p>I staggered to my desk, and sat there in a deep study. My blind inveteracy returned. Was there any other thing in which I could procure myself to be ignominiously repulsed by this lean, penniless with?--my hired clerk? What added thing is there, perfectly reasonable, that he will be sure to refuse to do?</p>
+ <p>"Bartleby!"</p>
+ <p>No answer.</p>
+ <p>"Bartleby," in a louder tone.</p>
+ <p>No answer.</p>
+ <p>"Bartleby," I roared.</p>
+ <p>Like a very ghost, agreeably to the laws of magical invocation, at the third summons, he appeared at the entrance of his hermitage.</p>
+ <p>"Go to the next room, and tell Nippers to come to me."</p>
+ <p>"I prefer not to," he respectfully and slowly said, and mildly disappeared.</p>
+ <p>"Very good, Bartleby," said I, in a quiet sort of serenely severe self-possessed tone, intimating the unalterable purpose of some terrible retribution very close at hand. At the moment I half intended something of the kind. But upon the whole, as it was drawing towards my dinner-hour, I thought it best to put on my hat and walk home for the day, suffering much from perplexity and distress of mind.</p>
+ <p> Shall I acknowledge it? The conclusion of this whole business was that it soon became a fixed fact of my chambers, that a pale young scrivener, by the name of Bartleby, had a desk there; that he copied for me at the usual rate of four cents a folio (one hundred words); but he was permanently exempt from examining the work done by him, that duty being transferred to Turkey and Nippers, one of compliment doubtless to their superior acuteness; moreover, said Bartleby was never on any account to be dispatched on the most trivial errand of any sort; and that even if entreated to take upon him such a matter, it was generally understood that he would prefer not to--in other words, that he would refuse point-blank. </p>
+ <p>32 As days passed on, I became considerably reconciled to Bartleby. His steadiness, his freedom from all dissipation, his incessant industry (except when he chose to throw himself into a standing revery behind his screen), his great stillness, his unalterableness of demeanor under all circumstances, made him a valuable acquisition. One prime thing was this,--he was always there;--first in the morning, continually through the day, and the last at night. I had a singular confidence in his honesty. I felt my most precious papers perfectly safe in his hands. Sometimes to be sure I could not, for the very soul of me, avoid falling into sudden spasmodic passions with him. For it was exceeding difficult to bear in mind all the time those strange peculiarities, privileges, and unheard of exemptions, forming the tacit stipulations on Bartleby's part under which he remained in my office. Now and then, in the eagerness of dispatching pressing business, I would inadvertently summon Bartleby, in a short, rapid tone, to put his finger, say, on the incipient tie of a bit of red tape with which I was about compressing some papers. Of course, from behind the screen the usual answer, "I prefer not to," was sure to come; and then, how could a human creature with the common infirmities of our nature, refrain from bitterly exclaiming upon such perverseness--such unreasonableness. However, every added repulse of this sort which I received only tended to lessen the probability of my repeating the inadvertence.</p>
+ <p>Here is must be said, that according to the custom of most legal gentlemen occupying chambers in densely-populated law buildings, there were several keys to my door. One was kept by a woman residing in the attic, which person weekly scrubbed and daily swept and dusted my apartments. Another was kept by Turkey for convenience sake. The third I sometimes carried in my own pocket. The fourth I knew not who had.</p>
+ <p>Now, one Sunday morning I happened to go to Trinity Church, to hear a celebrated preacher, and finding myself rather early on the ground, I thought I would walk round to my chambers for a while. Luckily I had my key with me; but upon applying it to the lock, I found it resisted by something inserted from the inside. Quite surprised, I called out; when to my consternation a key was turned from within; and thrusting his lean visage at me, and holding the door ajar, the apparition of Bartleby appeared, in his shirt sleeves, and otherwise in a strangely tattered dishabille, saying quietly that he was sorry, but he was deeply engaged just then, and--preferred not admitting me at present. In a brief word or two, he moreover added, that perhaps I had better walk round the block two or three times, and by that time he would probably have concluded his affairs. Now, the utterly unsurmised appearance of Bartleby, tenanting my law-chambers of a Sunday morning, with his cadaverously gentlemanly nonchalance, yet withal firm and self-possessed, had such a strange effect upon me, that incontinently I slunk away from my own door, and did as desired. But not without sundry twinges of impotent rebellion against the mild effrontery of this unaccountable scrivener. Indeed, it was his wonderful mildness chiefly, which not only disarmed me, but unmanned me, as it were. For I consider that one, for the time, is a sort of unmanned when he tranquilly permits his hired clerk to dictate to him, and order him away from his own premises. Furthermore, I was full of uneasiness as to what Bartleby could possibly be doing in my office in his shirt sleeves, and in an otherwise dismantled condition of a Sunday morning. Was any thing amiss going on? Nay, that was out of the question. It was not to be thought of for a moment that Bartleby was an immoral person. But what could he be doing there?--copying? Nay again, whatever might be his eccentricities, Bartleby was an eminently decorous person. He would be the last man to sit down to his desk in any state approaching to nudity. Besides, it was Sunday; and there was something about Bartleby that forbade the supposition that we would by any secular occupation violate the proprieties of the day.</p>
+ <p>Nevertheless, my mind was not pacified; and full of a restless curiosity, at last I returned to the door. Without hindrance I inserted my key, opened it, and entered. Bartleby was not to be seen. I looked round anxiously, peeped behind his screen; but it was very plain that he was gone. Upon more closely examining the place, I surmised that for an indefinite period Bartleby must have ate, dressed, and slept in my office, and that too without plate, mirror, or bed. The cushioned seat of a rickety old sofa in one corner bore t faint impress of a lean, reclining form. Rolled away under his desk, I found a blanket; under the empty grate, a blacking box and brush; on a chair, a tin basin, with soap and a ragged towel; in a newspaper a few crumbs of ginger-nuts and a morsel of cheese. Yet, thought I, it is evident enough that Bartleby has been making his home here, keeping bachelor's hallall by himself. Immediately then the thought came sweeping across me, What miserable friendlessness and loneliness are here revealed! His poverty is great; but his solitude, how horrible! Think of it. Of a Sunday, Wall-street is deserted as Petra; and every night of every day it is an emptiness. This building too, which of week-days hums with industry and life, at nightfall echoes with sheer vacancy, and all through Sunday is forlorn. And here Bartleby makes his home; sole spectator of a solitude which he has seen all populous--a sort of innocent and transformed Marius brooding among the ruins of Carthage! </p>
+ <p>For the first time in my life a feeling of overpowering stinging melancholy seized me. Before, I had never experienced aught but a not-unpleasing sadness. The bond of a common humanity now drew me irresistibly to gloom. A fraternal melancholy! For both I and Bartleby were sons of Adam. I remembered the bright silks and sparkling faces I had seen that day in gala trim, swan-like sailing down the Mississippi of Broadway; and I contrasted them with the pallid copyist, and thought to myself, Ah, happiness courts the light, so we deem the world is gay; but misery hides aloof, so we deem that misery there is none. These sad fancyings-- chimeras, doubtless, of a sick and silly brain--led on to other and more special thoughts, concerning the eccentricities of Bartleby. Presentiments of strange discoveries hovered round me. The scrivener's pale form appeared to me laid out, among uncaring strangers, in its shivering winding sheet.</p>
+ <p>Suddenly I was attracted by Bartleby's closed desk, the key in open sight left in the lock.</p>
+ <p> I mean no mischief, seek the gratification of no heartless curiosity, thought I; besides, the desk is mine, and its contents too, so I will make bold to look within. Every thing was methodically arranged, the papers smoothly placed. The pigeon holes were deep, and removing the files of documents, I groped into their recesses. Presently I felt something there, and dragged it out. It was an old bandanna handkerchief, heavy and knotted. I opened it, and saw it was a savings' bank.</p>
+ <p>I now recalled all the quiet mysteries which I had noted in the man. I remembered that he never spoke but to answer; that though at intervals he had considerable time to himself, yet I had never seen him reading--no, not even a newspaper; that for long periods he would stand looking out, at his pale window behind the screen, upon the dead brick wall; I was quite sure he never visited any refectory or eating house; while his pale face clearly indicated that he never drank beer like Turkey, or tea and coffee even, like other men; that he never went any where in particular that I could learn; never went out for a walk, unless indeed that was the case at present; that he had declined telling who he was, or whence he came, or whether he had any relatives in the world; that though so thin and pale, he never complained of ill health. And more than all, I remembered a certain unconscious air of pallid--how shall I call it?--of pallid haughtiness, say, or rather an austere reserve about him, which had positively awed me into my tame compliance with his eccentricities, when I had feared to ask him to do the slightest incidental thing for me, even though I might know, from his long-continued motionlessness, that behind his screen he must be standing in one of those dead-wall reveries of his.</p>
+ <p>Revolving all these things, and coupling them with the recently discovered fact that he made my office his constant abiding place and home, and not forgetful of his morbid moodiness; revolving all these things, a prudential feeling began to steal over me. My first emotions had been those of pure melancholy and sincerest pity; but just in proportion as the forlornness of Bartleby grew and grew to my imagination, did that same melancholy merge into fear, that pity into repulsion. So true it is, and so terrible too, that up to a certain point the thought or sight of misery enlists our best affections; but, in certain special cases, beyond that point it does not. They err who would assert that invariably this is owing to the inherent selfishness of the human heart. It rather proceeds from a certain hopelessness of remedying excessive and organic ill. To a sensitive being, pity is not seldom pain. And when at last it is perceived that such pity cannot lead to effectual succor, common sense bids the soul be rid of it. What I saw that morning persuaded me that the scrivener was the victim of innate and incurable disorder. I might give alms to his body; but his body did not pain him; it was his soul that suffered, and his soul I could not reach. </p>
+ <p>I did not accomplish the purpose of going to Trinity Church that morning. Somehow, the things I had seen disqualified me for the time from church-going. I walked homeward, thinking what I would do with Bartleby. Finally, I resolvedupon this;--I would put certain calm questions to him the next morning, touching his history, &amp;c., and if he declined to answer then openly and reservedly (and I supposed he would prefer not), then to give him a twenty dollar bill over and above whatever I might owe him, and tell him his services were no longer required; but that if in any other way I could assist him, I would be happy to do so, especially if he desired to return to his native place, wherever that might be, I would willingly help to defray the expenses. Moreover, if after reaching home, he found himself at any time in want of aid, a letter from him would be sure of a reply.</p>
+ <p>The next morning came.</p>
+ <p>"Bartleby," said I, gently calling to him behind the screen.</p>
+ <p>No reply.</p>
+ <p>"Bartleby," said I, in a still gentler tone, "come here; I am not going to ask you to do any thing you would prefer not to do--I simply wish to speak to you."</p>
+ <p>Upon this he noiselessly slid into view.</p>
+ <p>"Will you tell me, Bartleby, where you were born?" </p>
+ <p>"I would prefer not to."</p>
+ <p>"Will you tell me <i>anything </i>about yourself?"</p>
+ <p>"I would prefer not to."</p>
+ <p>"But what reasonable objection can you have to speak to me? I feel friendly towards you."</p>
+ <p>He did not look at me while I spoke, but kept his glance fixed upon my bust of Cicero, which as I then sat, was directly behind me, some six inches above my head. "What is your answer, Bartleby?" said I, after waiting a considerable time for a reply, during which his countenance remained immovable, only there was the faintest conceivable tremor of the white attenuated mouth.</p>
+ <p>"At present I prefer to give no answer," he said, and retired into his hermitage.</p>
+ <p>It was rather weak in me I confess, but his manner on this occasion nettled me. Not only did there seem to lurk in it a certain disdain, but his perverseness seemed ungrateful, considering the undeniable good usage and indulgence he had received from me.</p>
+ <p>Again I sat ruminating what I should do.Mortified as I was at his behavior, and resolved as I had been to dismiss him when I entered my office, nevertheless I strangely felt something superstitious knocking at my heart, and forbidding me to carry out my purpose, and denouncing me for a villain if I dared to breathe one bitter word against this forlornest of mankind. At last, familiarly drawing my chair behind his screen, I sat down and said: "Bartleby, never mind then about revealing your history; but let me entreat you, as a friend, to comply as far as may be with the usages of this office. Say now you will help to examine papers tomorrow or next day: in short, say now that in a day or two you will begin to be a little reasonable:--say so, Bartleby."</p>
+ <p>"At present I would prefer not to be a little reasonable was his idly cadaverous reply.,"</p>
+ <p>Just then the folding-doors opened, and Nippers approached. He seemed suffering from an unusually bad night's rest, induced by severer indigestion than common. He overheard those final words of Bartleby.</p>
+ <p><i>"Prefer</i> not, eh?" gritted Nippers--"I'd<i> prefer</i> him, if I were you, sir," addressing me--"I'd <i>prefer</i> him; I'd give him preferences, the stubborn mule! What is it, sir, pray, that he <i>prefers</i> not to do now?"</p>
+ <p>Bartleby moved not a limb.</p>
+ <p>"Mr. Nippers," said I, "I'd prefer that you would withdraw for the present." </p>
+ <p>Somehow, of late I had got into the way of involuntary using this word "prefer" upon all sorts of not exactly suitable occasions. And I trembled to think that my contact with the scrivener had already and seriously affected me in a mental way. And what further and deeper aberration might it not yet produce? This apprehension had not been without efficacy in determining me to summary means.</p>
+ <p>As Nippers, looking very sour and sulky, was departing, Turkey blandly and deferentially approached.</p>
+ <p>"With submission, sir," said he, "yesterday I was thinking about Bartleby here, and I think that if he would but prefer to take a quart of good ale every day, it would do much towards mending him, and enabling him to assist in examining his papers."</p>
+ <p>"So you have got the word too," said I, slightly excited.</p>
+ <p>"With submission, what word, sir," asked Turkey, respectfully crowding himself into the contracted space behind the screen, and by so doing, making me jostle the scrivener. "What word, sir?"</p>
+ <p>"I would prefer to be left alone here," said Bartleby, as if offended at being mobbed in his privacy. </p>
+ <p>"<i>That's</i> the word, Turkey," said I--<i>"that's</i> it."</p>
+ <p>"Oh,<i> prefer</i> oh yes--queer word. I never use it myself. But, sir as I was saying, if he would but prefer--"</p>
+ <p>"Turkey," interrupted I, "you will please withdraw."</p>
+ <p>"Oh, certainly, sir, if you prefer that I should."</p>
+ <p>As he opened the folding-door to retire, Nippers at his desk caught a glimpse of me, and asked whether I would prefer to have a certain paper copied on blue paper or white. He did not in the least roguishly accent the word prefer. It was plain that it involuntarily rolled from his tongue. I thought to myself, surely I must get rid of a demented man, who already has in some degree turned the tongues, if not the heads of myself and clerks. But I thought it prudent not to break the dismission at once.</p>
+ <p>The next day I noticed that Bartleby did nothing but stand at his window in his dead-wall revery. Upon asking him why he did not write, he said that he had decided upon doing no more writing.</p>
+ <p>"Why, how now? what next?" exclaimed I, "do no more writing?"</p>
+ <p>"No more."</p>
+ <p>"And what is the reason?"</p>
+ <p>"Do you not see the reason for yourself," he indifferently replied.</p>
+ <p>I looked steadfastly at him, and perceived that his eyes looked dull and glazed. Instantly it occurred to me, that his unexampled diligence in copying by his dim window for the first few weeks of his stay with me might have temporarily impaired his vision.</p>
+ <p>I was touched. I said something in condolence with him. I hinted that of course he did wisely in abstaining from writing for a while; and urged him to embrace that opportunity of taking wholesome exercise in the open air. This, however, he did not do. A few days after this, my other clerks being absent, and being in a great hurry to dispatch certain letters by the mail, I thought that, having nothing else earthly to do, Bartleby would surely be less inflexible than usual, and carry these letters to the post-office. But he blankly declined. So, much to my inconvenience, I went myself.</p>
+ <p>Still added days went by. Whether Bartleby's eyes improved or not, I could not say. To all appearance, I thought they did. But when I asked him if they did, he vouchsafed no answer. At all events, he would do no copying. At last, in reply to my urgings, he informed me that he had permanently given up copying.</p>
+ <p>"What!" exclaimed I; "suppose your eyes should get entirely well- better than ever before--would you not copy then?"</p>
+ <p>"I have given up copying," he answered, and slid aside. </p>
+ <p>He remained as ever, a fixture in my chamber. Nay--if that were possible--he became still more of a fixture than before. What was to be done? He would do nothing in the office: why should he stay there? In plain fact, he had now become a millstone to me, not only useless as a necklace, but afflictive to bear. Yet I was sorry for him. I speak less than truth when I say that, on his own account, he occasioned me uneasiness. If he would but have named a single relative or friend, I would instantly have written, and urged their taking the poor fellow away to some convenient retreat. But he seemed alone, absolutely alone in the universe. A bit of wreck&lt;/font&gt; in the mid Atlantic. At length, necessities connected with my business tyrannized over all other considerations. Decently as I could, I told Bartleby that in six days' time he must unconditionally leave the office. I warned him to take measures, in the interval, for procuring some other abode. I offered to assist him in this endeavor, if he himself would but take the first step towards a removal. "And when you finally quit me, Bartleby," added I, "I shall see that you go not away entirely unprovided. Six days from this hour, remember."</p>
+ <p>At the expiration of that period, I peeped behind the screen, and lo! Bartleby was there. </p>
+ <p>I buttoned up my coat, balanced myself; advanced slowly towards him, touched his shoulder, and said, "The time has come; you must quit this place; I am sorry for you; here is money; but you must go."</p>
+ <p>"I would prefer not," he replied, with his back still towards me.</p>
+ <p>"You<i> must</i>."</p>
+ <p>He remained silent.</p>
+ <p>Now I had an unbounded confidence in this man's common honesty. He had frequently restored to me six pences and shillings carelessly dropped upon the floor, for I am apt to be very reckless in such shirt-button affairs. The proceeding then which followed will not be deemed extraordinary. "Bartleby," said I, "I owe you twelve dollars on account; here are thirty-two; the odd twenty are yours.--Will you take it? and I handed the bills towards him.</p>
+ <p>But he made no motion.</p>
+ <p>"I will leave them here then," putting them under a weight on the table. Then taking my hat and cane and going to the door I tranquilly turned and added--"After you have removed your things from these offices, Bartleby, you will of course lock the door--since every one is now gone for the day but you--and if you please, slip your key underneath the mat, so that I may have it in the morning. I shall not see you again; so good-bye to you. If hereafter in your new place of abode I can be of any service to you, do not fail to advise me by letter. Good-bye, Bartleby, and fare you well."</p>
+ <p>But he answered not a word; like the last column of some ruined temple, he remained standing mute and solitary in the middle of the otherwise deserted room.</p>
+ <p>As I walked home in a pensive mood, my vanity got the better of my pity. I could not but highly plume myself on my masterly management in getting rid of Bartleby. Masterly I call it, and such it must appear to any dispassionate thinker. The beauty of my procedure seemed to consist in its perfect quietness. There was no vulgar bullying, no bravado of any sort, no choleric hectoring and striding to and fro across the apartment, jerking out vehement commands for Bartleby to bundle himself off with his beggarly traps. Nothing of the kind. Without loudly bidding Bartleby depart--as an inferior genius might have done--I assumed the ground that depart he must; and upon the assumption built all I had to say. The more I thought over my procedure, the more I was charmed with it. Nevertheless, next morning, upon awakening, I had my doubts,--I had somehow slept off the fumes of vanity. One of the coolest and wisest hours a man has, is just after he awakes in the morning. My procedure seemed as sagacious as ever,--but only in theory. How it would prove in practice--there was the rub. It was truly a beautiful thought to have assumed Bartleby's departure; but, after all, that assumption was simply my own, and none of Bartleby's. The great point was, not whether I had assumed that he would quit me, but whether he would prefer so to do. He was more a man of preferences than assumptions.</p>
+ <p>After breakfast, I walked down town, arguing the probabilities pro and con. One moment I thought it would prove a miserable failure, and Bartleby would be found all alive at my office as usual; the next moment it seemed certain that I should see his chair empty. And so I kept veering about. At the corner of Broadway and Canal- street, I saw quite an excited group of people standing in earnest conversation.</p>
+ <p>"I'll take odds he doesn't," said a voice as I passed.</p>
+ <p>"Doesn't go?--done!" said I, "put up your money."</p>
+ <p>I was instinctively putting my hand in my pocket to produce my own, when I remembered that this was an election day. The words I had overheard bore no reference to Bartleby, but to the success or non-success of some candidate for the mayoralty. In my intent frame of mind, I had, as it were, imagined that all Broadway shared in my excitement, and were debating the same question with me. I passed on, very thankful that the uproar of the street screened my momentary absent-mindedness.</p>
+ <p>As I had intended, I was earlier than usual at my office door. I stood listening for a moment. All was still. He must be gone. I tried the knob. The door was locked. Yes, my procedure had worked to a charm; he indeed must be vanished. Yet a certain melancholy mixed with this: I was almost sorry for my brilliant success. I was fumbling under the door mat for the key, which Bartleby was to have left there for me, when accidentally my knee knocked against a panel, producing a summoning sound, and in response a voice came to me from within--"Not yet; I am occupied."</p>
+ <p>It was Bartleby.</p>
+ <p>I was thunderstruck. For an instant I stood like the man who, pipe in mouth, was killed one cloudless afternoon long ago in Virginia, by summer lightning; at his own warm open window he was killed, and remained leaning out there upon the dreamy afternoon, till some one touched him, when he fell. "Not gone!" I murmured at last. But again obeying that wondrous ascendancy which the inscrutable scrivener had over me, and from which ascendancy, for all my chafing, I could not completely escape, I slowly went down stairs and out into the street, and while walking round the block, considered what I should next do in this unheard-of-perplexity. Turn the man out by an actual thrusting I could not; to drive him away by calling him hard names would not do; calling in the police was an unpleasant idea; and yet, permit him to enjoy his cadaverous triumph over me,--this too I could not think of. What was to be done? or, if nothing could be done, was there any thing further that I could assume in the matter? Yes, as before I had prospectively assumed that Bartleby would depart, so now I might retrospectively assume that departed he was. In the legitimate carrying out of this assumption, I might enter my office in a great hurry, and pretending not to see Bartleby at all, walk straight against him as if he were air. Such a proceeding would in a singular degree have the appearance of a home-thrust. It was hardly possible that Bartleby could withstand such an application of the doctrine of assumptions. But upon second thoughts the success of the plan seemed rather dubious. I resolved to argue the matter over with him again.</p>
+ <p>Bartleby," said I, entering the office, with a quietly severe expression. "I am seriously displeased. I am pained, Bartleby. I had thought better of you. I had imagined you of such a gentlemanly organization, that in any delicate dilemma a slight hint would suffice--in short, an assumption. But it appears I am deceived. Why," I added, unaffectedly starting, "you have not even touched the money yet," pointing to it, just where I had left it the evening previous.</p>
+ <p>He answered nothing.</p>
+ <p>"Will you, or will you not, quit me?" I now demanded in a sudden passion, advancing close to him.</p>
+ <p>"I would prefer <i>not</i> to quit you," he replied, gently emphasizing the<i> not</i>.</p>
+ <p>"What earthly right have you to stay here? do you pay any rent? Do you pay my taxes? Or is this property yours?"</p>
+ <p>He answered nothing.</p>
+ <p>"Are you ready to go on and write now? Are your eyes recovered? Could you copy a small paper for me this morning? or help examine a few lines? or step round to the post-office? In a word, will you do any thing at all, to give a coloring to your refusal to depart the premises?"</p>
+ <p>He silently retired into his hermitage.</p>
+ <p>I was now in such a state of nervous resentment that I thought it but prudentto check myself at present from further demonstrations. Bartleby and I were alone. I remembered the tragedy of the unfortunate Adams and the still more unfortunate Colt in the solitary office of the latter; and how poor Colt, being dreadfully incensed by Adams, and imprudently permitting himself to get wildly excited, was at unawares hurried into his fatal act--an act which certainly no man could possibly deplore more than the actor himself. Often it had occurred to me in my ponderings upon the subject, that had that altercation taken place in the public street, or at a private residence, it would not have terminated as it did. It was the circumstance of being alone in a solitary office, up stairs, of a building entirely unhallowed by humanizing domestic associations--an uncarpeted office, doubtless of a dusty, haggard sort of appearance;--this it must have been, which greatly helped to enhance the irritable desperation of the hapless Colt.</p>
+ <p>But when this old Adam of resentment rose in me and tempted me concerning Bartleby, I grappled him and threw him. How? Why, simply by recalling the divine injunction: "A new commandment give I unto you, that ye love one another." Yes, this it was that saved me. Aside from higher considerations, charity often operates as a vastly wise and prudent principle--a great safeguard to its possessor. Men have committed murder for jealousy's sake, and anger's sake, and hatred's sake, and selfishness' sake, and spiritual pride's sake; but no man that ever I heard of, ever committed a diabolical murder for sweet charity's sake. Mere self-interest, then, if no better motive can be enlisted, should, especially with high-tempered men, prompt all beings to charity and philanthropy. At any rate, upon the occasion in question, I strove to drown my exasperated feelings towards the scrivener by benevolently construing his conduct. Poor fellow, poor fellow! thought I, he don't mean any thing; and besides, he has seen hard times, and ought to be indulged.</p>
+ <p>I endeavored also immediately to occupy myself, and at the same time to comfort my despondency.I tried to fancy that in the course of the morning, at such time as might prove agreeable to him, Bartleby, of his own free accord, would emerge from his hermitage, and take up some decided line of march in the direction of the door. But no. Half-past twelve o'clock came; Turkey began to glow in the face, overturn his inkstand, and become generally obstreperous; Nippers abated down into quietude and courtesy; Ginger Nut munched his noon apple; and Bartleby remained standing at his window in one of his profoundest deadwall reveries. Will it be credited? Ought I to acknowledge it? That afternoon I left the office without saying one further word to him.</p>
+ <p>Some days now passed, during which, at leisure intervals I looked a little into Edwards on the Will," and "Priestly on Necessity." Under the circumstances, those books induced a salutary feeling. Gradually I slid into the persuasion that these troubles of mine touching the scrivener, had been all predestinated from eternity, and Bartleby was billeted upon me for some mysterious purpose of an all-wise Providence, which it was not for a mere mortal like me to fathom. Yes, Bartleby, stay there behind your screen, thought I; I shall persecute you no more; you are harmless and noiseless as any of these old chairs; in short, I never feel so private as when I know you are here. At least I see it, I feel it; I penetrate to the predestinated purpose of my life. I am content. Others may have loftier parts to enact; but my mission in this world, Bartleby, is to furnish you with office-room for such period as you may see fit to remain.</p>
+ <p>I believe that this wise and blessed frame of mind would have continued with me, had it not been for the unsolicited and uncharitable remarks obtruded upon me by my professional friends who visited the rooms. But thus it often is, that the constant friction of illiberal minds wears out at last the best resolves of the more generous. Though to be sure, when I reflected upon it, it was not strange that people entering my office should be struck by the peculiar aspect of the unaccountable Bartleby, and so be tempted to throw out some sinister observations concerning him. Sometimes an attorney having business with me, and calling at my office, and finding no one but the scrivener there, would undertake to obtain some sort of precise information from him touching my whereabouts; but without heeding his idle talk, Bartleby would remain standing immovable in the middle of the room. So after contemplating him in that position for a time, the attorney would depart, no wiser than he came.</p>
+ <p>Also, when a Reference was going on, and the room full of lawyers and witnesses and business was driving fast; some deeply occupied legal gentleman present, seeing Bartleby wholly unemployed, would request him to run round to his (the legal gentleman's) office and fetch some papers for him. Thereupon, Bartleby would tranquilly decline, and remain idle as before. Then the lawyer would give a great stare, and turn to me. And what could I say? At last I was made aware that all through the circle of my professional acquaintance, a whisper of wonder was running round, having reference to the strange creature I kept at my office. This worried me very much. And as the idea came upon me of his possibly turning out a long-lived man, and keep occupying my chambers, and denying my authority; and perplexing my visitors; and scandalizing my professional reputation; and casting a general gloom over the premises; keeping soul and body together to the last upon his savings (for doubtless he spent but half a dime a day), and in the end perhaps outlive me, and claim possession of my office by right of his perpetual occupancy: as all these dark anticipations crowded upon me more and more, and my friends continually intruded their relentless remarks upon the apparition in my room; a great change was wrought in me. I resolved to gather all my faculties together, and for ever rid me of this intolerable incubus.</p>
+ <p>Ere revolving any complicated project, however, adapted to this end, I first simply suggested to Bartleby the propriety of his permanent departure. In a calm and serious tone, I commended the idea to his careful and mature consideration. But having taken three days to meditate upon it, he apprised me that his original determination remained the same; in short, that he still preferred to abide with me.</p>
+ <p>What shall I do? I now said to myself, buttoning up my coat to the last button. What shall I do? what ought I to do? what does conscience say I should do with this man, or rather ghost. Rid myself of him, I must; go, he shall. But how? You will not thrust him, the poor, pale, passive mortal,--you will not thrust such a helpless creature out of your door? you will not dishonor yourself by such cruelty? No, I will not, I cannot do that. Rather would I let him live and die here, and then mason up his remains in the wall. What then will you do? For all your coaxing, he will not budge. Bribes he leaves under your own paperweight on your table; in short, it is quite plain that he prefers to cling to you.</p>
+ <p>Then something severe, something unusual must be done. What! surely you will not have him collared by a constable, and commit his innocent pallor to the common jail? And upon what ground could you procure such a thing to be done?--a vagrant, is he? What! he a vagrant, a wanderer, who refuses to budge? It is because he will not be a vagrant, then, that you seek to count him as a vagrant. That is too absurd. No visible means of support: there I have him. Wrong again: for indubitably he does support himself, and that is the only unanswerable proof that any man can show of his possessing the means so to do. No more then. Since he will not quit me, I must quit him. I will change my offices; I will move elsewhere; and give him fair notice, that if I find him on my new premises I will then proceed against him as a common trespasser.</p>
+ <p>Acting accordingly, next day I thus addressed him: "I find these chambers too far from the City Hall; the air is unwholesome. In a word, I propose to remove my offices next week, and shall no longer require your services. I tell you this now, in order that you may seek another place."</p>
+ <p>He made no reply, and nothing more was said.</p>
+ <p>On the appointed day I engaged carts and men, proceeded to my chambers, and having but little furniture, every thing was removed in a few hours. Throughout, the scrivener remained standing behind the screen, which I directed to be removed the last thing. It was withdrawn; and being folded up like a huge folio, left him the motionless occupant of a naked room. I stood in the entry watching him a moment, while something from within me upbraided me.</p>
+ <p>I re-entered, with my hand in my pocket--and--and my heart in my mouth. </p>
+ <p>"Good-bye, Bartleby; I am going--good-bye, and God some way bless you; and take that," slipping something in his hand. But it dropped to the floor, and then,--strange to say--I tore myself from him whom I had so longed to be rid of.</p>
+ <p>Established in my new quarters, for a day or two I kept the door locked, and started at every footfall in the passages. When I returned to my rooms after any little absence, I would pause at the threshold for an instant, and attentively listen, ere applying my key. But these fears were needless. Bartleby never came nigh me.</p>
+ <p>I thought all was going well, when a perturbed looking stranger visited me, inquiring whether I was the person who had recently occupied rooms at No.--Wall-street.</p>
+ <p>Full of forebodings, I replied that I was.</p>
+ <p>"Then, sir," said the stranger, who proved a lawyer, "you are responsible for the man you left there. He refuses to do any copying; he refuses to do any thing; he says he prefers not to; and he refuses to quit the premises."</p>
+ <p>"I am very sorry, sir," said I, with assumed tranquillity, but an inward tremor, "but, really, the man you allude to is nothing to me --he is no relation or apprentice of mine, that you should hold me responsible for him."</p>
+ <p>"In mercy's name, who is he?"</p>
+ <p>"I certainly cannot inform you. I know nothing about him. Formerly I employed him as a copyist; but he has done nothing for me now for some time past."</p>
+ <p>"I shall settle him then,--good morning, sir."</p>
+ <p>Several days passed, and I heard nothing more; and though I often felt a charitable prompting to call at the place and see poor Bartleby, yet a certain squeamishness of I know not what withheld me.</p>
+ <p>All is over with him, by this time, thought I at last, when through another week no further intelligence reached me. But coming to my room the day after, I found several persons waiting at my door in a high state of nervous excitement.</p>
+ <p>"That's the man--here he comes," cried the foremost one, whom recognized as the lawyer who had previously called upon me alone.</p>
+ <p>"You must take him away, sir, at once," cried a portly person among them, advancing upon me, and whom I knew to be the landlord of No.--Wall-street. "These gentlemen, my tenants, cannot stand it any longer; Mr. B--" pointing to the lawyer, "has turned him out of his room, and he now persists in haunting the buildinggenerally, sitting upon the banisters of the stairs by day, and sleeping in the entry by night. Every body is concerned; clients are leaving the offices; some fears are entertained of a mob; something you must do, and that without delay."</p>
+ <p> Aghast at this torment, I fell back before it, and would fain have locked myselfin my new quarters. In vain I persisted that Bartleby was nothing to me--no more than to any one else. In vain:--I was the last person known to have any thing to do with him, and they held me to the terrible account. Fearful then of being exposed in the papers (as one person present obscurely threatened) I considered the matter, and at length said, that if the lawyer would give me a confidential interview with the scrivener, in his (the lawyer's) own room, I would that afternoon strive my best to rid them of the nuisance they complained of.</p>
+ <p>Going up stairs to my old haunt, there was Bartleby silently sitting upon the banister at the landing.</p>
+ <p>"What are you doing here, Bartleby?" said I.</p>
+ <p>"Sitting upon the banister," he mildly replied.</p>
+ <p>I motioned him into the lawyer's room, who then left us.</p>
+ <p>"Bartleby," said I, "are you aware that you are the cause of great tribulation to me, by persisting in occupying the entry after being dismissed from the office?"</p>
+ <p>No answer.</p>
+ <p>"Now one of two things must take place. Either you must do something or something must be done to you. Now what sort of business would you like to engage in? Would you like to re-engage in copying for some one?"</p>
+ <p>"No; I would prefer not to make any change."</p>
+ <p>"Would you like a clerkship in a dry-goods store?"</p>
+ <p>"There is too much confinement about that. No, I would not like a clerkship; but I am not particular."</p>
+ <p>"Too much confinement," I cried, "why you keep yourself confined all the time!"</p>
+ <p>"I would prefer not to take a clerkship," he rejoined, as if to settle that little item at once.</p>
+ <p>"How would a bar-tender's business suit you? There is no trying of the eyesight in that."</p>
+ <p>"I would not like it at all; though, as I said before, I am not particular."</p>
+ <p>His unwonted wordiness inspirited me. I returned to the charge.</p>
+ <p>"Well then, would you like to travel through the country collecting bills for the merchants? That would improve your health."</p>
+ <p>"No, I would prefer to be doing something else."</p>
+ <p>"How then would going as a companion to Europe, to entertain some young gentleman with your conversation,--how would that suit you?"</p>
+ <p>"Not at all. It does not strike me that there is any thing definite about that. I like to be stationary. But I am not particular.</p>
+ <p>"Stationary you shall be then," I cried, now losing all patience, and for the first time in all my exasperating connection with him fairly flying into a passion. "If you do not go away from these premises before night, I shall feel bound--indeed I am bound--to-- to--to quit the premises myself!" I rather absurdly concluded, knowing not with what possible threat to try to frighten his immobility into compliance. Despairing of all further efforts, I was precipitately leaving him, when a final thought occurred to me--one which had not been wholly unindulged before. </p>
+ <p>"Bartleby," said I, in the kindest tone I could assume under such exciting circumstances, "will you go home with me now--not to my office, but my dwelling--and remain there till we can conclude upon some convenient arrangement for you at our leisure? Come, let us start now, right away."</p>
+ <p>"No: at present I would prefer not to make any change at all."</p>
+ <p>I answered nothing; but effectualy dodging every one by the suddenness and rapidity of my flight, rushed from the building, ran up Wall-street towards Broadway, and jumping into the first omnibus was soon removed from pursuit. As soon as tranquility returned I distinctly perceived that I had now done all that I possibly could, both in respect to the demands of the landlord and his tenants, and with regard to my own desire and sense of duty, to benefit Bartleby, and shield him from rude persecution. I now strove to be entirely care-free and quiescent; and my conscience justified me in the attempt; though indeed it was not so successful as I could have wished. So fearful was I of being again hunted out by the incensed landlord and his exasperated tenants, that, surrendering my business to Nippers, for a few days I drove about the upper part of the town and through the suburbs, in my rockaway; crossed over to Jersey City and Hoboken, and paid fugitive visits to Manhattanville and Astoria. In fact I almost lived in my rockaway for the time.</p>
+ <p>When again I entered my office, lo, a note from the landlord lay upon desk. opened it with trembling hands. informed me that writer had sent to police, and Bartleby removed the Tombs as a vagrant. Moreover, since I knew more about him than any one else, he wished me to appear at that place, and make a suitable statement of the facts. These tidings had a conflicting effect upon me. At first I was indignant; but at last almost approved. The landlord's energetic, summary disposition, had led him to adopt a procedure which I do not think I would have decided upon myself; and yet as a last resort, under such peculiar circumstances, it seemed the only plan.</p>
+ <p>As I afterwards learned, the poor scrivener, when told that he must be conducted to the Tombs, offered not the slightest obstacle, but in his pale unmoving way, silently acquiesced. </p>
+ <p>Some of the compassionate and curious bystanders joined the party; and headed by one of the constables arm in arm with Bartleby, the silent procession filed its way through all the noise, and heat, and joy of the roaring thoroughfares at noon.</p>
+ <p>The same day I received the note I went to the Tombs, or to speak more properly, the Halls of Justice. Seeking the right officer, I stated the purpose of my call, and was informed that the individual I described was indeed within. I then assured the functionary that Bartleby was a perfectly honest man, and greatly to be compassionated, however unaccountably eccentric. I narrated all I knew,and closed by suggesting the idea of letting him remain in as indulgent confinement as possible till something less harsh might be done--though indeed I hardly knew what. At all events, if nothing else could be decided upon, the alms-house must receive him. I then begged to have an interview.</p>
+ <p>Being under no disgraceful charge, and quite serene and harmless in all his ways, they had permitted him freely to wander about the prison, and especially in the inclosed grass-platted yards thereof. And so I found him there, standing all alone in the quietest of the yards, his face towards a high wall, while all around, from the narrow slits of the jail windows, I thought I saw peering out upon him the eyes of murderers and thieves. </p>
+ <p>"Bartleby!"</p>
+ <p>"I know you," he said, without looking round,--"and I want nothing to say to you."</p>
+ <p>"It was not I that brought you here, Bartleby," said I, keenly pained at his implied suspicion. "And to you, this should not be so vile a place. Nothing reproachful attaches to you by being here. And see, it is not so sad a place as one might think. Look, there is the sky, and here is the grass."</p>
+ <p>"I know where I am," he replied, but would say nothing more, and so I left him.</p>
+ <p>As I entered the corridor again, a broad meat-like man in an apron, accosted me, and jerking his thumb over his shoulder said--"Is that your friend?"</p>
+ <p>"Yes."</p>
+ <p>"Does he want to starve? If he does, let him live on the prison fare, that's all.</p>
+ <p>"Who are you?" asked I, not knowing what to make of such an unofficially speaking person in such a place.</p>
+ <p>"I am the grub-man. Such gentlemen as have friends here, hire me to provide them with something good to eat."</p>
+ <p>"Is this so?" said I, turning to the turnkey.</p>
+ <p>He said it was.</p>
+ <p>"Well then," said I, slipping some silver into the grub-man's hands (for so they called him). "I want you to give particular attention to my friend there; let him have the best dinner you can get. And you must be as polite to him as possible."</p>
+ <p>"Introduce me, will you?" said the grub-man, looking at me with an expression which seemed to say he was all impatience for an opportunity to give a specimen of his breeding.</p>
+ <p>Thinking it would prove of benefit to the scrivener, I acquiesced; and asking the grub-man his name, went up with him to Bartleby.</p>
+ <p>"Bartleby, this is a friend; you will find him very useful to you."</p>
+ <p>"Your sarvant, sir, your sarvant," said the grub-man, making a low salutation behind his apron. "Hope you find it pleasant here, sir;--spacious grounds--cool apartments, sir--hope you'll stay with us some time--try to make it agreeable. What will you have for dinner today?"</p>
+ <p>"I prefer not to dine to-day," said Bartleby, turning away. "It would disagree with me; I am unused to dinners." So saying he slowly moved to the other side of the inclosure, and took up a position fronting the dead-wall.</p>
+ <p>"How's this?" said the grub-man, addressing me with a stare of astonishment. "He's odd, aint he?"</p>
+ <p>"I think he is a little deranged," said I, sadly.</p>
+ <p>"Deranged? deranged is it? Well now, upon my word, I thought that friend of yourn was a gentleman forger; they are always pale and genteel-like, them forgers. I can't help pity 'em--can't help it, sir. Did you know Monroe Edwards?" he added touchingly, and paused. Then, laying his hand pityingly on my shoulder, sighed, "he died of consumption at Sing-Sing. so you weren't acquainted with Monroe?"</p>
+ <p>"No, I was never socially acquainted with any forgers. But I cannot stop longer. Look to my friend yonder. You will not lose by it. I will see you again."</p>
+ <p>Some few days after this, I again obtained admission to the Tombs, and went through the corridors in quest of Bartleby; but without finding him.</p>
+ <p>"I saw him coming from his cell not long ago," said a turnkey, "may be he's gone to loiter in the yards."</p>
+ <p>So I went in that direction.</p>
+ <p>"Are you looking for the silent man?" said another turnkey passing me. "Yonder he lies--sleeping in the yard there. 'Tis not twenty minutes since I saw him lie down."</p>
+ <p>The yard was entirely quiet. It was not accessible to the common prisoners. The surrounding walls, of amazing thickness, kept off all sound behind them. The Egyptian character of the masonry weighed upon me with its gloom. But a soft imprisoned turf grew under foot. The heart of the eternal pyramids, it seemed, wherein, by some strange magic, through the clefts, grass-seed, dropped by birds, had sprung.</p>
+ <p>Strangely huddled at the base of the wall, his knees drawn up, and lying on his side, his head touching the cold stones, I saw the wasted Bartleby. But nothing stirred. I paused; then went close up to him; stooped over, and saw that his dim eyes were open; otherwise he seemed profoundly sleeping. Something prompted me to touch him. I felt his hand, when a tingling shiver ran up my arm and down my spine to my feet.</p>
+ <p>The round face of the grub-man peered upon me now. "His dinner is ready. Won't he dine to-day, either? Or does he live without dining?"</p>
+ <p>"Lives without dining," said I, and closed the eyes.</p>
+ <p>"Eh!--He's asleep, aint he?"</p>
+ <p>"With kings and counsellors," murmured I.</p>
+ <p>* * * * * * * *</p>
+ <p>There would seem little need for proceeding further in this history. Imagination will readily supply the meagre recital of poor Bartleby's interment. But ere parting with the reader, let me say, that if this little narrative has sufficiently interested him, to awaken curiosity as to who Bartleby was, and what manner of life he led prior to the present narrator's making his acquaintance, I can only reply, that in such curiosity I fully share, but am wholly unable to gratify it. Yet here I hardly know whether I should divulge one little item of rumor, which came to my ear a few months after the scrivener's decease. Upon what basis it rested, I could never ascertain; and hence how true it is I cannot now tell. But inasmuch as this vague report has not been without a certain strange suggestive interest to me, however said, it may prove the same with some others; and so I will briefly mention it. The report was this: that Bartleby had been a subordinate clerk in the Dead Letter Office at <a href="http://raven.cc.ukans.edu/%7Ezeke/bartleby/parker.html" target="_blank">Washington</a>, from which he had been suddenly removed by a change in the administration. When I think over this rumor, I cannot adequately express the emotions which seize me. Dead letters! does it not sound like dead men? Conceive a man by nature and misfortune prone to a pallid hopelessness, can any business seem more fitted to heighten it than that of continually handling these dead letters and assorting them for the flames? For by the cart-load they are annually burned. Sometimes from out the folded paper the pale clerk takes a ring:--the bank-note sent in swiftest charity:--he whom it would relieve, nor eats nor hungers any more; pardon for those who died despairing; hope for those who died unhoping; good tidings for those who died stifled by unrelieved calamities. On errands of life, these letters speed to death. </p>
+ <p> Ah Bartleby! Ah humanity!</p>
+ </td></tr></tbody></table>
+ </div>
+</div>
diff --git a/test/test-pages/cnet/expected.html b/test/test-pages/cnet/expected.html
index 1f5675a..587e9d2 100644
--- a/test/test-pages/cnet/expected.html
+++ b/test/test-pages/cnet/expected.html
@@ -4,16 +4,16 @@
<figure class="image image-medium&#xA; pull-right" section="shortcodeImage"><span class="imageContainer"><span itemprop="image" itemscope="" itemtype="https://schema.org/ImageObject"><img alt="" class="" height="0" src="https://cnet1.cbsistatic.com/img/nAMdBzIE1ogVw5bOBZBaiJCt3Ro=/570x0/2014/03/21/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e/mark-zuckerberg-facebook-home-10671610x407.jpg" width="570"></img><meta content="https://cnet1.cbsistatic.com/img/nAMdBzIE1ogVw5bOBZBaiJCt3Ro=/570x0/2014/03/21/863df5d9-e8b8-4b38-851b-5e3f77f2cf0e/mark-zuckerberg-facebook-home-10671610x407.jpg" itemprop="url"></meta><meta content="0" itemprop="height"></meta><meta content="570" itemprop="width"></meta></span></span>
- <figcaption><span class="caption"><p style="">Facebook CEO Mark Zuckerberg, the man with the acquisition plan.</p></span><span class="credit">Photo by James Martin/CNET
- </span></figcaption></figure><p style="">Anyone who has ever been involved in closing a billion-dollar acquisition deal will tell you that you don't go in without a clear, well thought out plan.</p>
+ <figcaption><span class="caption"><p>Facebook CEO Mark Zuckerberg, the man with the acquisition plan.</p></span><span class="credit">Photo by James Martin/CNET
+ </span></figcaption></figure><p>Anyone who has ever been involved in closing a billion-dollar acquisition deal will tell you that you don't go in without a clear, well thought out plan.</p>
- <p style="">Facebook CEO Mark Zuckerberg knows a thing or two about how to seal the deal on blockbuster buys. After all, he's the man behind his company's <a href="https://www.cnet.com/news/facebook-closes-19-billion-deal-for-whatsapp/" target="_blank">$19 billion acquisition</a> of WhatsApp, he <a href="https://www.cnet.com/news/zuckerberg-did-1-billion-instagram-deal-on-his-own/" target="_blank">personally brokered</a> its $1 billion buyout of <a href="https://www.cnet.com/news/why-facebook-plunked-down-1-billion-to-buy-instagram/" target="_blank">Instagram</a> and closed the <a href="https://www.cnet.com/news/facebook-to-buy-oculus-for-2-billion/" target="_blank">$3 billion deal</a> to buy Oculus VR.</p>
- <p style="">Zuckerberg offered a primer on the strategies he and his company employ when they see an attractive target during testimony Tuesday <a href="https://www.cnet.com/news/zenimax-sues-oculus-over-virtual-reality-rift-tech/">in a lawsuit with ZeniMax Media</a>, which accuses Oculus and Facebook of "misappropriating" trade secrets and copyright infringement. At the heart of the lawsuit is technology that helped create liftoff for virtual reality, one of the <a data-component="externalLink" href="http://www.cbsnews.com/videos/the-reality-of-the-virtual-world/" target="_blank">hottest gadget trends today.</a></p>
- <p style="">A key Facebook approach is building a long-term relationship with your target, Zuckerberg said at the trial. These deals don't just pop up over night, he said according to a transcript reviewed by <a data-component="externalLink" href="http://www.businessinsider.com/mark-zuckerberg-explains-facebooks-acquisition-strategy-2017-1" target="_blank">Business Insider</a>. They take time to cultivate. </p>
+ <p>Facebook CEO Mark Zuckerberg knows a thing or two about how to seal the deal on blockbuster buys. After all, he's the man behind his company's <a href="https://www.cnet.com/news/facebook-closes-19-billion-deal-for-whatsapp/" target="_blank">$19 billion acquisition</a> of WhatsApp, he <a href="https://www.cnet.com/news/zuckerberg-did-1-billion-instagram-deal-on-his-own/" target="_blank">personally brokered</a> its $1 billion buyout of <a href="https://www.cnet.com/news/why-facebook-plunked-down-1-billion-to-buy-instagram/" target="_blank">Instagram</a> and closed the <a href="https://www.cnet.com/news/facebook-to-buy-oculus-for-2-billion/" target="_blank">$3 billion deal</a> to buy Oculus VR.</p>
+ <p>Zuckerberg offered a primer on the strategies he and his company employ when they see an attractive target during testimony Tuesday <a href="https://www.cnet.com/news/zenimax-sues-oculus-over-virtual-reality-rift-tech/">in a lawsuit with ZeniMax Media</a>, which accuses Oculus and Facebook of "misappropriating" trade secrets and copyright infringement. At the heart of the lawsuit is technology that helped create liftoff for virtual reality, one of the <a data-component="externalLink" href="http://www.cbsnews.com/videos/the-reality-of-the-virtual-world/" target="_blank">hottest gadget trends today.</a></p>
+ <p>A key Facebook approach is building a long-term relationship with your target, Zuckerberg said at the trial. These deals don't just pop up over night, he said according to a transcript reviewed by <a data-component="externalLink" href="http://www.businessinsider.com/mark-zuckerberg-explains-facebooks-acquisition-strategy-2017-1" target="_blank">Business Insider</a>. They take time to cultivate. </p>
<blockquote>
- <p style="">I've been building relationships, at least in Instagram and the WhatsApp cases, for years with the founders and the people that are involved in these companies, which made [it] so that when it became time or when we thought it was the right time to move, we felt like we had a good amount of context and had good relationships so that we could move quickly, which was competitively important and why a lot of these acquisitions, I think, came to us instead of our competitors and ended up being very good acquisitions over time that a lot of competitors wished they had gotten instead. </p>
+ <p>I've been building relationships, at least in Instagram and the WhatsApp cases, for years with the founders and the people that are involved in these companies, which made [it] so that when it became time or when we thought it was the right time to move, we felt like we had a good amount of context and had good relationships so that we could move quickly, which was competitively important and why a lot of these acquisitions, I think, came to us instead of our competitors and ended up being very good acquisitions over time that a lot of competitors wished they had gotten instead. </p>
</blockquote>
- <p style=""> He also stressed the need assure your target that you have a shared vision about how you will collaborate after the deal is put to bed. Zuckerberg said this was reason Facebook was able to acquire Oculus for less than its original $4 billion asking price.</p>
+ <p> He also stressed the need assure your target that you have a shared vision about how you will collaborate after the deal is put to bed. Zuckerberg said this was reason Facebook was able to acquire Oculus for less than its original $4 billion asking price.</p>
<blockquote>If this [deal] is going to happen, it's not going to be because we offer a lot of money, although we're going to have to offer a fair price for the company that is more than what they felt like they could do on their own. But they also need to feel like this was actually going to help their mission.</blockquote>
@@ -21,19 +21,19 @@
- <p style="">When that doesn't work, Zuckerberg said scare tactics is an effective, if undesirable, way of persuading small startups that they face a better chance of survival if they have Facebook to guide their way rather than going it alone.</p>
+ <p>When that doesn't work, Zuckerberg said scare tactics is an effective, if undesirable, way of persuading small startups that they face a better chance of survival if they have Facebook to guide their way rather than going it alone.</p>
<blockquote>That's less my thing, but I think if you are trying to help convince people that they want to join you, helping them understand all the pain that they would have to go through to build it out independently is a valuable tactic. </blockquote>
- <p style="">It also pays to be weary of competing suitors for your startup, Zuckerberg said, and be willing to move fast to stave off rivals and get the deal done.</p>
+ <p>It also pays to be weary of competing suitors for your startup, Zuckerberg said, and be willing to move fast to stave off rivals and get the deal done.</p>
<blockquote>Often, if a company knows we're offering something, they will offer more. So being able to move quickly not only increases our chance of being able to get a deal done if we want to, but it makes it so we don't have end up having to pay a lot more because the process drags out.</blockquote>
- <p style="">It wasn't clear why these strategies didn't work on Snapchat CEO Evan Spiegel, who <a href="https://www.cnet.com/news/snapchat-said-to-rebuff-3-billion-offer-from-facebook/">famously rebuffed</a> a $3 billion takeover offer from Facebook in 2013.</p>
+ <p>It wasn't clear why these strategies didn't work on Snapchat CEO Evan Spiegel, who <a href="https://www.cnet.com/news/snapchat-said-to-rebuff-3-billion-offer-from-facebook/">famously rebuffed</a> a $3 billion takeover offer from Facebook in 2013.</p>
- <p style=""><em><strong>Tech Enabled:</strong> CNET chronicles tech's role in providing new kinds of accessibility. Check it out <a href="https://www.cnet.com/tech-enabled/">here</a>.</em><em><strong><br></br></strong></em></p>
- <p style=""><em><strong>Technically Literate:</strong> Original works of short fiction with unique perspectives on tech, exclusively on CNET. <a href="https://www.cnet.com/technically-literate/">Here</a>.</em></p>
+ <p><em><strong>Tech Enabled:</strong> CNET chronicles tech's role in providing new kinds of accessibility. Check it out <a href="https://www.cnet.com/tech-enabled/">here</a>.</em><em><strong><br></br></strong></em></p>
+ <p><em><strong>Technically Literate:</strong> Original works of short fiction with unique perspectives on tech, exclusively on CNET. <a href="https://www.cnet.com/technically-literate/">Here</a>.</em></p>
diff --git a/test/test-pages/cnn/expected.html b/test/test-pages/cnn/expected.html
index d2a4433..9b3b86a 100644
--- a/test/test-pages/cnn/expected.html
+++ b/test/test-pages/cnn/expected.html
@@ -1,56 +1,68 @@
-<div id="readability-page-1" class="page">
- <div id="storytext">
- <div id="js-ie-storytop" class="ie--storytop">
- <div class="cnnplayer fade-in" id="cnnplayer_cvp_story_0">
- <div class="cnnVidplayer">
- <div class="summaryImg" id="vid0" href="/video/news/2015/11/30/homeboy-industries-priest.cnnmoney" onclick="javascript:VideoPlayerManager.playVideos('cvp_story_0'); return false;"><video id="cvp_story_0" preload="metadata" poster="" src="http://ht3.cdn.turner.com/money/big/news/2015/11/30/homeboy-industries-priest.cnnmoney_1024x576.mp4" controls="controls" width="300" height="169"></video>
- <div id="cvp_story_0_endSlate" class="video-posterboard end-slate">
- <div class="video-slate-wrapper">
- <div class="video-bg">
- <img src="" alt="" width="620" height="348" /></div>
+<div id="storytext">
+ <div class="ie--storytop" id="js-ie-storytop">
+
+
+
+ <div class="cnnplayer fade-in" id="cnnplayer_cvp_story_0">
+ <div class="cnnVidplayer">
+ <div class="summaryImg" href="/video/news/2015/11/30/homeboy-industries-priest.cnnmoney" id="vid0" onclick="javascript:VideoPlayerManager.playVideos('cvp_story_0'); return false;"><video controls="controls" height="169" id="cvp_story_0" poster="" preload="metadata" src="http://ht3.cdn.turner.com/money/big/news/2015/11/30/homeboy-industries-priest.cnnmoney_1024x576.mp4" width="300"></video><div class="video-posterboard end-slate" id="cvp_story_0_endSlate">
+ <div class="video-slate-wrapper">
+ <div class="video-bg">
+ <img alt="" height="348" src="" width="620"></img></div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div>
</div>
- </div>
- </div>
- </div>
+
+ <h2>The U.S. has long been heralded as a land of opportunity -- a place where anyone can succeed regardless of the economic class they were born into.</h2>
+ <p> But a new report released on Monday by <a href="http://web.stanford.edu/group/scspi-dev/cgi-bin/" target="_blank">Stanford University's Center on Poverty and Inequality</a> calls that into question. </p>
+
+ <p> The report assessed poverty levels, income and wealth inequality, economic mobility and unemployment levels among 10 wealthy countries with social welfare programs. </p>
+ <div class="module" id="smartassetcontainer">
+ <div class="module">
+ <div class="module-body">
+ <div class="collapsible" id="smartasset-article">
+ <div>
+ <p>
+ Powered by SmartAsset.com
+ </p>
- </div>
- </div>
- <h2>The U.S. has long been heralded as a land of opportunity -- a place where anyone can succeed regardless of the economic class they were born into.</h2>
- <p> But a new report released on Monday by <a href="http://web.stanford.edu/group/scspi-dev/cgi-bin/" target="_blank">Stanford University's Center on Poverty and Inequality</a> calls that into question. </p>
- <p> The report assessed poverty levels, income and wealth inequality, economic mobility and unemployment levels among 10 wealthy countries with social welfare programs. </p>
- <div id="smartassetcontainer" class="module">
- <div class="module">
- <div class="module-body">
- <div id="smartasset-article" class="collapsible">
- <div>
- <p class="cnnhdr">
- Powered by SmartAsset.com
+
+
+
+
+
+ <img src="https://smrt.as/ck"></img></div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <p> Among its key findings: the class you're born into matters much more in the U.S. than many of the other countries. </p>
+ <p> As the <a href="http://web.stanford.edu/group/scspi-dev/cgi-bin/publications/state-union-report" target="_blank">report states</a>: "[T]he birth lottery matters more in the U.S. than in most well-off countries." </p>
+
+ <p> But this wasn't the only finding that suggests the U.S. isn't quite living up to its reputation as a country where everyone has an equal chance to get ahead through sheer will and hard work. </p>
+ <p> <a href="http://money.cnn.com/2016/01/11/news/economy/rich-taxes/index.html?iid=EL"><span class="inStoryHeading">Related: Rich are paying more in taxes but not as much as they used to</span></a> </p>
+
+ <p> The report also suggested the U.S. might not be the "jobs machine" it thinks it is, when compared to other countries. </p>
+ <p> It ranked near the bottom of the pack based on the levels of unemployment among men and women of prime working age. The study determined this by taking the ratio of employed men and women between the ages of 25 and 54 compared to the total population of each country. </p>
+ <p> The overall rankings of the countries were as follows:<span> <br></br>1. Finland <span> <br></br>2. Norway<span> <br></br>3. Australia <span> <br></br>4. Canada<span> <br></br>5. Germany<span> <br></br>6. France<span> <br></br>7. United Kingdom <span> <br></br>8. Italy<span> <br></br>9. Spain<span> <br></br>10. United States </span></span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
+ </span>
</p>
- <img src="https://smrt.as/ck" />
- </div>
- </div>
- </div>
- </div>
- </div>
- <p> Among its key findings: the class you're born into matters much more in the U.S. than many of the other countries. </p>
- <p> As the <a href="http://web.stanford.edu/group/scspi-dev/cgi-bin/publications/state-union-report" target="_blank">report states</a>: "[T]he birth lottery matters more in the U.S. than in most well-off countries." </p>
- <p> But this wasn't the only finding that suggests the U.S. isn't quite living up to its reputation as a country where everyone has an equal chance to get ahead through sheer will and hard work. </p>
- <p> <a href="http://money.cnn.com/2016/01/11/news/economy/rich-taxes/index.html?iid=EL"><span class="inStoryHeading">Related: Rich are paying more in taxes but not as much as they used to</span></a> </p>
- <p> The report also suggested the U.S. might not be the "jobs machine" it thinks it is, when compared to other countries. </p>
- <p> It ranked near the bottom of the pack based on the levels of unemployment among men and women of prime working age. The study determined this by taking the ratio of employed men and women between the ages of 25 and 54 compared to the total population of each country. </p>
- <p> The overall rankings of the countries were as follows:<span> <br/>1. Finland <span> <br/>2. Norway<span> <br/>3. Australia <span> <br/>4. Canada<span> <br/>5. Germany<span> <br/>6. France<span> <br/>7. United Kingdom <span> <br/>8. Italy<span> <br/>9. Spain<span> <br/>10. United States </span></span>
- </span>
- </span>
- </span>
- </span>
- </span>
- </span>
- </span>
- </span>
- </p>
- <p> The low ranking the U.S. received was due to its extreme levels of wealth and income inequality and the ineffectiveness of its "safety net" -- social programs aimed at reducing poverty. </p>
- <p> <a href="http://money.cnn.com/2016/01/05/news/economy/chicago-segregated/index.html?iid=EL"><span class="inStoryHeading">Related: Chicago is America's most segregated city</span></a> </p>
- <p> The report concluded that the American safety net was ineffective because it provides only half the financial help people need. Additionally, the levels of assistance in the U.S. are generally lower than in other countries. </p>
- <p class="storytimestamp"> <span class="cnnStorySource"> CNNMoney (New York) </span> <span class="cnnDateStamp">First published February 1, 2016: 1:28 AM ET</span> </p>
- </div>
-</div>
+ <p> The low ranking the U.S. received was due to its extreme levels of wealth and income inequality and the ineffectiveness of its "safety net" -- social programs aimed at reducing poverty. </p>
+ <p> <a href="http://money.cnn.com/2016/01/05/news/economy/chicago-segregated/index.html?iid=EL"><span class="inStoryHeading">Related: Chicago is America's most segregated city</span></a> </p>
+ <p> The report concluded that the American safety net was ineffective because it provides only half the financial help people need. Additionally, the levels of assistance in the U.S. are generally lower than in other countries. </p>
+
+
+ <p> <span class="cnnStorySource"> CNNMoney (New York) </span> <span class="cnnDateStamp">First published February 1, 2016: 1:28 AM ET</span> </p>
+ </div> \ No newline at end of file
diff --git a/test/test-pages/daringfireball-1/expected.html b/test/test-pages/daringfireball-1/expected.html
index 609b37e..37a4e07 100644
--- a/test/test-pages/daringfireball-1/expected.html
+++ b/test/test-pages/daringfireball-1/expected.html
@@ -1,11 +1,14 @@
-<div class="article">
-
+<div id="readability-page-1" class="page">
+ <div id="Box">
+ <div id="Main">
+ <div class="article">
<p>Daring Fireball is written and produced by John Gruber.</p>
<p>
- <a href="http://fakehost/graphics/author/addison-bw.jpg"> <img alt="Photograph of the author." src="http://fakehost/graphics/author/addison-bw-425.jpg" style="border: 0;"></img></a>
- <br></br><em>Portrait by <a href="http://superbiate.com/inquiries/">George Del Barrio</a></em> </p>
+ <a href="http://fakehost/graphics/author/addison-bw.jpg"> <img src="http://fakehost/graphics/author/addison-bw-425.jpg" alt="Photograph of the author."/></a>
+ <br/><em>Portrait by <a href="http://superbiate.com/inquiries/">George Del Barrio</a></em> </p>
<h2>Mac Apps</h2>
- <ul><li><a href="http://www.barebones.com/products/bbedit/">BBEdit</a></li>
+ <ul>
+ <li><a href="http://www.barebones.com/products/bbedit/">BBEdit</a></li>
<li><a href="http://www.flyingmeat.com/acorn/">Acorn</a></li>
<li><a href="http://www.red-sweater.com/marsedit/">MarsEdit</a></li>
<li><a href="http://aged-and-distilled.com/napkin/">Napkin</a></li>
@@ -14,13 +17,19 @@
<li><a href="http://latenightsw.com/sd4/index.html">Script Debugger</a></li>
<li><a href="http://www.ambrosiasw.com/utilities/snapzprox/">Snapz Pro X</a></li>
<li><a href="http://nightly.webkit.org/">WebKit</a></li>
- </ul><h2>iPhone Apps</h2>
- <ul><li><a href="http://vesperapp.co/">Vesper</a></li>
- </ul><h2>Server Software</h2>
+ </ul>
+ <h2>iPhone Apps</h2>
+ <ul>
+ <li><a href="http://vesperapp.co/">Vesper</a></li>
+ </ul>
+ <h2>Server Software</h2>
<p>The Daring Fireball website is hosted by <a href="http://joyent.com/">Joyent</a>.</p>
<p>Articles and links are published through <a href="http://movabletype.org/">Movable Type</a>. In addition to my own SmartyPants and Markdown plug-ins, Daring Fireball uses several excellent Movable Type plug-ins, including Brad Choate’s <a href="http://bradchoate.com/weblog/2003/06/24/regular-expressions">MT-Regex</a> and <a href="http://bradchoate.com/weblog/2004/10/20/mtifempty">MT-IfEmpty</a>, and <a href="http://bumppo.net/projects/amputator/">Nat Irons’s Amputator</a>.</p>
<p>Stats are tracked using <a href="http://haveamint.com/">Mint</a>. Additional web nerdery, including the membership system, is fueled by <a href="http://perl.org/">Perl</a>, <a href="http://www.php.net/">PHP</a>, and <a href="http://www.mysql.com/">MySQL</a>.</p>
<h2>Web Standards</h2>
<p>Web standards are important, and Daring Fireball adheres to them. Specifically, Daring Fireball’s HTML markup should validate as either <a href="http://www.whatwg.org/specs/web-apps/current-work/">HTML 5</a> or XHTML 4.01 Transitional, its layout is constructed using <a href="http://jigsaw.w3.org/css-validator/validator?uri=http://daringfireball.net/css/fireball_screen.css">valid CSS</a>, and its syndicated feed is <a href="http://feedvalidator.org/check?url=http%3A%2F%2Fdaringfireball.net%2Findex.xml">valid Atom</a>.</p>
<p>If Daring Fireball looks goofy in your browser, you’re likely using a shitty browser that doesn’t support web standards. Internet Explorer, I’m looking in your direction. If you complain about this, I will laugh at you, because I do not care. If, however, you are using a modern, standards-compliant browser and have trouble viewing or reading Daring Fireball, please do let me know.</p>
- </div> \ No newline at end of file
+ </div>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/test/test-pages/gmw/expected.html b/test/test-pages/gmw/expected.html
index 59d4a68..5bc8121 100644
--- a/test/test-pages/gmw/expected.html
+++ b/test/test-pages/gmw/expected.html
@@ -6,8 +6,8 @@
<p>  不幸的是,对于希望能喝上一杯的太空探险者,那些将他们送上太空的政府机构普遍禁止他们染指包括酒在内的含酒精饮料。</p>
<p>  但是,很快普通人都会有机会向人类“最终的边疆”出发——以平民化旅行的形式,去探索和殖民火星。确实,火星之旅将是一次令人感到痛苦的旅行,可能一去不复返并要几年时间才能完成,但是否应该允许参与者在旅程中痛饮一番?或至少携带能在火星上发酵自制酒精饮料的设备?</p>
<p align="center"><img alt="(Credit: Nasa)" id="45395168" src="http://imgtech.gmw.cn/attachement/jpg/site2/20170310/448a5bc1e2861a2c4e5929.jpg" title="宇航员在太空中喝酒会怎么样?后果很严重"></img></p>
- <p align="center" style="TEXT-ALIGN: center">
- <span face="楷体" style="font-family: 楷体;">  图注:巴兹?奥尔德林(Buzz Aldrin)可能是第二个在月球上行走的人,但他是第一个在月球上喝酒的人</span>
+ <p align="center">
+ <span face="楷体">  图注:巴兹?奥尔德林(Buzz Aldrin)可能是第二个在月球上行走的人,但他是第一个在月球上喝酒的人</span>
</p>
<p>  事实是,历史上酒与太空探险有一种复杂的关系。让我们来看看喝了酒的航天员究竟会发生什么—— 如果我们开始给予进入太空的人类更大的自由度,又可能会发生什么。</p>
<p>  人们普遍认为,当一个人所处的海拔越高,喝醉后会越容易感到头昏。因此,人们自然地想到,当人身处地球轨道上时,饮酒会对人体有更强烈的致眩作用。但这种说法可能不是正确的。</p>
@@ -22,7 +22,7 @@
<p>  为此,国际空间站上的宇航员甚至没有被提供含有酒精的产品,例如漱口水、香水或须后水。如果在国际空间站上饮酒狂欢,溢出的啤酒也可能存在损坏设备的风险。</p>
<p align="center"><img alt="(Credit: iStock)" id="45395150" src="http://imgtech.gmw.cn/attachement/jpg/site2/20170310/448a5bc1e2861a2c4e592a.jpg" title="宇航员在太空中喝酒会怎么样?后果很严重"></img></p>
<p align="center" class="pictext">
- <span face="楷体" style="font-family: 楷体;">  图注:测试表明,有关人在高空中喝酒更容易醉的传言是不正确的</span>
+ <span face="楷体">  图注:测试表明,有关人在高空中喝酒更容易醉的传言是不正确的</span>
</p>
<p>  然后是责任的问题。我们不允许汽车司机或飞机飞行员喝醉后驾驶,所以并不奇怪同样的规则适用于国际空间站上的宇航员。毕竟国际空间站的造价高达1500亿美元,而且在接近真空的太空中其运行速度达到了每小时27680公里。</p>
<p>  然而,2007年,美国宇航局(NASA)成立了一个负责调查宇航员健康状况的独立小组,称历史上该机构至少有两名宇航员在即将飞行前喝了大量的酒,但仍然被允许飞行。Nasa安全负责人随后的审查发现并没有证据支持这一指控。宇航员在飞行前12小时是严禁饮酒的,因为他们需要充分的思维能力和清醒的意识。</p>
@@ -41,10 +41,10 @@
<p>  然而,像戴夫?汉森这样的专家认为,继续禁止饮酒并没有什么害处。除了实际的安全问题,饮酒还可能有其它挑战。汉森认为,地球人存在许多社会文化方面的差异,而且人连续几年时间呆在一个狭小的空间里,很容易突然发怒,这些因素都使饮酒问题变得很棘手。</p>
<p align="center"><img alt="(Credit: David Frohman/Peachstate Historical Consulting Inc)" id="45395153" src="http://imgtech.gmw.cn/attachement/jpg/site2/20170310/448a5bc1e2861a2c4e592d.jpg" title="宇航员在太空中喝酒会怎么样?后果很严重"></img></p>
<p align="center" class="pictext">
- <span face="楷体" style="font-family: 楷体;">  图注:奥尔德林的圣餐杯回到了地球上</span>
+ <span face="楷体">  图注:奥尔德林的圣餐杯回到了地球上</span>
</p>
<p>  他说:“这是一个政治问题,也是一个文化方面的问题,但不是一个科学上的问题。这将是未来一个可能产生冲突领域,因为人们具有不同的文化背景,他们对饮酒的态度不同。”他进一步指出,如果你与穆斯林、摩门教徒或禁酒主义者分配在同一间宿舍怎么办?面对未来人们可能在一个没有期限的时间内呆在一个有限的空间里,需要“尽早解决”如何协调不同文化观点的问题。</p>
- <p><ins style="float:left;display:inline;margin:8px 13px 8px 0px;"></ins>  所以,当宇航员在地球轨道上时,将还不得不满足于通过欣赏外面的景色来振作精神,而不要指望沉溺于烈酒中。我们留在地球上的人,则可以准备好适量的香槟酒,以迎接他们的归来。</p>
+ <p><ins></ins>  所以,当宇航员在地球轨道上时,将还不得不满足于通过欣赏外面的景色来振作精神,而不要指望沉溺于烈酒中。我们留在地球上的人,则可以准备好适量的香槟酒,以迎接他们的归来。</p>
<p>  原标题:他晚于阿姆斯特朗登月 却是首个敢在月球喝酒的人</p>
<p><strong>  出品︱网易科学人栏目组 胖胖</strong></p>
<p><strong>  作者︱春春</strong>
diff --git a/test/test-pages/herald-sun-1/expected-metadata.json b/test/test-pages/herald-sun-1/expected-metadata.json
index 9fdf973..6c8b59b 100644
--- a/test/test-pages/herald-sun-1/expected-metadata.json
+++ b/test/test-pages/herald-sun-1/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "title": "Angry media won’t buckle over new surveillance laws",
+ "title": "Angry media won’t buckle over new surveillance laws\n\t\t\t\t\t\t| Herald Sun",
"byline": "JOE HILDEBRAND",
"excerpt": "A HIGH-powered federal government team has been doing the rounds of media organisations in the past few days in an attempt to allay concerns about the impact of new surveillance legislation on press freedom. It failed.",
"readerable": true
diff --git a/test/test-pages/iab-1/expected-metadata.json b/test/test-pages/iab-1/expected-metadata.json
index 9ddd850..8c95f5e 100644
--- a/test/test-pages/iab-1/expected-metadata.json
+++ b/test/test-pages/iab-1/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "title": "Getting LEAN with Digital Ad UX | IAB",
+ "title": "Getting LEAN with Digital Ad UX",
"byline": "By\n\t\t\tScott Cunningham",
"excerpt": "We messed up. As technologists, tasked with delivering content and services to users, we lost track of the user experience. Twenty years ago we saw an explosion of websites, built by developers around the world, providing all forms of content. This was the beginning of an age of enlightenment, the intersection of content and technology. … Continued",
"readerable": true
diff --git a/test/test-pages/iab-1/expected.html b/test/test-pages/iab-1/expected.html
index 5a44e52..a0fab78 100644
--- a/test/test-pages/iab-1/expected.html
+++ b/test/test-pages/iab-1/expected.html
@@ -1,22 +1,32 @@
-<div class="article__content">
- <p>We messed up. As technologists, tasked with delivering content and services to users, we lost track of the user experience.</p>
-<p>Twenty years ago we saw an explosion of websites, built by developers around the world, providing all forms of content. This was the beginning of an age of enlightenment, the intersection of content and technology. Many of us in the technical field felt compelled, and even empowered, to produce information as the distribution means for mass communication were no longer restricted by a high barrier to entry.</p>
-<p>In 2000, the dark ages came when the dot-com bubble burst. We were told that our startups were gone or that our divisions sustained by corporate parent companies needed to be in the black. It was a wakeup call that led to a renaissance age. Digital advertising became the foundation of an economic engine that, still now, sustains the free and democratic World Wide Web. In digital publishing, we strived to balance content, commerce, and technology. The content management systems and communication gateways we built to inform and entertain populations around the world disrupted markets and in some cases governments, informed communities of imminent danger, and liberated new forms of art and entertainment—all while creating a digital middle class of small businesses.</p>
-<p>We engineered not just the technical, but also the social and economic foundation that users around the world came to lean on for access to real time information. And users came to expect this information whenever and wherever they needed it. And more often than not, for anybody with a connected device, it was free.</p>
-<p>This was choice—powered by digital advertising—and premised on user experience.</p>
-<p>But we messed up.</p>
-<p>Through our pursuit of further automation and maximization of margins during the industrial age of media technology, we built advertising technology to optimize publishers’ yield of marketing budgets that had eroded after the last recession. Looking back now, our scraping of dimes may have cost us dollars in consumer loyalty. The fast, scalable systems of targeting users with ever-heftier advertisements have slowed down the public internet and drained more than a few batteries. We were so clever and so good at it that we over-engineered the capabilities of the plumbing laid down by, well, ourselves. This steamrolled the users, depleted their devices, and tried their patience.</p>
-<p>The rise of ad blocking poses a threat to the internet and could potentially drive users to an enclosed platform world dominated by a few companies. We have let the fine equilibrium of content, commerce, and technology get out of balance in the open web. We had, and still do have, a responsibility to educate the business side, and in some cases to push back. We lost sight of our social and ethical responsibility to provide a safe, usable experience for anyone and everyone wanting to consume the content of their choice.</p>
-<p>We need to bring that back into alignment, starting right now.</p>
-<p><a href="http://www.iab.com/wp-content/uploads/2015/10/getting-lean-with-digital-ad-ux.jpg"><img alt="Getting LEAN with Digital Ad UX" class="alignnone size-medium wp-image-15403" height="250" src="http://www.iab.com/wp-content/uploads/2015/10/getting-lean-with-digital-ad-ux-300x250.jpg" width="300"></img></a>Today, the IAB Tech Lab is launching the L.E.A.N. Ads program. Supported by the Executive Committee of the IAB Tech Lab Board, IABs around the world, and hundreds of member companies, L.E.A.N. stands for Light, Encrypted, Ad choice supported, Non-invasive ads. These are principles that will help guide the next phases of advertising technical standards for the global digital advertising supply chain.</p>
-<p>As with any other industry, standards should be created by non-profit standards-setting bodies, with many diverse voices providing input. We will invite all parties for public comment, and make sure consumer interest groups have the opportunity to provide input.</p>
-<p>L.E.A.N. Ads do not replace the current advertising standards many consumers still enjoy and engage with while consuming content on our sites across all IP enabled devices. Rather, these principles will guide an alternative set of standards that provide choice for marketers, content providers, and consumers.</p>
-<p>Among the many areas of concentration, we must also address frequency capping on retargeting in Ad Tech and make sure a user is targeted appropriately before, but never AFTER they make a purchase. If we are so good at reach and scale, we can be just as good, if not better, at moderation. Additionally, we must address volume of ads per page as well as continue on the path to viewability. The dependencies here are critical to an optimized user experience.</p>
-<p>The consumer is demanding these actions, challenging us to do better, and we must respond.</p>
-<p>The IAB Tech Lab will continue to provide the tools for publishers in the digital supply chain to have a dialogue with users about their choices so that content providers can generate revenue while creating value. Publishers should have the opportunity to provide rich advertising experiences, L.E.A.N. advertising experiences, and subscription services. Or publishers can simply deny their service to users who choose to keep on blocking ads. That is all part of elasticity of consumer tolerance and choice.</p>
-<p>Finally, we must do this in an increasingly fragmented market, across screens. We must do this in environments where entire sites are blocked, purposefully or not. Yes, it is disappointing that our development efforts will have to manage with multiple frameworks while we work to supply the economic engine to sustain an open internet. However, our goal is still to provide diverse content and voices to as many connected users as possible around the world.</p>
-<p>That is user experience.</p>
-<p> </p>
-<table style="background-color: #cccccc;"><tbody><tr><td>IAB Tech Lab Members can join the IAB Tech Lab Ad Blocking Working Group, please email <a href="mailto:[email protected]">[email protected]</a> for more information.</td>
-</tr></tbody></table><p>Read <a href="http://www.iab.com/insights/ad-blocking/" target="_blank">more about ad blocking here</a>.</p>
- </div> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <div class="container module--news">
+ <div class="article__content">
+ <p>We messed up. As technologists, tasked with delivering content and services to users, we lost track of the user experience.</p>
+ <p>Twenty years ago we saw an explosion of websites, built by developers around the world, providing all forms of content. This was the beginning of an age of enlightenment, the intersection of content and technology. Many of us in the technical field felt compelled, and even empowered, to produce information as the distribution means for mass communication were no longer restricted by a high barrier to entry.</p>
+ <p>In 2000, the dark ages came when the dot-com bubble burst. We were told that our startups were gone or that our divisions sustained by corporate parent companies needed to be in the black. It was a wakeup call that led to a renaissance age. Digital advertising became the foundation of an economic engine that, still now, sustains the free and democratic World Wide Web. In digital publishing, we strived to balance content, commerce, and technology. The content management systems and communication gateways we built to inform and entertain populations around the world disrupted markets and in some cases governments, informed communities of imminent danger, and liberated new forms of art and entertainment—all while creating a digital middle class of small businesses.</p>
+ <p>We engineered not just the technical, but also the social and economic foundation that users around the world came to lean on for access to real time information. And users came to expect this information whenever and wherever they needed it. And more often than not, for anybody with a connected device, it was free.</p>
+ <p>This was choice—powered by digital advertising—and premised on user experience.</p>
+ <p>But we messed up.</p>
+ <p>Through our pursuit of further automation and maximization of margins during the industrial age of media technology, we built advertising technology to optimize publishers’ yield of marketing budgets that had eroded after the last recession. Looking back now, our scraping of dimes may have cost us dollars in consumer loyalty. The fast, scalable systems of targeting users with ever-heftier advertisements have slowed down the public internet and drained more than a few batteries. We were so clever and so good at it that we over-engineered the capabilities of the plumbing laid down by, well, ourselves. This steamrolled the users, depleted their devices, and tried their patience.</p>
+ <p>The rise of ad blocking poses a threat to the internet and could potentially drive users to an enclosed platform world dominated by a few companies. We have let the fine equilibrium of content, commerce, and technology get out of balance in the open web. We had, and still do have, a responsibility to educate the business side, and in some cases to push back. We lost sight of our social and ethical responsibility to provide a safe, usable experience for anyone and everyone wanting to consume the content of their choice.</p>
+ <p>We need to bring that back into alignment, starting right now.</p>
+ <p>
+ <a href="http://www.iab.com/wp-content/uploads/2015/10/getting-lean-with-digital-ad-ux.jpg"><img width="300" height="250" alt="Getting LEAN with Digital Ad UX" src="http://www.iab.com/wp-content/uploads/2015/10/getting-lean-with-digital-ad-ux-300x250.jpg" class="alignnone size-medium wp-image-15403"/></a>Today, the IAB Tech Lab is launching the L.E.A.N. Ads program. Supported by the Executive Committee of the IAB Tech Lab Board, IABs around the world, and hundreds of member companies, L.E.A.N. stands for Light, Encrypted, Ad choice supported, Non-invasive ads. These are principles that will help guide the next phases of advertising technical standards for the global digital advertising supply chain.</p>
+ <p>As with any other industry, standards should be created by non-profit standards-setting bodies, with many diverse voices providing input. We will invite all parties for public comment, and make sure consumer interest groups have the opportunity to provide input.</p>
+ <p>L.E.A.N. Ads do not replace the current advertising standards many consumers still enjoy and engage with while consuming content on our sites across all IP enabled devices. Rather, these principles will guide an alternative set of standards that provide choice for marketers, content providers, and consumers.</p>
+ <p>Among the many areas of concentration, we must also address frequency capping on retargeting in Ad Tech and make sure a user is targeted appropriately before, but never AFTER they make a purchase. If we are so good at reach and scale, we can be just as good, if not better, at moderation. Additionally, we must address volume of ads per page as well as continue on the path to viewability. The dependencies here are critical to an optimized user experience.</p>
+ <p>The consumer is demanding these actions, challenging us to do better, and we must respond.</p>
+ <p>The IAB Tech Lab will continue to provide the tools for publishers in the digital supply chain to have a dialogue with users about their choices so that content providers can generate revenue while creating value. Publishers should have the opportunity to provide rich advertising experiences, L.E.A.N. advertising experiences, and subscription services. Or publishers can simply deny their service to users who choose to keep on blocking ads. That is all part of elasticity of consumer tolerance and choice.</p>
+ <p>Finally, we must do this in an increasingly fragmented market, across screens. We must do this in environments where entire sites are blocked, purposefully or not. Yes, it is disappointing that our development efforts will have to manage with multiple frameworks while we work to supply the economic engine to sustain an open internet. However, our goal is still to provide diverse content and voices to as many connected users as possible around the world.</p>
+ <p>That is user experience.</p>
+ <table>
+ <tbody>
+ <tr>
+ <td>IAB Tech Lab Members can join the IAB Tech Lab Ad Blocking Working Group, please email <a href="mailto:[email protected]">[email protected]</a> for more information.</td>
+ </tr>
+ </tbody>
+ </table>
+ <p>Read <a target="_blank" href="http://www.iab.com/insights/ad-blocking/">more about ad blocking here</a>.</p>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/test/test-pages/ietf-1/expected.html b/test/test-pages/ietf-1/expected.html
index 70a2064..1d538b0 100644
--- a/test/test-pages/ietf-1/expected.html
+++ b/test/test-pages/ietf-1/expected.html
@@ -1107,4 +1107,4 @@ de Jong [Page 22]
</pre><span class="noprint"><small><small>Html markup produced by rfcmarkup 1.111, available from
<a href="https://tools.ietf.org/tools/rfcmarkup/">https://tools.ietf.org/tools/rfcmarkup/</a>
</small></small></span>
-</p></p></div> \ No newline at end of file
+</div> \ No newline at end of file
diff --git a/test/test-pages/keep-images/expected-metadata.json b/test/test-pages/keep-images/expected-metadata.json
index 1933990..a62d0ab 100644
--- a/test/test-pages/keep-images/expected-metadata.json
+++ b/test/test-pages/keep-images/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "title": "Inside the Deep Web Drug Lab",
+ "title": "Inside the Deep Web Drug Lab — Backchannel — Medium",
"byline": "Joseph Cox",
"excerpt": "Welcome to DoctorX’s Barcelona lab, where the drugs you bought online are tested for safety and purity. No questions ask…",
"readerable": true
diff --git a/test/test-pages/keep-images/expected.html b/test/test-pages/keep-images/expected.html
index 97ff3ac..fe18118 100644
--- a/test/test-pages/keep-images/expected.html
+++ b/test/test-pages/keep-images/expected.html
@@ -1,380 +1,162 @@
-<div class="postField postField--body">
- <section class=" section--first section--last" name="ef8c">
- <div class="section-content">
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage graf--first" id="b9ad" name="b9ad"><div class="aspectRatioPlaceholder is-locked">
- <p></p>
- <img class="graf-image" data-height="1402" data-image-id="1*sLDnS1UWEFIS33uLMxq3cw.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*sLDnS1UWEFIS33uLMxq3cw.jpeg"></img></div>
- </figure></div>
- <div class="section-inner layoutSingleColumn">
-
-
- <h4 class="graf--h4" data-align="center" id="9736" name="9736">Welcome to DoctorX’s Barcelona lab, where the drugs you bought online are tested for safety and purity. No questions asked.</h4>
- <p class="graf--p graf--empty" id="fc64" name="fc64">
- <br></br></p>
- <figure class="graf--figure" id="7417" name="7417"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 14px;">
-
- <img class="graf-image" data-action="zoom" data-action-value="1*3vIhkoHIzcxvUdijoCVx6w.png" data-height="24" data-image-id="1*3vIhkoHIzcxvUdijoCVx6w.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*3vIhkoHIzcxvUdijoCVx6w.png"></img></div>
- </figure><p class="graf--p" id="8a83" name="8a83">Standing at a table in a chemistry lab in Barcelona, Cristina Gil Lladanosa
- tears open a silver, smell-proof protective envelope. She slides out a
- transparent bag full of crystals. Around her, machines whir and hum, and
- other researchers mill around in long, white coats.</p>
- <p class="graf--p" id="b675" name="b675">She is holding the lab’s latest delivery of a drug bought from the “deep
- web,” the clandestine corner of the internet that isn’t reachable by normal
- search engines, and is home to some sites that require special software
- to access. Labeled as <a class="markup--anchor markup--p-anchor" data-href="http://en.wikipedia.org/wiki/MDMA" href="http://en.wikipedia.org/wiki/MDMA" rel="nofollow">MDMA</a> (the street
- term is ecstasy), this sample has been shipped from Canada. Lladanosa and
- her colleague Iván Fornís Espinosa have also received drugs, anonymously,
- from people in China, Australia, Europe and the United States.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="3c0b" name="3c0b">“Here we have speed, MDMA, cocaine, pills,” Lladanosa says, pointing to
- vials full of red, green, blue and clear solutions sitting in labeled boxes.</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="c4e6" name="c4e6"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="1402" data-image-id="1*4gN1-fzOwCniw-DbqQjDeQ.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*4gN1-fzOwCniw-DbqQjDeQ.jpeg"></img></div>
- <figcaption class="imageCaption">Cristina Gil Lladanosa, at the Barcelona testing lab | photo by Joan Bardeletti</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <p class="graf--p" id="7a54" name="7a54">Since 2011, with the launch of <a class="markup--anchor markup--p-anchor" data-href="http://en.wikipedia.org/wiki/Silk_Road_%28marketplace%29" href="http://en.wikipedia.org/wiki/Silk_Road_%28marketplace%29" rel="nofollow">Silk Road</a>, anybody has been able to safely buy illegal
- drugs from the deep web and have them delivered to their door. Though the
- FBI shut down that black market in October 2013, other outlets have emerged
- to fill its role. For the last 10 months the lab at which Lladanosa and
- Espinosa work has offered a paid testing service of those drugs. By sending
- in samples for analysis, users can know exactly what it is they are buying,
- and make a more informed decision about whether to ingest the substance.
- The group, called <a class="markup--anchor markup--p-anchor" data-href="http://energycontrol.org/" href="http://energycontrol.org/" rel="nofollow">Energy Control</a>,
- which has being running “harm reduction” programs since 1999, is the first
- to run a testing service explicitly geared towards verifying those purchases
- from the deep web.</p>
- <p class="graf--p" id="4395" name="4395">Before joining Energy Control, Lladanosa briefly worked at a pharmacy,
- whereas Espinosa spent 14 years doing drug analysis. Working at Energy
- Control is “more gratifying,” and “rewarding” than her previous jobs, Lladanosa
- told me. They also receive help from a group of volunteers, made up of
- a mixture of “squatters,” as Espinosa put it, and medical students, who
- prepare the samples for testing.</p>
- <p class="graf--p" id="0c18" name="0c18">After weighing out the crystals, aggressively mixing it with methanol
- until dissolved, and delicately pouring the liquid into a tiny brown bottle,
- Lladanosa, a petite woman who is nearly engulfed by her lab coat, is now
- ready to test the sample. She loads a series of three trays on top of a
- large white appliance sitting on a table, called a gas chromatograph (GC).
- A jungle of thick pipes hang from the lab’s ceiling behind it.</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="559c" name="559c"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="1402" data-image-id="1*2KPmZkIBUrhps-2uwDvYFQ.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*2KPmZkIBUrhps-2uwDvYFQ.jpeg"></img></div>
- <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <p class="graf--p graf--startsWithDoubleQuote" id="1549" name="1549">“Chromatography separates all the substances,” Lladanosa says as she loads
- the machine with an array of drugs sent from the deep web and local Spanish
- users. It can tell whether a sample is pure or contaminated, and if the
- latter, with what.</p>
- <p class="graf--p" id="5d0f" name="5d0f">Rushes of hot air blow across the desk as the gas chromatograph blasts
- the sample at 280 degrees Celsius. Thirty minutes later the machine’s robotic
- arm automatically moves over to grip another bottle. The machine will continue
- cranking through the 150 samples in the trays for most of the work week.</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="d6aa" name="d6aa"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="1241" data-image-id="1*PU40bbbox2Ompc5I3RE99A.jpeg" data-width="2013" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*PU40bbbox2Ompc5I3RE99A.jpeg"></img></div>
- <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <p class="graf--p" id="15e0" name="15e0">To get the drugs to Barcelona, a user mails at least 10 milligrams of
- a substance to the offices of the Asociación Bienestar y Desarrollo, the
- non-government organization that oversees Energy Control. The sample then
- gets delivered to the testing service’s laboratory, at the Barcelona Biomedical
- Research Park, a futuristic, seven story building sitting metres away from
- the beach. Energy Control borrows its lab space from a biomedical research
- group for free.</p>
- <p class="graf--p" id="2574" name="2574">The tests cost 50 Euro per sample. Users pay, not surprisingly, with Bitcoin.
- In the post announcing Energy Control’s service on the deep web, the group
- promised that “All profits of this service are set aside of maintenance
- of this project.”</p>
- <p class="graf--p" id="2644" name="2644">About a week after testing, those results are sent in a PDF to an email
- address provided by the anonymous client.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="9f91" name="9f91">“The process is quite boring, because you are in a routine,” Lladanosa
- says. But one part of the process is consistently surprising: that moment
- when the results pop up on the screen. “Every time it’s something different.”
- For instance, one cocaine sample she had tested also contained phenacetin,
- a painkiller added to increase the product’s weight; lidocaine, an anesthetic
- that numbs the gums, giving the impression that the user is taking higher
- quality cocaine; and common caffeine.</p>
- <figure class="graf--figure" id="b821" name="b821"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 14px;">
-
- <img class="graf-image" data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" data-height="24" data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png"></img></div>
- </figure><p class="graf--p" id="39a6" name="39a6">The deep web drug lab is the brainchild of Fernando Caudevilla, a Spanish
- physician who is better known as “DoctorX” on the deep web, a nickname
- given to him by his Energy Control co-workers because of his earlier writing
- about the history, risks and recreational culture of MDMA. In the physical
- world, Caudevilla has worked for over a decade with Energy Control on various
- harm reduction focused projects, most of which have involved giving Spanish
- illegal drug users medical guidance, and often writing leaflets about the
- harms of certain substances.</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="eebc" name="eebc"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="1241" data-image-id="1*mKvUNOAVQxl6atCbxbCZsg.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*mKvUNOAVQxl6atCbxbCZsg.jpeg"></img></div>
- <figcaption class="imageCaption">Fernando Caudevilla, AKA DoctorX. Photo: Joseph Cox</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <p class="graf--p" id="c099" name="c099">Caudevilla first ventured into Silk Road forums in April 2013. “I would
- like to contribute to this forum offering professional advice in topics
- related to drug use and health,” he wrote in an <a class="markup--anchor markup--p-anchor" data-href="http://web.archive.org/web/20131015051405/https://dkn255hz262ypmii.onion.to/index.php?topic=147607.0" href="http://web.archive.org/web/20131015051405/https://dkn255hz262ypmii.onion.to/index.php?topic=147607.0" rel="nofollow">introductory post</a>,
- using his DoctorX alias. Caudevilla offered to provide answers to questions
- that a typical doctor is not prepared, or willing, to respond to, at least
- not without a lecture or a judgment. “This advice cannot replace a complete
- face-to-face medical evaluation,” he wrote, “but I know how difficult it
- can be to talk frankly about these things.”</p>
- <p class="graf--p" id="ff1d" name="ff1d">The requests flooded in. A diabetic asked what effect MDMA has on blood
- sugar; another what the risks of frequent psychedelic use were for a young
- person. Someone wanted to know whether amphetamine use should be avoided
- during lactation. In all, Fernando’s thread received over 50,000 visits
- and 300 questions before the FBI shut down Silk Road.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="1f35" name="1f35">“He’s amazing. A gift to this community,” one user wrote on the Silk Road
- 2.0 forum, a site that sprang up after the original. “His knowledge is
- invaluable, and never comes with any judgment.” Up until recently, Caudevilla
- answered questions on the marketplace “Evolution.” Last week, however,
- the administrators of that site <a class="markup--anchor markup--p-anchor" data-href="http://motherboard.vice.com/read/one-of-the-darknets-biggest-markets-may-have-just-stole-all-its-users-bitcoin" href="http://motherboard.vice.com/read/one-of-the-darknets-biggest-markets-may-have-just-stole-all-its-users-bitcoin" rel="nofollow">pulled a scam</a>,
- shutting the market down and escaping with an estimated $12 million worth
- of Bitcoin.</p>
- <p class="graf--p" id="b20f" name="b20f">Caudevilla’s transition from dispensing advice to starting up a no-questions-asked
- drug testing service came as a consequence of his experience on the deep
- web. He’d wondered whether he could help bring more harm reduction services
- to a marketplace without controls. The Energy Control project, as part
- of its mandate of educating drug users and preventing harm, had already
- been carrying out drug testing for local Spanish users since 2001, at music
- festivals, night clubs, or through a drop-in service at a lab in Madrid.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="f739" name="f739">“I thought, we are doing this in Spain, why don’t we do an international
- drug testing service?” Caudevilla told me when I visited the other Energy
- Control lab, in Madrid. Caudevilla, a stocky character with ear piercings
- and short, shaved hair, has eyes that light up whenever he discusses the
- world of the deep web. Later, via email, he elaborated that it was not
- a hard sell. “It was not too hard to convince them,” he wrote me. Clearly,
- Energy Control believed that the reputation he had earned as an unbiased
- medical professional on the deep web might carry over to the drug analysis
- service, where one needs to establish “credibility, trustworthiness, [and]
- transparency,” Caudevilla said. “We could not make mistakes,” he added.</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="4058" name="4058"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="3141" data-image-id="1*knT10_FNVUmqQIBLnutmzQ.jpeg" data-width="4400" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*knT10_FNVUmqQIBLnutmzQ.jpeg"></img></div>
- <figcaption class="imageCaption">Photo: Joseph Cox</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <figure class="graf--figure" id="818c" name="818c"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 14px;">
- <p></p>
- <img class="graf-image" data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" data-height="24" data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png"></img></div>
- </figure><p class="graf--p" id="7b5e" name="7b5e">While the Energy Control lab in Madrid lab only tests Spanish drugs from
- various sources, it is the Barcelona location which vets the substances
- bought in the shadowy recesses of of the deep web. Caudevilla no longer
- runs it, having handed it over to his colleague Ana Muñoz. She maintains
- a presence on the deep web forums, answers questions from potential users,
- and sends back reports when they are ready.</p>
- <p class="graf--p" id="0f0e" name="0f0e">The testing program exists in a legal grey area. The people who own the
- Barcelona lab are accredited to experiment with and handle drugs, but Energy
- Control doesn’t have this permission itself, at least not in writing.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="e002" name="e002">“We have a verbal agreement with the police and other authorities. They
- already know what we are doing,” Lladanosa tells me. It is a pact of mutual
- benefit. Energy Control provides the police with information on batches
- of drugs in Spain, whether they’re from the deep web or not, Espinosa says.
- They also contribute to the European Monitoring Centre for Drugs and Drug
- Addiction’s early warning system, a collaboration that attempts to spread
- information about dangerous drugs as quickly as possible.</p>
- <p class="graf--p" id="db1b" name="db1b">By the time of my visit in February, Energy Control had received over
- 150 samples from the deep web and have been receiving more at a rate of
- between 4 and 8 a week. Traditional drugs, such as cocaine and MDMA, make
- up about 70 percent of the samples tested, but the Barcelona lab has also
- received samples of the prescription pill codeine, research chemicals and
- synthetic cannabinoids, and even pills of Viagra.</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="b885" name="b885"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="1402" data-image-id="1*Vr61dyCTRwk6CemmVF8YAQ.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*Vr61dyCTRwk6CemmVF8YAQ.jpeg"></img></div>
- <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <p class="graf--p" id="e76f" name="e76f">So it’s fair to make a tentative judgement on what people are paying for
- on the deep web. The verdict thus far? Overall, drugs on the deep web appear
- to be of much higher quality than those found on the street.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="5352" name="5352">“In general, the cocaine is amazing,” says Caudevilla, saying that the
- samples they’ve seen have purities climbing towards 80 or 90 percent, and
- some even higher. To get an idea of how unusual this is, take a look at
- the <a class="markup--anchor markup--p-anchor" data-href="http://www.unodc.org/documents/wdr2014/Cocaine_2014_web.pdf" href="http://www.unodc.org/documents/wdr2014/Cocaine_2014_web.pdf" rel="nofollow">United Nations Office on Drugs and Crime World Drug Report 2014</a>,
- which reports that the average quality of street cocaine in Spain is just
- over 40 percent, while in the United Kingdom it is closer to 30 percent.“We
- have found 100 percent [pure] cocaine,” he adds. “That’s really, really
- strange. That means that, technically, this cocaine has been purified,
- with clandestine methods.”</p>
- <p class="graf--p" id="a71c" name="a71c">Naturally, identifying vendors who sell this top-of-the-range stuff is
- one of the reasons that people have sent samples to Energy Control. Caudevilla
- was keen to stress that, officially, Energy Control’s service “is not intended
- to be a control of drug quality,” meaning a vetting process for identifying
- the best sellers, but that is exactly how some people have been using it.</p>
- <p class="graf--p" id="cb5b" name="cb5b">As one buyer on the Evolution market, elmo666, wrote to me over the site’s
- messaging system, “My initial motivations were selfish. My primary motivation
- was to ensure that I was receiving and continue to receive a high quality
- product, essentially to keep the vendor honest as far as my interactions
- with them went.”</p>
- <p class="graf--p" id="d80d" name="d80d">Vendors on deep web markets advertise their product just like any other
- outlet does, using flash sales, gimmicky giveaways and promises of drugs
- that are superior to those of their competitors. The claims, however, can
- turn out to be empty: despite the test results that show that deep web
- cocaine vendors typically sell product that is of a better quality than
- that found on the street, in plenty of cases, the drugs are nowhere near
- as pure as advertised.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="36de" name="36de">“You won’t be getting anything CLOSE to what you paid for,” one user complained
- about the cocaine from ‘Mirkov’, a vendor on Evolution. “He sells 65% not
- 95%.”</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="8544" name="8544"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="1402" data-image-id="1*a-1_13xE6_ErQ-QSlz6myw.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*a-1_13xE6_ErQ-QSlz6myw.jpeg"></img></div>
- <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <figure class="graf--figure" id="d521" name="d521"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 14px;">
- <p></p>
- <img class="graf-image" data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" data-height="24" data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png"></img></div>
- </figure><p class="graf--p" id="126b" name="126b">Despite the prevalence of people using the service to gauge the quality
- of what goes up their nose, many users send samples to Energy Control in
- the spirit of its original mission: keeping themselves alive and healthy.
- The worst case scenario from drugs purchased on the deep web is, well the
- worst case. That was the outcome when <a class="markup--anchor markup--p-anchor" data-href="http://www.independent.co.uk/news/uk/crime/teenager-patrick-mcmullen-who-died-while-on-skype-had-bought-drugs-from-silk-road-8942329.html" href="http://www.independent.co.uk/news/uk/crime/teenager-patrick-mcmullen-who-died-while-on-skype-had-bought-drugs-from-silk-road-8942329.html" rel="nofollow">Patrick McMullen,</a> a
- 17-year-old Scottish student, ingested half a gram of MDMA and three tabs
- of LSD, reportedly purchased from the Silk Road. While talking to his friends
- on Skype, his words became slurred and he passed out. Paramedics could
- not revive him. The coroner for that case, Sherrif Payne, who deemed the
- cause of death ecstasy toxicity, told <em class="markup--em markup--p-em">The Independent</em> “You
- never know the purity of what you are taking and you can easily come unstuck.”</p>
- <p class="graf--p" id="5e9e" name="5e9e">ScreamMyName, a deep web user who has been active since the original Silk
- Road, wants to alert users to the dangerous chemicals that are often mixed
- with drugs, and is using Energy Control as a means to do so.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="19a6" name="19a6">“We’re at a time where some vendors are outright sending people poison.
- Some do it unknowingly,” ScreamMyName told me in an encrypted message.
- “Cocaine production in South America is often tainted with either levamisole
- or phenacetine. Both poison to humans and both with severe side effects.”</p>
- <p class="graf--p" id="9fef" name="9fef">In the case of Levamisole, those prescribing it are often not doctors
- but veterinarians, as Levamisole is commonly used on animals, primarily
- for the treatment of worms. If ingested by humans it can lead to cases
- of extreme eruptions of the skin, as <a class="markup--anchor markup--p-anchor" data-href="http://www.ncbi.nlm.nih.gov/pubmed/22127712" href="http://www.ncbi.nlm.nih.gov/pubmed/22127712" rel="nofollow">documented in a study</a> from researchers at the University
- of California, San Francisco. But Lladanosa has found Levamisole in cocaine
- samples; dealers use it to increase the product weight, allowing them to
- stretch their batch further for greater profit — and also, she says, because
- Levamisole has a strong stimulant effect.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="7886" name="7886">“It got me sick as fuck,” Dr. Feel, an Evolution user, wrote on the site’s
- forums after consuming cocaine that had been cut with 23 percent Levamisole,
- and later tested by Energy Control. “I was laid up in bed for several days
- because of that shit. The first night I did it, I thought I was going to
- die. I nearly drove myself to the ER.”</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="18d3" name="18d3">“More people die because of tainted drugs than the drugs themselves,”
- Dr. Feel added. “It’s the cuts and adulterants that are making people sick
- and killing them.”</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="552a" name="552a"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="1192" data-image-id="1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg"></img></div>
- <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <p class="graf--p" id="839a" name="839a">The particular case of cocaine cut with Levamisole is one of the reasons
- that ScreamMyName has been pushing for more drug testing on the deep web
- markets. “I recognize that drug use isn’t exactly healthy, but why exacerbate
- the problem?” he told me when I contacted him after his post. “[Energy
- Control] provides a way for users to test the drugs they’ll use and for
- these very users to know what it is they’re putting in their bodies. Such
- services are in very short supply.”</p>
- <p class="graf--p" id="18dc" name="18dc">After sending a number of Energy Control tests himself, ScreamMyName started
- a de facto crowd-sourcing campaign to get more drugs sent to the lab, and
- then shared the results, after throwing in some cash to get the ball rolling.
- <a class="markup--anchor markup--p-anchor" data-href="https://blockchain.info/address/1Mi6VjMFqjcD48FPV7cnPB24MAtQQenRy3" href="https://blockchain.info/address/1Mi6VjMFqjcD48FPV7cnPB24MAtQQenRy3" rel="nofollow">He set up a Bitcoin wallet</a>, with the hope that users might chip in
- to fund further tests. At the time of writing, the wallet has received
- a total of 1.81 bitcoins; around $430 at today’s exchange rates.</p>
- <p class="graf--p" id="dcbd" name="dcbd">In posts to the Evolution community, ScreamMyName pitched this project
- as something that will benefit users and keep drug dealer honest. “When
- the funds build up to a point where we can purchase an [Energy Control]
- test fee, we’ll do a US thread poll for a few days and try to cohesively
- decide on what vendor to test,” he continued.</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="9d32" name="9d32"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="913" data-image-id="1*NGcrjfkV0l37iQH2uyYjEw.jpeg" data-width="1368" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*NGcrjfkV0l37iQH2uyYjEw.jpeg"></img></div>
- <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <p class="graf--p" id="bff6" name="bff6">Other members of the community have been helping out, too. PlutoPete,
- a vendor from the original Silk Road who sold cannabis seeds and other
- legal items, has provided ScreamMyName with packaging to safely send the
- samples to Barcelona. “A box of baggies, and a load of different moisture
- barrier bags,” PlutoPete told me over the phone. “That’s what all the vendors
- use.”</p>
- <p class="graf--p" id="bb78" name="bb78">It’s a modest program so far. ScreamMyName told me that so far he had
- gotten enough public funding to purchase five different Energy Control
- tests, in addition to the ten or so he’s sent himself so far. “The program
- created is still in its infancy and it is growing and changing as we go
- along but I have a lot of faith in what we’re doing,” he says.</p>
- <p class="graf--p" id="5638" name="5638">But the spirit is contagious: elmo666, the other deep web user testing
- cocaine, originally kept the results of the drug tests to himself, but
- he, too, saw a benefit to distributing the data. “It is clear that it is
- a useful service to other users, keeping vendors honest and drugs (and
- their users) safe,” he told me. He started to report his findings to others
- on the forums, and then created a thread with summaries of the test results,
- as well as comments from the vendors if they provided it. Other users were
- soon basing their decisions on what to buy on elmo666‘s tests.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="de75" name="de75">“I’m defo trying the cola based on the incredibly helpful elmo and his
- energy control results and recommendations,” wrote user jayk1984. On top
- of this, elmo666 plans to launch an independent site on the deep web that
- will collate all of these results, which should act as a resource for users
- of all the marketplaces.</p>
- <p class="graf--p" id="6b72" name="6b72">As word of elmo666's efforts spread, he began getting requests from drug
- dealers who wanted him to use their wares for testing. Clearly, they figured
- that a positive result from Energy Control would be a fantastic marketing
- tool to draw more customers. They even offered elmo666 free samples. (He
- passed.)</p>
- <p class="graf--p" id="b008" name="b008">Meanwhile, some in the purchasing community are arguing that those running
- markets on the deep web should be providing quality control themselves.
- PlutoPete told me over the phone that he had been in discussions about
- this with Dread Pirate Roberts, the pseudonymous owner of the original
- Silk Road site. “We [had been] talking about that on a more organized basis
- on Silk Road 1, doing lots of anonymous buys to police each category. But
- of course they took the thing [Silk Road] down before we got it properly
- off the ground,” he lamented.</p>
- <p class="graf--p" id="49c8" name="49c8">But perhaps it is best that the users, those who are actually consuming
- the drugs, remain in charge of shaming dealers and warning each other.
- “It’s our responsibility to police the market based on reviews and feedback,”
- elmo666 wrote in an Evolution forum post. It seems that in the lawless
- space of the deep web, where everything from child porn to weapons are
- sold openly, users have cooperated in an organic display of self-regulation
- to stamp out those particular batches of drugs that are more likely to
- harm users.</p>
- <p class="graf--p graf--startsWithDoubleQuote" id="386d" name="386d">“That’s always been the case with the deep web,” PlutoPete told me. Indeed,
- ever since Silk Road, a stable of the drug markets has been the review
- system, where buyers can leave a rating and feedback for vendors, letting
- others know about the reliability of the seller. But DoctorX’s lab, rigorously
- testing the products with scientific instruments, takes it a step further.</p>
- </div>
- <div class="section-inner u-sizeFullWidth">
- <figure class="graf--figure postField--fillWidthImage" id="890b" name="890b"><div class="aspectRatioPlaceholder is-locked">
-
- <img class="graf-image" data-height="1373" data-image-id="1*WRlKt3q3mt7utmwxcbl3sQ.jpeg" data-width="2100" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*WRlKt3q3mt7utmwxcbl3sQ.jpeg"></img></div>
- <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption></figure></div>
- <div class="section-inner layoutSingleColumn">
- <p class="graf--p graf--startsWithDoubleQuote" id="b109" name="b109">“In the white market, they have quality control. In the dark market, it
- should be the same,” Cristina Gil Lladanosa says to me before I leave the
- Barcelona lab.</p>
- <p class="graf--p" id="e3a4" name="e3a4">A week after I visit the lab, the results of the MDMA arrive in my inbox:
- it is 85 percent pure, with no indications of other active ingredients.
- Whoever ordered that sample from the digital shelves of the deep web, and
- had it shipped to their doorstep in Canada, got hold of some seriously
- good, and relatively safe drugs. And now they know it.</p>
- <figure class="graf--figure" id="31cf" name="31cf"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 14px;">
-
- <img class="graf-image" data-action="zoom" data-action-value="1*320_4I0lxbn5x3bx4XPI5Q.png" data-height="24" data-image-id="1*320_4I0lxbn5x3bx4XPI5Q.png" data-width="1200" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*320_4I0lxbn5x3bx4XPI5Q.png"></img></div>
- </figure><p class="graf--p" data-align="center" id="9b87" name="9b87"><em class="markup--em markup--p-em">Top photo by Joan Bardeletti</em>
- </p>
- <p class="graf--p graf--last" data-align="center" id="c30a" name="c30a">Follow Backchannel: <a class="markup--anchor markup--p-anchor" data-href="https://twitter.com/backchnnl" href="https://twitter.com/backchnnl" rel="nofollow"><em class="markup--em markup--p-em">Twitter</em></a>
- <em class="markup--em markup--p-em">|</em><a class="markup--anchor markup--p-anchor" data-href="https://www.facebook.com/pages/Backchannel/1488568504730671" href="https://www.facebook.com/pages/Backchannel/1488568504730671" rel="nofollow"><em class="markup--em markup--p-em">Facebook</em></a>
- </p>
- </div>
- </div>
- </section></div> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <div class="notesSource">
+ <div class="postField postField--body">
+ <section name="ef8c" class=" section--first section--last">
+ <div class="section-content">
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="b9ad" id="b9ad" class="graf--figure postField--fillWidthImage graf--first">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*sLDnS1UWEFIS33uLMxq3cw.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*sLDnS1UWEFIS33uLMxq3cw.jpeg"/></div>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <h4 name="9736" id="9736" data-align="center" class="graf--h4">Welcome to DoctorX’s Barcelona lab, where the drugs you bought online are tested for safety and purity. No questions asked.</h4>
+ <figure name="7417" id="7417" class="graf--figure">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*3vIhkoHIzcxvUdijoCVx6w.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*3vIhkoHIzcxvUdijoCVx6w.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*3vIhkoHIzcxvUdijoCVx6w.png"/></div>
+ </figure>
+ <p name="8a83" id="8a83" class="graf--p">Standing at a table in a chemistry lab in Barcelona, Cristina Gil Lladanosa tears open a silver, smell-proof protective envelope. She slides out a transparent bag full of crystals. Around her, machines whir and hum, and other researchers mill around in long, white coats.</p>
+ <p name="b675" id="b675" class="graf--p">She is holding the lab’s latest delivery of a drug bought from the “deep web,” the clandestine corner of the internet that isn’t reachable by normal search engines, and is home to some sites that require special software to access. Labeled as <a href="http://en.wikipedia.org/wiki/MDMA" data-href="http://en.wikipedia.org/wiki/MDMA" class="markup--anchor markup--p-anchor" rel="nofollow">MDMA</a> (the street term is ecstasy), this sample has been shipped from Canada. Lladanosa and her colleague Iván Fornís Espinosa have also received drugs, anonymously, from people in China, Australia, Europe and the United States.</p>
+ <p name="3c0b" id="3c0b" class="graf--p graf--startsWithDoubleQuote">“Here we have speed, MDMA, cocaine, pills,” Lladanosa says, pointing to vials full of red, green, blue and clear solutions sitting in labeled boxes.</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="c4e6" id="c4e6" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*4gN1-fzOwCniw-DbqQjDeQ.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*4gN1-fzOwCniw-DbqQjDeQ.jpeg"/></div>
+ <figcaption class="imageCaption">Cristina Gil Lladanosa, at the Barcelona testing lab | photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <p name="7a54" id="7a54" class="graf--p">Since 2011, with the launch of <a href="http://en.wikipedia.org/wiki/Silk_Road_%28marketplace%29" data-href="http://en.wikipedia.org/wiki/Silk_Road_%28marketplace%29" class="markup--anchor markup--p-anchor" rel="nofollow">Silk Road</a>, anybody has been able to safely buy illegal drugs from the deep web and have them delivered to their door. Though the FBI shut down that black market in October 2013, other outlets have emerged to fill its role. For the last 10 months the lab at which Lladanosa and Espinosa work has offered a paid testing service of those drugs. By sending in samples for analysis, users can know exactly what it is they are buying, and make a more informed decision about whether to ingest the substance. The group, called <a href="http://energycontrol.org/" data-href="http://energycontrol.org/" class="markup--anchor markup--p-anchor" rel="nofollow">Energy Control</a>, which has being running “harm reduction” programs since 1999, is the first to run a testing service explicitly geared towards verifying those purchases from the deep web.</p>
+ <p name="4395" id="4395" class="graf--p">Before joining Energy Control, Lladanosa briefly worked at a pharmacy, whereas Espinosa spent 14 years doing drug analysis. Working at Energy Control is “more gratifying,” and “rewarding” than her previous jobs, Lladanosa told me. They also receive help from a group of volunteers, made up of a mixture of “squatters,” as Espinosa put it, and medical students, who prepare the samples for testing.</p>
+ <p name="0c18" id="0c18" class="graf--p">After weighing out the crystals, aggressively mixing it with methanol until dissolved, and delicately pouring the liquid into a tiny brown bottle, Lladanosa, a petite woman who is nearly engulfed by her lab coat, is now ready to test the sample. She loads a series of three trays on top of a large white appliance sitting on a table, called a gas chromatograph (GC). A jungle of thick pipes hang from the lab’s ceiling behind it.</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="559c" id="559c" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*2KPmZkIBUrhps-2uwDvYFQ.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*2KPmZkIBUrhps-2uwDvYFQ.jpeg"/></div>
+ <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <p name="1549" id="1549" class="graf--p graf--startsWithDoubleQuote">“Chromatography separates all the substances,” Lladanosa says as she loads the machine with an array of drugs sent from the deep web and local Spanish users. It can tell whether a sample is pure or contaminated, and if the latter, with what.</p>
+ <p name="5d0f" id="5d0f" class="graf--p">Rushes of hot air blow across the desk as the gas chromatograph blasts the sample at 280 degrees Celsius. Thirty minutes later the machine’s robotic arm automatically moves over to grip another bottle. The machine will continue cranking through the 150 samples in the trays for most of the work week.</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="d6aa" id="d6aa" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*PU40bbbox2Ompc5I3RE99A.jpeg" data-width="2013" data-height="1241" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*PU40bbbox2Ompc5I3RE99A.jpeg"/></div>
+ <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <p name="15e0" id="15e0" class="graf--p">To get the drugs to Barcelona, a user mails at least 10 milligrams of a substance to the offices of the Asociación Bienestar y Desarrollo, the non-government organization that oversees Energy Control. The sample then gets delivered to the testing service’s laboratory, at the Barcelona Biomedical Research Park, a futuristic, seven story building sitting metres away from the beach. Energy Control borrows its lab space from a biomedical research group for free.</p>
+ <p name="2574" id="2574" class="graf--p">The tests cost 50 Euro per sample. Users pay, not surprisingly, with Bitcoin. In the post announcing Energy Control’s service on the deep web, the group promised that “All profits of this service are set aside of maintenance of this project.”</p>
+ <p name="2644" id="2644" class="graf--p">About a week after testing, those results are sent in a PDF to an email address provided by the anonymous client.</p>
+ <p name="9f91" id="9f91" class="graf--p graf--startsWithDoubleQuote">“The process is quite boring, because you are in a routine,” Lladanosa says. But one part of the process is consistently surprising: that moment when the results pop up on the screen. “Every time it’s something different.” For instance, one cocaine sample she had tested also contained phenacetin, a painkiller added to increase the product’s weight; lidocaine, an anesthetic that numbs the gums, giving the impression that the user is taking higher quality cocaine; and common caffeine.</p>
+ <figure name="b821" id="b821" class="graf--figure">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png"/></div>
+ </figure>
+ <p name="39a6" id="39a6" class="graf--p">The deep web drug lab is the brainchild of Fernando Caudevilla, a Spanish physician who is better known as “DoctorX” on the deep web, a nickname given to him by his Energy Control co-workers because of his earlier writing about the history, risks and recreational culture of MDMA. In the physical world, Caudevilla has worked for over a decade with Energy Control on various harm reduction focused projects, most of which have involved giving Spanish illegal drug users medical guidance, and often writing leaflets about the harms of certain substances.</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="eebc" id="eebc" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*mKvUNOAVQxl6atCbxbCZsg.jpeg" data-width="2100" data-height="1241" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*mKvUNOAVQxl6atCbxbCZsg.jpeg"/></div>
+ <figcaption class="imageCaption">Fernando Caudevilla, AKA DoctorX. Photo: Joseph Cox</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <p name="c099" id="c099" class="graf--p">Caudevilla first ventured into Silk Road forums in April 2013. “I would like to contribute to this forum offering professional advice in topics related to drug use and health,” he wrote in an <a href="http://web.archive.org/web/20131015051405/https://dkn255hz262ypmii.onion.to/index.php?topic=147607.0" data-href="http://web.archive.org/web/20131015051405/https://dkn255hz262ypmii.onion.to/index.php?topic=147607.0" class="markup--anchor markup--p-anchor" rel="nofollow">introductory post</a>, using his DoctorX alias. Caudevilla offered to provide answers to questions that a typical doctor is not prepared, or willing, to respond to, at least not without a lecture or a judgment. “This advice cannot replace a complete face-to-face medical evaluation,” he wrote, “but I know how difficult it can be to talk frankly about these things.”</p>
+ <p name="ff1d" id="ff1d" class="graf--p">The requests flooded in. A diabetic asked what effect MDMA has on blood sugar; another what the risks of frequent psychedelic use were for a young person. Someone wanted to know whether amphetamine use should be avoided during lactation. In all, Fernando’s thread received over 50,000 visits and 300 questions before the FBI shut down Silk Road.</p>
+ <p name="1f35" id="1f35" class="graf--p graf--startsWithDoubleQuote">“He’s amazing. A gift to this community,” one user wrote on the Silk Road 2.0 forum, a site that sprang up after the original. “His knowledge is invaluable, and never comes with any judgment.” Up until recently, Caudevilla answered questions on the marketplace “Evolution.” Last week, however, the administrators of that site <a href="http://motherboard.vice.com/read/one-of-the-darknets-biggest-markets-may-have-just-stole-all-its-users-bitcoin" data-href="http://motherboard.vice.com/read/one-of-the-darknets-biggest-markets-may-have-just-stole-all-its-users-bitcoin" class="markup--anchor markup--p-anchor" rel="nofollow">pulled a scam</a>, shutting the market down and escaping with an estimated $12 million worth of Bitcoin.</p>
+ <p name="b20f" id="b20f" class="graf--p">Caudevilla’s transition from dispensing advice to starting up a no-questions-asked drug testing service came as a consequence of his experience on the deep web. He’d wondered whether he could help bring more harm reduction services to a marketplace without controls. The Energy Control project, as part of its mandate of educating drug users and preventing harm, had already been carrying out drug testing for local Spanish users since 2001, at music festivals, night clubs, or through a drop-in service at a lab in Madrid.</p>
+ <p name="f739" id="f739" class="graf--p graf--startsWithDoubleQuote">“I thought, we are doing this in Spain, why don’t we do an international drug testing service?” Caudevilla told me when I visited the other Energy Control lab, in Madrid. Caudevilla, a stocky character with ear piercings and short, shaved hair, has eyes that light up whenever he discusses the world of the deep web. Later, via email, he elaborated that it was not a hard sell. “It was not too hard to convince them,” he wrote me. Clearly, Energy Control believed that the reputation he had earned as an unbiased medical professional on the deep web might carry over to the drug analysis service, where one needs to establish “credibility, trustworthiness, [and] transparency,” Caudevilla said. “We could not make mistakes,” he added.</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="4058" id="4058" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*knT10_FNVUmqQIBLnutmzQ.jpeg" data-width="4400" data-height="3141" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*knT10_FNVUmqQIBLnutmzQ.jpeg"/></div>
+ <figcaption class="imageCaption">Photo: Joseph Cox</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <figure name="818c" id="818c" class="graf--figure">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png"/></div>
+ </figure>
+ <p name="7b5e" id="7b5e" class="graf--p">While the Energy Control lab in Madrid lab only tests Spanish drugs from various sources, it is the Barcelona location which vets the substances bought in the shadowy recesses of of the deep web. Caudevilla no longer runs it, having handed it over to his colleague Ana Muñoz. She maintains a presence on the deep web forums, answers questions from potential users, and sends back reports when they are ready.</p>
+ <p name="0f0e" id="0f0e" class="graf--p">The testing program exists in a legal grey area. The people who own the Barcelona lab are accredited to experiment with and handle drugs, but Energy Control doesn’t have this permission itself, at least not in writing.</p>
+ <p name="e002" id="e002" class="graf--p graf--startsWithDoubleQuote">“We have a verbal agreement with the police and other authorities. They already know what we are doing,” Lladanosa tells me. It is a pact of mutual benefit. Energy Control provides the police with information on batches of drugs in Spain, whether they’re from the deep web or not, Espinosa says. They also contribute to the European Monitoring Centre for Drugs and Drug Addiction’s early warning system, a collaboration that attempts to spread information about dangerous drugs as quickly as possible.</p>
+ <p name="db1b" id="db1b" class="graf--p">By the time of my visit in February, Energy Control had received over 150 samples from the deep web and have been receiving more at a rate of between 4 and 8 a week. Traditional drugs, such as cocaine and MDMA, make up about 70 percent of the samples tested, but the Barcelona lab has also received samples of the prescription pill codeine, research chemicals and synthetic cannabinoids, and even pills of Viagra.</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="b885" id="b885" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*Vr61dyCTRwk6CemmVF8YAQ.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*Vr61dyCTRwk6CemmVF8YAQ.jpeg"/></div>
+ <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <p name="e76f" id="e76f" class="graf--p">So it’s fair to make a tentative judgement on what people are paying for on the deep web. The verdict thus far? Overall, drugs on the deep web appear to be of much higher quality than those found on the street.</p>
+ <p name="5352" id="5352" class="graf--p graf--startsWithDoubleQuote">“In general, the cocaine is amazing,” says Caudevilla, saying that the samples they’ve seen have purities climbing towards 80 or 90 percent, and some even higher. To get an idea of how unusual this is, take a look at the <a href="http://www.unodc.org/documents/wdr2014/Cocaine_2014_web.pdf" data-href="http://www.unodc.org/documents/wdr2014/Cocaine_2014_web.pdf" class="markup--anchor markup--p-anchor" rel="nofollow">United Nations Office on Drugs and Crime World Drug Report 2014</a>, which reports that the average quality of street cocaine in Spain is just over 40 percent, while in the United Kingdom it is closer to 30 percent.“We have found 100 percent [pure] cocaine,” he adds. “That’s really, really strange. That means that, technically, this cocaine has been purified, with clandestine methods.”</p>
+ <p name="a71c" id="a71c" class="graf--p">Naturally, identifying vendors who sell this top-of-the-range stuff is one of the reasons that people have sent samples to Energy Control. Caudevilla was keen to stress that, officially, Energy Control’s service “is not intended to be a control of drug quality,” meaning a vetting process for identifying the best sellers, but that is exactly how some people have been using it.</p>
+ <p name="cb5b" id="cb5b" class="graf--p">As one buyer on the Evolution market, elmo666, wrote to me over the site’s messaging system, “My initial motivations were selfish. My primary motivation was to ensure that I was receiving and continue to receive a high quality product, essentially to keep the vendor honest as far as my interactions with them went.”</p>
+ <p name="d80d" id="d80d" class="graf--p">Vendors on deep web markets advertise their product just like any other outlet does, using flash sales, gimmicky giveaways and promises of drugs that are superior to those of their competitors. The claims, however, can turn out to be empty: despite the test results that show that deep web cocaine vendors typically sell product that is of a better quality than that found on the street, in plenty of cases, the drugs are nowhere near as pure as advertised.</p>
+ <p name="36de" id="36de" class="graf--p graf--startsWithDoubleQuote">“You won’t be getting anything CLOSE to what you paid for,” one user complained about the cocaine from ‘Mirkov’, a vendor on Evolution. “He sells 65% not 95%.”</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="8544" id="8544" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*a-1_13xE6_ErQ-QSlz6myw.jpeg" data-width="2100" data-height="1402" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*a-1_13xE6_ErQ-QSlz6myw.jpeg"/></div>
+ <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <figure name="d521" id="d521" class="graf--figure">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*ohyycinH18fz98TCyUzVgQ.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*ohyycinH18fz98TCyUzVgQ.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*ohyycinH18fz98TCyUzVgQ.png"/></div>
+ </figure>
+ <p name="126b" id="126b" class="graf--p">Despite the prevalence of people using the service to gauge the quality of what goes up their nose, many users send samples to Energy Control in the spirit of its original mission: keeping themselves alive and healthy. The worst case scenario from drugs purchased on the deep web is, well the worst case. That was the outcome when <a href="http://www.independent.co.uk/news/uk/crime/teenager-patrick-mcmullen-who-died-while-on-skype-had-bought-drugs-from-silk-road-8942329.html" data-href="http://www.independent.co.uk/news/uk/crime/teenager-patrick-mcmullen-who-died-while-on-skype-had-bought-drugs-from-silk-road-8942329.html" class="markup--anchor markup--p-anchor" rel="nofollow">Patrick McMullen,</a> a 17-year-old Scottish student, ingested half a gram of MDMA and three tabs of LSD, reportedly purchased from the Silk Road. While talking to his friends on Skype, his words became slurred and he passed out. Paramedics could not revive him. The coroner for that case, Sherrif Payne, who deemed the cause of death ecstasy toxicity, told <em class="markup--em markup--p-em">The Independent</em> “You never know the purity of what you are taking and you can easily come unstuck.”</p>
+ <p name="5e9e" id="5e9e" class="graf--p">ScreamMyName, a deep web user who has been active since the original Silk Road, wants to alert users to the dangerous chemicals that are often mixed with drugs, and is using Energy Control as a means to do so.</p>
+ <p name="19a6" id="19a6" class="graf--p graf--startsWithDoubleQuote">“We’re at a time where some vendors are outright sending people poison. Some do it unknowingly,” ScreamMyName told me in an encrypted message. “Cocaine production in South America is often tainted with either levamisole or phenacetine. Both poison to humans and both with severe side effects.”</p>
+ <p name="9fef" id="9fef" class="graf--p">In the case of Levamisole, those prescribing it are often not doctors but veterinarians, as Levamisole is commonly used on animals, primarily for the treatment of worms. If ingested by humans it can lead to cases of extreme eruptions of the skin, as <a href="http://www.ncbi.nlm.nih.gov/pubmed/22127712" data-href="http://www.ncbi.nlm.nih.gov/pubmed/22127712" class="markup--anchor markup--p-anchor" rel="nofollow">documented in a study</a> from researchers at the University of California, San Francisco. But Lladanosa has found Levamisole in cocaine samples; dealers use it to increase the product weight, allowing them to stretch their batch further for greater profit — and also, she says, because Levamisole has a strong stimulant effect.</p>
+ <p name="7886" id="7886" class="graf--p graf--startsWithDoubleQuote">“It got me sick as fuck,” Dr. Feel, an Evolution user, wrote on the site’s forums after consuming cocaine that had been cut with 23 percent Levamisole, and later tested by Energy Control. “I was laid up in bed for several days because of that shit. The first night I did it, I thought I was going to die. I nearly drove myself to the ER.”</p>
+ <p name="18d3" id="18d3" class="graf--p graf--startsWithDoubleQuote">“More people die because of tainted drugs than the drugs themselves,” Dr. Feel added. “It’s the cuts and adulterants that are making people sick and killing them.”</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="552a" id="552a" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg" data-width="2100" data-height="1192" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*IWXhtSsVv0gNnCwnDEXk-Q.jpeg"/></div>
+ <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <p name="839a" id="839a" class="graf--p">The particular case of cocaine cut with Levamisole is one of the reasons that ScreamMyName has been pushing for more drug testing on the deep web markets. “I recognize that drug use isn’t exactly healthy, but why exacerbate the problem?” he told me when I contacted him after his post. “[Energy Control] provides a way for users to test the drugs they’ll use and for these very users to know what it is they’re putting in their bodies. Such services are in very short supply.”</p>
+ <p name="18dc" id="18dc" class="graf--p">After sending a number of Energy Control tests himself, ScreamMyName started a de facto crowd-sourcing campaign to get more drugs sent to the lab, and then shared the results, after throwing in some cash to get the ball rolling. <a href="https://blockchain.info/address/1Mi6VjMFqjcD48FPV7cnPB24MAtQQenRy3" data-href="https://blockchain.info/address/1Mi6VjMFqjcD48FPV7cnPB24MAtQQenRy3" class="markup--anchor markup--p-anchor" rel="nofollow">He set up a Bitcoin wallet</a>, with the hope that users might chip in to fund further tests. At the time of writing, the wallet has received a total of 1.81 bitcoins; around $430 at today’s exchange rates.</p>
+ <p name="dcbd" id="dcbd" class="graf--p">In posts to the Evolution community, ScreamMyName pitched this project as something that will benefit users and keep drug dealer honest. “When the funds build up to a point where we can purchase an [Energy Control] test fee, we’ll do a US thread poll for a few days and try to cohesively decide on what vendor to test,” he continued.</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="9d32" id="9d32" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*NGcrjfkV0l37iQH2uyYjEw.jpeg" data-width="1368" data-height="913" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*NGcrjfkV0l37iQH2uyYjEw.jpeg"/></div>
+ <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <p name="bff6" id="bff6" class="graf--p">Other members of the community have been helping out, too. PlutoPete, a vendor from the original Silk Road who sold cannabis seeds and other legal items, has provided ScreamMyName with packaging to safely send the samples to Barcelona. “A box of baggies, and a load of different moisture barrier bags,” PlutoPete told me over the phone. “That’s what all the vendors use.”</p>
+ <p name="bb78" id="bb78" class="graf--p">It’s a modest program so far. ScreamMyName told me that so far he had gotten enough public funding to purchase five different Energy Control tests, in addition to the ten or so he’s sent himself so far. “The program created is still in its infancy and it is growing and changing as we go along but I have a lot of faith in what we’re doing,” he says.</p>
+ <p name="5638" id="5638" class="graf--p">But the spirit is contagious: elmo666, the other deep web user testing cocaine, originally kept the results of the drug tests to himself, but he, too, saw a benefit to distributing the data. “It is clear that it is a useful service to other users, keeping vendors honest and drugs (and their users) safe,” he told me. He started to report his findings to others on the forums, and then created a thread with summaries of the test results, as well as comments from the vendors if they provided it. Other users were soon basing their decisions on what to buy on elmo666‘s tests.</p>
+ <p name="de75" id="de75" class="graf--p graf--startsWithDoubleQuote">“I’m defo trying the cola based on the incredibly helpful elmo and his energy control results and recommendations,” wrote user jayk1984. On top of this, elmo666 plans to launch an independent site on the deep web that will collate all of these results, which should act as a resource for users of all the marketplaces.</p>
+ <p name="6b72" id="6b72" class="graf--p">As word of elmo666's efforts spread, he began getting requests from drug dealers who wanted him to use their wares for testing. Clearly, they figured that a positive result from Energy Control would be a fantastic marketing tool to draw more customers. They even offered elmo666 free samples. (He passed.)</p>
+ <p name="b008" id="b008" class="graf--p">Meanwhile, some in the purchasing community are arguing that those running markets on the deep web should be providing quality control themselves. PlutoPete told me over the phone that he had been in discussions about this with Dread Pirate Roberts, the pseudonymous owner of the original Silk Road site. “We [had been] talking about that on a more organized basis on Silk Road 1, doing lots of anonymous buys to police each category. But of course they took the thing [Silk Road] down before we got it properly off the ground,” he lamented.</p>
+ <p name="49c8" id="49c8" class="graf--p">But perhaps it is best that the users, those who are actually consuming the drugs, remain in charge of shaming dealers and warning each other. “It’s our responsibility to police the market based on reviews and feedback,” elmo666 wrote in an Evolution forum post. It seems that in the lawless space of the deep web, where everything from child porn to weapons are sold openly, users have cooperated in an organic display of self-regulation to stamp out those particular batches of drugs that are more likely to harm users.</p>
+ <p name="386d" id="386d" class="graf--p graf--startsWithDoubleQuote">“That’s always been the case with the deep web,” PlutoPete told me. Indeed, ever since Silk Road, a stable of the drug markets has been the review system, where buyers can leave a rating and feedback for vendors, letting others know about the reliability of the seller. But DoctorX’s lab, rigorously testing the products with scientific instruments, takes it a step further.</p>
+ </div>
+ <div class="section-inner u-sizeFullWidth">
+ <figure name="890b" id="890b" class="graf--figure postField--fillWidthImage">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*WRlKt3q3mt7utmwxcbl3sQ.jpeg" data-width="2100" data-height="1373" src="https://d262ilb51hltx0.cloudfront.net/max/2000/1*WRlKt3q3mt7utmwxcbl3sQ.jpeg"/></div>
+ <figcaption class="imageCaption">Photo by Joan Bardeletti</figcaption>
+ </figure>
+ </div>
+ <div class="section-inner layoutSingleColumn">
+ <p name="b109" id="b109" class="graf--p graf--startsWithDoubleQuote">“In the white market, they have quality control. In the dark market, it should be the same,” Cristina Gil Lladanosa says to me before I leave the Barcelona lab.</p>
+ <p name="e3a4" id="e3a4" class="graf--p">A week after I visit the lab, the results of the MDMA arrive in my inbox: it is 85 percent pure, with no indications of other active ingredients. Whoever ordered that sample from the digital shelves of the deep web, and had it shipped to their doorstep in Canada, got hold of some seriously good, and relatively safe drugs. And now they know it.</p>
+ <figure name="31cf" id="31cf" class="graf--figure">
+ <div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-image-id="1*320_4I0lxbn5x3bx4XPI5Q.png" data-width="1200" data-height="24" data-action="zoom" data-action-value="1*320_4I0lxbn5x3bx4XPI5Q.png" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*320_4I0lxbn5x3bx4XPI5Q.png"/></div>
+ </figure>
+ <p name="9b87" id="9b87" data-align="center" class="graf--p"><em class="markup--em markup--p-em">Top photo by Joan Bardeletti</em> </p>
+ <p name="c30a" id="c30a" data-align="center" class="graf--p graf--last">Follow Backchannel: <a href="https://twitter.com/backchnnl" data-href="https://twitter.com/backchnnl" class="markup--anchor markup--p-anchor" rel="nofollow"><em class="markup--em markup--p-em">Twitter</em></a> <em class="markup--em markup--p-em">|</em><a href="https://www.facebook.com/pages/Backchannel/1488568504730671" data-href="https://www.facebook.com/pages/Backchannel/1488568504730671" class="markup--anchor markup--p-anchor" rel="nofollow"><em class="markup--em markup--p-em">Facebook</em></a> </p>
+ </div>
+ </div>
+ </section>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/test/test-pages/liberation-1/expected.html b/test/test-pages/liberation-1/expected.html
index cedbffa..2b9b909 100644
--- a/test/test-pages/liberation-1/expected.html
+++ b/test/test-pages/liberation-1/expected.html
@@ -1,12 +1,17 @@
-<div class="article-body mod" id="article-body" itemprop="articleBody">
- <div>
- <p>Un troisième Français a été tué dans le tremblement de terre samedi au Népal, emporté par une avalanche, <a href="http://www.liberation.fr/video/2015/04/30/laurent-fabius-plus-de-200-francais-n-ont-pas-ete-retrouves_1278687" target="_blank">a déclaré jeudi le ministre des Affaires étrangères</a>. Les autorités françaises sont toujours sans nouvelles <em>«d’encore plus de 200» </em>personnes. <em>«Pour certains d’entre eux on est très interrogatif»</em>, a ajouté Laurent Fabius. Il accueillait à Roissy un premier avion spécial ramenant des rescapés. <a href="http://www.liberation.fr/video/2015/04/30/seisme-au-nepal-soulages-mais-inquiets-206-survivants-de-retour-en-france_1278758" target="_blank">L’Airbus A350 affrété par les autorités françaises s’est posé peu avant 5h45</a> avec à son bord 206 passagers, dont 12 enfants et 26 blessés, selon une source du Quai d’Orsay. Quasiment tous sont français, à l’exception d’une quinzaine de ressortissants allemands, suisses, italiens, portugais ou encore turcs. Des psychologues, une équipe médicale et des personnels du centre de crise du Quai d’Orsay les attendent.</p>
- <p>L’appareil, mis à disposition par Airbus, était arrivé à Katmandou mercredi matin avec 55 personnels de santé et humanitaires, ainsi que 25 tonnes de matériel (abris, médicaments, aide alimentaire). Un deuxième avion dépêché par Paris, qui était immobilisé aux Emirats depuis mardi avec 20 tonnes de matériel, est arrivé jeudi à Katmandou, <a href="http://www.liberation.fr/monde/2015/04/29/embouteillages-et-retards-a-l-aeroport-de-katmandou_1276612" target="_blank">dont le petit aéroport est engorgé</a> par le trafic et l’afflux d’aide humanitaire. Il devait lui aussi ramener des Français, <em>«les plus éprouvés»</em> par la catastrophe et les <em>«plus vulnérables (blessés, familles avec enfants)»</em>, selon le ministère des Affaires étrangères.</p>
- <p>2 209 Français ont été localisés sains et saufs tandis que 393 n’ont pas encore pu être joints, selon le Quai d’Orsay. Environ 400 Français ont demandé à être rapatriés dans les vols mis en place par la France.</p>
- <p>Le séisme a fait près de 5 500 morts et touche huit des 28 millions d’habitants du Népal. Des dizaines de milliers de personnes sont sans abri.</p>
- <p>
- <iframe data-aspect-ratio="0.5625" data-responsive="1" frameborder="0" src="http://www.dailymotion.com/embed/video/x2oikl3" width="100%"></iframe>
- <br></br><em></em></p>
- </div>
-
- </div> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <section id="news-article">
+ <article itemscope="" itemtype="http://schema.org/NewsArticle">
+ <div class="article-body mod" itemprop="articleBody" id="article-body">
+ <div>
+ <p>Un troisième Français a été tué dans le tremblement de terre samedi au Népal, emporté par une avalanche, <a href="http://www.liberation.fr/video/2015/04/30/laurent-fabius-plus-de-200-francais-n-ont-pas-ete-retrouves_1278687" target="_blank">a déclaré jeudi le ministre des Affaires étrangères</a>.&nbsp;Les autorités françaises sont toujours sans nouvelles <em>«d’encore plus de 200»&nbsp;</em>personnes.&nbsp;<em>«Pour certains d’entre eux on est très interrogatif»</em>, a ajouté&nbsp;Laurent Fabius. Il accueillait à Roissy un premier avion spécial ramenant des&nbsp;rescapés. <a href="http://www.liberation.fr/video/2015/04/30/seisme-au-nepal-soulages-mais-inquiets-206-survivants-de-retour-en-france_1278758" target="_blank">L’Airbus A350 affrété par les autorités françaises s’est posé peu avant 5h45</a> avec à son bord 206&nbsp;passagers, dont 12&nbsp;enfants et 26&nbsp;blessés, selon une source du Quai d’Orsay. Quasiment tous sont français, à l’exception d’une quinzaine de ressortissants allemands, suisses, italiens, portugais ou encore turcs. Des psychologues, une équipe médicale et des personnels du centre de crise du Quai d’Orsay les attendent.</p>
+ <p>L’appareil, mis à disposition par Airbus, était arrivé à Katmandou mercredi matin avec 55&nbsp;personnels de santé et humanitaires, ainsi que 25&nbsp;tonnes de matériel (abris, médicaments, aide alimentaire). Un deuxième avion dépêché par Paris, qui était immobilisé aux Emirats depuis mardi avec 20&nbsp;tonnes de matériel, est arrivé jeudi à Katmandou, <a href="http://www.liberation.fr/monde/2015/04/29/embouteillages-et-retards-a-l-aeroport-de-katmandou_1276612" target="_blank">dont le petit aéroport est engorgé</a> par le trafic et l’afflux d’aide humanitaire. Il devait lui aussi ramener des Français, <em>«les plus éprouvés»</em> par la catastrophe et les <em>«plus vulnérables (blessés, familles avec enfants)»</em>, selon le ministère des Affaires étrangères.</p>
+ <p>2 209 Français ont été localisés sains et saufs tandis que 393 n’ont pas encore pu être joints, selon le Quai d’Orsay. Environ 400&nbsp;Français ont demandé à être rapatriés dans les vols mis en place par la France.</p>
+ <p>Le séisme a fait près de 5&nbsp;500 morts et touche huit des 28 millions d’habitants du Népal. Des dizaines de milliers de personnes sont sans abri.</p>
+ <p>
+ <iframe src="http://www.dailymotion.com/embed/video/x2oikl3" frameborder="0" width="100%" data-aspect-ratio="0.5625" data-responsive="1"></iframe>
+ <br/><em></em></p>
+ </div>
+ </div>
+ </article>
+ </section>
+</div> \ No newline at end of file
diff --git a/test/test-pages/links-in-tables/expected.html b/test/test-pages/links-in-tables/expected.html
index b6b9113..ce794ab 100644
--- a/test/test-pages/links-in-tables/expected.html
+++ b/test/test-pages/links-in-tables/expected.html
@@ -1,155 +1,194 @@
-<div id="readability-page-1" class="page">
- <div class="post-body entry-content" id="post-body-2701400044422363572" itemprop="articlesBody">
- <p> <em>Posted by Andrew Hayden, Software Engineer on Google Play</em> </p>
- <p> Android users are downloading tens of billions of apps and games on Google Play. We're also seeing developers update their apps frequently in order to provide users with great content, improve security, and enhance the overall user experience. It takes a lot of data to download these updates and we know users care about how much data their devices are using. Earlier this year, we announced that we started using <a href="https://android-developers.blogspot.com/2016/07/improvements-for-smaller-app-downloads.html">the
+<div class="post-body entry-content" id="post-body-2701400044422363572" itemprop="articlesBody">
+<p>
+<em>Posted by Andrew Hayden, Software Engineer on Google Play</em>
+</p>
+<p>
+Android users are downloading tens of billions of apps and games on Google Play.
+ We're also seeing developers update their apps frequently in order to provide
+users with great content, improve security, and enhance the overall user
+experience. It takes a lot of data to download these updates and we know users
+care about how much data their devices are using. Earlier this year, we
+announced that we started using <a href="https://android-developers.blogspot.com/2016/07/improvements-for-smaller-app-downloads.html">the
bsdiff algorithm</a> <a href="https://android-developers.blogspot.com/2016/07/improvements-for-smaller-app-downloads.html">(by
-Colin Percival)</a>. Using bsdiff, we were able to reduce the size of app updates on average by 47% compared to the full APK size. </p>
- <p> Today, we're excited to share a new approach that goes further — <strong><a href="https://github.com/andrewhayden/archive-patcher/blob/master/README.md">File-by-File
-patching</a></strong>. App Updates using File-by-File patching are, <strong>on average,</strong> <strong>65% smaller than the full app</strong>, and in some cases more than 90% smaller. </p>
- <p> The savings, compared to our previous approach, add up to 6 petabytes of user data saved per day! </p>
- <p> In order to get the new version of the app, Google Play sends your device a patch that describes the <em>differences</em> between the old and new versions of the app. </p>
- <p> Imagine you are an author of a book about to be published, and wish to change a single sentence - it's much easier to tell the editor which sentence to change and what to change, rather than send an entirely new book. In the same way, patches are much smaller and much faster to download than the entire APK. </p>
- <p> <strong><span>Techniques used in File-by-File
-patching </span></strong> </p>
- <p> Android apps are packaged as APKs, which are ZIP files with special conventions. Most of the content within the ZIP files (and APKs) is compressed using a technology called <a href="https://en.wikipedia.org/w/index.php?title=DEFLATE&amp;oldid=735386036">Deflate</a>. Deflate is really good at compressing data but it has a drawback: it makes identifying changes in the original (uncompressed) content really hard. Even a tiny change to the original content (like changing one word in a book) can make the compressed output of deflate look <em>completely different</em>. Describing the differences between the <em>original</em> content is easy, but describing the differences between the <em>compressed</em> content is so hard that it leads to inefficient patches. </p>
- <p> Watch how much the compressed text on the right side changes from a one-letter change in the uncompressed text on the left: </p>
- <div class="separator">
- <a href="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s1600/ipsum-opsum.gif" imageanchor="1"><img src="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s640/ipsum-opsum.gif" width="640" height="105" border="0" /></a>
- </div>
- <p> File-by-File therefore is based on detecting changes in the uncompressed data. To generate a patch, we first decompress both old and new files before computing the delta (we still use bsdiff here). Then to apply the patch, we decompress the old file, apply the delta to the uncompressed content and then recompress the new file. In doing so, we need to make sure that the APK on your device is a perfect match, byte for byte, to the one on the Play Store (see <a href="https://source.android.com/security/apksigning/v2.html">APK Signature
-Schema v2 </a>for why). </p>
- <p> When recompressing the new file, we hit two complications. First, Deflate has a number of settings that affect output; and we don't know which settings were used in the first place. Second, many versions of deflate exist and we need to know whether the version on your device is suitable. </p>
- <p> Fortunately, after analysis of the apps on the Play Store, we've discovered that recent and compatible versions of deflate based on zlib (the most popular deflate library) account for almost all deflated content in the Play Store. In addition, the default settings (level=6) and maximum compression settings (level=9) are the only settings we encountered in practice. </p>
- <p> Knowing this, we can detect and reproduce the original deflate settings. This makes it possible to uncompress the data, apply a patch, and then recompress the data back to <em>exactly the same bytes</em> as originally uploaded. </p>
- <p> However, there is one trade off; extra processing power is needed on the device. On modern devices (e.g. from 2015), recompression can take a little over a second per megabyte and on older or less powerful devices it can be longer. Analysis so far shows that, on average, if the patch size is halved then the time spent applying the patch (which for File-by-File includes recompression) is doubled. </p>
- <p> For now, we are limiting the use of this new patching technology to auto-updates only, i.e. the updates that take place in the background, usually at night when your phone is plugged into power and you're not likely to be using it. This ensures that users won't have to wait any longer than usual for an update to finish when manually updating an app. </p>
- <p> <strong><span>How effective is File-by-File
-Patching?</span></strong> </p>
- <p> Here are examples of app updates already using File-by-File Patching: </p>
- <div dir="ltr" trbidi="on">
- <div dir="ltr">
- <table>
- <colgroup>
- <col width="142" />
- <col width="102" />
- <col width="176" />
- <col width="176" />
- </colgroup>
- <tbody>
- <tr>
- <td>
- <p dir="ltr"> <span>Application</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>Original Size</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>Previous (BSDiff) Patch Size</span></p>
- <p dir="ltr"> <span>(% vs original)</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>File-by-File Patch Size (% vs original)</span></p>
- </td>
- </tr>
- <tr>
- <td>
- <div dir="ltr"><a href="https://play.google.com/store/apps/details?id=com.king.farmheroessupersaga&amp;hl=en"><span>Farm Heroes Super Saga</span></a></div>
- </td>
- <td>
- <p dir="ltr"> <span>71.1 MB</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>13.4 MB (-81%)</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>8.0 MB (-89%)</span></p>
- </td>
- </tr>
- <tr>
- <td>
- <div dir="ltr"><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.maps"><span>Google Maps</span></a></div>
- </td>
- <td>
- <p dir="ltr"> <span>32.7 MB</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>17.5 MB (-46%)</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>9.6 MB (-71%)</span></p>
- </td>
- </tr>
- <tr>
- <td>
- <div dir="ltr"><a href="https://play.google.com/store/apps/details?id=com.google.android.gm"><span>Gmail</span></a></div>
- </td>
- <td>
- <p dir="ltr"> <span>17.8 MB</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>7.6 MB (-57%)</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>7.3 MB (-59%)</span></p>
- </td>
- </tr>
- <tr>
- <td>
- <div dir="ltr"><a href="https://play.google.com/store/apps/details?id=com.google.android.tts"><span>Google TTS</span></a></div>
- </td>
- <td>
- <p dir="ltr"> <span>18.9 MB</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>17.2 MB (-9%)</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>13.1 MB (-31%)</span></p>
- </td>
- </tr>
- <tr>
- <td>
- <div dir="ltr"><a href="https://play.google.com/store/apps/details?id=com.amazon.kindle"><span>Kindle</span></a></div>
- </td>
- <td>
- <p dir="ltr"> <span>52.4 MB</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>19.1 MB (-64%)</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>8.4 MB (-84%)</span></p>
- </td>
- </tr>
- <tr>
- <td>
- <div dir="ltr"><a href="https://play.google.com/store/apps/details?id=com.netflix.mediaclient"><span>Netflix</span></a></div>
- </td>
- <td>
- <p dir="ltr"> <span>16.2 MB</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>7.7 MB (-52%)</span></p>
- </td>
- <td>
- <p dir="ltr"> <span>1.2 MB (-92%)</span></p>
- </td>
- </tr>
- </tbody>
- </table>
- </div><span id="docs-internal-guid-de7f0210-d587-05da-d332-146959aa303f"></span><br/></div><em>Disclaimer: if you see different patch sizes when you press "update"
+Colin Percival)</a>. Using bsdiff, we were able to reduce the size of app
+updates on average by 47% compared to the full APK size.
+</p>
+<p>
+Today, we're excited to share a new approach that goes further — <strong><a href="https://github.com/andrewhayden/archive-patcher/blob/master/README.md">File-by-File
+patching</a></strong>. App Updates using File-by-File patching are, <strong>on average,</strong>
+<strong>65% smaller than the full app</strong>, and in some cases more than 90%
+smaller.
+</p>
+<p>
+The savings, compared to our previous approach, add up to 6 petabytes of user
+data saved per day!
+</p>
+<p>
+In order to get the new version of the app, Google Play sends your device a
+patch that describes the <em>differences</em> between the old and new versions
+of the app.
+</p>
+<p>
+Imagine you are an author of a book about to be published, and wish to change a
+single sentence - it's much easier to tell the editor which sentence to change
+and what to change, rather than send an entirely new book. In the same way,
+patches are much smaller and much faster to download than the entire APK.
+</p>
+<p>
+<strong><span>Techniques used in File-by-File
+patching </span></strong>
+</p>
+<p>
+Android apps are packaged as APKs, which are ZIP files with special conventions.
+Most of the content within the ZIP files (and APKs) is compressed using a
+technology called <a href="https://en.wikipedia.org/w/index.php?title=DEFLATE&amp;oldid=735386036">Deflate</a>.
+Deflate is really good at compressing data but it has a drawback: it makes
+identifying changes in the original (uncompressed) content really hard. Even a
+tiny change to the original content (like changing one word in a book) can make
+the compressed output of deflate look <em>completely different</em>. Describing
+the differences between the <em>original</em> content is easy, but describing
+the differences between the <em>compressed</em> content is so hard that it leads
+to inefficient patches.
+</p>
+<p>
+Watch how much the compressed text on the right side changes from a one-letter
+change in the uncompressed text on the left:
+</p>
+<div class="separator"><a href="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s1600/ipsum-opsum.gif" imageanchor="1"><img border="0" height="105" src="https://2.bp.blogspot.com/-chCZZinlUTg/WEcxvJo9gdI/AAAAAAAADnk/3ND_BspqN6Y2j5xxkLFW3RyS2Ig0NHZpQCLcB/s640/ipsum-opsum.gif" width="640"></img></a></div>
+<p>
+File-by-File therefore is based on detecting changes in the uncompressed data.
+To generate a patch, we first decompress both old and new files before computing
+the delta (we still use bsdiff here). Then to apply the patch, we decompress the
+old file, apply the delta to the uncompressed content and then recompress the
+new file. In doing so, we need to make sure that the APK on your device is a
+perfect match, byte for byte, to the one on the Play Store (see <a href="https://source.android.com/security/apksigning/v2.html">APK Signature
+Schema v2 </a>for why).
+</p>
+<p>
+When recompressing the new file, we hit two complications. First, Deflate has a
+number of settings that affect output; and we don't know which settings were
+used in the first place. Second, many versions of deflate exist and we need to
+know whether the version on your device is suitable.
+</p>
+<p>
+Fortunately, after analysis of the apps on the Play Store, we've discovered that
+recent and compatible versions of deflate based on zlib (the most popular
+deflate library) account for almost all deflated content in the Play Store. In
+addition, the default settings (level=6) and maximum compression settings
+(level=9) are the only settings we encountered in practice.
+</p>
+<p>
+Knowing this, we can detect and reproduce the original deflate settings. This
+makes it possible to uncompress the data, apply a patch, and then recompress the
+data back to <em>exactly the same bytes</em> as originally uploaded.
+</p>
+<p>
+However, there is one trade off; extra processing power is needed on the device.
+On modern devices (e.g. from 2015), recompression can take a little over a
+second per megabyte and on older or less powerful devices it can be longer.
+Analysis so far shows that, on average, if the patch size is halved then the
+time spent applying the patch (which for File-by-File includes recompression) is
+doubled.
+</p>
+<p>
+For now, we are limiting the use of this new patching technology to auto-updates
+only, i.e. the updates that take place in the background, usually at night when
+your phone is plugged into power and you're not likely to be using it. This
+ensures that users won't have to wait any longer than usual for an update to
+finish when manually updating an app.
+</p>
+<p>
+<strong><span>How effective is File-by-File
+Patching?</span></strong>
+</p>
+<p>
+Here are examples of app updates already using File-by-File Patching:
+</p>
+<div dir="ltr" trbidi="on">
+
+<div dir="ltr">
+<table><colgroup><col width="142"></col><col width="102"></col><col width="176"></col><col width="176"></col></colgroup><tbody><tr><td><p>
+<span>Application</span></p>
+</td><td><p>
+<span>Original Size</span></p>
+</td><td><p>
+<span>Previous (BSDiff) Patch Size</span></p>
+<p>
+<span>(% vs original)</span></p>
+</td><td><p>
+<span>File-by-File Patch Size (% vs original)</span></p>
+</td></tr><tr><td>
+</td><td><p>
+<span>71.1 MB</span></p>
+</td><td><p>
+<span>13.4 MB (-81%)</span></p>
+</td><td><p>
+<span>8.0 MB (-89%)</span></p>
+</td></tr><tr><td>
+</td><td><p>
+<span>32.7 MB</span></p>
+</td><td><p>
+<span>17.5 MB (-46%)</span></p>
+</td><td><p>
+<span>9.6 MB (-71%)</span></p>
+</td></tr><tr><td>
+</td><td><p>
+<span>17.8 MB</span></p>
+</td><td><p>
+<span>7.6 MB (-57%)</span></p>
+</td><td><p>
+<span>7.3 MB (-59%)</span></p>
+</td></tr><tr><td>
+</td><td><p>
+<span>18.9 MB</span></p>
+</td><td><p>
+<span>17.2 MB (-9%)</span></p>
+</td><td><p>
+<span>13.1 MB (-31%)</span></p>
+</td></tr><tr><td>
+</td><td><p>
+<span>52.4 MB</span></p>
+</td><td><p>
+<span>19.1 MB (-64%)</span></p>
+</td><td><p>
+<span>8.4 MB (-84%)</span></p>
+</td></tr><tr><td>
+</td><td><p>
+<span>16.2 MB</span></p>
+</td><td><p>
+<span>7.7 MB (-52%)</span></p>
+</td><td><p>
+<span>1.2 MB (-92%)</span></p>
+</td></tr></tbody></table></div>
+<span id="docs-internal-guid-de7f0210-d587-05da-d332-146959aa303f"></span><br></br>
+</div>
+<em>Disclaimer: if you see different patch sizes when you press "update"
manually, that is because we are not currently using File-by-file for
interactive updates, only those done in the background.</em>
- <p> <strong><span>Saving data and making our
-users (&amp; developers!) happy</span></strong> </p>
- <p> These changes are designed to ensure our community of over a billion Android users use as little data as possible for regular app updates. The best thing is that as a developer you don't need to do anything. You get these reductions to your update size for free! </p>
- <p> If you'd like to know more about File-by-File patching, including the technical details, head over to the <a href="https://github.com/andrewhayden/archive-patcher">Archive Patcher GitHub
-project</a> where you can find information, including the source code. Yes, File-by-File patching is completely open-source! </p>
- <p> As a developer if you're interested in reducing your APK size still further, here are some <a href="https://developer.android.com/topic/performance/reduce-apk-size.html?utm_campaign=android_discussion_filebyfile_120616&amp;utm_source=anddev&amp;utm_medium=blog">general
-tips on reducing APK size</a>. </p>
- <div class="separator">
- <a href="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s1600/image01.png" imageanchor="1"><img src="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s200/image01.png" width="191" height="200" border="0" /></a>
- </div><span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
-<meta content="https://plus.google.com/116899029375914044550" itemprop="url"/>
-</span></div>
+<p>
+<strong><span>Saving data and making our
+users (&amp; developers!) happy</span></strong>
+</p>
+<p>
+These changes are designed to ensure our community of over a billion Android
+users use as little data as possible for regular app updates. The best thing is
+that as a developer you don't need to do anything. You get these reductions to
+your update size for free!
+</p>
+
+<p>
+If you'd like to know more about File-by-File patching, including the technical
+details, head over to the <a href="https://github.com/andrewhayden/archive-patcher">Archive Patcher GitHub
+project</a> where you can find information, including the source code. Yes,
+File-by-File patching is completely open-source!
+</p>
+<p>
+As a developer if you're interested in reducing your APK size still further,
+here are some <a href="https://developer.android.com/topic/performance/reduce-apk-size.html?utm_campaign=android_discussion_filebyfile_120616&amp;utm_source=anddev&amp;utm_medium=blog">general
+tips on reducing APK size</a>.
+</p>
+<div class="separator"><a href="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s1600/image01.png" imageanchor="1"><img border="0" height="200" src="https://2.bp.blogspot.com/-5aRh1dM6Unc/WEcNs55RGhI/AAAAAAAADnI/tzr_oOJjZwgWd9Vu25ydY0UwB3eXKupXwCLcB/s200/image01.png" width="191"></img></a></div>
+<span itemprop="author" itemscope="itemscope" itemtype="http://schema.org/Person">
+<meta content="https://plus.google.com/116899029375914044550" itemprop="url"></meta></span>
+
</div> \ No newline at end of file
diff --git a/test/test-pages/lwn-1/config.json b/test/test-pages/lwn-1/config.json
new file mode 100644
index 0000000..6441edf
--- /dev/null
+++ b/test/test-pages/lwn-1/config.json
@@ -0,0 +1,3 @@
+{
+ "articleByLine": true
+} \ No newline at end of file
diff --git a/test/test-pages/lwn-1/expected.html b/test/test-pages/lwn-1/expected.html
index 45b86fc..4b6ec34 100644
--- a/test/test-pages/lwn-1/expected.html
+++ b/test/test-pages/lwn-1/expected.html
@@ -1,378 +1,581 @@
-<div><td class="MidColumn">
-
- <div class="ArticleText">
- <h2 class="SummaryHL"><a href="http://fakehost/Articles/637755/">A trademark battle in the Arduino community</a></h2>
- <p> By <b>Nathan Willis</b>
- <br></br>March 25, 2015 </p>
- <p>The <a href="https://en.wikipedia.org/wiki/Arduino">Arduino</a> has been one of the biggest success stories of the open-hardware movement, but that success does not protect it from internal conflict. In recent months, two of the project's founders have come into conflict about the direction of future efforts—and that conflict has turned into a legal dispute about who owns the rights to the Arduino trademark. </p>
- <p>The current fight is a battle between two companies that both bear the Arduino name: Arduino LLC and Arduino SRL. The disagreements that led to present state of affairs go back a bit further. </p>
- <p>The Arduino project grew out of 2005-era course work taught at the Interaction Design Institute Ivrea (IDII) in Ivrea, Italy (using <a href="https://en.wikipedia.org/wiki/Processing_(programming_language)">Processing</a>, <a href="https://en.wikipedia.org/wiki/Wiring_%28development_platform%29">Wiring</a>, and pre-existing microcontroller hardware). After the IDII program was discontinued, the open-hardware Arduino project as we know it was launched by Massimo Banzi, David Cuartielles, and David Mellis (who had worked together at IDII), with co-founders Tom Igoe and Gianluca Martino joining shortly afterward. The project released open hardware designs (including full schematics and design files) as well as the microcontroller software to run on the boards and the desktop IDE needed to program it. </p>
- <p>Arduino LLC was incorporated in 2008 by Banzi, Cuartielles, Mellis, Igoe, and Martino. The company is registered in the United States, and it has continued to design the Arduino product line, develop the software, and run the Arduino community site. The hardware devices themselves, however, were manufactured by a separate company, "Smart Projects SRL," that was founded by Martino. "SRL" is essentially the Italian equivalent of "LLC"—Smart Projects was incorporated in Italy. </p>
- <p>This division of responsibilities—with the main Arduino project handling everything except for board manufacturing—may seem like an odd one, but it is consistent with Arduino's marketing story. From its earliest days, the designs for the hardware have been freely available, and outside companies were allowed to make Arduino-compatible devices. The project has long run a <a href="http://arduino.cc/en/ArduinoCertified/Products#program">certification
+<div id="readability-page-1" class="page">
+ <div>
+ <td class="MidColumn">
+ <div class="ArticleText">
+ <h2 class="SummaryHL"><a href="http://fakehost/Articles/637755/">A trademark battle in the Arduino community</a></h2>
+ <p>The <a href="https://en.wikipedia.org/wiki/Arduino">Arduino</a> has been one of the biggest success stories of the open-hardware movement, but that success does not protect it from internal conflict. In recent months, two of the project's founders have come into conflict about the direction of future efforts—and that conflict has turned into a legal dispute about who owns the rights to the Arduino trademark. </p>
+ <p>The current fight is a battle between two companies that both bear the Arduino name: Arduino LLC and Arduino SRL. The disagreements that led to present state of affairs go back a bit further. </p>
+ <p>The Arduino project grew out of 2005-era course work taught at the Interaction Design Institute Ivrea (IDII) in Ivrea, Italy (using <a href="https://en.wikipedia.org/wiki/Processing_(programming_language)">Processing</a>, <a href="https://en.wikipedia.org/wiki/Wiring_%28development_platform%29">Wiring</a>, and pre-existing microcontroller hardware). After the IDII program was discontinued, the open-hardware Arduino project as we know it was launched by Massimo Banzi, David Cuartielles, and David Mellis (who had worked together at IDII), with co-founders Tom Igoe and Gianluca Martino joining shortly afterward. The project released open hardware designs (including full schematics and design files) as well as the microcontroller software to run on the boards and the desktop IDE needed to program it. </p>
+ <p>Arduino LLC was incorporated in 2008 by Banzi, Cuartielles, Mellis, Igoe, and Martino. The company is registered in the United States, and it has continued to design the Arduino product line, develop the software, and run the Arduino community site. The hardware devices themselves, however, were manufactured by a separate company, "Smart Projects SRL," that was founded by Martino. "SRL" is essentially the Italian equivalent of "LLC"—Smart Projects was incorporated in Italy. </p>
+ <p>This division of responsibilities—with the main Arduino project handling everything except for board manufacturing—may seem like an odd one, but it is consistent with Arduino's marketing story. From its earliest days, the designs for the hardware have been freely available, and outside companies were allowed to make Arduino-compatible devices. The project has long run a <a href="http://arduino.cc/en/ArduinoCertified/Products#program">certification
program</a> for third-party manufacturers interested in using the "Arduino" branding, but allows (and arguably even encourages) informal software and firmware compatibility. </p>
- <p>The Arduino branding was not formally registered as a trademark in the early days, however. Arduino LLC <a href="http://tsdr.uspto.gov/#caseNumber=3931675&amp;caseType=US_REGISTRATION_NO&amp;searchType=statusSearch">filed</a> to register the US trademark in April 2009, and it was granted in 2011. </p>
- <p>At this point, the exact events begin to be harder to verify, but the original group of founders reportedly had a difference of opinion about how to license out hardware production rights to other companies. Wired Italy <a href="http://www.wired.it/gadget/computer/2015/02/12/arduino-nel-caos-situazione/">reports</a> that Martino and Smart Projects resisted the other four founders' plans to "internationalize" production—although it is not clear if that meant that Smart Projects disapproved of licensing out <em>any</em> official hardware manufacturing to other companies, or had some other concern. Heise Online <a href="http://www.heise.de/make/meldung/Arduino-gegen-Arduino-Gruender-streiten-um-die-Firma-2549653.html">adds</a> that the conflict seemed to be about moving some production to China. </p>
- <p>What is clear is that Smart Projects filed a <a href="http://ttabvue.uspto.gov/ttabvue/v?pno=92060077&amp;pty=CAN&amp;eno=1">petition</a> with the US Patent and Trademark Office (USPTO) in October 2014 asking the USPTO to cancel Arduino LLC's trademark on "Arduino." Then, in November 2014, Smart Projects changed its company's name to Arduino SRL. Somewhere around that time, Martino sold off his ownership stake in Smart Projects SRL and new owner Federico Musto was named CEO. </p>
- <p>Unsurprisingly, Arduino LLC did not care for the petition to the USPTO and, in January 2015, the company filed a trademark-infringement <a href="http://dockets.justia.com/docket/massachusetts/madce/1:2015cv10181/167131">lawsuit</a> against Arduino SRL. Confusing matters further, the re-branded Arduino SRL has set up its own web site using the domain name <tt>arduino.org</tt>, which duplicates most of the site features found on the original Arduino site (<tt>arduino.cc</tt>). That includes both a hardware store and software downloads. </p>
- <p>Musto, the new CEO of the company now called Arduino SRL, has a bit of a history with Arduino as well. His other manufacturing business had <a href="http://www.eetimes.com/document.asp?doc_id=1263246">collaborated</a> with Arduino LLC on the design and production of the Arduino Yún, which has received some <a href="http://hackaday.com/2015/02/24/is-the-arduino-yun-open-hardware/">criticism</a> for including proprietary components. </p>
- <p>Hackaday has run a two-part series (in <a href="http://hackaday.com/2015/02/25/arduino-v-arduino/">February</a> and <a href="http://hackaday.com/2015/03/12/arduino-v-arduino-part-ii/">March</a>) digging into the ins and outs of the dispute, including the suggestion that Arduino LLC's recent release of version 1.6.0 of the Arduino IDE was a move intended to block Arduino SRL from hijacking IDE development. Commenter Paul Stoffregen (who was the author of the Heise story above) <a href="http://hackaday.com/2015/02/25/arduino-v-arduino/comment-page-1/#comment-2453084">noted</a> that Arduino SRL recently created a fork of the Arduino IDE on GitHub. </p>
- <p>Most recently, Banzi broke his silence about the dispute in a <a href="http://makezine.com/2015/03/19/massimo-banzi-fighting-for-arduino">story</a> published at MAKEzine. There, Banzi claims that Martino secretly filed a trademark application on "Arduino" in Italy in 2008 and told none of the other Arduino founders. He also details a series of unpleasant negotiations between the companies, including Smart Projects stopping the royalty payments it had long sent to Arduino LLC for manufacturing devices and re-branding its boards with the Arduino.org URL. </p>
- <p>Users appear to be stuck in the middle. Banzi says that several retail outlets that claim to be selling "official" Arduino boards are actually paying Arduino SRL, not Arduino LLC, but it is quite difficult to determine which retailers are lined up on which side, since there are (typically) several levels of supplier involved. The two Arduino companies' web sites also disagree about the available hardware, with Arduino.org offering the new <a href="http://arduino.org/products/arduino-zero-pro">Arduino Zero</a> model for sale today and Arduino.cc <a href="http://arduino.cc/en/Main/Products">listing it</a> as "Coming soon." </p>
- <p>Furthermore, as Hackaday's March story explains, the recently-released Arduino.cc IDE now reports that boards manufactured by Arduino SRL are "uncertified." That warning does not prevent users from programming the other company's hardware, but it will no doubt confuse quite a few users who believe they possess genuine Arduino-manufactured devices. </p>
- <p>The USPTO page for Arduino SRL's petition notes pre-trial disclosure dates have been set for August and October of 2015 (for Arduino SRL and Arduino LLC, respectively), which suggests that this debate is far from over. Of course, it is always disappointing to observe a falling out between project founders, particularly when the project in question has had such an impact on open-source software and open hardware. </p>
- <p>One could argue that disputes of this sort are proof that even small projects started among friends need to take legal and intellectual-property issues (such as trademarks) seriously from the very beginning—perhaps Arduino and Smart Projects thought that an informal agreement was all that was necessary in the early days, after all. </p>
- <p>But, perhaps, once a project becomes profitable, there is simply no way to predict what might happen. Arduino LLC would seem to have a strong case for continual and rigorous use of the "Arduino" trademark, which is the salient point in US trademark law. It could still be a while before the courts rule on either side of that question, however. </p>
- <p><a href="http://fakehost/Articles/637755/#Comments">Comments (5 posted)</a> </p>
-
- <h2 class="SummaryHL"><a href="http://fakehost/Articles/637533/">Mapping and data mining with QGIS 2.8</a></h2>
- <p> By <b>Nathan Willis</b>
- <br></br>March 25, 2015 </p>
- <p><a href="http://qgis.org/">QGIS</a> is a free-software geographic information system (GIS) tool; it provides a unified interface in which users can import, edit, and analyze geographic-oriented information, and it can produce output as varied as printable maps or map-based web services. The project recently made its first update to be designated a long-term release (LTR), and that release is both poised for high-end usage and friendly to newcomers alike. </p>
- <p>The new release is version 2.8, which was unveiled on March 2. An official <a href="http://qgis.org/en/site/forusers/visualchangelog28/index.html">change
+ <p>The Arduino branding was not formally registered as a trademark in the early days, however. Arduino LLC <a href="http://tsdr.uspto.gov/#caseNumber=3931675&amp;caseType=US_REGISTRATION_NO&amp;searchType=statusSearch">filed</a> to register the US trademark in April 2009, and it was granted in 2011. </p>
+ <p>At this point, the exact events begin to be harder to verify, but the original group of founders reportedly had a difference of opinion about how to license out hardware production rights to other companies. Wired Italy <a href="http://www.wired.it/gadget/computer/2015/02/12/arduino-nel-caos-situazione/">reports</a> that Martino and Smart Projects resisted the other four founders' plans to "internationalize" production—although it is not clear if that meant that Smart Projects disapproved of licensing out <em>any</em> official hardware manufacturing to other companies, or had some other concern. Heise Online <a href="http://www.heise.de/make/meldung/Arduino-gegen-Arduino-Gruender-streiten-um-die-Firma-2549653.html">adds</a> that the conflict seemed to be about moving some production to China. </p>
+ <p>What is clear is that Smart Projects filed a <a href="http://ttabvue.uspto.gov/ttabvue/v?pno=92060077&amp;pty=CAN&amp;eno=1">petition</a> with the US Patent and Trademark Office (USPTO) in October 2014 asking the USPTO to cancel Arduino LLC's trademark on "Arduino." Then, in November 2014, Smart Projects changed its company's name to Arduino SRL. Somewhere around that time, Martino sold off his ownership stake in Smart Projects SRL and new owner Federico Musto was named CEO. </p>
+ <p>Unsurprisingly, Arduino LLC did not care for the petition to the USPTO and, in January 2015, the company filed a trademark-infringement <a href="http://dockets.justia.com/docket/massachusetts/madce/1:2015cv10181/167131">lawsuit</a> against Arduino SRL. Confusing matters further, the re-branded Arduino SRL has set up its own web site using the domain name <tt>arduino.org</tt>, which duplicates most of the site features found on the original Arduino site (<tt>arduino.cc</tt>). That includes both a hardware store and software downloads. </p>
+ <p>Musto, the new CEO of the company now called Arduino SRL, has a bit of a history with Arduino as well. His other manufacturing business had <a href="http://www.eetimes.com/document.asp?doc_id=1263246">collaborated</a> with Arduino LLC on the design and production of the Arduino Yún, which has received some <a href="http://hackaday.com/2015/02/24/is-the-arduino-yun-open-hardware/">criticism</a> for including proprietary components. </p>
+ <p>Hackaday has run a two-part series (in <a href="http://hackaday.com/2015/02/25/arduino-v-arduino/">February</a> and <a href="http://hackaday.com/2015/03/12/arduino-v-arduino-part-ii/">March</a>) digging into the ins and outs of the dispute, including the suggestion that Arduino LLC's recent release of version 1.6.0 of the Arduino IDE was a move intended to block Arduino SRL from hijacking IDE development. Commenter Paul Stoffregen (who was the author of the Heise story above) <a href="http://hackaday.com/2015/02/25/arduino-v-arduino/comment-page-1/#comment-2453084">noted</a> that Arduino SRL recently created a fork of the Arduino IDE on GitHub. </p>
+ <p>Most recently, Banzi broke his silence about the dispute in a <a href="http://makezine.com/2015/03/19/massimo-banzi-fighting-for-arduino">story</a> published at MAKEzine. There, Banzi claims that Martino secretly filed a trademark application on "Arduino" in Italy in 2008 and told none of the other Arduino founders. He also details a series of unpleasant negotiations between the companies, including Smart Projects stopping the royalty payments it had long sent to Arduino LLC for manufacturing devices and re-branding its boards with the Arduino.org URL. </p>
+ <p>Users appear to be stuck in the middle. Banzi says that several retail outlets that claim to be selling "official" Arduino boards are actually paying Arduino SRL, not Arduino LLC, but it is quite difficult to determine which retailers are lined up on which side, since there are (typically) several levels of supplier involved. The two Arduino companies' web sites also disagree about the available hardware, with Arduino.org offering the new <a href="http://arduino.org/products/arduino-zero-pro">Arduino Zero</a> model for sale today and Arduino.cc <a href="http://arduino.cc/en/Main/Products">listing it</a> as "Coming soon." </p>
+ <p>Furthermore, as Hackaday's March story explains, the recently-released Arduino.cc IDE now reports that boards manufactured by Arduino SRL are "uncertified." That warning does not prevent users from programming the other company's hardware, but it will no doubt confuse quite a few users who believe they possess genuine Arduino-manufactured devices. </p>
+ <p>The USPTO page for Arduino SRL's petition notes pre-trial disclosure dates have been set for August and October of 2015 (for Arduino SRL and Arduino LLC, respectively), which suggests that this debate is far from over. Of course, it is always disappointing to observe a falling out between project founders, particularly when the project in question has had such an impact on open-source software and open hardware. </p>
+ <p>One could argue that disputes of this sort are proof that even small projects started among friends need to take legal and intellectual-property issues (such as trademarks) seriously from the very beginning—perhaps Arduino and Smart Projects thought that an informal agreement was all that was necessary in the early days, after all. </p>
+ <p>But, perhaps, once a project becomes profitable, there is simply no way to predict what might happen. Arduino LLC would seem to have a strong case for continual and rigorous use of the "Arduino" trademark, which is the salient point in US trademark law. It could still be a while before the courts rule on either side of that question, however. </p>
+ <p><a href="http://fakehost/Articles/637755/#Comments">Comments (5 posted)</a> </p>
+ <h2 class="SummaryHL"><a href="http://fakehost/Articles/637533/">Mapping and data mining with QGIS 2.8</a></h2>
+ <p class="FeatureByline"> By <b>Nathan Willis</b>
+ <br/>March 25, 2015 </p>
+ <p><a href="http://qgis.org/">QGIS</a> is a free-software geographic information system (GIS) tool; it provides a unified interface in which users can import, edit, and analyze geographic-oriented information, and it can produce output as varied as printable maps or map-based web services. The project recently made its first update to be designated a long-term release (LTR), and that release is both poised for high-end usage and friendly to newcomers alike. </p>
+ <p>The new release is version 2.8, which was unveiled on March&nbsp;2. An official <a href="http://qgis.org/en/site/forusers/visualchangelog28/index.html">change
log</a> is available on the QGIS site, while the release itself was announced primarily through blog posts (such as <a href="http://anitagraser.com/2015/03/02/qgis-2-8-ltr-has-landed/">this
post</a> by Anita Graser of the project's steering committee). Downloads are <a href="http://qgis.org/en/site/forusers/download.html">available</a> for a variety of platforms, including packages for Ubuntu, Debian, Fedora, openSUSE, and several other distributions.</p>
- <a href="http://fakehost/Articles/637747/"> <img align="right" alt="[QGIS main interface]" border="0" height="264" hspace="5" src="http://fakehost/images/2015/03-qgis-map-sm.png" width="350"></img></a>
- <p>As the name might suggest, QGIS is a Qt application; the latest release will, in fact, build on both Qt4 and Qt5, although the binaries released by the project come only in Qt4 form at present. 2.8 has been labeled a long-term release (LTR)—which, in this case, means that the project has committed to providing backported bug fixes for one full calendar year, and that the 2.8.x series is in permanent feature freeze. The goal, according to the change log, is to provide a stable version suitable for businesses and deployments in other large organizations. The change log itself points out that the development of quite a few new features was underwritten by various GIS companies or university groups, which suggests that taking care of these organizations' needs is reaping dividends for the project. </p>
- <p>For those new to QGIS (or GIS in general), there is a detailed new-user <a href="http://docs.qgis.org/testing/en/docs/training_manual/">tutorial</a> that provides a thorough walk-through of the data-manipulation, mapping, and analysis functions. Being a new user, I went through the tutorial; although there are a handful of minor differences between QGIS 2.8 and the version used in the text (primarily whether specific features were accessed through a toolbar or right-click menu), on the whole it is well worth the time. </p>
- <p>QGIS is designed to make short work of importing spatially oriented data sets, mining information from them, and turning the results into a meaningful visualization. Technically speaking, the visualization output is optional: one could simply extract the needed statistics and results and use them to answer some question or, perhaps, publish the massaged data set as a database for others to use. </p>
- <p>But well-made maps are often the easiest way to illuminate facts about populations, political regions, geography, and many other topics when human comprehension is the goal. QGIS makes importing data from databases, web-mapping services (WMS), and even unwieldy flat-file data dumps a painless experience. It handles converting between a variety of map-referencing systems more or less automatically, and allows the user to focus on finding the useful attributes of the data sets and rendering them on screen. </p>
- <h4>Here be data</h4>
- <p>The significant changes in QGIS 2.8 fall into several categories. There are updates to how QGIS handles the mathematical expressions and queries users can use to filter information out of a data set, improvements to the tools used to explore the on-screen map canvas, and enhancements to the "map composer" used to produce visual output. This is on top of plenty of other under-the-hood improvements, naturally.</p>
- <a href="http://fakehost/Articles/637748/"> <img align="left" alt="[QGIS query builder]" border="0" height="302" hspace="5" src="http://fakehost/images/2015/03-qgis-query-sm.png" width="300"></img></a>
- <p>In the first category are several updates to the filtering tools used to mine a data set. Generally speaking, each independent data set is added to a QGIS project as its own layer, then transformed with filters to focus in on a specific portion of the original data. For instance, the land-usage statistics for a region might be one layer, while roads and buildings for the same region from OpenStreetMap might be two additional layers. Such filters can be created in several ways: there is a "query builder" that lets the user construct and test expressions on a data layer, then save the results, an SQL console for performing similar queries on a database, and spreadsheet-like editing tools for working directly on data tables. </p>
- <p>All three have been improved in this release. New are support for <tt>if(condition, true, false)</tt> conditional statements, a set of operations for geometry primitives (e.g., to test whether regions overlap or lines intersect), and an "integer divide" operation. Users can also add comments to their queries to annotate their code, and there is a new <a href="http://nathanw.net/2015/01/19/function-editor-for-qgis-expressions/">custom
+ <a href="http://fakehost/Articles/637747/"> <img src="http://fakehost/images/2015/03-qgis-map-sm.png" border="0" hspace="5" align="right" width="350" height="264" alt="[QGIS main interface]"/> </a>
+ <p>As the name might suggest, QGIS is a Qt application; the latest release will, in fact, build on both Qt4 and Qt5, although the binaries released by the project come only in Qt4 form at present. 2.8 has been labeled a long-term release (LTR)—which, in this case, means that the project has committed to providing backported bug fixes for one full calendar year, and that the 2.8.x series is in permanent feature freeze. The goal, according to the change log, is to provide a stable version suitable for businesses and deployments in other large organizations. The change log itself points out that the development of quite a few new features was underwritten by various GIS companies or university groups, which suggests that taking care of these organizations' needs is reaping dividends for the project. </p>
+ <p>For those new to QGIS (or GIS in general), there is a detailed new-user <a href="http://docs.qgis.org/testing/en/docs/training_manual/">tutorial</a> that provides a thorough walk-through of the data-manipulation, mapping, and analysis functions. Being a new user, I went through the tutorial; although there are a handful of minor differences between QGIS 2.8 and the version used in the text (primarily whether specific features were accessed through a toolbar or right-click menu), on the whole it is well worth the time. </p>
+ <p>QGIS is designed to make short work of importing spatially oriented data sets, mining information from them, and turning the results into a meaningful visualization. Technically speaking, the visualization output is optional: one could simply extract the needed statistics and results and use them to answer some question or, perhaps, publish the massaged data set as a database for others to use. </p>
+ <p>But well-made maps are often the easiest way to illuminate facts about populations, political regions, geography, and many other topics when human comprehension is the goal. QGIS makes importing data from databases, web-mapping services (WMS), and even unwieldy flat-file data dumps a painless experience. It handles converting between a variety of map-referencing systems more or less automatically, and allows the user to focus on finding the useful attributes of the data sets and rendering them on screen. </p>
+ <h4>Here be data</h4>
+ <p>The significant changes in QGIS 2.8 fall into several categories. There are updates to how QGIS handles the mathematical expressions and queries users can use to filter information out of a data set, improvements to the tools used to explore the on-screen map canvas, and enhancements to the "map composer" used to produce visual output. This is on top of plenty of other under-the-hood improvements, naturally.</p>
+ <a href="http://fakehost/Articles/637748/"> <img src="http://fakehost/images/2015/03-qgis-query-sm.png" border="0" hspace="5" align="left" width="300" height="302" alt="[QGIS query builder]"/> </a>
+ <p>In the first category are several updates to the filtering tools used to mine a data set. Generally speaking, each independent data set is added to a QGIS project as its own layer, then transformed with filters to focus in on a specific portion of the original data. For instance, the land-usage statistics for a region might be one layer, while roads and buildings for the same region from OpenStreetMap might be two additional layers. Such filters can be created in several ways: there is a "query builder" that lets the user construct and test expressions on a data layer, then save the results, an SQL console for performing similar queries on a database, and spreadsheet-like editing tools for working directly on data tables. </p>
+ <p>All three have been improved in this release. New are support for <tt>if(condition, true, false)</tt> conditional statements, a set of operations for geometry primitives (e.g., to test whether regions overlap or lines intersect), and an "integer divide" operation. Users can also add comments to their queries to annotate their code, and there is a new <a href="http://nathanw.net/2015/01/19/function-editor-for-qgis-expressions/">custom
function editor</a> for writing Python functions that can be called in mathematical expressions within the query builder. </p>
- <p>It is also now possible to select only some rows in a table, then perform calculations just on the selection—previously, users would have to extract the rows of interest into a new table first. Similarly, in the SQL editor, the user can highlight a subset of the SQL query and execute it separately, which is no doubt helpful for debugging. </p>
- <p>There have also been several improvements to the Python and Processing plugins. Users can now drag-and-drop Python scripts onto QGIS and they will be run automatically. Several new analysis algorithms are now available through the Processing interface that were previously Python-only; they include algorithms for generating grids of points or vectors within a region, splitting layers and lines, generating <a href="http://en.wikipedia.org/wiki/Hypsometric_curve">hypsometric
+ <p>It is also now possible to select only some rows in a table, then perform calculations just on the selection—previously, users would have to extract the rows of interest into a new table first. Similarly, in the SQL editor, the user can highlight a subset of the SQL query and execute it separately, which is no doubt helpful for debugging. </p>
+ <p>There have also been several improvements to the Python and Processing plugins. Users can now drag-and-drop Python scripts onto QGIS and they will be run automatically. Several new analysis algorithms are now available through the Processing interface that were previously Python-only; they include algorithms for generating grids of points or vectors within a region, splitting layers and lines, generating <a href="http://en.wikipedia.org/wiki/Hypsometric_curve">hypsometric
curves</a>, refactoring data sets, and more. </p>
- <h4>Maps in, maps out</h4>
- <a href="http://fakehost/Articles/637749/"> <img align="right" alt="[QGIS simplify tool]" border="0" height="303" hspace="5" src="http://fakehost/images/2015/03-qgis-simplify-sm.png" width="300"></img></a>
- <p>The process of working with on-screen map data picked up some improvements in the new release as well. Perhaps the most fundamental is that each map layer added to the canvas is now handled in its own thread, so fewer hangs in the user interface are experienced when re-rendering a layer (as happens whenever the user changes the look of points or shapes in a layer). Since remote databases can also be layers, this multi-threaded approach is more resilient against connectivity problems, too. The interface also now supports temporary "scratch" layers that can be used to merge, filter, or simply experiment with a data set, but are not saved when the current project is saved. </p>
- <p>For working on the canvas itself, polygonal regions can now use raster images (tiled, if necessary) as fill colors, the map itself can be rotated arbitrarily, and objects can be "snapped" to align with items on any layer (not just the current layer). For working with raster image layers (e.g., aerial photographs) or simply creating new geometric shapes by hand, there is a new digitizing tool that can offer assistance by locking lines to specific angles, automatically keeping borders parallel, and other niceties. </p>
- <p>There is a completely overhauled "simplify" tool that is used to reduce the number of extraneous vertices of a vector layer (thus reducing its size). The old simplify tool provided only a relative "tolerance" setting that did not correspond directly to any units. With the new tool, users can set a simplification threshold in terms of the underlying map units, layer-specific units, pixels, and more—and, in addition, the tool reports how much the simplify operation has reduced the size of the data.</p>
- <a href="http://fakehost/Articles/637751/"> <img align="left" alt="[QGIS style editing]" border="0" height="286" hspace="5" src="http://fakehost/images/2015/03-qgis-style-sm.png" width="300"></img></a>
- <p>There has also been an effort to present a uniform interface to one of the most important features of the map canvas: the ability to change the symbology used for an item based on some data attribute. The simplest example might be to change the line color of a road based on whether its road-type attribute is "highway," "service road," "residential," or so on. But the same feature is used to automatically highlight layer information based on the filtering and querying functionality discussed above. The new release allows many more map attributes to be controlled by these "data definition" settings, and provides a hard-to-miss button next to each attribute, through which a custom data definition can be set. </p>
- <p>QGIS's composer module is the tool used to take project data and generate a map that can be used outside of the application (in print, as a static image, or as a layer for <a href="http://mapserver.org/">MapServer</a> or some other software tool, for example). Consequently, it is not a simple select-and-click-export tool; composing the output can involve a lot of choices about which data to make visible, how (and where) to label it, and how to make it generally accessible. </p>
- <p>The updated composer in 2.8 now has a full-screen mode and sports several new options for configuring output. For instance, the user now has full control over how map axes are labeled. In previous releases, the grid coordinates of the map could be turned on or off, but the only options were all or nothing. Now, the user can individually choose whether coordinates are displayed on all four sides, and can even choose in which direction vertical text labels will run (so that they can be correctly justified to the edge of the map, for example). </p>
- <p>There are, as usual, many more changes than there is room to discuss. Some particularly noteworthy improvements include the ability to save and load bookmarks for frequently used data sources (perhaps most useful for databases, web services, and other non-local data) and improvements to QGIS's server module. This module allows one QGIS instance to serve up data accessible to other QGIS applications (for example, to simply team projects). The server can now be extended with Python plugins and the data layers that it serves can be styled with style rules like those used in the desktop interface. </p>
- <p>QGIS is one of those rare free-software applications that is both powerful enough for high-end work and yet also straightforward to use for the simple tasks that might attract a newcomer to GIS in the first place. The 2.8 release, particularly with its project-wide commitment to long-term support, appears to be an update well worth checking out, whether one needs to create a simple, custom map or to mine a database for obscure geo-referenced meaning. </p>
- <p><a href="http://fakehost/Articles/637533/#Comments">Comments (3 posted)</a> </p>
-
- <h2 class="SummaryHL"><a href="http://fakehost/Articles/637735/">Development activity in LibreOffice and OpenOffice</a></h2>
- <p> By <b>Jonathan Corbet</b>
- <br></br>March 25, 2015 </p><p> The LibreOffice project was </p><a href="http://fakehost/Articles/407383/">announced</a><p> with great fanfare in September 2010. Nearly one year later, the OpenOffice.org project (from which LibreOffice was forked) </p><a href="http://fakehost/Articles/446093/">was
-cut loose from Oracle</a><p> and found a new home as an Apache project. It is fair to say that the rivalry between the two projects in the time since then has been strong. Predictions that one project or the other would fail have not been borne out, but that does not mean that the two projects are equally successful. A look at the two projects' development communities reveals some interesting differences.
- </p>
- <h4>Release histories</h4>
- <p> Apache OpenOffice has made two releases in the past year: <a href="https://blogs.apache.org/OOo/entry/the_apache_openoffice_project_announce">4.1</a> in April 2014 and <a href="https://blogs.apache.org/OOo/entry/announcing_apache_openoffice_4_1">4.1.1</a> (described as "a micro update" in the release announcement) in August. The main feature added during that time would appear to be significantly improved accessibility support. </p>
- <p> The release history for LibreOffice tells a slightly different story: </p>
-
- <blockquote>
- </blockquote>
- <p> It seems clear that LibreOffice has maintained a rather more frenetic release cadence, generally putting out at least one release per month. The project typically keeps at least two major versions alive at any one time. Most of the releases are of the minor, bug-fix variety, but there have been two major releases in the last year as well. </p>
-
- <h4>Development statistics</h4>
- <p> In the one-year period since late March 2014, there have been 381 changesets committed to the OpenOffice Subversion repository. The most active committers are: </p>
-
- <blockquote>
- <table><tbody><tr><th align="center" colspan="2">Most active OpenOffice developers</th>
- </tr><tr><td valign="top" width="50%">
- <table cellspacing="3"><tbody><tr><th colspan="3">By changesets</th>
- </tr><tr class="Even"><td>Herbert Dürr</td>
- <td align="right">63</td>
- <td align="right">16.6%</td>
- </tr><tr class="Odd"><td>Jürgen Schmidt             </td>
- <td align="right">56</td>
- <td align="right">14.7%</td>
- </tr><tr class="Even"><td>Armin Le Grand</td>
- <td align="right">56</td>
- <td align="right">14.7%</td>
- </tr><tr class="Odd"><td>Oliver-Rainer Wittmann</td>
- <td align="right">46</td>
- <td align="right">12.1%</td>
- </tr><tr class="Even"><td>Tsutomu Uchino</td>
- <td align="right">33</td>
- <td align="right">8.7%</td>
- </tr><tr class="Odd"><td>Kay Schenk</td>
- <td align="right">27</td>
- <td align="right">7.1%</td>
- </tr><tr class="Even"><td>Pedro Giffuni</td>
- <td align="right">23</td>
- <td align="right">6.1%</td>
- </tr><tr class="Odd"><td>Ariel Constenla-Haile</td>
- <td align="right">22</td>
- <td align="right">5.8%</td>
- </tr><tr class="Even"><td>Andrea Pescetti</td>
- <td align="right">14</td>
- <td align="right">3.7%</td>
- </tr><tr class="Odd"><td>Steve Yin</td>
- <td align="right">11</td>
- <td align="right">2.9%</td>
- </tr><tr class="Even"><td>Andre Fischer</td>
- <td align="right">10</td>
- <td align="right">2.6%</td>
- </tr><tr class="Odd"><td>Yuri Dario</td>
- <td align="right">7</td>
- <td align="right">1.8%</td>
- </tr><tr class="Even"><td>Regina Henschel</td>
- <td align="right">6</td>
- <td align="right">1.6%</td>
- </tr><tr class="Odd"><td>Juan C. Sanz</td>
- <td align="right">2</td>
- <td align="right">0.5%</td>
- </tr><tr class="Even"><td>Clarence Guo</td>
- <td align="right">2</td>
- <td align="right">0.5%</td>
- </tr><tr class="Odd"><td>Tal Daniel</td>
- <td align="right">2</td>
- <td align="right">0.5%</td>
- </tr></tbody></table></td>
- <td valign="top" width="50%">
- <table cellspacing="3"><tbody><tr><th colspan="3">By changed lines</th>
- </tr><tr class="Even"><td>Jürgen Schmidt             </td>
- <td align="right">455499</td>
- <td align="right">88.1%</td>
- </tr><tr class="Odd"><td>Andre Fischer</td>
- <td align="right">26148</td>
- <td align="right">3.8%</td>
- </tr><tr class="Even"><td>Pedro Giffuni</td>
- <td align="right">23183</td>
- <td align="right">3.4%</td>
- </tr><tr class="Odd"><td>Armin Le Grand</td>
- <td align="right">11018</td>
- <td align="right">1.6%</td>
- </tr><tr class="Even"><td>Juan C. Sanz</td>
- <td align="right">4582</td>
- <td align="right">0.7%</td>
- </tr><tr class="Odd"><td>Oliver-Rainer Wittmann</td>
- <td align="right">4309</td>
- <td align="right">0.6%</td>
- </tr><tr class="Even"><td>Andrea Pescetti</td>
- <td align="right">3908</td>
- <td align="right">0.6%</td>
- </tr><tr class="Odd"><td>Herbert Dürr</td>
- <td align="right">2811</td>
- <td align="right">0.4%</td>
- </tr><tr class="Even"><td>Tsutomu Uchino</td>
- <td align="right">1991</td>
- <td align="right">0.3%</td>
- </tr><tr class="Odd"><td>Ariel Constenla-Haile</td>
- <td align="right">1258</td>
- <td align="right">0.2%</td>
- </tr><tr class="Even"><td>Steve Yin</td>
- <td align="right">1010</td>
- <td align="right">0.1%</td>
- </tr><tr class="Odd"><td>Kay Schenk</td>
- <td align="right">616</td>
- <td align="right">0.1%</td>
- </tr><tr class="Even"><td>Regina Henschel</td>
- <td align="right">417</td>
- <td align="right">0.1%</td>
- </tr><tr class="Odd"><td>Yuri Dario</td>
- <td align="right">268</td>
- <td align="right">0.0%</td>
- </tr><tr class="Even"><td>tal</td>
- <td align="right">16</td>
- <td align="right">0.0%</td>
- </tr><tr class="Odd"><td>Clarence Guo</td>
- <td align="right">11</td>
- <td align="right">0.0%</td>
- </tr></tbody></table></td>
- </tr></tbody></table></blockquote>
- <p> In truth, the above list is not just the most active OpenOffice developers — it is all of them; a total of 16 developers have committed changes to OpenOffice in the last year. Those developers changed 528,000 lines of code, but, as can be seen above, Jürgen Schmidt accounted for the bulk of those changes, which were mostly updates to translation files. </p>
- <p> The top four developers in the "by changesets" column all work for IBM, so IBM is responsible for a minimum of about 60% of the changes to OpenOffice in the last year. </p>
- <p> The picture for LibreOffice is just a little bit different; in the same one-year period, the project has committed 22,134 changesets from 268 developers. The most active of these developers were: </p>
-
- <blockquote>
- <table><tbody><tr><th align="center" colspan="2">Most active LibreOffice developers</th>
- </tr><tr><td valign="top" width="50%">
- <table cellspacing="3"><tbody><tr><th colspan="3">By changesets</th>
- </tr><tr class="Even"><td>Caolán McNamara</td>
- <td align="right">4307</td>
- <td align="right">19.5%</td>
- </tr><tr class="Odd"><td>Stephan Bergmann</td>
- <td align="right">2351</td>
- <td align="right">10.6%</td>
- </tr><tr class="Even"><td>Miklos Vajna</td>
- <td align="right">1449</td>
- <td align="right">6.5%</td>
- </tr><tr class="Odd"><td>Tor Lillqvist</td>
- <td align="right">1159</td>
- <td align="right">5.2%</td>
- </tr><tr class="Even"><td>Noel Grandin</td>
- <td align="right">1064</td>
- <td align="right">4.8%</td>
- </tr><tr class="Odd"><td>Markus Mohrhard</td>
- <td align="right">935</td>
- <td align="right">4.2%</td>
- </tr><tr class="Even"><td>Michael Stahl</td>
- <td align="right">915</td>
- <td align="right">4.1%</td>
- </tr><tr class="Odd"><td>Kohei Yoshida</td>
- <td align="right">755</td>
- <td align="right">3.4%</td>
- </tr><tr class="Even"><td>Tomaž Vajngerl</td>
- <td align="right">658</td>
- <td align="right">3.0%</td>
- </tr><tr class="Odd"><td>Thomas Arnhold</td>
- <td align="right">619</td>
- <td align="right">2.8%</td>
- </tr><tr class="Even"><td>Jan Holesovsky</td>
- <td align="right">466</td>
- <td align="right">2.1%</td>
- </tr><tr class="Odd"><td>Eike Rathke</td>
- <td align="right">457</td>
- <td align="right">2.1%</td>
- </tr><tr class="Even"><td>Matteo Casalin</td>
- <td align="right">442</td>
- <td align="right">2.0%</td>
- </tr><tr class="Odd"><td>Bjoern Michaelsen</td>
- <td align="right">421</td>
- <td align="right">1.9%</td>
- </tr><tr class="Even"><td>Chris Sherlock</td>
- <td align="right">396</td>
- <td align="right">1.8%</td>
- </tr><tr class="Odd"><td>David Tardon</td>
- <td align="right">386</td>
- <td align="right">1.7%</td>
- </tr><tr class="Even"><td>Julien Nabet</td>
- <td align="right">362</td>
- <td align="right">1.6%</td>
- </tr><tr class="Odd"><td>Zolnai Tamás</td>
- <td align="right">338</td>
- <td align="right">1.5%</td>
- </tr><tr class="Even"><td>Matúš Kukan</td>
- <td align="right">256</td>
- <td align="right">1.2%</td>
- </tr><tr class="Odd"><td>Robert Antoni Buj Gelonch</td>
- <td align="right">231</td>
- <td align="right">1.0%</td>
- </tr></tbody></table></td>
- <td valign="top" width="50%">
- <table cellspacing="3"><tbody><tr><th colspan="3">By changed lines</th>
- </tr><tr class="Even"><td>Lionel Elie Mamane</td>
- <td align="right">244062</td>
- <td align="right">12.5%</td>
- </tr><tr class="Odd"><td>Noel Grandin</td>
- <td align="right">238711</td>
- <td align="right">12.2%</td>
- </tr><tr class="Even"><td>Stephan Bergmann</td>
- <td align="right">161220</td>
- <td align="right">8.3%</td>
- </tr><tr class="Odd"><td>Miklos Vajna</td>
- <td align="right">129325</td>
- <td align="right">6.6%</td>
- </tr><tr class="Even"><td>Caolán McNamara</td>
- <td align="right">97544</td>
- <td align="right">5.0%</td>
- </tr><tr class="Odd"><td>Tomaž Vajngerl</td>
- <td align="right">69404</td>
- <td align="right">3.6%</td>
- </tr><tr class="Even"><td>Tor Lillqvist</td>
- <td align="right">59498</td>
- <td align="right">3.1%</td>
- </tr><tr class="Odd"><td>Laurent Balland-Poirier</td>
- <td align="right">52802</td>
- <td align="right">2.7%</td>
- </tr><tr class="Even"><td>Markus Mohrhard</td>
- <td align="right">50509</td>
- <td align="right">2.6%</td>
- </tr><tr class="Odd"><td>Kohei Yoshida</td>
- <td align="right">45514</td>
- <td align="right">2.3%</td>
- </tr><tr class="Even"><td>Chris Sherlock</td>
- <td align="right">36788</td>
- <td align="right">1.9%</td>
- </tr><tr class="Odd"><td>Peter Foley</td>
- <td align="right">34305</td>
- <td align="right">1.8%</td>
- </tr><tr class="Even"><td>Christian Lohmaier</td>
- <td align="right">33787</td>
- <td align="right">1.7%</td>
- </tr><tr class="Odd"><td>Thomas Arnhold</td>
- <td align="right">32722</td>
- <td align="right">1.7%</td>
- </tr><tr class="Even"><td>David Tardon</td>
- <td align="right">21681</td>
- <td align="right">1.1%</td>
- </tr><tr class="Odd"><td>David Ostrovsky</td>
- <td align="right">21620</td>
- <td align="right">1.1%</td>
- </tr><tr class="Even"><td>Jan Holesovsky</td>
- <td align="right">20792</td>
- <td align="right">1.1%</td>
- </tr><tr class="Odd"><td>Valentin Kettner</td>
- <td align="right">20526</td>
- <td align="right">1.1%</td>
- </tr><tr class="Even"><td>Robert Antoni Buj Gelonch</td>
- <td align="right">20447</td>
- <td align="right">1.0%</td>
- </tr><tr class="Odd"><td>Michael Stahl</td>
- <td align="right">18216</td>
- <td align="right">0.9%</td>
- </tr></tbody></table></td>
- </tr></tbody></table></blockquote>
- <p> To a first approximation, the top ten companies supporting LibreOffice in the last year are: </p>
-
- <blockquote>
- <table><tbody><tr><th colspan="3">Companies supporting LibreOffice development</th>
- </tr><tr><th colspan="3">(by changesets)</th>
- </tr><tr class="Even"><td>Red Hat</td>
- <td align="right">8417</td>
- <td align="right">38.0%</td>
- </tr><tr class="Odd"><td>Collabora <strike>Multimedia</strike></td>
- <td align="right">6531</td>
- <td align="right">29.5%</td>
- </tr><tr class="Even"><td>(Unknown)</td>
- <td align="right">5126</td>
- <td align="right">23.2%</td>
- </tr><tr class="Odd"><td>(None)</td>
- <td align="right">1490</td>
- <td align="right">6.7%</td>
- </tr><tr class="Even"><td>Canonical</td>
- <td align="right">422</td>
- <td align="right">1.9%</td>
- </tr><tr class="Odd"><td>Igalia S.L.</td>
- <td align="right">80</td>
- <td align="right">0.4%</td>
- </tr><tr class="Even"><td>Ericsson</td>
- <td align="right">21</td>
- <td align="right">0.1%</td>
- </tr><tr class="Odd"><td>Yandex</td>
- <td align="right">18</td>
- <td align="right">0.1%</td>
- </tr><tr class="Even"><td>FastMail.FM</td>
- <td align="right">17</td>
- <td align="right">0.1%</td>
- </tr><tr class="Odd"><td>SUSE</td>
- <td align="right">7</td>
- <td align="right">0.0%</td>
- </tr></tbody></table></blockquote>
- <p> Development work on LibreOffice is thus concentrated in a small number of companies, though it is rather more spread out than OpenOffice development. It is worth noting that the LibreOffice developers with unknown affiliation, who contributed 23% of the changes, make up 82% of the developer base, so there would appear to be a substantial community of developers contributing from outside the above-listed companies. </p>
-
- <h4>Some conclusions</h4>
- <p> Last October, some <a href="http://fakehost/Articles/637742/">concerns</a> were raised on the OpenOffice list about the health of that project's community. At the time, Rob Weir <a href="http://fakehost/Articles/637743/">shrugged them off</a> as the result of a marketing effort by the LibreOffice crowd. There can be no doubt that the war of words between these two projects has gotten tiresome at times, but, looking at the above numbers, it is hard not to conclude that there is an issue that goes beyond marketing hype here. </p>
- <p> In the 4½ years since its founding, the LibreOffice project has put together a community with over 250 active developers. There is support from multiple companies and an impressive rate of patches going into the project's repository. The project's ability to sustain nearly monthly releases on two branches is a direct result of that community's work. Swearing at LibreOffice is one of your editor's favorite pastimes, but it seems clear that the project is on a solid footing with a healthy community. </p>
- <p> OpenOffice, instead, is driven by four developers from a single company — a company that appears to have been deemphasizing OpenOffice work for some time. As a result, the project's commit rate is a fraction of what LibreOffice is able to sustain and releases are relatively rare. As of this writing, the <a href="https://blogs.apache.org/OOo/">OpenOffice
-blog</a> shows no posts in 2015. In the October discussion, Rob <a href="http://fakehost/Articles/637750/">said</a> that "<span>the dogs may
-bark but the caravan moves on.</span>" That may be true, but, in this case, the caravan does not appear to be moving with any great speed. </p>
- <p> Anything can happen in the free-software development world; it is entirely possible that a reinvigorated OpenOffice.org may yet give LibreOffice a run for its money. But something will clearly have to change to bring that future around. As things stand now, it is hard not to conclude that LibreOffice has won the battle for developer participation. </p>
- <p><a href="http://fakehost/Articles/637735/#Comments">Comments (74 posted)</a> </p>
-
- <p> <b>Page editor</b>: Jonathan Corbet
- <br></br></p>
- <h2>Inside this week's LWN.net Weekly Edition</h2>
- <ul><li> <a href="http://fakehost/Articles/637395/">Security</a>: Toward secure package downloads; New vulnerabilities in drupal, mozilla, openssl, python-django ... </li>
- <li> <a href="http://fakehost/Articles/637396/">Kernel</a>: LSFMM coverage: NFS, defragmentation, epoll(), copy offload, and more. </li>
- <li> <a href="http://fakehost/Articles/637397/">Distributions</a>: A look at Debian's 2015 DPL candidates; Debian, Fedora, ... </li>
- <li> <a href="http://fakehost/Articles/637398/">Development</a>: A look at GlusterFS; LibreOffice Online; Open sourcing existing code; Secure Boot in Windows 10; ... </li>
- <li> <a href="http://fakehost/Articles/637399/">Announcements</a>: A Turing award for Michael Stonebraker, Sébastien Jodogne, ReGlue are Free Software Award winners, Kat Walsh joins FSF board of directors, Cyanogen, ... </li>
- </ul><b>Next page</b><p>: </p><a href="http://fakehost/Articles/637395/">Security&gt;&gt;</a>
- <br></br></div>
-
+ <h4>Maps in, maps out</h4>
+ <a href="http://fakehost/Articles/637749/"> <img src="http://fakehost/images/2015/03-qgis-simplify-sm.png" border="0" hspace="5" align="right" width="300" height="303" alt="[QGIS simplify tool]"/> </a>
+ <p>The process of working with on-screen map data picked up some improvements in the new release as well. Perhaps the most fundamental is that each map layer added to the canvas is now handled in its own thread, so fewer hangs in the user interface are experienced when re-rendering a layer (as happens whenever the user changes the look of points or shapes in a layer). Since remote databases can also be layers, this multi-threaded approach is more resilient against connectivity problems, too. The interface also now supports temporary "scratch" layers that can be used to merge, filter, or simply experiment with a data set, but are not saved when the current project is saved. </p>
+ <p>For working on the canvas itself, polygonal regions can now use raster images (tiled, if necessary) as fill colors, the map itself can be rotated arbitrarily, and objects can be "snapped" to align with items on any layer (not just the current layer). For working with raster image layers (e.g., aerial photographs) or simply creating new geometric shapes by hand, there is a new digitizing tool that can offer assistance by locking lines to specific angles, automatically keeping borders parallel, and other niceties. </p>
+ <p>There is a completely overhauled "simplify" tool that is used to reduce the number of extraneous vertices of a vector layer (thus reducing its size). The old simplify tool provided only a relative "tolerance" setting that did not correspond directly to any units. With the new tool, users can set a simplification threshold in terms of the underlying map units, layer-specific units, pixels, and more—and, in addition, the tool reports how much the simplify operation has reduced the size of the data.</p>
+ <a href="http://fakehost/Articles/637751/"> <img src="http://fakehost/images/2015/03-qgis-style-sm.png" border="0" hspace="5" align="left" width="300" height="286" alt="[QGIS style editing]"/> </a>
+ <p>There has also been an effort to present a uniform interface to one of the most important features of the map canvas: the ability to change the symbology used for an item based on some data attribute. The simplest example might be to change the line color of a road based on whether its road-type attribute is "highway," "service road," "residential," or so on. But the same feature is used to automatically highlight layer information based on the filtering and querying functionality discussed above. The new release allows many more map attributes to be controlled by these "data definition" settings, and provides a hard-to-miss button next to each attribute, through which a custom data definition can be set. </p>
+ <p>QGIS's composer module is the tool used to take project data and generate a map that can be used outside of the application (in print, as a static image, or as a layer for <a href="http://mapserver.org/">MapServer</a> or some other software tool, for example). Consequently, it is not a simple select-and-click-export tool; composing the output can involve a lot of choices about which data to make visible, how (and where) to label it, and how to make it generally accessible. </p>
+ <p>The updated composer in 2.8 now has a full-screen mode and sports several new options for configuring output. For instance, the user now has full control over how map axes are labeled. In previous releases, the grid coordinates of the map could be turned on or off, but the only options were all or nothing. Now, the user can individually choose whether coordinates are displayed on all four sides, and can even choose in which direction vertical text labels will run (so that they can be correctly justified to the edge of the map, for example). </p>
+ <p>There are, as usual, many more changes than there is room to discuss. Some particularly noteworthy improvements include the ability to save and load bookmarks for frequently used data sources (perhaps most useful for databases, web services, and other non-local data) and improvements to QGIS's server module. This module allows one QGIS instance to serve up data accessible to other QGIS applications (for example, to simply team projects). The server can now be extended with Python plugins and the data layers that it serves can be styled with style rules like those used in the desktop interface. </p>
+ <p>QGIS is one of those rare free-software applications that is both powerful enough for high-end work and yet also straightforward to use for the simple tasks that might attract a newcomer to GIS in the first place. The 2.8 release, particularly with its project-wide commitment to long-term support, appears to be an update well worth checking out, whether one needs to create a simple, custom map or to mine a database for obscure geo-referenced meaning. </p>
+ <p><a href="http://fakehost/Articles/637533/#Comments">Comments (3 posted)</a> </p>
+ <h2 class="SummaryHL"><a href="http://fakehost/Articles/637735/">Development activity in LibreOffice and OpenOffice</a></h2>
+ <p class="FeatureByline"> By <b>Jonathan Corbet</b>
+ <br/>March 25, 2015 </p>
+ <p style="display: inline;" class="readability-styled"> The LibreOffice project was </p><a href="http://fakehost/Articles/407383/">announced</a>
+ <p style="display: inline;" class="readability-styled"> with great fanfare in September 2010. Nearly one year later, the OpenOffice.org project (from which LibreOffice was forked) </p><a href="http://fakehost/Articles/446093/">was
+cut loose from Oracle</a>
+ <p style="display: inline;" class="readability-styled"> and found a new home as an Apache project. It is fair to say that the rivalry between the two projects in the time since then has been strong. Predictions that one project or the other would fail have not been borne out, but that does not mean that the two projects are equally successful. A look at the two projects' development communities reveals some interesting differences. </p>
+ <h4>Release histories</h4>
+ <p> Apache OpenOffice has made two releases in the past year: <a href="https://blogs.apache.org/OOo/entry/the_apache_openoffice_project_announce">4.1</a> in April 2014 and <a href="https://blogs.apache.org/OOo/entry/announcing_apache_openoffice_4_1">4.1.1</a> (described as "a micro update" in the release announcement) in August. The main feature added during that time would appear to be significantly improved accessibility support. </p>
+ <p> The release history for LibreOffice tells a slightly different story: </p>
+ <blockquote> </blockquote>
+ <p> It seems clear that LibreOffice has maintained a rather more frenetic release cadence, generally putting out at least one release per month. The project typically keeps at least two major versions alive at any one time. Most of the releases are of the minor, bug-fix variety, but there have been two major releases in the last year as well. </p>
+ <h4>Development statistics</h4>
+ <p> In the one-year period since late March 2014, there have been 381 changesets committed to the OpenOffice Subversion repository. The most active committers are: </p>
+ <blockquote>
+ <table>
+ <tbody>
+ <tr>
+ <th colspan="2" align="center">Most active OpenOffice developers</th>
+ </tr>
+ <tr>
+ <td width="50%" valign="top">
+ <table cellspacing="3">
+ <tbody>
+ <tr>
+ <th colspan="3">By changesets</th>
+ </tr>
+ <tr class="Even">
+ <td>Herbert Dürr</td>
+ <td align="right">63</td>
+ <td align="right">16.6%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Jürgen&nbsp;Schmidt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+ <td align="right">56</td>
+ <td align="right">14.7%</td>
+ </tr>
+ <tr class="Even">
+ <td>Armin Le Grand</td>
+ <td align="right">56</td>
+ <td align="right">14.7%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Oliver-Rainer&nbsp;Wittmann</td>
+ <td align="right">46</td>
+ <td align="right">12.1%</td>
+ </tr>
+ <tr class="Even">
+ <td>Tsutomu Uchino</td>
+ <td align="right">33</td>
+ <td align="right">8.7%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Kay Schenk</td>
+ <td align="right">27</td>
+ <td align="right">7.1%</td>
+ </tr>
+ <tr class="Even">
+ <td>Pedro Giffuni</td>
+ <td align="right">23</td>
+ <td align="right">6.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Ariel Constenla-Haile</td>
+ <td align="right">22</td>
+ <td align="right">5.8%</td>
+ </tr>
+ <tr class="Even">
+ <td>Andrea Pescetti</td>
+ <td align="right">14</td>
+ <td align="right">3.7%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Steve Yin</td>
+ <td align="right">11</td>
+ <td align="right">2.9%</td>
+ </tr>
+ <tr class="Even">
+ <td>Andre Fischer</td>
+ <td align="right">10</td>
+ <td align="right">2.6%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Yuri Dario</td>
+ <td align="right">7</td>
+ <td align="right">1.8%</td>
+ </tr>
+ <tr class="Even">
+ <td>Regina Henschel</td>
+ <td align="right">6</td>
+ <td align="right">1.6%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Juan C. Sanz</td>
+ <td align="right">2</td>
+ <td align="right">0.5%</td>
+ </tr>
+ <tr class="Even">
+ <td>Clarence Guo</td>
+ <td align="right">2</td>
+ <td align="right">0.5%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Tal Daniel</td>
+ <td align="right">2</td>
+ <td align="right">0.5%</td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ <td width="50%" valign="top">
+ <table cellspacing="3">
+ <tbody>
+ <tr>
+ <th colspan="3">By changed lines</th>
+ </tr>
+ <tr class="Even">
+ <td>Jürgen&nbsp;Schmidt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
+ <td align="right">455499</td>
+ <td align="right">88.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Andre Fischer</td>
+ <td align="right">26148</td>
+ <td align="right">3.8%</td>
+ </tr>
+ <tr class="Even">
+ <td>Pedro Giffuni</td>
+ <td align="right">23183</td>
+ <td align="right">3.4%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Armin Le Grand</td>
+ <td align="right">11018</td>
+ <td align="right">1.6%</td>
+ </tr>
+ <tr class="Even">
+ <td>Juan C. Sanz</td>
+ <td align="right">4582</td>
+ <td align="right">0.7%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Oliver-Rainer Wittmann</td>
+ <td align="right">4309</td>
+ <td align="right">0.6%</td>
+ </tr>
+ <tr class="Even">
+ <td>Andrea Pescetti</td>
+ <td align="right">3908</td>
+ <td align="right">0.6%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Herbert Dürr</td>
+ <td align="right">2811</td>
+ <td align="right">0.4%</td>
+ </tr>
+ <tr class="Even">
+ <td>Tsutomu Uchino</td>
+ <td align="right">1991</td>
+ <td align="right">0.3%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Ariel Constenla-Haile</td>
+ <td align="right">1258</td>
+ <td align="right">0.2%</td>
+ </tr>
+ <tr class="Even">
+ <td>Steve Yin</td>
+ <td align="right">1010</td>
+ <td align="right">0.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Kay Schenk</td>
+ <td align="right">616</td>
+ <td align="right">0.1%</td>
+ </tr>
+ <tr class="Even">
+ <td>Regina Henschel</td>
+ <td align="right">417</td>
+ <td align="right">0.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Yuri Dario</td>
+ <td align="right">268</td>
+ <td align="right">0.0%</td>
+ </tr>
+ <tr class="Even">
+ <td>tal</td>
+ <td align="right">16</td>
+ <td align="right">0.0%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Clarence Guo</td>
+ <td align="right">11</td>
+ <td align="right">0.0%</td>
+ </tr>
+ </tbody>
+ </table>
</td>
-
- <td class="RightColumn">
-
+ </tr>
+ </tbody>
+ </table>
+ </blockquote>
+ <p> In truth, the above list is not just the most active OpenOffice developers — it is all of them; a total of 16 developers have committed changes to OpenOffice in the last year. Those developers changed 528,000 lines of code, but, as can be seen above, Jürgen Schmidt accounted for the bulk of those changes, which were mostly updates to translation files. </p>
+ <p> The top four developers in the "by changesets" column all work for IBM, so IBM is responsible for a minimum of about 60% of the changes to OpenOffice in the last year. </p>
+ <p> The picture for LibreOffice is just a little bit different; in the same one-year period, the project has committed 22,134 changesets from 268 developers. The most active of these developers were: </p>
+ <blockquote>
+ <table>
+ <tbody>
+ <tr>
+ <th colspan="2" align="center">Most active LibreOffice developers</th>
+ </tr>
+ <tr>
+ <td width="50%" valign="top">
+ <table cellspacing="3">
+ <tbody>
+ <tr>
+ <th colspan="3">By changesets</th>
+ </tr>
+ <tr class="Even">
+ <td>Caolán McNamara</td>
+ <td align="right">4307</td>
+ <td align="right">19.5%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Stephan Bergmann</td>
+ <td align="right">2351</td>
+ <td align="right">10.6%</td>
+ </tr>
+ <tr class="Even">
+ <td>Miklos Vajna</td>
+ <td align="right">1449</td>
+ <td align="right">6.5%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Tor Lillqvist</td>
+ <td align="right">1159</td>
+ <td align="right">5.2%</td>
+ </tr>
+ <tr class="Even">
+ <td>Noel Grandin</td>
+ <td align="right">1064</td>
+ <td align="right">4.8%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Markus Mohrhard</td>
+ <td align="right">935</td>
+ <td align="right">4.2%</td>
+ </tr>
+ <tr class="Even">
+ <td>Michael Stahl</td>
+ <td align="right">915</td>
+ <td align="right">4.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Kohei Yoshida</td>
+ <td align="right">755</td>
+ <td align="right">3.4%</td>
+ </tr>
+ <tr class="Even">
+ <td>Tomaž Vajngerl</td>
+ <td align="right">658</td>
+ <td align="right">3.0%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Thomas Arnhold</td>
+ <td align="right">619</td>
+ <td align="right">2.8%</td>
+ </tr>
+ <tr class="Even">
+ <td>Jan Holesovsky</td>
+ <td align="right">466</td>
+ <td align="right">2.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Eike Rathke</td>
+ <td align="right">457</td>
+ <td align="right">2.1%</td>
+ </tr>
+ <tr class="Even">
+ <td>Matteo Casalin</td>
+ <td align="right">442</td>
+ <td align="right">2.0%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Bjoern Michaelsen</td>
+ <td align="right">421</td>
+ <td align="right">1.9%</td>
+ </tr>
+ <tr class="Even">
+ <td>Chris Sherlock</td>
+ <td align="right">396</td>
+ <td align="right">1.8%</td>
+ </tr>
+ <tr class="Odd">
+ <td>David Tardon</td>
+ <td align="right">386</td>
+ <td align="right">1.7%</td>
+ </tr>
+ <tr class="Even">
+ <td>Julien Nabet</td>
+ <td align="right">362</td>
+ <td align="right">1.6%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Zolnai Tamás</td>
+ <td align="right">338</td>
+ <td align="right">1.5%</td>
+ </tr>
+ <tr class="Even">
+ <td>Matúš Kukan</td>
+ <td align="right">256</td>
+ <td align="right">1.2%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Robert&nbsp;Antoni&nbsp;Buj&nbsp;Gelonch</td>
+ <td align="right">231</td>
+ <td align="right">1.0%</td>
+ </tr>
+ </tbody>
+ </table>
</td>
- </div> \ No newline at end of file
+ <td width="50%" valign="top">
+ <table cellspacing="3">
+ <tbody>
+ <tr>
+ <th colspan="3">By changed lines</th>
+ </tr>
+ <tr class="Even">
+ <td>Lionel Elie Mamane</td>
+ <td align="right">244062</td>
+ <td align="right">12.5%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Noel Grandin</td>
+ <td align="right">238711</td>
+ <td align="right">12.2%</td>
+ </tr>
+ <tr class="Even">
+ <td>Stephan Bergmann</td>
+ <td align="right">161220</td>
+ <td align="right">8.3%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Miklos Vajna</td>
+ <td align="right">129325</td>
+ <td align="right">6.6%</td>
+ </tr>
+ <tr class="Even">
+ <td>Caolán McNamara</td>
+ <td align="right">97544</td>
+ <td align="right">5.0%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Tomaž Vajngerl</td>
+ <td align="right">69404</td>
+ <td align="right">3.6%</td>
+ </tr>
+ <tr class="Even">
+ <td>Tor Lillqvist</td>
+ <td align="right">59498</td>
+ <td align="right">3.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Laurent Balland-Poirier</td>
+ <td align="right">52802</td>
+ <td align="right">2.7%</td>
+ </tr>
+ <tr class="Even">
+ <td>Markus Mohrhard</td>
+ <td align="right">50509</td>
+ <td align="right">2.6%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Kohei Yoshida</td>
+ <td align="right">45514</td>
+ <td align="right">2.3%</td>
+ </tr>
+ <tr class="Even">
+ <td>Chris Sherlock</td>
+ <td align="right">36788</td>
+ <td align="right">1.9%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Peter Foley</td>
+ <td align="right">34305</td>
+ <td align="right">1.8%</td>
+ </tr>
+ <tr class="Even">
+ <td>Christian Lohmaier</td>
+ <td align="right">33787</td>
+ <td align="right">1.7%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Thomas Arnhold</td>
+ <td align="right">32722</td>
+ <td align="right">1.7%</td>
+ </tr>
+ <tr class="Even">
+ <td>David Tardon</td>
+ <td align="right">21681</td>
+ <td align="right">1.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>David Ostrovsky</td>
+ <td align="right">21620</td>
+ <td align="right">1.1%</td>
+ </tr>
+ <tr class="Even">
+ <td>Jan Holesovsky</td>
+ <td align="right">20792</td>
+ <td align="right">1.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Valentin Kettner</td>
+ <td align="right">20526</td>
+ <td align="right">1.1%</td>
+ </tr>
+ <tr class="Even">
+ <td>Robert&nbsp;Antoni&nbsp;Buj&nbsp;Gelonch</td>
+ <td align="right">20447</td>
+ <td align="right">1.0%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Michael Stahl</td>
+ <td align="right">18216</td>
+ <td align="right">0.9%</td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </blockquote>
+ <p> To a first approximation, the top ten companies supporting LibreOffice in the last year are: </p>
+ <blockquote>
+ <table>
+ <tbody>
+ <tr>
+ <th colspan="3">Companies supporting LibreOffice development</th>
+ </tr>
+ <tr>
+ <th colspan="3">(by changesets)</th>
+ </tr>
+ <tr class="Even">
+ <td>Red Hat</td>
+ <td align="right">8417</td>
+ <td align="right">38.0%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Collabora <strike>Multimedia</strike></td>
+ <td align="right">6531</td>
+ <td align="right">29.5%</td>
+ </tr>
+ <tr class="Even">
+ <td>(Unknown)</td>
+ <td align="right">5126</td>
+ <td align="right">23.2%</td>
+ </tr>
+ <tr class="Odd">
+ <td>(None)</td>
+ <td align="right">1490</td>
+ <td align="right">6.7%</td>
+ </tr>
+ <tr class="Even">
+ <td>Canonical</td>
+ <td align="right">422</td>
+ <td align="right">1.9%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Igalia S.L.</td>
+ <td align="right">80</td>
+ <td align="right">0.4%</td>
+ </tr>
+ <tr class="Even">
+ <td>Ericsson</td>
+ <td align="right">21</td>
+ <td align="right">0.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>Yandex</td>
+ <td align="right">18</td>
+ <td align="right">0.1%</td>
+ </tr>
+ <tr class="Even">
+ <td>FastMail.FM</td>
+ <td align="right">17</td>
+ <td align="right">0.1%</td>
+ </tr>
+ <tr class="Odd">
+ <td>SUSE</td>
+ <td align="right">7</td>
+ <td align="right">0.0%</td>
+ </tr>
+ </tbody>
+ </table>
+ </blockquote>
+ <p> Development work on LibreOffice is thus concentrated in a small number of companies, though it is rather more spread out than OpenOffice development. It is worth noting that the LibreOffice developers with unknown affiliation, who contributed 23% of the changes, make up 82% of the developer base, so there would appear to be a substantial community of developers contributing from outside the above-listed companies. </p>
+ <h4>Some conclusions</h4>
+ <p> Last October, some <a href="http://fakehost/Articles/637742/">concerns</a> were raised on the OpenOffice list about the health of that project's community. At the time, Rob Weir <a href="http://fakehost/Articles/637743/">shrugged them off</a> as the result of a marketing effort by the LibreOffice crowd. There can be no doubt that the war of words between these two projects has gotten tiresome at times, but, looking at the above numbers, it is hard not to conclude that there is an issue that goes beyond marketing hype here. </p>
+ <p> In the 4½ years since its founding, the LibreOffice project has put together a community with over 250 active developers. There is support from multiple companies and an impressive rate of patches going into the project's repository. The project's ability to sustain nearly monthly releases on two branches is a direct result of that community's work. Swearing at LibreOffice is one of your editor's favorite pastimes, but it seems clear that the project is on a solid footing with a healthy community. </p>
+ <p> OpenOffice, instead, is driven by four developers from a single company — a company that appears to have been deemphasizing OpenOffice work for some time. As a result, the project's commit rate is a fraction of what LibreOffice is able to sustain and releases are relatively rare. As of this writing, the <a href="https://blogs.apache.org/OOo/">OpenOffice
+blog</a> shows no posts in 2015. In the October discussion, Rob <a href="http://fakehost/Articles/637750/">said</a> that "<span>the dogs may
+bark but the caravan moves on.</span>" That may be true, but, in this case, the caravan does not appear to be moving with any great speed. </p>
+ <p> Anything can happen in the free-software development world; it is entirely possible that a reinvigorated OpenOffice.org may yet give LibreOffice a run for its money. But something will clearly have to change to bring that future around. As things stand now, it is hard not to conclude that LibreOffice has won the battle for developer participation. </p>
+ <p><a href="http://fakehost/Articles/637735/#Comments">Comments (74 posted)</a> </p>
+ <p> <b>Page editor</b>: Jonathan Corbet
+ <br/> </p>
+ <h2>Inside this week's LWN.net Weekly Edition</h2>
+ <ul>
+ <li> <a href="http://fakehost/Articles/637395/">Security</a>: Toward secure package downloads; New vulnerabilities in drupal, mozilla, openssl, python-django ... </li>
+ <li> <a href="http://fakehost/Articles/637396/">Kernel</a>: LSFMM coverage: NFS, defragmentation, epoll(), copy offload, and more. </li>
+ <li> <a href="http://fakehost/Articles/637397/">Distributions</a>: A look at Debian's 2015 DPL candidates; Debian, Fedora, ... </li>
+ <li> <a href="http://fakehost/Articles/637398/">Development</a>: A look at GlusterFS; LibreOffice Online; Open sourcing existing code; Secure Boot in Windows 10; ... </li>
+ <li> <a href="http://fakehost/Articles/637399/">Announcements</a>: A Turing award for Michael Stonebraker, Sébastien Jodogne, ReGlue are Free Software Award winners, Kat Walsh joins FSF board of directors, Cyanogen, ... </li>
+ </ul><b>Next page</b>
+ <p style="display: inline;" class="readability-styled">: </p><a href="http://fakehost/Articles/637395/">Security&gt;&gt;</a>
+ <br/>
+ </div>
+ </td>
+ <td class="RightColumn"> </td>
+ </div>
+</div> \ No newline at end of file
diff --git a/test/test-pages/medium-1/expected-metadata.json b/test/test-pages/medium-1/expected-metadata.json
index ecd6650..232a067 100644
--- a/test/test-pages/medium-1/expected-metadata.json
+++ b/test/test-pages/medium-1/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "title": "The Open Journalism Project: Better Student Journalism",
+ "title": "Better Student Journalism — Medium",
"byline": "Pippin Lee",
"excerpt": "We pushed out the first version of the Open Journalism site in January. Here’s what we’ve learned about student journali…",
"readerable": true
diff --git a/test/test-pages/medium-1/expected.html b/test/test-pages/medium-1/expected.html
index 44ca7f0..d8d0c0e 100644
--- a/test/test-pages/medium-1/expected.html
+++ b/test/test-pages/medium-1/expected.html
@@ -1,10 +1,10 @@
<div class="section-inner layoutSingleColumn">
-
+ <h2 class="graf--h2" data-align="center" id="3c62" name="3c62">Open Journalism Project:</h2>
<h4 class="graf--h4" data-align="center" id="425a" name="425a"><em class="markup--em markup--h4-em">Better Student Journalism</em></h4>
<p class="graf--p graf--empty" id="a511" name="a511">
<br></br></p>
- <h4 class="graf--h4 graf--empty" id="08db" name="08db"><br></br></h4>
+
<p class="graf--p" id="d178" name="d178">We pushed out the first version of the <a class="markup--anchor markup--p-anchor" data-href="http://pippinlee.github.io/open-journalism-project/" href="http://pippinlee.github.io/open-journalism-project/" rel="nofollow">Open Journalism site</a> in January. Our goal is for the
site to be a place to teach students what they should know about journalism
@@ -26,7 +26,7 @@
time discussing. One of my habits as a photographer was scouring sites
like Flickr to see how others could frame the world in ways I hadn’t previously
considered.</p>
- <figure class="graf--figure" id="06e8" name="06e8"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 350px;">
+ <figure class="graf--figure" id="06e8" name="06e8"><div class="aspectRatioPlaceholder is-locked">
<img class="graf-image" data-action="zoom" data-action-value="1*AzYWbe4cZkMMEUbfRjysLQ.png" data-height="500" data-image-id="1*AzYWbe4cZkMMEUbfRjysLQ.png" data-width="1000" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*AzYWbe4cZkMMEUbfRjysLQ.png"></img></div>
<figcaption class="imageCaption">topleftpixel.com</figcaption></figure><p class="graf--p" id="930f" name="930f">I started discovering beautiful things the <a class="markup--anchor markup--p-anchor" data-href="http://wvs.topleftpixel.com/13/02/06/timelapse-strips-homewood.htm" href="http://wvs.topleftpixel.com/13/02/06/timelapse-strips-homewood.htm" rel="nofollow">web could do with images</a>:
@@ -45,7 +45,7 @@
was becoming harder to romanticize the dusty newsprint smell coming from
the shoes we were handed down from previous generations of editors. It
was, we were told, all part of “becoming a journalist.”</p>
- <figure class="graf--figure" id="12da" name="12da"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 364px;">
+ <figure class="graf--figure" id="12da" name="12da"><div class="aspectRatioPlaceholder is-locked">
<img class="graf-image" data-action="zoom" data-action-value="1*d0Hp6KlzyIcGHcL6to1sYQ.png" data-height="451" data-image-id="1*d0Hp6KlzyIcGHcL6to1sYQ.png" data-width="868" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*d0Hp6KlzyIcGHcL6to1sYQ.png"></img></div>
</figure><h3 class="graf--h3" id="e2f0" name="e2f0">We don’t know what we don’t know</h3>
@@ -89,7 +89,7 @@
was seen as “a career with words.” The other 5% were designers, designing
words on computers, for print.</li>
<li class="graf--li" id="0be9" name="0be9">Not enough discussion between the business side and web efforts</li>
- </ul><figure class="graf--figure" id="79ed" name="79ed"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 322px;">
+ </ul><figure class="graf--figure" id="79ed" name="79ed"><div class="aspectRatioPlaceholder is-locked">
<img class="graf-image" data-action="zoom" data-action-value="1*_9KYIFrk_PqWFgptsMDeww.png" data-height="500" data-image-id="1*_9KYIFrk_PqWFgptsMDeww.png" data-width="1086" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*_9KYIFrk_PqWFgptsMDeww.png"></img></div>
<figcaption class="imageCaption">From our 2011 research</figcaption></figure><h3 class="graf--h3" id="8d0c" name="8d0c">Common problems in student newsrooms (2013)</h3>
@@ -138,7 +138,7 @@
<p class="graf--p" id="4634" name="4634">In our 2013 research we found that almost 50% of student newsrooms had
created roles specifically for the web. <strong class="markup--strong markup--p-strong">This sounds great, but is still problematic in its current state.</strong>
</p>
- <figure class="graf--figure" id="416f" name="416f"><div class="aspectRatioPlaceholder is-locked" style="max-width: 624px; max-height: 560px;">
+ <figure class="graf--figure" id="416f" name="416f"><div class="aspectRatioPlaceholder is-locked">
<img class="graf-image" data-height="560" data-image-id="1*Vh2MpQjqjPkzYJaaWExoVg.png" data-width="624" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*Vh2MpQjqjPkzYJaaWExoVg.png"></img></div>
<figcaption class="imageCaption"><strong class="markup--strong markup--figure-strong">We designed many of these slides to help explain to ourselves what we were doing</strong>
@@ -180,7 +180,7 @@
<p class="graf--p" id="4eb1" name="4eb1">We’re OK with this problem, if we see newsrooms continue to take small
steps towards having all their editors involved in the stories for the
web.</p>
- <figure class="graf--figure" id="7aab" name="7aab"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 382px;">
+ <figure class="graf--figure" id="7aab" name="7aab"><div class="aspectRatioPlaceholder is-locked">
<img class="graf-image" data-action="zoom" data-action-value="1*2Ln_DmC95Xpz6LzgywkcFQ.png" data-height="718" data-image-id="1*2Ln_DmC95Xpz6LzgywkcFQ.png" data-width="1315" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*2Ln_DmC95Xpz6LzgywkcFQ.png"></img></div>
<figcaption class="imageCaption">The current Open Journalism site was a few years in the making. This was
@@ -251,7 +251,7 @@
of developing stories for the web. You play a big part in this. This means
writing about it, and sharing code. We need to start building a bridge
between student journalism and professional newsrooms.</p>
- <figure class="graf--figure" id="7ed3" name="7ed3"><div class="aspectRatioPlaceholder is-locked" style="max-width: 686px; max-height: 400px;">
+ <figure class="graf--figure" id="7ed3" name="7ed3"><div class="aspectRatioPlaceholder is-locked">
<img class="graf-image" data-height="400" data-image-id="1*bXaR_NBJdoHpRc8lUWSsow.png" data-width="686" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*bXaR_NBJdoHpRc8lUWSsow.png"></img></div>
<figcaption class="imageCaption">2012</figcaption></figure><h3 class="graf--h3" id="ee1b" name="ee1b">This is a start</h3>
@@ -269,11 +269,10 @@
<p class="graf--p" id="abd5" name="abd5">We’re trying out some new shoes. And while they’re not self-lacing, and
smell a bit different, we feel lacing up a new pair of kicks can change
a lot.</p>
- <figure class="graf--figure" id="4c68" name="4c68"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 393px;">
+ <figure class="graf--figure" id="4c68" name="4c68"><div class="aspectRatioPlaceholder is-locked">
<img class="graf-image" data-action="zoom" data-action-value="1*lulfisQxgSQ209vPHMAifg.png" data-height="534" data-image-id="1*lulfisQxgSQ209vPHMAifg.png" data-width="950" src="https://d262ilb51hltx0.cloudfront.net/max/800/1*lulfisQxgSQ209vPHMAifg.png"></img></div>
- </figure><p class="graf--p graf--empty" id="c6bf" name="c6bf">
- <br></br></p>
+ </figure>
<p class="graf--p" id="2c5c" name="2c5c"><strong class="markup--strong markup--p-strong">Let’s talk. Let’s listen.</strong>
</p>
<p class="graf--p" id="63ec" name="63ec"><strong class="markup--strong markup--p-strong">We’re still in the early stages of what this project will look like, so if you want to help or have thoughts, let’s talk.</strong>
diff --git a/test/test-pages/medium-2/expected-metadata.json b/test/test-pages/medium-2/expected-metadata.json
index 2eaaccb..dade1f4 100644
--- a/test/test-pages/medium-2/expected-metadata.json
+++ b/test/test-pages/medium-2/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "title": "On Behalf of “Literally”",
+ "title": "On Behalf of “Literally” — Medium",
"byline": "Courtney Kirchoff",
"excerpt": "In defense of the word “literally” and why you or someone you know should stop misusing the word, lest they drive us fig…",
"readerable": true
diff --git a/test/test-pages/medium-2/expected.html b/test/test-pages/medium-2/expected.html
index 1e3b1ec..96baebc 100644
--- a/test/test-pages/medium-2/expected.html
+++ b/test/test-pages/medium-2/expected.html
@@ -1 +1 @@
-<div class="section-inner layoutSingleColumn"><figure class="graf--figure graf--first" id="4924" name="4924"><div class="aspectRatioPlaceholder is-locked" style="max-width: 700px; max-height: 474px;"><img class="graf-image" data-action="zoom" data-action-value="1*eR_J8DurqygbhrwDg-WPnQ.png" data-height="1280" data-image-id="1*eR_J8DurqygbhrwDg-WPnQ.png" data-width="1891" src="https://d262ilb51hltx0.cloudfront.net/max/1600/1*eR_J8DurqygbhrwDg-WPnQ.png"></img></div><figcaption class="imageCaption">Words need defenders.</figcaption></figure><h3 class="graf--h3" id="b098" name="b098">On Behalf of “Literally”</h3><p class="graf--p" id="1a73" name="1a73">You either are a “literally” abuser or know of one. If you’re anything like me, hearing the word “literally” used incorrectly causes a little piece of your soul to whither and die. Of course I do not mean that literally, I mean that figuratively. An abuser would have said: “Every time a person uses that word, a piece of my soul literally withers and dies.” Which is terribly, horribly wrong.</p><p class="graf--p" id="104a" name="104a">For whatever bizarre reason, people feel the need to use literally as a sort of verbal crutch. They use it to emphasize a point, which is silly because they’re already using an analogy or a metaphor to illustrate said point. For example: “Ugh, I literally tore the house apart looking for my remote control!” No, you literally did not tear apart your house, because it’s still standing. If you’d just told me you “tore your house apart” searching for your remote, I would’ve understood what you meant. No need to add “literally” to the sentence.</p><p class="graf--p" id="c2c0" name="c2c0">Maybe I should define literally.</p><blockquote class="graf--pullquote pullquote" id="b239" name="b239">Literally means actually. When you say something literally happened, you’re describing the scene or situation as it actually happened.</blockquote><p class="graf--p" id="a8fd" name="a8fd">So you should only use literally when you mean it. It should not be used in hyperbole. Example: “That was so funny I literally cried.” Which is possible. Some things are funny enough to elicit tears. Note the example stops with “literally cried.” You cannot <em class="markup--em markup--p-em">literally cry your eyes out</em>. The joke wasn’t so funny your eyes popped out of their sockets.</p><h4 class="graf--h4" id="165a" name="165a">When in Doubt, Leave it Out</h4><p class="graf--p graf--startsWithDoubleQuote" id="e434" name="e434">“I’m so hungry I could eat a horse,” means you’re hungry. You don’t need to say “I’m so hungry I could literally eat a horse.” Because you can’t do that in one sitting, I don’t care how big your stomach is.</p><p class="graf--p graf--startsWithDoubleQuote" id="d88f" name="d88f">“That play was so funny I laughed my head off,” illustrates the play was amusing. You don’t need to say you literally laughed your head off, because then your head would be on the ground and you wouldn’t be able to speak, much less laugh.</p><p class="graf--p graf--startsWithDoubleQuote" id="4bab" name="4bab">“I drove so fast my car was flying,” we get your point: you were speeding. But your car is never going fast enough to fly, so don’t say your car was literally flying.</p><h4 class="graf--h4" id="f2f0" name="f2f0">Insecurities?</h4><p class="graf--p" id="1bd7" name="1bd7">Maybe no one believed a story you told as a child, and you felt the need to prove that it actually happened. <em class="markup--em markup--p-em">No really, mom, I literally climbed the tree. </em>In efforts to prove truth, you used literally to describe something real, however outlandish it seemed. Whatever the reason, now your overuse of literally has become a habit.</p><h4 class="graf--h4" id="d7c1" name="d7c1">Hard Habit to Break?</h4><p class="graf--p" id="714b" name="714b">Abusing literally isn’t as bad a smoking, but it’s still an unhealthy habit (I mean that figuratively). Help is required in order to break it.</p><p class="graf--p" id="f929" name="f929">This is my version of an intervention for literally abusers. I’m not sure how else to do it other than in writing. I know this makes me sound like a know-it-all, and I accept that. But there’s no excuse other than blatant ignorance to misuse the word “literally.” So just stop it.</p><p class="graf--p" id="fd19" name="fd19">Don’t say “Courtney, this post is so snobbish it literally burned up my computer.” Because nothing is that snobbish that it causes computers to combust. Or: “Courtney, your head is so big it literally cannot get through the door.” Because it can, unless it’s one of those tiny doors from <em class="markup--em markup--p-em">Alice in Wonderland</em> and I need to eat a mushroom to make my whole body smaller.</p><h4 class="graf--h4" id="fe12" name="fe12">No One’s Perfect</h4><p class="graf--p" id="7ff8" name="7ff8">And I’m not saying I am. I’m trying to restore meaning to a word that’s lost meaning. I’m standing up for literally. It’s a good word when used correctly. People are butchering it and destroying it every day (figuratively speaking) and the massacre needs to stop. Just as there’s a coalition of people against the use of certain fonts (like <a class="markup--anchor markup--p-anchor" data-href="http://bancomicsans.com/main/?page_id=2" href="http://bancomicsans.com/main/?page_id=2" rel="nofollow">Comic Sans</a> and <a class="markup--anchor markup--p-anchor" data-href="https://www.facebook.com/group.php?gid=14448723154" href="https://www.facebook.com/group.php?gid=14448723154" rel="nofollow">Papyrus</a>), so should there be a coalition of people against the abuse of literally.</p><h4 class="graf--h4" id="049e" name="049e">Saying it to Irritate?</h4><p class="graf--p" id="9381" name="9381">Do you misuse the word “literally” just to annoy your know-it-all or grammar police friends/acquaintances/total strangers? If so, why? Doing so would be like me going outside when it’s freezing, wearing nothing but a pair of shorts and t-shirt in hopes of making you cold by just looking at me. Who suffers more?</p><h4 class="graf--h4" id="3e52" name="3e52">Graphical Representation</h4><p class="graf--p graf--last" id="b57e" name="b57e">Matthew Inman of “The Oatmeal” wrote a comic about literally. Abusers and defenders alike <a class="markup--anchor markup--p-anchor" data-href="http://theoatmeal.com/comics/literally" href="http://theoatmeal.com/comics/literally" rel="nofollow">should check it out</a>. It’s clear this whole craze about literally is driving a lot of us nuts. You literally abusers are killing off pieces of our souls. You must be stopped, or the world will be lost to meaninglessness forever. Figuratively speaking.</p></div> \ No newline at end of file
+<section class=" section--first" name="d9f8"><div class="section-content"><div class="section-inner layoutSingleColumn"><figure class="graf--figure graf--first" id="4924" name="4924"><div class="aspectRatioPlaceholder is-locked"><img class="graf-image" data-action="zoom" data-action-value="1*eR_J8DurqygbhrwDg-WPnQ.png" data-height="1280" data-image-id="1*eR_J8DurqygbhrwDg-WPnQ.png" data-width="1891" src="https://d262ilb51hltx0.cloudfront.net/max/1600/1*eR_J8DurqygbhrwDg-WPnQ.png"></img></div><figcaption class="imageCaption">Words need defenders.</figcaption></figure><h3 class="graf--h3" id="b098" name="b098">On Behalf of “Literally”</h3><p class="graf--p" id="1a73" name="1a73">You either are a “literally” abuser or know of one. If you’re anything like me, hearing the word “literally” used incorrectly causes a little piece of your soul to whither and die. Of course I do not mean that literally, I mean that figuratively. An abuser would have said: “Every time a person uses that word, a piece of my soul literally withers and dies.” Which is terribly, horribly wrong.</p><p class="graf--p" id="104a" name="104a">For whatever bizarre reason, people feel the need to use literally as a sort of verbal crutch. They use it to emphasize a point, which is silly because they’re already using an analogy or a metaphor to illustrate said point. For example: “Ugh, I literally tore the house apart looking for my remote control!” No, you literally did not tear apart your house, because it’s still standing. If you’d just told me you “tore your house apart” searching for your remote, I would’ve understood what you meant. No need to add “literally” to the sentence.</p><p class="graf--p" id="c2c0" name="c2c0">Maybe I should define literally.</p><blockquote class="graf--pullquote pullquote" id="b239" name="b239">Literally means actually. When you say something literally happened, you’re describing the scene or situation as it actually happened.</blockquote><p class="graf--p" id="a8fd" name="a8fd">So you should only use literally when you mean it. It should not be used in hyperbole. Example: “That was so funny I literally cried.” Which is possible. Some things are funny enough to elicit tears. Note the example stops with “literally cried.” You cannot <em class="markup--em markup--p-em">literally cry your eyes out</em>. The joke wasn’t so funny your eyes popped out of their sockets.</p><h4 class="graf--h4" id="165a" name="165a">When in Doubt, Leave it Out</h4><p class="graf--p graf--startsWithDoubleQuote" id="e434" name="e434">“I’m so hungry I could eat a horse,” means you’re hungry. You don’t need to say “I’m so hungry I could literally eat a horse.” Because you can’t do that in one sitting, I don’t care how big your stomach is.</p><p class="graf--p graf--startsWithDoubleQuote" id="d88f" name="d88f">“That play was so funny I laughed my head off,” illustrates the play was amusing. You don’t need to say you literally laughed your head off, because then your head would be on the ground and you wouldn’t be able to speak, much less laugh.</p><p class="graf--p graf--startsWithDoubleQuote" id="4bab" name="4bab">“I drove so fast my car was flying,” we get your point: you were speeding. But your car is never going fast enough to fly, so don’t say your car was literally flying.</p><h4 class="graf--h4" id="f2f0" name="f2f0">Insecurities?</h4><p class="graf--p" id="1bd7" name="1bd7">Maybe no one believed a story you told as a child, and you felt the need to prove that it actually happened. <em class="markup--em markup--p-em">No really, mom, I literally climbed the tree. </em>In efforts to prove truth, you used literally to describe something real, however outlandish it seemed. Whatever the reason, now your overuse of literally has become a habit.</p><h4 class="graf--h4" id="d7c1" name="d7c1">Hard Habit to Break?</h4><p class="graf--p" id="714b" name="714b">Abusing literally isn’t as bad a smoking, but it’s still an unhealthy habit (I mean that figuratively). Help is required in order to break it.</p><p class="graf--p" id="f929" name="f929">This is my version of an intervention for literally abusers. I’m not sure how else to do it other than in writing. I know this makes me sound like a know-it-all, and I accept that. But there’s no excuse other than blatant ignorance to misuse the word “literally.” So just stop it.</p><p class="graf--p" id="fd19" name="fd19">Don’t say “Courtney, this post is so snobbish it literally burned up my computer.” Because nothing is that snobbish that it causes computers to combust. Or: “Courtney, your head is so big it literally cannot get through the door.” Because it can, unless it’s one of those tiny doors from <em class="markup--em markup--p-em">Alice in Wonderland</em> and I need to eat a mushroom to make my whole body smaller.</p><h4 class="graf--h4" id="fe12" name="fe12">No One’s Perfect</h4><p class="graf--p" id="7ff8" name="7ff8">And I’m not saying I am. I’m trying to restore meaning to a word that’s lost meaning. I’m standing up for literally. It’s a good word when used correctly. People are butchering it and destroying it every day (figuratively speaking) and the massacre needs to stop. Just as there’s a coalition of people against the use of certain fonts (like <a class="markup--anchor markup--p-anchor" data-href="http://bancomicsans.com/main/?page_id=2" href="http://bancomicsans.com/main/?page_id=2" rel="nofollow">Comic Sans</a> and <a class="markup--anchor markup--p-anchor" data-href="https://www.facebook.com/group.php?gid=14448723154" href="https://www.facebook.com/group.php?gid=14448723154" rel="nofollow">Papyrus</a>), so should there be a coalition of people against the abuse of literally.</p><h4 class="graf--h4" id="049e" name="049e">Saying it to Irritate?</h4><p class="graf--p" id="9381" name="9381">Do you misuse the word “literally” just to annoy your know-it-all or grammar police friends/acquaintances/total strangers? If so, why? Doing so would be like me going outside when it’s freezing, wearing nothing but a pair of shorts and t-shirt in hopes of making you cold by just looking at me. Who suffers more?</p><h4 class="graf--h4" id="3e52" name="3e52">Graphical Representation</h4><p class="graf--p graf--last" id="b57e" name="b57e">Matthew Inman of “The Oatmeal” wrote a comic about literally. Abusers and defenders alike <a class="markup--anchor markup--p-anchor" data-href="http://theoatmeal.com/comics/literally" href="http://theoatmeal.com/comics/literally" rel="nofollow">should check it out</a>. It’s clear this whole craze about literally is driving a lot of us nuts. You literally abusers are killing off pieces of our souls. You must be stopped, or the world will be lost to meaninglessness forever. Figuratively speaking.</p></div></div></section> \ No newline at end of file
diff --git a/test/test-pages/mozilla-1/expected-metadata.json b/test/test-pages/mozilla-1/expected-metadata.json
index 77ad264..63a3699 100644
--- a/test/test-pages/mozilla-1/expected-metadata.json
+++ b/test/test-pages/mozilla-1/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "title": "Firefox — Customize and make it your own — The most flexible browser on the Web",
+ "title": "Firefox — Customize and make it your own — The most flexible browser on\n the Web — Mozilla",
"byline": null,
"dir": "ltr",
"excerpt": "It’s easier than ever to personalize Firefox and make it work the way\n you do.\n No other browser gives you so much choice and flexibility.",
diff --git a/test/test-pages/mozilla-1/expected.html b/test/test-pages/mozilla-1/expected.html
index ca0e111..0c243ce 100644
--- a/test/test-pages/mozilla-1/expected.html
+++ b/test/test-pages/mozilla-1/expected.html
@@ -29,12 +29,7 @@
<p class="lead">Make Firefox match your style. Choose from thousands of themes and dress
up your browser with a single click.</p>
- <p>
- <button aria-controls="theme-demo" id="theme-yellow" type="button">Preview yellow theme</button>
- <button aria-controls="theme-demo" id="theme-green" type="button">Preview green theme</button>
- <button aria-controls="theme-demo" id="theme-blue" type="button">Preview blue theme</button>
- <button aria-controls="theme-demo" class="selected" id="theme-red" type="button">Preview red theme</button>
- </p> <a class="more" href="https://addons.mozilla.org/firefox/themes/" rel="external">Try it now</a>
+ <a class="more" href="https://addons.mozilla.org/firefox/themes/" rel="external">Try it now</a>
<br></br><a class="more" href="https://support.mozilla.org/kb/use-themes-change-look-of-firefox" rel="external">Learn more</a>
diff --git a/test/test-pages/msn/expected.html b/test/test-pages/msn/expected.html
index 6442f6b..fb84113 100644
--- a/test/test-pages/msn/expected.html
+++ b/test/test-pages/msn/expected.html
@@ -1,10 +1,10 @@
<article class="articlecontent loaded" data-aop="article" itemscope="" itemtype="http://schema.org/NewsArticle"><section class="articlebody" data-aop="articlebody" itemprop="articleBody"><p>
<span class="storyimage fullwidth inlineimage" data-aop="image">
<span class="image" data-attrib="Provided by Business Insider Inc" data-caption="&lt;span style=&quot;font-size:13px;&quot;>Nintendo/Apple&lt;/span>" data-id="55" data-m="{&quot;i&quot;:55,&quot;p&quot;:52,&quot;n&quot;:&quot;openModal&quot;,&quot;t&quot;:&quot;articleImages&quot;,&quot;o&quot;:3}">
- <img alt="&lt;span style=&quot;font-size:13px;&quot;>Nintendo/Apple&lt;/span>" class="loaded" data-initial-set="true" data-src="{&quot;default&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;73&quot;,&quot;h&quot;:&quot;41&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=410&amp;w=728&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;},&quot;size3column&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;62&quot;,&quot;h&quot;:&quot;35&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=351&amp;w=624&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;},&quot;size2column&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;62&quot;,&quot;h&quot;:&quot;35&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=351&amp;w=624&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;}}" src="http://img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=820&amp;w=1456&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540" style="width:73rem;height:41rem;"></img></span>
+ <img alt="&lt;span style=&quot;font-size:13px;&quot;>Nintendo/Apple&lt;/span>" class="loaded" data-initial-set="true" data-src="{&quot;default&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;73&quot;,&quot;h&quot;:&quot;41&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=410&amp;w=728&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;},&quot;size3column&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;62&quot;,&quot;h&quot;:&quot;35&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=351&amp;w=624&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;},&quot;size2column&quot;:{&quot;load&quot;:&quot;default&quot;,&quot;w&quot;:&quot;62&quot;,&quot;h&quot;:&quot;35&quot;,&quot;src&quot;:&quot;//img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=351&amp;w=624&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540&quot;}}" src="http://img-s-msn-com.akamaized.net/tenant/amp/entityid/AAkk5fh.img?h=820&amp;w=1456&amp;m=6&amp;q=60&amp;o=f&amp;l=f&amp;x=1162&amp;y=540"></img></span>
<span class="caption truncate">
<span class="attribution">© Provided by Business Insider Inc</span>
- <span style="font-size:13px;">Nintendo/Apple</span>
+ <span>Nintendo/Apple</span>
</span>
</span>
Nintendo and Apple shocked the world earlier this year by announcing "Super Mario Run," the legendary gaming company's first foray into mobile gaming. It's a Mario game you can play on your phone with just one hand, so what's not to love?</p>
diff --git a/test/test-pages/needs-entity-normalization/expected.html b/test/test-pages/needs-entity-normalization/expected.html
index 223558c..3fe9055 100644
--- a/test/test-pages/needs-entity-normalization/expected.html
+++ b/test/test-pages/needs-entity-normalization/expected.html
@@ -1,7 +1,7 @@
<p><strong>30/05/2017 | 11:57 |</strong> El titular del Suoem le dijo al intendente que "va a pagar caro, esta infamia y canallada"–por la publiación de sueldos–. Los municipales realizaron una ruidosa protesta en el Palacio 6 de Julio</p><div class="cuerpo"><p>Los municipales de la ciudad de Córdoba realizan este martes una ruidosa asamblea general en el Palacio 6 de Julio y todas las reparticiones como medida de presión en contra de la difusión de las lista de los empleados y los sueldos que perciben.<p>
"Esta infamia, esta canallada, este intento por pisotear nuestra dignidad este ataque a nuestra seguridad y la de nuestras familias le prometo que lo va a pagar caro; vamos a responder con toda la fuerza", disparó al hablar ante la multitud el titular del Suoem, Rubén Daniele.<p>
"En estos días señor intendente lo he visto suelto de cuerpo, diría que casi con una sonrisa burlona. Le prometo y lo juro acá: en unos meses se va a borrar la sonrisa y se va a cagar como se cagó otras veces, pidiendo que vayamos a solucionar los problemas de la ciudad", agregó.<p>
-Si bien la medida de fuerza arrancó a las 11 en la explanada de la Municipalidad, la atención en el municipio, los CPC y otras dependencias se vio resentida durante toda la jornada.</p></p></p></p><blockquote class="twitter-tweet" data-lang="es"><p dir="ltr" lang="und"><a href="https://twitter.com/hashtag/Asamblea?src=hash">#Asamblea</a> <a href="https://twitter.com/hashtag/municipales?src=hash">#municipales</a> <a href="https://t.co/PgA1xekg5Q">pic.twitter.com/PgA1xekg5Q</a></p>— SUOEM CÓRDOBA (@suoemcordoba) <a href="https://twitter.com/suoemcordoba/status/869480306906103808">30 de mayo de 2017</a></blockquote><p>
+Si bien la medida de fuerza arrancó a las 11 en la explanada de la Municipalidad, la atención en el municipio, los CPC y otras dependencias se vio resentida durante toda la jornada.</p></p></p></p><blockquote class="twitter-tweet" data-lang="es"><p dir="ltr" lang="und"><a href="https://twitter.com/hashtag/Asamblea?src=hash">#Asamblea</a> <a href="https://twitter.com/hashtag/municipales?src=hash">#municipales</a> <a href="https://t.co/PgA1xekg5Q">pic.twitter.com/PgA1xekg5Q</a></p>— SUOEM CÓRDOBA (@suoemcordoba) <a href="https://twitter.com/suoemcordoba/status/869480306906103808">30 de mayo de 2017</a></blockquote><br></br><p>
Además, las asambleas afectan el normal funcionamiento en las escuelas municipales y jardines maternales.<p>
Ayer, Damián Bizzi, vocero del Sindicato Unión Obreros y Empleados Municipales (Suoem) manifestó a <b>Cadena 3</b> que las asambleas “son la única forma de hacernos escuchar”: “Lo esencial sería que no hubiéramos tenido este problema. No hay otra forma que las autoridades municipales nos escuchen". <p>
"Estamos en una situación de conflicto y ésta es la única forma de hacernos escuchar. Es una gestión que no escucha mucho”, dijo. </p></p></p></div> \ No newline at end of file
diff --git a/test/test-pages/remove-extra-brs/expected.html b/test/test-pages/remove-extra-brs/expected.html
index f8f8a6c..05afcfc 100644
--- a/test/test-pages/remove-extra-brs/expected.html
+++ b/test/test-pages/remove-extra-brs/expected.html
@@ -1,16 +1,13 @@
-<div>
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
- tempor incididunt ut labore et dolore magna aliqua.</p>
- <p><p>Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat.</p><p>Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
- </p></div><div>
- <p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat.</p>
- <p>Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
- </div> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <div>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+ <p>
+ <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+ </p>
+ <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </div>
+ <div>
+ <p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+ <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </div>
+</div> \ No newline at end of file
diff --git a/test/test-pages/remove-extra-paragraphs/expected.html b/test/test-pages/remove-extra-paragraphs/expected.html
index 0daf4cb..f731d75 100644
--- a/test/test-pages/remove-extra-paragraphs/expected.html
+++ b/test/test-pages/remove-extra-paragraphs/expected.html
@@ -1,23 +1,11 @@
-<div>
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
- tempor incididunt ut labore et dolore magna aliqua.</p>
-
- <p>Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat.</p>
-
- <p></p>
- <p>Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-
- </div><div>
- <p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat.</p>
-
- <p>Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-
- </div> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <div>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
+ <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+ <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </div>
+ <div>
+ <p>Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
+ <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </div>
+</div> \ No newline at end of file
diff --git a/test/test-pages/reordering-paragraphs/expected.html b/test/test-pages/reordering-paragraphs/expected.html
index 4a46dd5..7d15fcc 100644
--- a/test/test-pages/reordering-paragraphs/expected.html
+++ b/test/test-pages/reordering-paragraphs/expected.html
@@ -1,26 +1,5 @@
-<div>
- <p id="first">Regarding item# 11111, under sufficiently extreme conditions, quarks may
- become deconfined and exist as free particles. In the course of asymptotic
- freedom, the strong interaction becomes weaker at higher temperatures.
- Eventually, color confinement would be lost and an extremely hot plasma
- of freely moving quarks and gluons would be formed. This theoretical phase
- of matter is called quark-gluon plasma.[81] The exact conditions needed
- to give rise to this state are unknown and have been the subject of a great
- deal of speculation and experimentation.</p>
- <p id="second">Regarding item# 22222, under sufficiently extreme conditions, quarks may
- become deconfined and exist as free particles. In the course of asymptotic
- freedom, the strong interaction becomes weaker at higher temperatures.
- Eventually, color confinement would be lost and an extremely hot plasma
- of freely moving quarks and gluons would be formed. This theoretical phase
- of matter is called quark-gluon plasma.[81] The exact conditions needed
- to give rise to this state are unknown and have been the subject of a great
- deal of speculation and experimentation.</p>
- <p id="third">Regarding item# 33333, under sufficiently extreme conditions, quarks may
- become deconfined and exist as free particles. In the course of asymptotic
- freedom, the strong interaction becomes weaker at higher temperatures.
- Eventually, color confinement would be lost and an extremely hot plasma
- of freely moving quarks and gluons would be formed. This theoretical phase
- of matter is called quark-gluon plasma.[81] The exact conditions needed
- to give rise to this state are unknown and have been the subject of a great
- deal of speculation and experimentation.</p>
- <br id="br2"></br></div> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <p id="first">Regarding item# 11111, under sufficiently extreme conditions, quarks may become deconfined and exist as free particles. In the course of asymptotic freedom, the strong interaction becomes weaker at higher temperatures. Eventually, color confinement would be lost and an extremely hot plasma of freely moving quarks and gluons would be formed. This theoretical phase of matter is called quark-gluon plasma.[81] The exact conditions needed to give rise to this state are unknown and have been the subject of a great deal of speculation and experimentation.</p>
+ <p id="second">Regarding item# 22222, under sufficiently extreme conditions, quarks may become deconfined and exist as free particles. In the course of asymptotic freedom, the strong interaction becomes weaker at higher temperatures. Eventually, color confinement would be lost and an extremely hot plasma of freely moving quarks and gluons would be formed. This theoretical phase of matter is called quark-gluon plasma.[81] The exact conditions needed to give rise to this state are unknown and have been the subject of a great deal of speculation and experimentation.</p>
+ <p id="third">Regarding item# 33333, under sufficiently extreme conditions, quarks may become deconfined and exist as free particles. In the course of asymptotic freedom, the strong interaction becomes weaker at higher temperatures. Eventually, color confinement would be lost and an extremely hot plasma of freely moving quarks and gluons would be formed. This theoretical phase of matter is called quark-gluon plasma.[81] The exact conditions needed to give rise to this state are unknown and have been the subject of a great deal of speculation and experimentation.</p>
+ <br id="br2"/> </div> \ No newline at end of file
diff --git a/test/test-pages/replace-brs/expected-metadata.json b/test/test-pages/replace-brs/expected-metadata.json
index 79bf997..9654255 100644
--- a/test/test-pages/replace-brs/expected-metadata.json
+++ b/test/test-pages/replace-brs/expected-metadata.json
@@ -2,5 +2,5 @@
"title": "Replace brs test",
"byline": null,
"excerpt": "Lorem ipsum",
- "readerable": false
+ "readerable": true
}
diff --git a/test/test-pages/replace-brs/expected.html b/test/test-pages/replace-brs/expected.html
index ba2d4fd..89bdf3f 100644
--- a/test/test-pages/replace-brs/expected.html
+++ b/test/test-pages/replace-brs/expected.html
@@ -1,14 +1,11 @@
-<div><p>
- Lorem ipsum</p><p>dolor sit</p><p>amet, consectetur adipisicing elit, sed do eiusmod
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
- </p></div><div><p>
- Tempor</p><p>incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
- </p></div> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <div>
+ <p style="display: inline;" class="readability-styled"> Lorem ipsum</p>
+ <p style="display: inline;" class="readability-styled">dolor sit</p>
+ <p> amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
+ </div>
+ <div>
+ <p style="display: inline;" class="readability-styled"> Tempor</p>
+ <p>incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. </p>
+ </div>
+</div> \ No newline at end of file
diff --git a/test/test-pages/replace-font-tags/expected.html b/test/test-pages/replace-font-tags/expected.html
index 52a5cf3..9d6025c 100644
--- a/test/test-pages/replace-font-tags/expected.html
+++ b/test/test-pages/replace-font-tags/expected.html
@@ -7,7 +7,7 @@
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
-
+ <h2>Foo</h2>
<p>
Tempor incididunt ut labore et <span face="Arial" size="2">dolore</span> magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
diff --git a/test/test-pages/rtl-1/expected.html b/test/test-pages/rtl-1/expected.html
index 504990b..eba1686 100644
--- a/test/test-pages/rtl-1/expected.html
+++ b/test/test-pages/rtl-1/expected.html
@@ -1,6 +1,4 @@
-<div id="readability-page-1" class="page">
- <div>
- <article>
+<div><article>
<p>
Lorem ipsum dolor sit amet.
</p>
@@ -10,6 +8,4 @@
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
- </article>
- </div>
-</div>
+ </article></div> \ No newline at end of file
diff --git a/test/test-pages/rtl-2/expected.html b/test/test-pages/rtl-2/expected.html
index 504990b..eba1686 100644
--- a/test/test-pages/rtl-2/expected.html
+++ b/test/test-pages/rtl-2/expected.html
@@ -1,6 +1,4 @@
-<div id="readability-page-1" class="page">
- <div>
- <article>
+<div><article>
<p>
Lorem ipsum dolor sit amet.
</p>
@@ -10,6 +8,4 @@
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
- </article>
- </div>
-</div>
+ </article></div> \ No newline at end of file
diff --git a/test/test-pages/rtl-3/expected.html b/test/test-pages/rtl-3/expected.html
index a6c5783..eba1686 100644
--- a/test/test-pages/rtl-3/expected.html
+++ b/test/test-pages/rtl-3/expected.html
@@ -1,6 +1,4 @@
-<div id="readability-page-1" class="page">
- <div dir="rtl">
- <article>
+<div><article>
<p>
Lorem ipsum dolor sit amet.
</p>
@@ -10,6 +8,4 @@
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
- </article>
- </div>
-</div>
+ </article></div> \ No newline at end of file
diff --git a/test/test-pages/rtl-4/expected.html b/test/test-pages/rtl-4/expected.html
index 0bb35c0..14724e7 100644
--- a/test/test-pages/rtl-4/expected.html
+++ b/test/test-pages/rtl-4/expected.html
@@ -1,6 +1,4 @@
-<div id="readability-page-1" class="page">
- <div>
- <article dir="rtl">
+<div><article dir="rtl">
<p>
Lorem ipsum dolor sit amet.
</p>
@@ -10,6 +8,4 @@
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
- </article>
- </div>
-</div>
+ </article></div> \ No newline at end of file
diff --git a/test/test-pages/salon-1/expected-metadata.json b/test/test-pages/salon-1/expected-metadata.json
index 1f72535..02cb664 100644
--- a/test/test-pages/salon-1/expected-metadata.json
+++ b/test/test-pages/salon-1/expected-metadata.json
@@ -1,5 +1,5 @@
{
- "title": "The sharing economy is a lie: Uber, Ayn Rand and the truth about tech and libertarians",
+ "title": "The sharing economy is a lie: Uber, Ayn Rand and the truth about tech\n and libertarians",
"byline": "Joanna Rothkopf",
"excerpt": "Disruptive companies talk a good game about sharing. Uber's really just an under-regulated company making riches",
"readerable": true
diff --git a/test/test-pages/salon-1/expected.html b/test/test-pages/salon-1/expected.html
index d8d3029..17b346a 100644
--- a/test/test-pages/salon-1/expected.html
+++ b/test/test-pages/salon-1/expected.html
@@ -13,7 +13,7 @@
Central Business District or “CBD.” In the process he put up an Islamic
flag – “igniting,” as <a href="http://www.reuters.com/article/2014/12/15/us-australia-security-idUSKBN0JS0WX20141215">Reuters</a> reported,
“fears of a jihadist attack in the heart of the country’s biggest city.”</p><p>In the midst of the fear, Uber stepped in and tweeted this announcement: 
- <span style="font-size: 13px;">“We are all concerned with events in CBD. Fares have increased to encourage
+ <span>“We are all concerned with events in CBD. Fares have increased to encourage
more drivers to come online &amp; pick up passengers in the area.”</span>
</p><p>As <a href="http://mashable.com/2014/12/14/uber-sydney-surge-pricing/">Mashable </a>reports,
the company announced that it would charge a minimum of $100 Australian
diff --git a/test/test-pages/social-buttons/expected.html b/test/test-pages/social-buttons/expected.html
index 3810cde..63fabd5 100644
--- a/test/test-pages/social-buttons/expected.html
+++ b/test/test-pages/social-buttons/expected.html
@@ -1,33 +1,9 @@
-<article class="main-content">
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
- <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
- tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
- quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
- consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
- cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
- proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
- </article> \ No newline at end of file
+<div id="readability-page-1" class="page">
+ <article class="main-content">
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
+ </article>
+</div> \ No newline at end of file
diff --git a/test/test-pages/style-tags-removal/expected.html b/test/test-pages/style-tags-removal/expected.html
index 6c26308..d3a8806 100644
--- a/test/test-pages/style-tags-removal/expected.html
+++ b/test/test-pages/style-tags-removal/expected.html
@@ -7,7 +7,7 @@
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
-
+ <h2>Foo</h2>
<p>
Tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
diff --git a/test/test-pages/svg-parsing/expected.html b/test/test-pages/svg-parsing/expected.html
index 1cc4559..1112299 100644
--- a/test/test-pages/svg-parsing/expected.html
+++ b/test/test-pages/svg-parsing/expected.html
@@ -11,7 +11,7 @@ quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
-<svg height="50" style="position: absolute;" version="1.1" viewbox="0 0 50 50" width="50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><clippath id="hex-mask-large"><polygon points="15,35 10,35 10,0 10,0 45,0 45,35 45,35 25,35 15,43"></polygon></clippath><clippath id="hex-mask-small"><polygon points="5,1 5,16 3,23 10,20 24,20 24,1"></polygon></clippath></g></svg><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
+<svg height="50" version="1.1" viewbox="0 0 50 50" width="50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><clippath id="hex-mask-large"><polygon points="15,35 10,35 10,0 10,0 45,0 45,35 45,35 25,35 15,43"></polygon></clippath><clippath id="hex-mask-small"><polygon points="5,1 5,16 3,23 10,20 24,20 24,1"></polygon></clippath></g></svg><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
diff --git a/test/test-pages/tmz-1/expected.html b/test/test-pages/tmz-1/expected.html
index 21ed790..13e7aff 100644
--- a/test/test-pages/tmz-1/expected.html
+++ b/test/test-pages/tmz-1/expected.html
@@ -1,6 +1,6 @@
<div class="post single-post" id="post-2015_02_26_lupita-nyongo-pearl-dress-stolen-oscars">
<p>
-
+ <h2 class="hf1">Lupita Nyong'o</h2>
<h4 class="hf2">$150K Pearl Oscar Dress ... STOLEN!!!!</h4>
diff --git a/test/test-pages/webmd-1/expected-metadata.json b/test/test-pages/webmd-1/expected-metadata.json
index e69de29..4ceddcf 100644
--- a/test/test-pages/webmd-1/expected-metadata.json
+++ b/test/test-pages/webmd-1/expected-metadata.json
@@ -0,0 +1,6 @@
+{
+ "title": "Babies Who Eat Peanuts Early May Avoid Allergy",
+ "byline": "By Brenda Goodman, MA\n WebMD Health News",
+ "excerpt": "Life-threatening peanut allergies have mysteriously been on the rise in the past decade, with little hope for a cure. But a groundbreaking new study may offer a way to stem that rise, while another may offer some hope for those who are already allergic.",
+ "readerable": true
+}
diff --git a/test/test-pages/webmd-1/expected.html b/test/test-pages/webmd-1/expected.html
index 285dc79..7f63a10 100644
--- a/test/test-pages/webmd-1/expected.html
+++ b/test/test-pages/webmd-1/expected.html
@@ -4,8 +4,8 @@
- <p></p>
- <h3></h3>
+
+
<p>Feb. 23, 2015 -- Life-threatening peanut allergies have mysteriously been
diff --git a/test/test-pages/webmd-1/source.html b/test/test-pages/webmd-1/source.html
index 79cc6f5..0b50ccc 100644
--- a/test/test-pages/webmd-1/source.html
+++ b/test/test-pages/webmd-1/source.html
@@ -1,6 +1,6 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" class="no-js">
-
+
<head>
<title>Babies Who Eat Peanuts Early May Avoid Allergy</title>
<meta http-equiv="X-UA-Compatible"
@@ -33,7 +33,7 @@
<link rel="alternate" type="application/rss+xml" title="RSS" href="http://rssfeeds.webmd.com/rss/rss.aspx?RSSSource=RSS_PUBLIC"/>
<link rel="alternate" media="only screen and (max-width: 640px)" href="http://www.m.webmd.com/allergies/news/20150220/child-peanut-allergy-findings"/>
<script language="javascript1.2" type="text/javascript">
- <!--
+ <!--
var center="health"; var center_name="Allergies"; var center_id=893; var center_prefix="www"; var center_url="/allergies/default.htm";//-->
</script>
<meta http-equiv="CACHE-CONTROL" content="NO-CACHE"/>
@@ -63,7 +63,7 @@
<script language="javascript" type="text/javascript" src="http://img.webmd.com/dtmcms/live/webmd/PageBuilder_Assets/JS/modules/answers3_promo17.js"></script>
<script language="javascript" type="text/javascript" src="http://img.webmd.com/dtmcms/live/webmd/PageBuilder_Assets/JS/hover-reg32.js"></script>
</head>
-
+
<body>
<div id="centering_area">
<div id="page_area">
@@ -115,7 +115,7 @@
<ul id="searchTypeahead_fmt" aria-live="assertive"></ul>
</div>
<div id="lln-srchbarlnks"><a onclick="return sl(this,'','lln-srchbarlnks_schk')" class="lln-symptoms"
- href="http://www.webmd.com/symptoms/default.htm">Symptoms</a><span class="pipe">|</span>
+ href="http://www.webmd.com/symptoms/default.htm">Symptoms</a><span class="pipe">|</span>
<a
onclick="return sl(this,'','lln-srchbarlnks_phyd')" class="lln-doctors"
href="http://doctor.webmd.com/home">Doctors</a><span class="pipe">|</span> <a onclick="return sl(this,'','lln-srchbarlnks_hins')"
@@ -207,7 +207,7 @@
</div>
<div id="nav_1_6">
<p>WebMD Pain Coach</p><a href="http://www.webmd.com/webmdpaincoachapp" onclick="return sl(this,'','hicb1-app_1')"
- class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/50x50_pain_app.jpg" alt="WebMD pain app"/></a>
+ class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/50x50_pain_app.jpg" alt="WebMD pain app"/></a>
<a
href="http://www.webmd.com/webmdpaincoachapp" onclick="return sl(this,'','hicb1-app_1')">Track your pain levels, triggers, and treatments. Set goals and get tips
with our app for iPhone.</a>
@@ -286,7 +286,7 @@
</div>
<div id="nav_2_4">
<p>WebMD Mobile Drug Information App</p><a href="http://www.webmd.com/webmdapp"
- onclick="return sl(this,'','hicb2-app_1')" class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/50x50_webmd_mobile_app.png" alt="WebMD logo"/></a>
+ onclick="return sl(this,'','hicb2-app_1')" class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/50x50_webmd_mobile_app.png" alt="WebMD logo"/></a>
<a
href="http://www.webmd.com/webmdapp" onclick="return sl(this,'','hicb2-app_1')">Drug, supplement, and vitamin information on the go.</a>
</div>
@@ -380,7 +380,7 @@
</div>
<div id="nav_3_4">
<p>WebMD Allergy App for iPhone</p><a href="http://www.webmd.com/allergy-app"
- onclick="return sl(this,'','hicb3-app_1')" class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/article_thumbnails/other/allergy_app_other/50x50_allergy_app_other.jpg" alt="WebMD Allergy App logo"/></a>
+ onclick="return sl(this,'','hicb3-app_1')" class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/article_thumbnails/other/allergy_app_other/50x50_allergy_app_other.jpg" alt="WebMD Allergy App logo"/></a>
<a
href="http://www.webmd.com/allergy-app" onclick="return sl(this,'','hicb3-app_1')">Fight allergies with daily forecasts, local alerts, and personalized tips.</a>
</div>
@@ -408,7 +408,7 @@
<div id="nav_4_2">
<p>Family and Pregnancy Centers</p>
<div class="third right_border"><a href="http://www.webmd.com/baby" onclick="return sl(this,'','hicb4-cpg_1')"
- class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_family_pregnancy.png" alt="pregnant woman"/></a>
+ class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_family_pregnancy.png" alt="pregnant woman"/></a>
<a
href="http://www.webmd.com/baby" onclick="return sl(this,'','hicb4-cpg_1')"
class="heading">Pregnancy</a>
@@ -425,7 +425,7 @@
</ul>
</div>
<div class="third right_border"><a href="http://www.webmd.com/parenting/default.htm" onclick="return sl(this,'','hicb4-cpt_1')"
- class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_family_parenting.png" alt="mom, dad, and baby"/></a>
+ class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_family_parenting.png" alt="mom, dad, and baby"/></a>
<a
href="http://www.webmd.com/parenting/default.htm" onclick="return sl(this,'','hicb4-cpt_1')"
class="heading">Parenting</a>
@@ -442,7 +442,7 @@
</ul>
</div>
<div class="third"><a href="http://www.webmd.com/pets/default.htm" onclick="return sl(this,'','hicb4-cpet_1')"
- class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_family_pets.png" alt="Cat and dog on grass"/></a>
+ class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_family_pets.png" alt="Cat and dog on grass"/></a>
<a
href="http://www.webmd.com/pets/default.htm" onclick="return sl(this,'','hicb4-cpet_1')"
class="heading">Pets</a>
@@ -478,7 +478,7 @@
</div>
<div id="nav_4_4">
<p>WebMD Pregnancy App for iPhone</p><a href="http://www.webmd.com/pregnancyapp"
- onclick="return sl(this,'','hicb4-app_1')" class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/article_thumbnails/other/pregnancy_app_other/50x50_pregnancy_app_other.jpg" alt="WebMD Pregnancy App logo"/></a>
+ onclick="return sl(this,'','hicb4-app_1')" class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/article_thumbnails/other/pregnancy_app_other/50x50_pregnancy_app_other.jpg" alt="WebMD Pregnancy App logo"/></a>
<a
href="http://www.webmd.com/pregnancyapp" onclick="return sl(this,'','hicb4-app_1')">The big day is coming! Get organized and track baby's weekly development.</a>
</div>
@@ -493,12 +493,12 @@
<div id="nav_5_1">
<p>News</p><span><a href="http://www.webmd.com/news/default.htm" onclick="return sl(this,'','hicb5-news_more')">View All</a></span>
<div
- class="nav_block hide_link" id="pb29"><a href="http://www.webmd.com/news/default.htm" class="nav_image" onclick="return sl(this,'','hicb5-news_1')"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_webmd_1.jpg" alt="WebMD logo"/></a>
+ class="nav_block hide_link" id="pb29"><a href="http://www.webmd.com/news/default.htm" class="nav_image" onclick="return sl(this,'','hicb5-news_1')"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_webmd_1.jpg" alt="WebMD logo"/></a>
<a
href="http://www.webmd.com/news/default.htm" onclick="return sl(this,'','hicb5-news_1')"
class="shorter">Today's Top Health Headlines</a>
</div>
- <div class="nav_block hide_link" id="pb30"><a href="http://www.webmd.com/news/default.htm" class="nav_image" onclick="return sl(this,'','hicb5-news_2')"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_webmd_1.jpg" alt="WebMD logo"/></a>
+ <div class="nav_block hide_link" id="pb30"><a href="http://www.webmd.com/news/default.htm" class="nav_image" onclick="return sl(this,'','hicb5-news_2')"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/110x70_webmd_1.jpg" alt="WebMD logo"/></a>
<a
href="http://www.webmd.com/news/default.htm" onclick="return sl(this,'','hicb5-news_2')"
class="shorter">Get the Latest Drug Approvals &amp; Alerts</a>
@@ -544,7 +544,7 @@
</div>
<div id="nav_5_4">
<p>WebMD Newsletters</p><a href="https://member.webmd.com/newsletters/newsletters.aspx"
- onclick="return sl(this,'','hicb5-nwsltr_1')" class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/50x50_newsletter.png" alt="closeup of newsletter"/></a>
+ onclick="return sl(this,'','hicb5-nwsltr_1')" class="nav_image"><img src="http://img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images/modules/masthead_test/50x50_newsletter.png" alt="closeup of newsletter"/></a>
<a
href="https://member.webmd.com/newsletters/newsletters.aspx" onclick="return sl(this,'','hicb5-nwsltr_1')">Sign up to receive WebMD's award-winning content delivered to your inbox.</a>
</div>
@@ -607,7 +607,7 @@
<span
class="bc_2"> <a href="http://www.webmd.com/allergies/news/default.htm" onclick="return sl(this,'','brdcrmb');"
- class="breadcrumbActive">Allergies News</a>
+ class="breadcrumbActive">Allergies News</a>
</span>
</div>
<div id="headerLinks_email" class="headerLinks_fmt"> <a href="#" title="Email this page to a friend" class="triggerEmailOverlay"
@@ -681,7 +681,7 @@
/* :: 2015.02.04 rewrite :: */
// Create array(s) of the ID's to add the Tools module to
var s_topic = s_topic || "", s_business_reference = s_business_reference || "", s_publication_source = s_publication_source ||"", s_channel_health = s_channel_health || "", cssBlockOverride = ['Glossary', 'Nav - A-Z page', 'TOC', 'TOC - Channel', 'TOC - Guide', 'TOC - Mini-Center Topic', 'WebMD Image Collection'], sTopicException = ['7002','7006','7022','7023','7024'];
-
+
//if the s_publication_source is !== to the array OR s_business_reference is !== to the array OR s_channel_health is === to the array
if ( cssBlockOverride.indexOf(s_publication_source) === -1 || ssBlockOverride.indexOf(s_business_reference) === -1 || s_channel_health === 'Health Insurance and Medicare') {
// if the s_topic ID's first number is not equal to 7 OR the s_topic ID is == the array AND s_business_reference != the array
@@ -725,15 +725,15 @@
<div class="pop_toolst_bot_fmt"></div>
</div>
<script type="text/javascript">
- if (window.$) {
+ if (window.$) {
$(document).ready(function() {
// produce array from value(s) of 'secTopId'
var mySplitResultsecTopId = secTopId.split("|");
var wloop = mySplitResultsecTopId.length;
var sTopicException = ['7002','7006','7022','7023','7024'];
- // Hides the Pop Tools list on pages with a sensitive secondary topic id.
+ // Hides the Pop Tools list on pages with a sensitive secondary topic id.
// Updated 2015.02.04 by David Ware
- for (i = 0; i < wloop; i++) {
+ for (i = 0; i &lt; wloop; i++) {
// if this is a sensitive topic and the topicId is not in the list
if (mySplitResultsecTopId[i].substring(0,1) === '7' && sTopicException.indexOf(mySplitResultsecTopId[i]) === -1){
$('.pop_toolst_rdr').css('display','none');
@@ -866,7 +866,7 @@
<script type="text/javascript">
var pagination_title=new Array();
var pagination_current=1;
-
+
pagination_title[1]="";
pagination_title[2]="A Change in Guidelines? continued...";
pagination_title[3]="Gathering Evidence";
@@ -916,7 +916,7 @@
var interstitial = window.open("/privacy_window.html","privacy_window","width=325,height=175,resizable=no,toolbar=no,left=350,top=300");
if (interstitial) {
interstitial.focus();
-
+
}
return false;
}
@@ -932,9 +932,9 @@
function getPubType() {
return "editorial";
}
-
+
function checkPartners(){
-
+
/* Array of Partner Names */
var partnerNames=[
"Good Housekeeping",
@@ -966,7 +966,7 @@
"Elle",
"Woman's Day"
]
-
+
/* Array of names that go with files in partners node */
var partnerScripts=[
"goodHousekeeping",
@@ -998,38 +998,38 @@
"elle",
"womansDay"
]
-
+
/* Variables for whether a partner exists and which one in the array it is */
var isThere;
var whichOne = -1;
-
+
/* Pulls the pub source out of the XML */
var pubSource = 'WebMD Medical News';
-
+
/* Runs through the different partners and sees if one of them exists in the pub source */
- for (var i=0; i <= partnerNames.length-1; i++) { isThere = pubSource.search(partnerNames[i]); if (isThere != -1) {whichOne = i} }
-
+ for (var i=0; i &lt;= partnerNames.length-1; i++) { isThere = pubSource.search(partnerNames[i]); if (isThere != -1) {whichOne = i} }
+
/* If it found one, makes the JS calls and also populates the correct divs with the files out of partners node */
if (whichOne != -1) {
-
+
var JSCall = 'ht' + 'tp://img.web' + 'md.com/dtmcms/live/webmd/consumer_assets/site_images/javascript/partners/' + partnerScripts[whichOne] + '.js';
-
+
var JSElement = document.createElement("script");
JSElement.type = "text/javascript";
JSElement.src = JSCall;
-
+
document.getElementsByTagName("head")[0].appendChild(JSElement);
-
+
var moduleCenter = "ContentPane8";
var moduleRight = "ContentPane25";
-
+
addLoadEvent(function() {
$('#'+moduleCenter).append(writePartnerCenter());
$('#'+moduleRight).prepend(writePartnerRight());
})
}
}
-
+
checkPartners();
</script>
<script type="text/javascript">
@@ -1093,22 +1093,22 @@
<script type="text/javascript">
function moveMustSeeArticles() {
/* make the swap function available internally */
- function doSwap() {
+ function doSwap() {
/* get must-see articles, remove from the DOM */
var msa = $('#mainContentContainer_area .related_reading_rdr').clone();
$('#mainContentContainer_area .related_reading_rdr').remove();
-
+
/* get the pagination if it exists */
var pagination = $('.attribution_rdr .pagination_fmt');
var contextual = $('.other_context_links_rdr');
var article = $('.article_rdr');
-
+
/* certain pages use another format:
// the top picks module is in .related_wrapper .dyn_related
// as the second div with this class.
// it has an id, unlike the other div */
var dyn_related = $('.related_wrapper .dyn_related[id]');
-
+
/* if dyn_related, it is handled one way */
if(dyn_related.html()) {
/* on last page, .related_wrapper is displayed and "Top Picks" should stay
@@ -1133,14 +1133,14 @@
$(article).after(msa);
}
}
-
+
/* show */
$('#mainContentContainer_area .related_reading_rdr').show();
-
+
}
-
-
-
+
+
+
/* do the swap unless the function getPubType exists and returns the value 'third_party', unless it is Healthy Day content */
if (s_publication_source = 'WebMD News from HealthDay'){
doSwap();
@@ -1150,15 +1150,15 @@
doSwap();
}
}
- if (window.$) {
+ if (window.$) {
moveMustSeeArticles();
$('.share_rdr').hide();
}
-
- $(document).ready(function()
+
+ $(document).ready(function()
{
$('.related_wrapper').css('display','block');
- $('.dyn_related').css('padding-top','0px');
+ $('.dyn_related').css('padding-top','0px');
});
</script>
</div>
@@ -1178,27 +1178,27 @@
</script>
<script>
// self executing function for scope
- (function() {
+ (function() {
var isDFP;
-
+
isDFP = true;
-
-
+
+
// Moving the ad up into the article:
// Finds all possible locations to insert, moves the ad location up into the article, before handling the Ad Seed Call
-
+
// Updates Paragraphs
$(".article_rdr p").each(function() {
$(this).addClass("node");
});
-
-
+
+
// Updates Unordered Lists
$(".article_rdr .copyNormal ul").each(function() {
$(this).addClass("node");
});
-
-
+
+
//Removes nodes from paragraphs where it shouldnt be?
$(".article_rdr .share_bar p").each(function() {
$(this).removeClass("node");
@@ -1224,10 +1224,10 @@
$(".article_rdr .copyNormal table ul").each(function() {
$(this).removeClass("node");
});
-
- // Finds the number of paragraphs / List items within the article.
+
+ // Finds the number of paragraphs / List items within the article.
sbposition = ($('.article_rdr .node').length);
-
+
//Is this Healthwise Content??
if (s_publication_source.indexOf("Healthwise") != -1) {
//Healthwise Steps, if different;
@@ -1251,16 +1251,16 @@
if (sbposition == 4) {
$('#remoteAd_rdr').insertAfter('.node:eq(3)');
}
- //End else
+ //End else
}
-
-
+
+
setTimeout(function() {
var iframeURLOutOfPB = 'http://as.webmd.com/html.ng/transactionID=442451382&tile=365904714&tug=2321&pug=__&site=2&affiliate=20&hcent=893&scent=&pos=113&xpg=1625&sec=&amp;au1=&au2=&uri=%2fallergies%2fnews%2f20150220%2fchild-peanut-allergy-findings&artid=091e9c5e810fb2ee&inst=0&amp;leaf=&segm=0&cc=17&tmg=&bc=_age121_l23_age122_j30_t780_&mcent=&micro=';
-
+
var cleanIframeURL = iframeURLOutOfPB.replace(/&amp;/g, '&');
-
-
+
+
var ad = {
adLocation: 'remote',
adURL: cleanIframeURL,
@@ -1268,20 +1268,20 @@
tile: '365904714',
pos: '5000'
};
-
+
// check to make sure this seed call functionality exists, if it does, dooo it
if (webmd.object.exists('//webmd.ads.handleAdSeedCall')) {
if(!isDFP){
webmd.ads.handleAdSeedCall(ad);
}
-
+
setTimeout(function() {
updateRemoteAd();
}, 2000);
}
}, 2000);
-
-
+
+
function updateRemoteAd() {
$('.chapterList_fmt #remoteAd_rdr').css('position', 'relative');
$('.chapterList_fmt #remoteAd_rdr').css('left', '-14px');
@@ -1291,7 +1291,7 @@
$('#remoteAd_rdr').css('display', 'block');
}
}
-
+
})();
</script>
<script type="text/javascript">
@@ -1395,45 +1395,45 @@
</div>
<script type="text/javascript">
var chapters = [
- 'http://www.webmd.com/allergies/guide/default.htm',
-
+ 'http://www.webmd.com/allergies/guide/default.htm',
+
'http://www.webmd.com/allergies/guide/allergies-overview',
-
+
'http://www.webmd.com/allergies/guide/allergy-symptoms-types',
-
+
'http://www.webmd.com/allergies/guide/allergies-diagnosis-tests',
-
+
'http://www.webmd.com/allergies/guide/allergies-treatment-care',
-
+
'http://www.webmd.com/allergies/guide/allergies-living-managing',
-
+
'http://www.webmd.com/allergies/guide/allergies-support-resources',
'',''];
-
-
+
+
var c1_1 = [
'http://www.webmd.com/allergies/guide/allergy-basics',
'http://www.webmd.com/allergies/guide/eye-allergies-1',
'http://www.webmd.com/allergies/guide/chronic-allergies-causes',];
-
+
var c1_2 = [
'http://www.webmd.com/allergies/guide/allergic-reaction-causes',
'http://www.webmd.com/allergies/guide/allergy-triggers',
'http://www.webmd.com/allergies/guide/nasal-polyps-symptoms-and-treatments'];
-
+
var c1_3 = [
'http://www.webmd.com/allergies/guide/who-gets-allergies'];
-
+
var c1_4 = [
'http://www.webmd.com/allergies/guide/allergy-prevention',
'http://www.webmd.com/allergies/guide/neti-pot-nasal-irrigation-pros-and-cons'];
-
+
var c1_5 = [
'http://www.webmd.com/allergies/guide/asthma-allergies',
'http://www.webmd.com/allergies/guide/sleep-and-allergies',
'http://www.webmd.com/allergies/guide/allergies-sinusitis',
'http://www.webmd.com/allergies/guide/anaphylaxis'];
-
+
var c2_1 = [
'http://www.webmd.com/allergies/guide/food-allergy-intolerances',
'http://www.webmd.com/allergies/guide/milk-allergy',
@@ -1445,17 +1445,17 @@
'http://www.webmd.com/allergies/guide/sulfite-sensitivity',
'http://www.webmd.com/allergies/guide/soy-allergy',
'http://www.webmd.com/allergies/guide/casein-allergy-overview'];
-
+
var c2_2 = [
'http://www.webmd.com/allergies/guide/spring-allergies',
'http://www.webmd.com/allergies/guide/summer-allergies',
'http://www.webmd.com/allergies/guide/fall-allergy-relief',
'http://www.webmd.com/allergies/guide/winter-allergies'];
-
+
var c2_3 = [
'http://www.webmd.com/allergies/guide/dog-allergies',
'http://www.webmd.com/allergies/guide/cat-allergies'];
-
+
var c2_4 = [
'http://www.webmd.com/allergies/guide/understanding-hay-fever-basics',
'http://www.webmd.com/allergies/guide/conjunctivitis',
@@ -1472,17 +1472,17 @@
'http://www.webmd.com/allergies/guide/dust-allergies',
'http://www.webmd.com/allergies/guide/chemical-allergies',
'http://www.webmd.com/allergies/guide/penicillin-allergy-topic-overview'];
-
+
var c3_1 = [
'http://www.webmd.com/allergies/guide/allergies-doctor-exam',
'http://www.webmd.com/allergies/guide/food-allergy-testing',
'http://www.webmd.com/allergies/guide/food-allergy-symptom-diary',
'http://www.webmd.com/allergies/guide/allergies-elimination-diet'];
-
+
var c3_2 = [
'http://www.webmd.com/allergies/guide/skin-test',
'http://www.webmd.com/allergies/guide/blood-test'];
-
+
var c4 = [
'http://www.webmd.com/allergies/guide/allergy-medications',
'http://www.webmd.com/allergies/guide/antihistamines-for-allergies',
@@ -1496,65 +1496,65 @@
'http://www.webmd.com/allergies/guide/skin-allergies',
'http://www.webmd.com/allergies/guide/dehumidifiers-for-allergies',
'http://www.webmd.com/allergies/guide/allergies-when-to-use-auto-injector'];
-
+
var c5 = [
'http://www.webmd.com/allergies/guide/allergic-reaction-home-treatment-options',
'http://www.webmd.com/allergies/guide/food-diary-helping-uncover-food-allergy-triggers',
'http://www.webmd.com/allergies/guide/dust-mite-mattress-and-pillow-covers-for-allergy-relief',
'http://www.webmd.com/allergies/guide/allergy-proof-your-environment',
'http://www.webmd.com/allergies/guide/tips-for-handling-allergies-in-school'];
-
+
var c6 = [
'http://www.webmd.com/allergies/guide/resource',
'http://www.webmd.com/allergies/guide/allergy-suggested-reading',];
</script>
<script type="text/javascript">
function definePage () {
-
+
var parentChapter, tabChapter, s_pagenameCheck;
var subChapter ="1";
var theUrl=location.href;
s_pagenameCheck = theUrl.toLowerCase();
-
+
if (s_pagenameCheck.lastIndexOf("?") > 0) {
var s_pagenameCheck = s_pagenameCheck.substring(0,s_pagenameCheck.lastIndexOf("?"));
- }
-
- if( s_pagenameCheck in oc(chapters) ) {
+ }
+
+ if( s_pagenameCheck in oc(chapters) ) {
parentChapter = s_pagenameCheck;
highlightLeftBin(parentChapter);
highlightCenterBin(parentChapter);
highlightTab();
} else {
-
+
if( s_pagenameCheck in oc(c1_1) ) { parentChapter = chapters[1]; tabChapter = "1";subChapter = "1";}
-
+
if( s_pagenameCheck in oc(c1_2) ) { parentChapter = chapters[1]; tabChapter = "1";subChapter = "2";}
-
+
if( s_pagenameCheck in oc(c1_3) ) { parentChapter = chapters[1]; tabChapter = "1";subChapter = "3";}
-
+
if( s_pagenameCheck in oc(c1_4) ) { parentChapter = chapters[1]; tabChapter = "1";subChapter = "4";}
-
+
if( s_pagenameCheck in oc(c1_5) ) { parentChapter = chapters[1]; tabChapter = "1";subChapter = "5";}
-
+
if( s_pagenameCheck in oc(c2_1) ) { parentChapter = chapters[2]; tabChapter = "2";subChapter = "1";}
-
+
if( s_pagenameCheck in oc(c2_2) ) { parentChapter = chapters[2]; tabChapter = "2";subChapter = "2";}
-
+
if( s_pagenameCheck in oc(c2_3) ) { parentChapter = chapters[2]; tabChapter = "2";subChapter = "3";}
-
+
if( s_pagenameCheck in oc(c2_4) ) { parentChapter = chapters[2]; tabChapter = "2";subChapter = "4";}
-
+
if( s_pagenameCheck in oc(c3_1) ) { parentChapter = chapters[3]; tabChapter = "3";subChapter = "1";}
-
+
if( s_pagenameCheck in oc(c3_2) ) { parentChapter = chapters[3]; tabChapter = "3";subChapter = "2";}
-
+
if( s_pagenameCheck in oc(c4) ) { parentChapter = chapters[3]; tabChapter = "4";}
-
+
if( s_pagenameCheck in oc(c5) ) { parentChapter = chapters[4]; tabChapter = "5";}
-
+
if( s_pagenameCheck in oc(c6) ) { parentChapter = chapters[5]; tabChapter = "6";}
-
+
if ((typeof(parentChapter)!="undefined") & (typeof(tabChapter)!="undefined")) {
highlightLeftBin(parentChapter);
highlightCenterBin(parentChapter);
@@ -1562,7 +1562,7 @@
}
}
}
-
+
definePage();
</script>
<div class="moduleSpacer_rdr"></div>
@@ -1803,7 +1803,7 @@
#allergyappsmsemailgen90 .pane h2 {
font-family: 'Lato', sans-serif;
}
-
+
#allergyappsmsemailgen90 *,
#allergyappsmsemailgen90 *:before,
#allergyappsmsemailgen90 *:after {
@@ -2033,36 +2033,36 @@
module.init({
selector: "#newsletter-mapping-center",
template: {
- successMsg: '<p class="success"><span>{email}</span><br //>You will receive your first newsletter with our next scheduled circulation!</p>',
+ successMsg: '&lt;p class="success">&lt;span>{email}&lt;/span>&lt;br //>You will receive your first newsletter with our next scheduled circulation!&lt;/p>',
content: '' +
- '<div class="newsletterFmt"></div>\n' +
- '<div class="wrapper">\n' +
- '<div class="nls-header">{header}</div>\n' +
+ '&lt;div class="newsletterFmt">&lt;/div>\n' +
+ '&lt;div class="wrapper">\n' +
+ '&lt;div class="nls-header">{header}&lt;/div>\n' +
'{preContent}' +
- '<div class="nls-content">\n' +
+ '&lt;div class="nls-content">\n' +
'{preForm}' +
- '<form class="nls-form" action="#" novalidate="novalidate">\n' +
- '<div class="validationWrapper"><div class="checkbox-container clearfix">{inputs}</div></div>\n' +
- '<div class="privacy-disclaimer">' +
- "<em>By clicking submit I agree to WebMD's <a href='http://www.webmd.com/about-webmd-policies/about-privacy-policy' target='_blank'>Privacy Policy</a></em>" +
- '</div>' +
- '<div class="input-container">\n' +
- '<div class="email-container validationWrapper">\n' +
- '<input type="email" class="nls-email" name="email" autocapitalize="off" autocorrect="off" placeholder="Enter email address" /> ' +
- '<button name="nl-submit" formnovalidate class="off {submitClass}" type="submit"><span>Submit</span></button>\n' +
- '<div class="clearfix"></div>' +
- '</div>\n' + // .email-container
- '</div>\n' + // .input-container
- '</form>\n' +
- '<a class="nl-link" href="https://member.webmd.com/newsletters/newsletters.aspx" onclick="return sl(this,"nw","nl-multie_s")">Sign up for more topics!</a>' +
+ '&lt;form class="nls-form" action="#" novalidate="novalidate">\n' +
+ '&lt;div class="validationWrapper">&lt;div class="checkbox-container clearfix">{inputs}&lt;/div>&lt;/div>\n' +
+ '&lt;div class="privacy-disclaimer">' +
+ "&lt;em>By clicking submit I agree to WebMD's &lt;a href='http://www.webmd.com/about-webmd-policies/about-privacy-policy' target='_blank'>Privacy Policy&lt;/a>&lt;/em>" +
+ '&lt;/div>' +
+ '&lt;div class="input-container">\n' +
+ '&lt;div class="email-container validationWrapper">\n' +
+ '&lt;input type="email" class="nls-email" name="email" autocapitalize="off" autocorrect="off" placeholder="Enter email address" /> ' +
+ '&lt;button name="nl-submit" formnovalidate class="off {submitClass}" type="submit">&lt;span>Submit&lt;/span>&lt;/button>\n' +
+ '&lt;div class="clearfix">&lt;/div>' +
+ '&lt;/div>\n' + // .email-container
+ '&lt;/div>\n' + // .input-container
+ '&lt;/form>\n' +
+ '&lt;a class="nl-link" href="https://member.webmd.com/newsletters/newsletters.aspx" onclick="return sl(this,"nw","nl-multie_s")">Sign up for more topics!&lt;/a>' +
'{postForm}' +
- '</div>\n' + // .nls-content
- '{postContent}' +
- '</div>',
+ '&lt;/div>\n' + // .nls-content
+ '{postContent}' +
+ '&lt;/div>',
submitClass: 'webmd-btn webmd-btn-pr webmd-btn-s',
- successHeader: '<h2>Thank You For Signing Up.</h2>',
- promo: '<div class="promo"><div class="promo-content clearfix"><img src="{image}" alt="WebMD App" /><div class="promo-description"><p>{text}</p><p class="promoLink"><a href="{url}" class="webmd-btn webmd-btn-pr webmd-btn-m" onclick="wmdPageLink(\'nlupgrd_sub\')">{button}</a></p><div class="clearfix"></div></div></div></div>'
-
+ successHeader: '&lt;h2>Thank You For Signing Up.&lt;/h2>',
+ promo: '&lt;div class="promo">&lt;div class="promo-content clearfix">&lt;img src="{image}" alt="WebMD App" />&lt;div class="promo-description">&lt;p>{text}&lt;/p>&lt;p class="promoLink">&lt;a href="{url}" class="webmd-btn webmd-btn-pr webmd-btn-m" onclick="wmdPageLink(\'nlupgrd_sub\')">{button}&lt;/a>&lt;/p>&lt;div class="clearfix">&lt;/div>&lt;/div>&lt;/div>&lt;/div>'
+
}
});
});
@@ -2111,7 +2111,7 @@
(function(){
var module_title = 'hicb f-hs';
var propIsSet = false;
-
+
$(document).bind('before_pv', function(){
if (!propIsSet) {
if (s_md.prop46) {
@@ -2261,12 +2261,12 @@
<script type="text/javascript">
$(function(){
var fileNameToLoad = '//preferences.truste.com/webservices/js?type=webmd&domain=webmd';
-
+
if(webmd.useragent.ua.browser === 'browserSF') {
fileNameToLoad = '//preferences.truste.com/webservices/js?domain=webmdsafari.com&type=webmdsafari&js=2';
}
-
- webmd.load({js:[fileNameToLoad, '//privacy-policy.truste.com/privacy-seal/WebMD,-LLC/asc?rid=f733a173-6d11-4e17-ba9f-f1454ef8b32f']});
+
+ webmd.load({js:[fileNameToLoad, '//privacy-policy.truste.com/privacy-seal/WebMD,-LLC/asc?rid=f733a173-6d11-4e17-ba9f-f1454ef8b32f']});
});
</script>
</div>
@@ -2282,32 +2282,32 @@
href="http://www.webmd.com/www/about-webmd-policies/about-our-sponsors?ss=ftr"
onclick="return sl(this,'','f-about_04');">Sponsor Policy</a> <a href="http://www.webmd.com/www/sitemap?ss=ftr"
onclick="return sl(this,'','f-about_05');">Site Map</a> <a rel="nofollow"
- href="https://careers-webmd.icims.com/" onclick="return sl(this,'','f-about_07')">Careers</a>
+ href="https://careers-webmd.icims.com/" onclick="return sl(this,'','f-about_07')">Careers</a>
<a
class="last" rel="nofollow" href="https://customercare.webmd.com/ics/support/default.asp?deptID=18003&amp;task=ticket"
onclick="return sl(this,'nw','f-about_08');">Contact Us</a>
</div>
- <div class="links"> <a href="http://reference.medscape.com/" onclick="return sl(this,'f-about_11','ftr')">Medscape Reference</a>
+ <div class="links"> <a href="http://reference.medscape.com/" onclick="return sl(this,'f-about_11','ftr')">Medscape Reference</a>
<a
- href="http://www.emedicinehealth.com/script/main/hp.asp" onclick="return sl(this,'f-about_12','ftr')">eMedicineHealth</a> <a href="http://www.rxlist.com/" onclick="return sl(this,'f-about_13','ftr')">RxList</a>
+ href="http://www.emedicinehealth.com/script/main/hp.asp" onclick="return sl(this,'f-about_12','ftr')">eMedicineHealth</a> <a href="http://www.rxlist.com/" onclick="return sl(this,'f-about_13','ftr')">RxList</a>
<a
- href="http://www.medscape.com/" onclick="return sl(this,'f-about_14','ftr')">Medscape</a> <a href="http://www.medicinenet.com/" onclick="return sl(this,'f-about_15','ftr')">MedicineNet</a>
+ href="http://www.medscape.com/" onclick="return sl(this,'f-about_14','ftr')">Medscape</a> <a href="http://www.medicinenet.com/" onclick="return sl(this,'f-about_15','ftr')">MedicineNet</a>
<a
href="http://www.webmd.boots.com/" onclick="return sl(this,'f-about_26','ftr')">BootsWebMD</a>
<a class="last" rel="nofollow" href="http://www.wbmd.com/"
onclick="return sl(this,'f-about_10','ftr')">WebMD Corporate</a>
</div>
- <div class="links"> <a rel="nofollow" href="http://www.webmdhealthservices.com/" onclick="return sl(this,'f-about_29','ftr')">WebMD Health Services</a>
+ <div class="links"> <a rel="nofollow" href="http://www.webmdhealthservices.com/" onclick="return sl(this,'f-about_29','ftr')">WebMD Health Services</a>
<a
href="http://www.webmd.com/first-aid/default.htm" onclick="return sl(this,'','f-about_17');">First Aid</a> <a href="http://www.webmd.com/www/magazine/default.htm?ss=ftr"
onclick="return sl(this,'','f-about_18');">WebMD Magazine</a> <a href="http://www.webmd.com/www/phr"
onclick="return sl(this,'','f-about_19')">WebMD Health Record</a> <a href="http://www.webmd.com/www/mobile"
onclick="return sl(this,'','f-about_20')">WebMD Mobile</a> <a class="last"
- href="https://member.webmd.com/subscribe" onclick="return sl(this,'','f-about_21')">Newsletters</a>
+ href="https://member.webmd.com/subscribe" onclick="return sl(this,'','f-about_21')">Newsletters</a>
</div>
<div class="links">
-<a href="http://dictionary.webmd.com/default.htm" onclick="return sl(this,'','f-about_22')">Dictionary</a>
+<a href="http://dictionary.webmd.com/default.htm" onclick="return sl(this,'','f-about_22')">Dictionary</a>
<a
class="last" href="http://doctor.webmd.com/home" onclick="return sl(this,'','f-about_23')">Physician Directory</a>
</div>
@@ -2330,15 +2330,15 @@
</script>
<script language="javascript1.2" type="text/javascript">
if (document.URL.substring(0, 5).indexOf('http:') >= 0) {
- document.write('<img src=//bi.medscape.com/pi/global/webmd-1x1.gif?' + new Date().getTime() + '" alt="" height="1" width="1" border="0" />')
+ document.write('&lt;img src=//bi.medscape.com/pi/global/webmd-1x1.gif?' + new Date().getTime() + '" alt="" height="1" width="1" border="0" />')
}
</script>
<script language="javascript" type="text/javascript" src="http://img.webmd.com/dtmcms/live/webmd/PageBuilder_Assets/JS_static/tools/ldcc.js"></script>
<script type="text/javascript">
(function(){
- // duckpunching s_before_pv as some assets are using that vs our event driven system. This lets the event system get triggered as well as the other functions
- var _old = window.s_before_pv;
-
+ // duckpunching s_before_pv as some assets are using that vs our event driven system. This lets the event system get triggered as well as the other functions
+ var _old = window.s_before_pv;
+
window.s_before_pv = function() {
var timestamp = Number(new Date());
if (window.location.protocol === 'http:') {
@@ -2347,7 +2347,7 @@
if (window.location.protocol === 'https:') {
webmd.load({image: '//sb.scorecardresearch.com/b?c1=2&c2=6035829&c3=&c4=&c5=&c6=&c7=' + encodeURIComponent(window.location.href) + '&c9=' + encodeURIComponent(window.document.referrer) + '&c15=&cv=2.0&cj=1&cb='+ timestamp});
}
-
+
_old();
}
if (webmd && webmd.ads2Consumer) {
diff --git a/test/test-pages/webmd-2/expected.html b/test/test-pages/webmd-2/expected.html
index cd4b917..a563cba 100644
--- a/test/test-pages/webmd-2/expected.html
+++ b/test/test-pages/webmd-2/expected.html
@@ -3,9 +3,9 @@
- <p> </p>
- <h3></h3>
+
+ <p> </p>
<p>April 17, 2015 -- Imagine being sick in the hospital with a <a class="" href="http://www.webmd.com/a-to-z-guides/bacterial-and-viral-infections" onclick="return sl(this,'','embd-lnk');">bacterial infection</a> and doctors can't stop it from spreading. This so-called "superbug" scenario is not science fiction. It's an urgent, worldwide worry that is prompting swift action.</p>
<p xmlns:xalan="http://xml.apache.org/xalan">Every year, about 2 million people get sick from a superbug, according to the CDC. About 23,000 die. Earlier this year, an outbreak of CRE (carbapenem-resistant enterobacteriaceae) linked to contaminated medical tools sickened 11 people at two Los-Angeles area hospitals. Two people died, and more than 200 others may have been exposed.</p>
<p>The White House recently released a <a href="http://www.webmd.com/click?url=https://www.whitehouse.gov/sites/default/files/docs/national_action_plan_for_combating_antibotic-resistant_bacteria.pdf" onclick="return sl(this,'','embd-lnk');">comprehensive plan</a> outlining steps to combat drug-resistant bacteria. The plan identifies three "urgent" and several "serious" threats. We asked infectious disease experts to explain what some of them are and when to worry.</p>
diff --git a/test/test-pages/yahoo-1/expected.html b/test/test-pages/yahoo-1/expected.html
index 32e6298..ef97630 100644
--- a/test/test-pages/yahoo-1/expected.html
+++ b/test/test-pages/yahoo-1/expected.html
@@ -1,53 +1,43 @@
-<div id="readability-page-1" class="page">
- <div id="Col1-0-ContentCanvas-Proxy" data-reactid="406">
- <div id="Col1-0-ContentCanvas" class="content-canvas Bgc(#fff) Pos(r) P(20px)--sm Pt(17px)--sm" data-reactid="407">
- <article data-uuid="80b35014-fba3-377e-adc5-47fb44f61fa7" data-type="story" data-reactid="408">
- <figure class="canvas-image Mx(a) canvas-atom Mt(0px) Mt(20px)--sm Mb(24px) Mb(22px)--sm" data-type="image" data-reactid="409">
- <div class="Maw(100%) Pos(r) H(0)" data-reactid="410"><img alt="The PlayStation VR" class="Trsdu(.42s) StretchedBox W(100%) H(100%) ie-7_H(a)" src="http://l1.yimg.com/ny/api/res/1.2/589noY9BZNdmsUUQf6L1AQ--/YXBwaWQ9aGlnaGxhbmRlcjtzbT0xO3c9NzQ0O2g9NjY5/http://media.zenfs.com/en/homerun/feed_manager_auto_publish_494/4406ef57dcb40376c513903b03bef048" data-reactid="411" /></div>
- <div class="Ov(h) Pos(r) Mah(80px)" data-reactid="413">
- <figcaption class="C(#787d82) Fz(13px) Py(5px) Lh(1.5)" title="Sony’s PlayStation VR." data-reactid="414">
- <p class="figure-caption" data-reactid="415">Sony’s PlayStation VR.</p>
- </figcaption>
- </div>
- </figure>
- <div class="canvas-body C(#26282a) Wow(bw) Cl(start) Mb(20px) Fz(15px) Lh(1.6) Ff($ff-secondary)" data-reactid="418">
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="419">Virtual reality has officially reached the consoles. And it’s pretty good! <a href="http://finance.yahoo.com/news/review-playstation-vr-is-comfortable-and-affordable-but-lacks-must-have-games-165053851.html">Sony’s PlayStation VR</a> is extremely comfortable and reasonably priced, and while it’s lacking killer apps, it’s loaded with lots of interesting ones.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="420">But which ones should you buy? I’ve played just about every launch game, and while some are worth your time, others you might want to skip. To help you decide what’s what, I’ve put together this list of the eight PSVR games worth considering.</p>
- <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="421"><a href="https://www.playstation.com/en-us/games/rez-infinite-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Rez Infinite” ($30)</a></h3>
- <p class="iframe-wrapper Pos(r) My(20px) canvas-atom Mt(14px)--sm Mb(0)--sm" data-reactid="422"><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-type="videoIframe" src="https://www.youtube.com/embed/YlDxEOwj5j8" data-reactid="423"></iframe></p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="424">Beloved cult hit “Rez” gets the VR treatment to help launch the PSVR, and the results are terrific. It includes a fully remastered take on the original “Rez” – you zoom through a Matrix-like computer system, shooting down enemies to the steady beat of thumping electronica – but the VR setting makes it incredibly immersive. It gets better the more you play it, too; unlock the amazing Area X mode and you’ll find yourself flying, shooting and bobbing your head to some of the trippiest visuals yet seen in VR.</p>
- <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="425"><a href="https://www.playstation.com/en-us/games/thumper-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Thumper” ($20)</a></h3>
- <p class="iframe-wrapper Pos(r) My(20px) canvas-atom Mt(14px)--sm Mb(0)--sm" data-reactid="426"><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-type="videoIframe" src="https://www.youtube.com/embed/gtPGX8i1Eaw" data-reactid="427"></iframe></p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="428">What would happen if Tron, the board game Simon, a Clown beetle, Cthulhu and a noise band met in VR? Chaos, for sure, and also “Thumper.” Called a “violent rhythm game” by its creators, “Thumper” is, well, a violent rhythm game that’s also a gorgeous, unsettling and totally captivating assault on the senses. With simple controls and a straightforward premise – click the X button and the analog stick in time with the music as you barrel down a neon highway — it’s one of the rare games that works equally well both in and out of VR. But since you have PSVR, play it there. It’s marvelous.</p>
- <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="429"><a href="https://www.playstation.com/en-us/games/until-dawn-rush-of-blood-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Until Dawn: Rush of Blood” ($20)</a></h3>
- <p class="iframe-wrapper Pos(r) My(20px) canvas-atom Mt(14px)--sm Mb(0)--sm" data-reactid="430"><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-type="videoIframe" src="https://www.youtube.com/embed/EL3svUfC8Ds" data-reactid="431"></iframe></p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="432">Cheeky horror game “Until Dawn” was a breakout hit for the PS4 last year, channeling the classic “dumb teens in the woods” horror trope into an effective interactive drama. Well, forget all that if you fire up “Rush of Blood,” because this one sticks you front and center on a rollercoaster ride from Hell. Literally. You ride through a dimly-lit carnival of terror, dual-wielding pistols as you take down targets, hideous pig monsters and, naturally, maniac clowns. Be warned: If the bad guys don’t get you, the jump scares will.</p>
- <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="433"><a href="https://www.playstation.com/en-us/games/headmaster-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Headmaster” ($20)</a></h3>
- <p class="iframe-wrapper Pos(r) My(20px) canvas-atom Mt(14px)--sm Mb(0)--sm" data-reactid="434"><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-type="videoIframe" src="https://www.youtube.com/embed/a7CSMKw1E7g" data-reactid="435"></iframe></p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="436">Soccer meets “Portal” in the weird (and weirdly fun) “Headmaster,” a game about heading soccer balls into nets, targets and a variety of other things while stuck in some diabolical training facility. While at first it seems a little basic, increasingly challenging shots and a consistently entertaining narrative keep it from running off the pitch. Funny, ridiculous and as easy as literally moving your head back and forth, it’s a pleasant PSVR surprise.</p>
- <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="437"><a href="https://www.playstation.com/en-us/games/rigs-mechanized-combat-league-ps4/" rel="nofollow noopener noreferrer" target="_blank">“RIGS: Mechanized Combat League” ($50)</a></h3>
- <p class="iframe-wrapper Pos(r) My(20px) canvas-atom Mt(14px)--sm Mb(0)--sm" data-reactid="438"><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-type="videoIframe" src="https://www.youtube.com/embed/Rnqlf9EQ2zA" data-reactid="439"></iframe></p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="440">Giant mechs + sports? That’s the gist of this robotic blast-a-thon, which pits two teams of three against one another in gorgeous, explosive and downright fun VR combat. At its best, “RIGS” marries the thrill of fast-paced competitive shooters with the insanity of piloting a giant mech in VR. It can, however, be one of the barfier PSVR games. So pack your Dramamine, you’re going to have to ease yourself into this one.</p>
- <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="441"><a href="https://www.playstation.com/en-us/games/batman-arkham-vr-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Batman Arkham VR” ($20)</a></h3>
- <p class="iframe-wrapper Pos(r) My(20px) canvas-atom Mt(14px)--sm Mb(0)--sm" data-reactid="442"><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-type="videoIframe" src="https://www.youtube.com/embed/eS4g0py16N8" data-reactid="443"></iframe></p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="444">“I’m Batman,” you will say. And you’ll actually be right this time, because you are Batman in this detective yarn, and you know this because you actually grab the famous cowl and mask, stick it on your head, and stare into the mirrored reflection of Rocksteady Games’ impressive Dark Knight character model. It lacks the action of its fellow “Arkham” games and runs disappointingly short, but it’s a high-quality experience that really shows off how powerfully immersive VR can be.</p>
- <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="445"><a href="https://www.playstation.com/en-us/games/job-simulator-the-2050-archives-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Job Simulator” ($30)</a></h3>
- <p class="iframe-wrapper Pos(r) My(20px) canvas-atom Mt(14px)--sm Mb(0)--sm" data-reactid="446"><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-type="videoIframe" src="https://www.youtube.com/embed/3-iMlQIGH8Y" data-reactid="447"></iframe></p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="448">There are a number of good VR ports in the PSVR launch lineup, but the HTC Vive launch game “Job Simulator” might be the best. Your task? Lots of tasks, actually, from cooking food to fixing cars to working in an office, all for robots, because did I mention you were in the future? Infinitely charming and surprisingly challenging, it’s a great showpiece for VR.</p>
- <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="449"><a href="https://www.playstation.com/en-us/games/eve-valkyrie-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Eve Valkyrie” ($60)</a></h3>
- <p class="iframe-wrapper Pos(r) My(20px) canvas-atom Mt(14px)--sm Mb(0)--sm" data-reactid="450"><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-type="videoIframe" src="https://www.youtube.com/embed/0KFHw12CTbo" data-reactid="451"></iframe></p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="452">Already a hit on the Oculus Rift, this space dogfighting game was one of the first to really show off how VR can turn a traditional game experience into something special. It’s pricey and not quite as hi-res as the Rift version, but “Eve Valkyrie” does an admirable job filling the void left since “Battlestar Galactica” ended. Too bad there aren’t any Cylons in it (or are there?)</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="453"><em><strong>More games news:</strong></em></p>
- <ul class="canvas-list Pstart(40px) Mt(1.5em) Mb(1.5em) List(d)" data-type="list" data-reactid="454">
- <li data-reactid="455"><a href="https://www.yahoo.com/tech/skylanders-imaginators-will-let-you-create-and-3d-print-your-own-action-figure-143838550.html">‘Skylanders Imaginators’ will let you create and 3D print your own action figures</a></li>
- <li data-reactid="456"><a href="https://www.yahoo.com/tech/review-high-flying-nba-2k17-has-a-career-year-184135248.html">Review: High-flying ‘NBA 2K17’ has a career year</a></li>
- <li data-reactid="457"><a href="https://www.yahoo.com/tech/review-race-at-your-own-speed-in-big-beautiful-forza-horizon-3-195337170.html">Review: Race at your own speed in big, beautiful ‘Forza Horizon 3’</a></li>
- <li data-reactid="458"><a href="https://www.yahoo.com/tech/sonys-playstation-4-pro-shows-promise-potential-161304037.html">Sony’s PlayStation 4 Pro shows promise, potential and plenty of pretty lighting</a></li>
- <li data-reactid="459"><a href="https://www.yahoo.com/tech/review-madden-nfl-17-runs-000000394.html">Review: ‘Madden NFL 17’ runs hard, plays it safe</a></li>
- </ul>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text" data-reactid="460"><i>Ben Silverman is on Twitter at</i>
- <a href="https://twitter.com/ben_silverman" target="_blank" rel="nofollow noopener noreferrer"> <i>ben_silverman</i></a><i>.</i></p>
- </div>
- </article><span class="canvas-bottom-anchor-80b35014-fba3-377e-adc5-47fb44f61fa7" aria-hidden="true" data-reactid="462"></span></div>
- </div>
-</div> \ No newline at end of file
+<div class="content-canvas Bgc(#fff) Pos(r) P(20px)--sm Pt(17px)--sm" data-reactid="407" id="Col1-0-ContentCanvas">
+ <article data-reactid="408" data-type="story" data-uuid="80b35014-fba3-377e-adc5-47fb44f61fa7"><figure class="canvas-image Mx(a) canvas-atom Mt(0px) Mt(20px)--sm Mb(24px) Mb(22px)--sm" data-reactid="409" data-type="image"><div class="Maw(100%) Pos(r) H(0)" data-reactid="410"><img alt="The PlayStation VR" class="Trsdu(.42s) StretchedBox W(100%) H(100%) ie-7_H(a)" data-reactid="411" src="http://l1.yimg.com/ny/api/res/1.2/589noY9BZNdmsUUQf6L1AQ--/YXBwaWQ9aGlnaGxhbmRlcjtzbT0xO3c9NzQ0O2g9NjY5/http://media.zenfs.com/en/homerun/feed_manager_auto_publish_494/4406ef57dcb40376c513903b03bef048"></img></div>
+ <div class="Ov(h) Pos(r) Mah(80px)" data-reactid="413">
+ <figcaption class="C(#787d82) Fz(13px) Py(5px) Lh(1.5)" data-reactid="414" title="Sony’s PlayStation VR."><p>Sony’s PlayStation VR.</p>
+ </figcaption></div>
+ </figure><div class="canvas-body C(#26282a) Wow(bw) Cl(start) Mb(20px) Fz(15px) Lh(1.6) Ff($ff-secondary)" data-reactid="418">
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="419" data-type="text">Virtual reality has officially reached the consoles. And it’s pretty good! <a href="http://finance.yahoo.com/news/review-playstation-vr-is-comfortable-and-affordable-but-lacks-must-have-games-165053851.html">Sony’s PlayStation VR</a> is extremely comfortable and reasonably priced, and while it’s lacking killer apps, it’s loaded with lots of interesting ones.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="420" data-type="text">But which ones should you buy? I’ve played just about every launch game, and while some are worth your time, others you might want to skip. To help you decide what’s what, I’ve put together this list of the eight PSVR games worth considering.</p>
+ <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="421" data-type="text"><a href="https://www.playstation.com/en-us/games/rez-infinite-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Rez Infinite” ($30)</a></h3>
+ <p><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-reactid="423" data-type="videoIframe" src="https://www.youtube.com/embed/YlDxEOwj5j8"></iframe></p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="424" data-type="text">Beloved cult hit “Rez” gets the VR treatment to help launch the PSVR, and the results are terrific. It includes a fully remastered take on the original “Rez” – you zoom through a Matrix-like computer system, shooting down enemies to the steady beat of thumping electronica – but the VR setting makes it incredibly immersive. It gets better the more you play it, too; unlock the amazing Area X mode and you’ll find yourself flying, shooting and bobbing your head to some of the trippiest visuals yet seen in VR.</p>
+ <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="425" data-type="text"><a href="https://www.playstation.com/en-us/games/thumper-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Thumper” ($20)</a></h3>
+ <p><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-reactid="427" data-type="videoIframe" src="https://www.youtube.com/embed/gtPGX8i1Eaw"></iframe></p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="428" data-type="text">What would happen if Tron, the board game Simon, a Clown beetle, Cthulhu and a noise band met in VR? Chaos, for sure, and also “Thumper.” Called a “violent rhythm game” by its creators, “Thumper” is, well, a violent rhythm game that’s also a gorgeous, unsettling and totally captivating assault on the senses. With simple controls and a straightforward premise – click the X button and the analog stick in time with the music as you barrel down a neon highway — it’s one of the rare games that works equally well both in and out of VR. But since you have PSVR, play it there. It’s marvelous.</p>
+ <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="429" data-type="text"><a href="https://www.playstation.com/en-us/games/until-dawn-rush-of-blood-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Until Dawn: Rush of Blood” ($20)</a></h3>
+ <p><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-reactid="431" data-type="videoIframe" src="https://www.youtube.com/embed/EL3svUfC8Ds"></iframe></p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="432" data-type="text">Cheeky horror game “Until Dawn” was a breakout hit for the PS4 last year, channeling the classic “dumb teens in the woods” horror trope into an effective interactive drama. Well, forget all that if you fire up “Rush of Blood,” because this one sticks you front and center on a rollercoaster ride from Hell. Literally. You ride through a dimly-lit carnival of terror, dual-wielding pistols as you take down targets, hideous pig monsters and, naturally, maniac clowns. Be warned: If the bad guys don’t get you, the jump scares will.</p>
+ <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="433" data-type="text"><a href="https://www.playstation.com/en-us/games/headmaster-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Headmaster” ($20)</a></h3>
+ <p><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-reactid="435" data-type="videoIframe" src="https://www.youtube.com/embed/a7CSMKw1E7g"></iframe></p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="436" data-type="text">Soccer meets “Portal” in the weird (and weirdly fun) “Headmaster,” a game about heading soccer balls into nets, targets and a variety of other things while stuck in some diabolical training facility. While at first it seems a little basic, increasingly challenging shots and a consistently entertaining narrative keep it from running off the pitch. Funny, ridiculous and as easy as literally moving your head back and forth, it’s a pleasant PSVR surprise.</p>
+ <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="437" data-type="text"><a href="https://www.playstation.com/en-us/games/rigs-mechanized-combat-league-ps4/" rel="nofollow noopener noreferrer" target="_blank">“RIGS: Mechanized Combat League” ($50)</a></h3>
+ <p><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-reactid="439" data-type="videoIframe" src="https://www.youtube.com/embed/Rnqlf9EQ2zA"></iframe></p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="440" data-type="text">Giant mechs + sports? That’s the gist of this robotic blast-a-thon, which pits two teams of three against one another in gorgeous, explosive and downright fun VR combat. At its best, “RIGS” marries the thrill of fast-paced competitive shooters with the insanity of piloting a giant mech in VR. It can, however, be one of the barfier PSVR games. So pack your Dramamine, you’re going to have to ease yourself into this one.</p>
+ <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="441" data-type="text"><a href="https://www.playstation.com/en-us/games/batman-arkham-vr-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Batman Arkham VR” ($20)</a></h3>
+ <p><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-reactid="443" data-type="videoIframe" src="https://www.youtube.com/embed/eS4g0py16N8"></iframe></p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="444" data-type="text">“I’m Batman,” you will say. And you’ll actually be right this time, because you are Batman in this detective yarn, and you know this because you actually grab the famous cowl and mask, stick it on your head, and stare into the mirrored reflection of Rocksteady Games’ impressive Dark Knight character model. It lacks the action of its fellow “Arkham” games and runs disappointingly short, but it’s a high-quality experience that really shows off how powerfully immersive VR can be.</p>
+ <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="445" data-type="text"><a href="https://www.playstation.com/en-us/games/job-simulator-the-2050-archives-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Job Simulator” ($30)</a></h3>
+ <p><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-reactid="447" data-type="videoIframe" src="https://www.youtube.com/embed/3-iMlQIGH8Y"></iframe></p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="448" data-type="text">There are a number of good VR ports in the PSVR launch lineup, but the HTC Vive launch game “Job Simulator” might be the best. Your task? Lots of tasks, actually, from cooking food to fixing cars to working in an office, all for robots, because did I mention you were in the future? Infinitely charming and surprisingly challenging, it’s a great showpiece for VR.</p>
+ <h3 class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="449" data-type="text"><a href="https://www.playstation.com/en-us/games/eve-valkyrie-ps4/" rel="nofollow noopener noreferrer" target="_blank">“Eve Valkyrie” ($60)</a></h3>
+ <p><iframe class="canvas-video-iframe Bdw(0) StretchedBox W(100%) H(100%)" data-reactid="451" data-type="videoIframe" src="https://www.youtube.com/embed/0KFHw12CTbo"></iframe></p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="452" data-type="text">Already a hit on the Oculus Rift, this space dogfighting game was one of the first to really show off how VR can turn a traditional game experience into something special. It’s pricey and not quite as hi-res as the Rift version, but “Eve Valkyrie” does an admirable job filling the void left since “Battlestar Galactica” ended. Too bad there aren’t any Cylons in it (or are there?)</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="453" data-type="text"><em><strong>More games news:</strong></em></p>
+ <ul class="canvas-list Pstart(40px) Mt(1.5em) Mb(1.5em) List(d)" data-reactid="454" data-type="list"><li data-reactid="455"><a href="https://www.yahoo.com/tech/skylanders-imaginators-will-let-you-create-and-3d-print-your-own-action-figure-143838550.html">‘Skylanders Imaginators’ will let you create and 3D print your own action figures</a></li>
+ <li data-reactid="456"><a href="https://www.yahoo.com/tech/review-high-flying-nba-2k17-has-a-career-year-184135248.html">Review: High-flying ‘NBA 2K17’ has a career year</a></li>
+ <li data-reactid="457"><a href="https://www.yahoo.com/tech/review-race-at-your-own-speed-in-big-beautiful-forza-horizon-3-195337170.html">Review: Race at your own speed in big, beautiful ‘Forza Horizon 3’</a></li>
+ <li data-reactid="458"><a href="https://www.yahoo.com/tech/sonys-playstation-4-pro-shows-promise-potential-161304037.html">Sony’s PlayStation 4 Pro shows promise, potential and plenty of pretty lighting</a></li>
+ <li data-reactid="459"><a href="https://www.yahoo.com/tech/review-madden-nfl-17-runs-000000394.html">Review: ‘Madden NFL 17’ runs hard, plays it safe</a></li>
+ </ul><p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-reactid="460" data-type="text"><i>Ben Silverman is on Twitter at</i>
+ <a href="https://twitter.com/ben_silverman" rel="nofollow noopener noreferrer" target="_blank"> <i>ben_silverman</i></a><i>.</i></p>
+
+ </div>
+ </article><span aria-hidden="true" class="canvas-bottom-anchor-80b35014-fba3-377e-adc5-47fb44f61fa7" data-reactid="462"></span></div> \ No newline at end of file
diff --git a/test/test-pages/yahoo-2/expected.html b/test/test-pages/yahoo-2/expected.html
index b72a2c5..f072909 100644
--- a/test/test-pages/yahoo-2/expected.html
+++ b/test/test-pages/yahoo-2/expected.html
@@ -1,33 +1,32 @@
-<div id="readability-page-1" class="page">
- <div id="tgt1-Col1-2-ContentCanvas-Proxy">
- <div id="tgt1-Col1-2-ContentCanvas" class="content-canvas Bgc(#fff) Pos(r) P(20px)--sm Pt(17px)--sm">
- <article data-uuid="8dd27580-6b4e-3cfb-a389-5b1ab90bd0eb" data-type="story">
- <div class="canvas-atom Mb(24px) Mb(22px)--sm">
- <div class="Bdbc(#e8e8e8) Bdbs(s) Bdbw(1px)">
- <div class="Pos(r) Lh(1.4) Fz(13px) Pb(10px) Pt(6px)">
- <p class="Fw(500) Fz(19px) Mb(8px)"><span>1 / 5</span></p>
- <div class="Pos(r) Ovy(h)">
- <div>
- <p class="slideshow-description">In this photo dated Tuesday, Nov, 29, 2016 the Soyuz-FG rocket booster with the Progress MS-04 cargo ship is installed on a launch pad in Baikonur, Kazakhstan. The unmanned Russian cargo space ship Progress MS-04 broke up in the atmosphere over Siberia on Thursday Dec. 1, 2016, just minutes after the launch en route to the International Space Station due to an unspecified malfunction, the Russian space agency said.(Oleg Urusov/ Roscosmos Space Agency Press Service photo via AP)</p>
- </div>
- </div></div>
- </div>
- </div>
- <div class="canvas-body C(#26282a) Wow(bw) Cl(start) Mb(20px) Fz(15px) Lh(1.6) Ff($ff-secondary)">
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">MOSCOW (AP) — An unmanned Russian cargo spaceship heading to the International Space Station broke up in the atmosphere over Siberia on Thursday due to an unspecified malfunction, the Russian space agency said.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">The Progress MS-04 cargo craft broke up at an altitude of 190 kilometers (118 miles) over the remote Russian Tuva region in Siberia that borders Mongolia, Roscosmos said in a statement. It said most of spaceship's debris burnt up as it entered the atmosphere but some fell to Earth over what it called an uninhabited area.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">Local people reported seeing a flash of light and hearing a loud thud west of the regional capital of Kyzyl, more than 3,600 kilometers (2,200 miles) east of Moscow, the Tuva government was quoted as saying late Thursday by the Interfax news agency.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">The Progress cargo ship had lifted off as scheduled at 8:51 p.m. (1451 GMT) from Russia's space launch complex in Baikonur, Kazakhstan, to deliver 2.5 metric tons of fuel, water, food and other supplies. It was set to dock with the space station on Saturday.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">Roscosmos said the craft was operating normally before it stopped transmitting data 6 ½ minutes after the launch. The Russian space agency would not immediately describe the malfunction, saying its experts were looking into it.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">This is the third botched launch of a Russian spacecraft in two years. A Progress cargo ship plunged into the Pacific Ocean in May 2015, and a Proton-M rocket carrying an advanced satellite broke up in the atmosphere in May 2014.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">But both Roscosmos and NASA said the crash of the ship would have no impact on the operations of the orbiting space lab that is currently home to a six-member crew, including three cosmonauts from Russia, two NASA astronauts and one from the European Union.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">Orbital ATK, NASA's other shipper, successfully sent up supplies to the space station in October, and a Japanese cargo spaceship is scheduled to launch a full load in mid-December.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">NASA supplier SpaceX, meanwhile, has been grounded since a rocket explosion in September on the launch pad at Cape Canaveral, Florida. The company hopes to resume launches in December to deliver communication satellites.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">___</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">This version corrects the spelling of the region to Tuva, not Tyva.</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">__</p>
- <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">Aerospace Writer Marcia Dunn in Cape Canaveral, Florida, and Vladimir Isachenkov in Moscow contributed to this report.</p>
- </div>
- </article><span class="canvas-bottom-anchor-8dd27580-6b4e-3cfb-a389-5b1ab90bd0eb" aria-hidden="true"></span></div>
- </div>
-</div>
+<div class="content-canvas Bgc(#fff) Pos(r) P(20px)--sm Pt(17px)--sm" id="tgt1-Col1-2-ContentCanvas">
+ <article data-type="story" data-uuid="8dd27580-6b4e-3cfb-a389-5b1ab90bd0eb"><div class="canvas-atom Mb(24px) Mb(22px)--sm">
+
+ <div class="Bdbc(#e8e8e8) Bdbs(s) Bdbw(1px)">
+ <div class="Pos(r) Lh(1.4) Fz(13px) Pb(10px) Pt(6px)">
+ <p><span>1 / 5</span></p>
+ <div class="Pos(r) Ovy(h)">
+ <div>
+
+ <p>In this photo dated Tuesday, Nov, 29, 2016 the Soyuz-FG rocket booster with the Progress MS-04 cargo ship is installed on a launch pad in Baikonur, Kazakhstan. The unmanned Russian cargo space ship Progress MS-04 broke up in the atmosphere over Siberia on Thursday Dec. 1, 2016, just minutes after the launch en route to the International Space Station due to an unspecified malfunction, the Russian space agency said.(Oleg Urusov/ Roscosmos Space Agency Press Service photo via AP)</p>
+ </div>
+
+ </div></div>
+ </div>
+ </div>
+ <div class="canvas-body C(#26282a) Wow(bw) Cl(start) Mb(20px) Fz(15px) Lh(1.6) Ff($ff-secondary)">
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">MOSCOW (AP) — An unmanned Russian cargo spaceship heading to the International Space Station broke up in the atmosphere over Siberia on Thursday due to an unspecified malfunction, the Russian space agency said.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">The Progress MS-04 cargo craft broke up at an altitude of 190 kilometers (118 miles) over the remote Russian Tuva region in Siberia that borders Mongolia, Roscosmos said in a statement. It said most of spaceship's debris burnt up as it entered the atmosphere but some fell to Earth over what it called an uninhabited area.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">Local people reported seeing a flash of light and hearing a loud thud west of the regional capital of Kyzyl, more than 3,600 kilometers (2,200 miles) east of Moscow, the Tuva government was quoted as saying late Thursday by the Interfax news agency.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">The Progress cargo ship had lifted off as scheduled at 8:51 p.m. (1451 GMT) from Russia's space launch complex in Baikonur, Kazakhstan, to deliver 2.5 metric tons of fuel, water, food and other supplies. It was set to dock with the space station on Saturday.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">Roscosmos said the craft was operating normally before it stopped transmitting data 6 ½ minutes after the launch. The Russian space agency would not immediately describe the malfunction, saying its experts were looking into it.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">This is the third botched launch of a Russian spacecraft in two years. A Progress cargo ship plunged into the Pacific Ocean in May 2015, and a Proton-M rocket carrying an advanced satellite broke up in the atmosphere in May 2014.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">But both Roscosmos and NASA said the crash of the ship would have no impact on the operations of the orbiting space lab that is currently home to a six-member crew, including three cosmonauts from Russia, two NASA astronauts and one from the European Union.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">Orbital ATK, NASA's other shipper, successfully sent up supplies to the space station in October, and a Japanese cargo spaceship is scheduled to launch a full load in mid-December.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">NASA supplier SpaceX, meanwhile, has been grounded since a rocket explosion in September on the launch pad at Cape Canaveral, Florida. The company hopes to resume launches in December to deliver communication satellites.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">___</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">This version corrects the spelling of the region to Tuva, not Tyva.</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">__</p>
+ <p class="canvas-text Mb(1.0em) Mb(0)--sm Mt(0.8em)--sm canvas-atom" data-type="text">Aerospace Writer Marcia Dunn in Cape Canaveral, Florida, and Vladimir Isachenkov in Moscow contributed to this report.</p>
+
+ </div>
+ </article><span aria-hidden="true" class="canvas-bottom-anchor-8dd27580-6b4e-3cfb-a389-5b1ab90bd0eb"></span></div> \ No newline at end of file
diff --git a/test/test-pages/yahoo-3/expected.html b/test/test-pages/yahoo-3/expected.html
index 74c1593..caf8bb5 100644
--- a/test/test-pages/yahoo-3/expected.html
+++ b/test/test-pages/yahoo-3/expected.html
@@ -1,44 +1,43 @@
-<div id="readability-page-1" class="page">
- <div class="Col2 yog-cp Pos-a Bxz-bb">
- <div id="Main" tabindex="0" class="Pos-r Z-3 Stack yog-card yog-content" role="main">
- <section class="yom-mod yom-breaking-news level2" id="mediacontentbreakingnews" data-ylk="mid:mediacontentbreakingnews;mpos:1;t1:a3;t2:mod-bkn;sec:mod-bkn;">
- <p class="hd"> <span>'GMA' Cookie Search:</span> </p>
- </section>
- <section id="mediacontentstory" class="yom-mod yom-card-main yom-article" data-uuid="4250eebf-bbb0-3c95-8fd0-3cb4d3daf93c" data-type="story" data-ylk="t1:a3;t2:ct-mod;sec:ct-mod;itc:0;rspns:nav;">
- <div class="book clearfix">
- <div class="body yom-art-content clearfix" itemscope="" itemtype="https://schema.org/Article">
- <meta itemprop="datePublished" content="2015-03-11T19:46:14Z" />
- <meta itemprop="headline" content="Veteran Wraps Baby in American Flag, Photo Sparks Controversy" />
- <meta itemprop="alternativeHeadline" content="" />
- <meta itemprop="image" content="https://media.zenfs.com/en-US/video/video.abcnewsplus.com/559ecdbafdb839129816b5c79a996975" />
- <meta itemprop="description" content="A photographer and Navy veteran is fighting back after a photo she posted to Facebook started an online backlash. Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform. Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot." />
- <p>A photographer and Navy veteran is fighting back after a photo she posted to <a id="ramplink_Facebook_" href="http://abcnews.go.com/topics/business/companies/facebook-inc.htm" target="_blank" data-rapid_p="13">Facebook</a> started an online backlash.</p>
- <p>Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform.</p>
- <p>Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot.</p>
- <p><a href="http://abcnews.go.com/WNT/video/pizza-patriots-making-special-super-bowl-delivery-troops-28633975" target="_blank" data-rapid_p="14">Pizza Man Making Special Delivery Pizza Delivery to Afghanistan During Super Bowl</a></p>
- <p><a href="http://abcnews.go.com/Health/superbug-scope-maker-altered-design-make-cleaning-easier/story?id=29417816" target="_blank" data-rapid_p="15">Redesigned Scopes Fail to Stop 'Superbug Outbreaks</a></p>
- <p><a href="http://abcnews.go.com/Travel/video/antarctica-penguin-post-office-job-attracts-record-number-29247380" target="_blank" data-rapid_p="16">Antarctica 'Penguin Post Office' Attracts Record Number of Applicants</a></p>
- <p>“This is what he was fighting for, his son wrapped in an American flag,” Hicks told ABC News. However, when she posted the image on her page, she started to get comments accusing her of desecrating the flag.</p>
- <p>On one Facebook page an unidentified poster put up her picture writing and wrote they found it was “disrespectful, rude, tacky, disgusting, and against the U.S. Flag Code.”</p>
- <div class="yom-fig-frame"><span id="schemaorg"><div class="yom-figure yom-fig-middle"><figure class="cover get-lbdata-from-dom go-to-slideshow-lightbox" data-orig-index="2"> <a class="cover-anchor" name="cover-c9b69c1a26e19ae9fe744763dc31e9ac" id="cover-c9b69c1a26e19ae9fe744763dc31e9ac" data-rapid_p="17"></a><div class="cta-overlay"><span class="clearfix title cta-text medium"></span>
- <p class="cta-text large">View photo</p><span class="icon-slideshow icon-white-slideshow">.</span></div><img alt="Vanessa Hicks" class="editorial lzbg" data-preembed="image" src="https://s3.yimg.com/bt/api/res/1.2/GNtA09EDJWzWfpBzGYJS0Q--/YXBwaWQ9eW5ld3NfbGVnbztxPTg1O3c9NjMw/http://media.zenfs.com/en_us/gma/us.abcnews.gma.com/HT_flag_baby_jtm_150311_16x9_992.jpg" title="Vanessa Hicks" width="630" /></figure>
- <p class="legend">Vanessa Hicks</p>
+<div class="Pos-r Z-3 Stack yog-card yog-content" id="Main" role="main" tabindex="0">
+ <section class="yom-mod yom-breaking-news level2" data-ylk="mid:mediacontentbreakingnews;mpos:1;t1:a3;t2:mod-bkn;sec:mod-bkn;" id="mediacontentbreakingnews"><p> <span>'GMA' Cookie Search:</span> </p>
+
+ </section>
+ <section class="yom-mod yom-card-main yom-article" data-type="story" data-uuid="4250eebf-bbb0-3c95-8fd0-3cb4d3daf93c" data-ylk="t1:a3;t2:ct-mod;sec:ct-mod;itc:0;rspns:nav;" id="mediacontentstory"><div class="book clearfix">
+
+
+
+
+ <div class="body yom-art-content clearfix" itemscope="" itemtype="https://schema.org/Article">
+
+ <meta content="2015-03-11T19:46:14Z" itemprop="datePublished"></meta><meta content="Veteran Wraps Baby in American Flag, Photo Sparks Controversy" itemprop="headline"></meta><meta content="" itemprop="alternativeHeadline"></meta><meta content="https://media.zenfs.com/en-US/video/video.abcnewsplus.com/559ecdbafdb839129816b5c79a996975" itemprop="image"></meta><meta content="A photographer and Navy veteran is fighting back after a photo she posted to Facebook started an online backlash. Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform. Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot." itemprop="description"></meta><p>A photographer and Navy veteran is fighting back after a photo she posted to <a data-rapid_p="13" href="http://abcnews.go.com/topics/business/companies/facebook-inc.htm" id="ramplink_Facebook_" target="_blank">Facebook</a> started an online backlash.</p>
+ <p>Vanessa Hicks said she had no idea her photo would be considered controversial. The photo, from a military family’s newborn photo shoot, showed a newborn infant wrapped in an American flag held by his father, who was in his military uniform.</p>
+ <p>Hicks, a Navy veteran herself and the wife of an active-duty Navy member, said her intention was to honor the flag as well as her clients, who wanted to incorporate their military service in the photo shoot.</p>
+ <p><a data-rapid_p="14" href="http://abcnews.go.com/WNT/video/pizza-patriots-making-special-super-bowl-delivery-troops-28633975" target="_blank">Pizza Man Making Special Delivery Pizza Delivery to Afghanistan During Super Bowl</a></p>
+ <p><a data-rapid_p="15" href="http://abcnews.go.com/Health/superbug-scope-maker-altered-design-make-cleaning-easier/story?id=29417816" target="_blank">Redesigned Scopes Fail to Stop 'Superbug Outbreaks</a></p>
+ <p><a data-rapid_p="16" href="http://abcnews.go.com/Travel/video/antarctica-penguin-post-office-job-attracts-record-number-29247380" target="_blank">Antarctica 'Penguin Post Office' Attracts Record Number of Applicants</a></p>
+ <p>“This is what he was fighting for, his son wrapped in an American flag,” Hicks told ABC News. However, when she posted the image on her page, she started to get comments accusing her of desecrating the flag.</p>
+ <p>On one Facebook page an unidentified poster put up her picture writing and wrote they found it was “disrespectful, rude, tacky, disgusting, and against the U.S. Flag Code.”</p>
+
+ <div class="yom-fig-frame"><span id="schemaorg"><div class="yom-figure yom-fig-middle"><figure class="cover get-lbdata-from-dom go-to-slideshow-lightbox" data-orig-index="2"><a class="cover-anchor" data-rapid_p="17" id="cover-c9b69c1a26e19ae9fe744763dc31e9ac" name="cover-c9b69c1a26e19ae9fe744763dc31e9ac"></a><div class="cta-overlay"><span class="clearfix title cta-text medium"></span>
+ <p class="cta-text large">View photo</p><span class="icon-slideshow icon-white-slideshow">.</span></div><img alt="Vanessa Hicks" class="editorial lzbg" data-preembed="image" src="https://s3.yimg.com/bt/api/res/1.2/GNtA09EDJWzWfpBzGYJS0Q--/YXBwaWQ9eW5ld3NfbGVnbztxPTg1O3c9NjMw/http://media.zenfs.com/en_us/gma/us.abcnews.gma.com/HT_flag_baby_jtm_150311_16x9_992.jpg" title="Vanessa Hicks" width="630"></img></figure><p class="legend">Vanessa Hicks</p>
+ </div>
+ </span>
+ </div><p>The Federal Flag Code has guidelines for the proper treatment of the U.S. Flag but there are no rules for punishment related to violations. In the past, the </p><a data-rapid_p="18" href="http://abcnews.go.com/topics/news/us/supreme-court.htm" target="_blank">Supreme Court</a><p> has found that people are protected from punishment under the First Amendment for manipulating or even burning the flag.
+ </p>
+ <p>Hicks said she was surprised when messages suddenly started to pop up on her Facebook page and even her own website criticizing her photos.</p>
+ <p>She said she stayed up until 4 a.m. recently to take down comments from her business and company page, even on shoots that had nothing to do with the flag.</p>
+ <p>“I know how low I felt during those first few hours,” said Hicks. “[I felt] am I not a good American or veteran or wife. It’s a train-wreck you can’t help but watch.”</p>
+ <p>As Hicks tried to stop the comments from taking over her pages, others started to take notice and her picture went viral on social media sites. After that, Hicks found that many people, both military and civilian, told her they did not find the picture offensive.</p>
+ <p>“I have seen first-hand what is desecration of the flag,” Hicks said of her time in the military. “At the end of the day I didn’t do anything that disrespected this flag.”</p>
+ <p>Hicks, whose husband is still on active duty in the Navy, said the flag is a symbol of U.S. freedoms including the First Amendment right to free speech.</p>
+ <p>“[My husband] wouldn’t die for a flag, he would die for the freedoms that this country offers,” she told ABC News.</p>
+ <p>After her story grabbed local headlines, Hicks has been inundated by requests for photos shoots, and she said she plans to give 15 percent of all profits related to these shoots to the USO.</p>
</div>
- </span>
- </div>
- <p style="display: inline;" class="readability-styled">The Federal Flag Code has guidelines for the proper treatment of the U.S. Flag but there are no rules for punishment related to violations. In the past, the </p><a href="http://abcnews.go.com/topics/news/us/supreme-court.htm" target="_blank" data-rapid_p="18">Supreme Court</a>
- <p style="display: inline;" class="readability-styled"> has found that people are protected from punishment under the First Amendment for manipulating or even burning the flag. </p>
- <p>Hicks said she was surprised when messages suddenly started to pop up on her Facebook page and even her own website criticizing her photos.</p>
- <p>She said she stayed up until 4 a.m. recently to take down comments from her business and company page, even on shoots that had nothing to do with the flag.</p>
- <p>“I know how low I felt during those first few hours,” said Hicks. “[I felt] am I not a good American or veteran or wife. It’s a train-wreck you can’t help but watch.”</p>
- <p>As Hicks tried to stop the comments from taking over her pages, others started to take notice and her picture went viral on social media sites. After that, Hicks found that many people, both military and civilian, told her they did not find the picture offensive.</p>
- <p>“I have seen first-hand what is desecration of the flag,” Hicks said of her time in the military. “At the end of the day I didn’t do anything that disrespected this flag.”</p>
- <p>Hicks, whose husband is still on active duty in the Navy, said the flag is a symbol of U.S. freedoms including the First Amendment right to free speech.</p>
- <p>“[My husband] wouldn’t die for a flag, he would die for the freedoms that this country offers,” she told ABC News.</p>
- <p>After her story grabbed local headlines, Hicks has been inundated by requests for photos shoots, and she said she plans to give 15 percent of all profits related to these shoots to the USO.</p>
</div>
- </div>
- </section>
- </div>
- </div>
-</div> \ No newline at end of file
+
+ </section>
+
+
+
+
+ </div> \ No newline at end of file
diff --git a/test/test-pages/youth/expected.html b/test/test-pages/youth/expected.html
index c9869c5..b707763 100644
--- a/test/test-pages/youth/expected.html
+++ b/test/test-pages/youth/expected.html
@@ -1,38 +1,32 @@
-<div id="readability-page-1" class="page">
- <div class="article">
- <div id="content">
- <div id="container" class="article-content">
- <div class="TRS_Editor">
- <p align="center"><img title="海外留学生看两会:出国前后关注点大不同" alt="海外留学生看两会:出国前后关注点大不同" src="http://fakehost/test/W020170310313653868929.jpg" oldsrc="W020170310313653868929.jpg" height="269" width="400" /></p>
- <p align="center">图为马素湘在澳大利亚悉尼游玩时的近影。</p>
- <p>  <strong>出国前后关注点大不同</strong></p>
- <p>  <strong>出国前:政治科目会出啥考题?</strong></p>
- <p>  <strong>出国后:国家未来将如何发展?</strong></p>
- <p>   在采访中,我们了解到不少学子在出国前就每年守在电脑前观看两会直播。但是,随着年龄和阅历的增长,学子对两会的关注点在出国前后发生了很大的变化。</p>
- <p>   在法国里昂国立应用科学院留学的卢宇表示,他还是个中学生时,就开始关注两会了。“我高中毕业后就出国留学了。当我还在国内读高中时,对两会的主要关注点落在民生和教育问题上。根据这些内容预测今年政治考点会有哪些变化。”卢宇说,“在国外学习生活了将近10年,我愈发感觉到祖国这些年发生的日新月异的变化;关注点也转移到国家‘一带一路’建设,高端人才引进,中外合作等方面。”</p>
- <p>   无独有偶,英国剑桥大学的李博灏也有着类似的经历。他表示,在国内读本科时,虽然关注过两会,但并不像现在这样,将关注点放在国家社会经济迫切需要解决的难题与问题上。“出国前更关心与我们学生的实际问题以及切身利益相关的议题,比如奖学金、助学金的发放与申请;相关工作行业就业前景等。”</p>
- <p>   在英国求学6年后,李博灏希望能够学有所用,为国家发展过程中遇到的难题寻求解决办法。因此随着课题研究的深入,他更加关注国家和社会目前所面临的挑战,比如中等收入陷阱、供给侧改革、创意创新产业的发展等议题。</p>
- <p>   还有一些学子表示,出国前对两会不太了解,出国后反而对两会热点多了些思考。在澳大利亚墨尔本留学的马素湘说:“想不关注都难啊!刷微博看新闻到处都是两会的消息。而且我现在学的是新闻专业,对世界发生的大小事都会留意。随着年龄、阅历增长,家国情怀也渐长,会关心国家发展的各方面问题。”</p>
- <p align="center"><img src="http://fakehost/test/W020170310313654043127.jpg" alt="" oldsrc="W020170310313654043127.jpg" /></p>
- <p align="center">图为李博灏在瑞士日内日瓦联合国欧洲总部的近影。</p>
- <p>  <strong>关注点多与所学专业相关</strong></p>
- <p>  <strong>法学专业热议法定婚龄</strong> <strong>很多人关心供给侧改革</strong></p>
- <p>   在谈及对两会的哪些话题比较感兴趣时,卢宇表示:“近几年,国内雾霾现象时有发生。而我本身是学习能源环境专业的,所以每年都对两会上政府工作报告和代表提案中有关环保和新能源政策的部分很感兴趣。今年两会提案中有几份关于大力发展清洁能源汽车的。我认为这对节能减排和防治雾霾都有积极作用,但也要注意加强电池和电动机等关键技术的研发。”</p>
- <p>   对此提案,卢宇有着自己的看法,“百花齐放的局面固然可喜,但也不能一哄而上,国家应该提高行业准入门槛,完善新能源汽车准入管理规则,从源头上进行制度创新,将一些不具备新能源汽车生产资质的厂家淘汰出局,并高度关注电池系统安全问题,严格执行充电桩生产的国际标准。”</p>
- <p>   马素湘表示,“出国读研之前,我在国内学习法学,因此对相关的问题比较感兴趣。今年两会上人大代表黄细花提出把法定婚龄降低到18岁的提案;而在微博的热搜榜上,一本儿童性教育读物引起了极大的争议。我认为降低婚龄并不适合我国国情。因为性教育的缺乏导致我国大部分人在18岁之前没有接受过完整的性教育,思想行动上也不够成熟,如何能够对自己的人生和自己的另一半负责?所以我希望能有人大代表提议在国民儿童阶段完善我国的性教育,而不是为了鼓励生育将法定婚龄提前。”</p>
- <p>   李博灏是英国剑桥大学制造业研究所创新设计管理中心的一名博士。他格外关注的话题是供给侧结构性改革,知识产权保护,消费升级等议题。“我的博士研究课题是关于推动创新设计密集型产业的发展从而帮助中等收入国家克服中等收入陷阱的探索,因此一直十分关注国内关于供给侧改革的相关议题。通过本届两会对于该议题的进一步关注,我希望可以有效地帮助我了解供给侧改革与中等收入陷阱问题目前的发展状况以及解决情况;也希望可以与更多的机构取得联系,并帮助他们了解该议题最前沿的研究与解决方案。”</p>
- <p align="center"><img src="http://fakehost/test/W020170310313654453091.jpg" alt="" oldsrc="W020170310313654453091.jpg" /></p>
- <p align="center">图为卢宇与祖国五星红旗和联合国会旗的合影。</p>
- <p>  <strong> 两会成为了解国情的窗口</strong></p>
- <p>  <strong> 盼准确把握国家发展需求 愿寻求机遇回国有所作为</strong></p>
- <p>   不少学子时刻关注着国内动态,寻找回国发展的契机,而两会正是一个提供最新最全面信息的窗口。</p>
- <p>   “对两会的关注使我能够准确把握国家目前迫切需要解决的难题,从而使我的研究具有更多的社会价值。把理论和现实结合起来,将学到的知识、理念与技术有效地融入到国家社会经济发展的实践中去,为国家和社会解决这些问题提供理论与实践依据。”李博灏说。</p>
- <p>   知识产权也是近些年来两会的热门话题。在李博灏看来,知识产权是经济可持续增长和创意创新产业发展的灵魂所在。完善的、与国际接轨的知识产权保护法能够很好地促进国民经济的发展。“如何将欧洲和英国先进的知识产权以及创意产业保护发展经验带回祖国,帮助我们国家推动创意创新驱动的经济发展一直是我在关注与思考的。因此我也会十分关注两会关于国内知识产权的保护,知识产权综合管理改革试点工作,知识产权国际合作,知识产权大数据等的发展现状等问题。”</p>
- <p>   在两会上,全国政协委员张近东提出“当前中国经济的发展正在从数量型向质量型转变,消费升级将成为企业新一轮创新发展的动力。”对此,李博灏认为这也是他关注的问题。他认为:“在消费市场持续扩大的大环境下,如何能够通过促进创新设计产业的发展以及消费品品质的提升,推动国内消费增长并促进其在可持续经济增长中的作用,是一个迫切需要解决的问题。在当前供给侧改革的大环境下,消费升级的重要性越发突显。”</p>
- <p>   作为两会的资深粉,卢宇聊起两会话题充满了期待。“今年是国家‘十三五’规划的关键时期,‘一带一路’建设也在如火如荼地进行中。作为一名中国留学生,我一直都关注着能在哪些领域为国家、为中外合作共赢做出贡献。‘大众创业、万众创新’提出有几年了。全国各省市在吸引留学人才归国创业就业方面纷纷提出了各种优惠政策,但目前大都集中在沿海发达省份,而且主要惠及理工科博士,政策覆盖面还不够广。期待从国家层面设立工作组加强留学人才的统筹协调,完善顶层设计。人文社科类留学人才是未来国家智库的重要后备力量,也应该适当加强对他们的政策鼓励,更好地服务于‘一带一路’国家战略。”</p>
- <p>   卢宇还认为两会应该增设学子代表,列席旁听两会,拓展留学生参政议政渠道。“我相信优秀留学生的国际化视野必将为家乡建设带来新的思路,增添新的活力。”卢宇恳切地说。</p>
- </div>
- </div>
- </div>
- </div>
-</div>
+<div class="article-content" id="container">
+ <div class="TRS_Editor">
+ <p align="center"><img alt="海外留学生看两会:出国前后关注点大不同" height="269" oldsrc="W020170310313653868929.jpg" src="http://fakehost/test/W020170310313653868929.jpg" title="海外留学生看两会:出国前后关注点大不同" width="400"></img></p>
+ <p align="center">图为马素湘在澳大利亚悉尼游玩时的近影。</p>
+ <p>  <strong>出国前后关注点大不同</strong></p>
+ <p>  <strong>出国前:政治科目会出啥考题?</strong></p>
+ <p>  <strong>出国后:国家未来将如何发展?</strong></p>
+ <p>   在采访中,我们了解到不少学子在出国前就每年守在电脑前观看两会直播。但是,随着年龄和阅历的增长,学子对两会的关注点在出国前后发生了很大的变化。</p>
+ <p>   在法国里昂国立应用科学院留学的卢宇表示,他还是个中学生时,就开始关注两会了。“我高中毕业后就出国留学了。当我还在国内读高中时,对两会的主要关注点落在民生和教育问题上。根据这些内容预测今年政治考点会有哪些变化。”卢宇说,“在国外学习生活了将近10年,我愈发感觉到祖国这些年发生的日新月异的变化;关注点也转移到国家‘一带一路’建设,高端人才引进,中外合作等方面。”</p>
+ <p>   无独有偶,英国剑桥大学的李博灏也有着类似的经历。他表示,在国内读本科时,虽然关注过两会,但并不像现在这样,将关注点放在国家社会经济迫切需要解决的难题与问题上。“出国前更关心与我们学生的实际问题以及切身利益相关的议题,比如奖学金、助学金的发放与申请;相关工作行业就业前景等。”</p>
+ <p>   在英国求学6年后,李博灏希望能够学有所用,为国家发展过程中遇到的难题寻求解决办法。因此随着课题研究的深入,他更加关注国家和社会目前所面临的挑战,比如中等收入陷阱、供给侧改革、创意创新产业的发展等议题。</p>
+ <p>   还有一些学子表示,出国前对两会不太了解,出国后反而对两会热点多了些思考。在澳大利亚墨尔本留学的马素湘说:“想不关注都难啊!刷微博看新闻到处都是两会的消息。而且我现在学的是新闻专业,对世界发生的大小事都会留意。随着年龄、阅历增长,家国情怀也渐长,会关心国家发展的各方面问题。”</p>
+ <p align="center"><img alt="" oldsrc="W020170310313654043127.jpg" src="http://fakehost/test/W020170310313654043127.jpg"></img></p>
+ <p align="center">图为李博灏在瑞士日内日瓦联合国欧洲总部的近影。</p>
+ <p>  <strong>关注点多与所学专业相关</strong></p>
+ <p>  <strong>法学专业热议法定婚龄</strong> <strong>很多人关心供给侧改革</strong></p>
+ <p>   在谈及对两会的哪些话题比较感兴趣时,卢宇表示:“近几年,国内雾霾现象时有发生。而我本身是学习能源环境专业的,所以每年都对两会上政府工作报告和代表提案中有关环保和新能源政策的部分很感兴趣。今年两会提案中有几份关于大力发展清洁能源汽车的。我认为这对节能减排和防治雾霾都有积极作用,但也要注意加强电池和电动机等关键技术的研发。”</p>
+ <p>   对此提案,卢宇有着自己的看法,“百花齐放的局面固然可喜,但也不能一哄而上,国家应该提高行业准入门槛,完善新能源汽车准入管理规则,从源头上进行制度创新,将一些不具备新能源汽车生产资质的厂家淘汰出局,并高度关注电池系统安全问题,严格执行充电桩生产的国际标准。”</p>
+ <p>   马素湘表示,“出国读研之前,我在国内学习法学,因此对相关的问题比较感兴趣。今年两会上人大代表黄细花提出把法定婚龄降低到18岁的提案;而在微博的热搜榜上,一本儿童性教育读物引起了极大的争议。我认为降低婚龄并不适合我国国情。因为性教育的缺乏导致我国大部分人在18岁之前没有接受过完整的性教育,思想行动上也不够成熟,如何能够对自己的人生和自己的另一半负责?所以我希望能有人大代表提议在国民儿童阶段完善我国的性教育,而不是为了鼓励生育将法定婚龄提前。”</p>
+ <p>   李博灏是英国剑桥大学制造业研究所创新设计管理中心的一名博士。他格外关注的话题是供给侧结构性改革,知识产权保护,消费升级等议题。“我的博士研究课题是关于推动创新设计密集型产业的发展从而帮助中等收入国家克服中等收入陷阱的探索,因此一直十分关注国内关于供给侧改革的相关议题。通过本届两会对于该议题的进一步关注,我希望可以有效地帮助我了解供给侧改革与中等收入陷阱问题目前的发展状况以及解决情况;也希望可以与更多的机构取得联系,并帮助他们了解该议题最前沿的研究与解决方案。”</p>
+ <p align="center"><img alt="" oldsrc="W020170310313654453091.jpg" src="http://fakehost/test/W020170310313654453091.jpg"></img></p>
+ <p align="center">图为卢宇与祖国五星红旗和联合国会旗的合影。</p>
+ <p>  <strong> 两会成为了解国情的窗口</strong></p>
+ <p>  <strong> 盼准确把握国家发展需求 愿寻求机遇回国有所作为</strong></p>
+ <p>   不少学子时刻关注着国内动态,寻找回国发展的契机,而两会正是一个提供最新最全面信息的窗口。</p>
+ <p>   “对两会的关注使我能够准确把握国家目前迫切需要解决的难题,从而使我的研究具有更多的社会价值。把理论和现实结合起来,将学到的知识、理念与技术有效地融入到国家社会经济发展的实践中去,为国家和社会解决这些问题提供理论与实践依据。”李博灏说。</p>
+ <p>   知识产权也是近些年来两会的热门话题。在李博灏看来,知识产权是经济可持续增长和创意创新产业发展的灵魂所在。完善的、与国际接轨的知识产权保护法能够很好地促进国民经济的发展。“如何将欧洲和英国先进的知识产权以及创意产业保护发展经验带回祖国,帮助我们国家推动创意创新驱动的经济发展一直是我在关注与思考的。因此我也会十分关注两会关于国内知识产权的保护,知识产权综合管理改革试点工作,知识产权国际合作,知识产权大数据等的发展现状等问题。”</p>
+ <p>   在两会上,全国政协委员张近东提出“当前中国经济的发展正在从数量型向质量型转变,消费升级将成为企业新一轮创新发展的动力。”对此,李博灏认为这也是他关注的问题。他认为:“在消费市场持续扩大的大环境下,如何能够通过促进创新设计产业的发展以及消费品品质的提升,推动国内消费增长并促进其在可持续经济增长中的作用,是一个迫切需要解决的问题。在当前供给侧改革的大环境下,消费升级的重要性越发突显。”</p>
+ <p>   作为两会的资深粉,卢宇聊起两会话题充满了期待。“今年是国家‘十三五’规划的关键时期,‘一带一路’建设也在如火如荼地进行中。作为一名中国留学生,我一直都关注着能在哪些领域为国家、为中外合作共赢做出贡献。‘大众创业、万众创新’提出有几年了。全国各省市在吸引留学人才归国创业就业方面纷纷提出了各种优惠政策,但目前大都集中在沿海发达省份,而且主要惠及理工科博士,政策覆盖面还不够广。期待从国家层面设立工作组加强留学人才的统筹协调,完善顶层设计。人文社科类留学人才是未来国家智库的重要后备力量,也应该适当加强对他们的政策鼓励,更好地服务于‘一带一路’国家战略。”</p>
+ <p>   卢宇还认为两会应该增设学子代表,列席旁听两会,拓展留学生参政议政渠道。“我相信优秀留学生的国际化视野必将为家乡建设带来新的思路,增添新的活力。”卢宇恳切地说。</p>
+ </div>
+ </div> \ No newline at end of file