From 8525c6af36d3badbe27c4672a6f2dd99ddb4097f Mon Sep 17 00:00:00 2001 From: Brad Philips Date: Fri, 2 Mar 2018 11:37:16 +0000 Subject: [PATCH] Fix relative URIs given tags (#422) --- Readability.js | 38 +++++----------- test/generate-testcase.js | 2 +- test/test-pages/002/expected.html | 4 +- .../expected-metadata.json | 7 +++ .../expected.html | 22 ++++++++++ .../source.html | 44 +++++++++++++++++++ .../expected-metadata.json | 7 +++ .../base-url-base-element/expected.html | 22 ++++++++++ .../base-url-base-element/source.html | 44 +++++++++++++++++++ test/test-pages/clean-links/expected.html | 5 +-- test/test-pages/gmw/expected.html | 2 +- test/test-pages/hukumusume/expected.html | 10 ++--- test/test-pages/ietf-1/expected.html | 36 +++++++-------- .../table-style-attributes/expected.html | 6 +-- test/test-pages/wikia/expected.html | 2 +- test/test-pages/wikipedia/expected.html | 6 +-- 16 files changed, 194 insertions(+), 63 deletions(-) create mode 100644 test/test-pages/base-url-base-element-relative/expected-metadata.json create mode 100644 test/test-pages/base-url-base-element-relative/expected.html create mode 100644 test/test-pages/base-url-base-element-relative/source.html create mode 100644 test/test-pages/base-url-base-element/expected-metadata.json create mode 100644 test/test-pages/base-url-base-element/expected.html create mode 100644 test/test-pages/base-url-base-element/source.html diff --git a/Readability.js b/Readability.js index a05c41c3..186ee404 100644 --- a/Readability.js +++ b/Readability.js @@ -269,34 +269,20 @@ Readability.prototype = { * @return void */ _fixRelativeUris: function(articleContent) { - var scheme = this._uri.scheme; - var prePath = this._uri.prePath; - var pathBase = this._uri.pathBase; - + var baseURI = this._doc.baseURI; + var documentURI = this._doc.documentURI; function toAbsoluteURI(uri) { - // If this is already an absolute URI, return it. - if (/^[a-zA-Z][a-zA-Z0-9\+\-\.]*:/.test(uri)) + // Leave hash links alone if the base URI matches the document URI: + if (baseURI == documentURI && uri.charAt(0) == "#") { return uri; - - // Scheme-rooted relative URI. - if (uri.substr(0, 2) == "//") - return scheme + "://" + uri.substr(2); - - // Prepath-rooted relative URI. - if (uri[0] == "/") - return prePath + uri; - - // Dotslash relative URI. - if (uri.indexOf("./") === 0) - return pathBase + uri.slice(2); - - // Ignore hash URIs: - if (uri[0] == "#") - return uri; - - // Standard relative URI; add entire path. pathBase already includes a - // trailing "/". - return pathBase + uri; + } + // Otherwise, resolve against base URI: + try { + return new URL(uri, baseURI).href; + } catch (ex) { + // Something went wrong, just return the original: + } + return uri; } var links = articleContent.getElementsByTagName("a"); diff --git a/test/generate-testcase.js b/test/generate-testcase.js index 94a91667..7e7b873c 100644 --- a/test/generate-testcase.js +++ b/test/generate-testcase.js @@ -100,7 +100,6 @@ function onResponseReceived(source) { } function runReadability(source, destPath, metadataDestPath) { - var doc = new JSDOMParser().parse(source); var uri = { spec: "http://fakehost/test/page.html", host: "fakehost", @@ -108,6 +107,7 @@ function runReadability(source, destPath, metadataDestPath) { scheme: "http", pathBase: "http://fakehost/test/" }; + var doc = new JSDOMParser().parse(source, uri.spec); var myReader, result, readerable; try { // We pass `caption` as a class to check that passing in extra classes works, diff --git a/test/test-pages/002/expected.html b/test/test-pages/002/expected.html index 4f858f96..d1be6df5 100644 --- a/test/test-pages/002/expected.html +++ b/test/test-pages/002/expected.html @@ -3,7 +3,7 @@

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 tracked using events. Also, the event-based model doesn’t play well with JavaScript’s recent focus on Promise- and generator-based asynchronous programming.

The Fetch API intends to fix most of these problems. It does this by introducing the same primitives to JS that are used in the HTTP protocol. In addition, it introduces a utility function fetch() that succinctly captures the intention of retrieving a resource from the network.

-

The Fetch specification, which defines the API, nails down the semantics of a user agent fetching a resource. This, combined with ServiceWorkers, is an attempt to:

+

The Fetch specification, which defines the API, nails down the semantics of a user agent fetching a resource. This, combined with ServiceWorkers, is an attempt to:

  1. Improve the offline experience.
  2. Expose the building blocks of the Web to the platform as part of the extensible web movement.
  3. @@ -121,7 +121,7 @@

    Headers

  4. “response”: naturally, for Headers obtained from Response (Response.headers).
  5. “immutable”: Mostly used for ServiceWorkers, renders a Headers object
    read-only.
  6. -

    The details of how each guard affects the behaviors of the Headers object are
    in the specification. For example, you may not append or set a “request” guarded Headers’ “Content-Length” header. Similarly, inserting “Set-Cookie” into a Response header is not allowed so that ServiceWorkers may not set cookies via synthesized Responses.

    +

    The details of how each guard affects the behaviors of the Headers object are
    in the specification. For example, you may not append or set a “request” guarded Headers’ “Content-Length” header. Similarly, inserting “Set-Cookie” into a Response header is not allowed so that ServiceWorkers may not set cookies via synthesized Responses.

    All of the Headers methods throw TypeError if name is not a valid HTTP Header name. The mutation operations will throw TypeError if there is an immutable guard. Otherwise they fail silently. For example:

    diff --git a/test/test-pages/base-url-base-element-relative/expected-metadata.json b/test/test-pages/base-url-base-element-relative/expected-metadata.json new file mode 100644 index 00000000..4c09218a --- /dev/null +++ b/test/test-pages/base-url-base-element-relative/expected-metadata.json @@ -0,0 +1,7 @@ +{ + "title": "Base URL with base relative test", + "byline": null, + "dir": null, + "excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\n proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + "readerable": false +} diff --git a/test/test-pages/base-url-base-element-relative/expected.html b/test/test-pages/base-url-base-element-relative/expected.html new file mode 100644 index 00000000..29e7ac5a --- /dev/null +++ b/test/test-pages/base-url-base-element-relative/expected.html @@ -0,0 +1,22 @@ +
    +
    +

    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.

    +

    Links

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    Images

    +

    +

    +

    +

    +

    +

    Foo

    +

    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.

    +
    +
    diff --git a/test/test-pages/base-url-base-element-relative/source.html b/test/test-pages/base-url-base-element-relative/source.html new file mode 100644 index 00000000..bb0f7df0 --- /dev/null +++ b/test/test-pages/base-url-base-element-relative/source.html @@ -0,0 +1,44 @@ + + + + + + Base URL with base relative test + + +
    +

    Lorem

    +
    + 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. +
    +

    Links

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    Images

    +

    +

    +

    +

    +

    +

    Foo

    +
    + 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. +
    +
    + + diff --git a/test/test-pages/base-url-base-element/expected-metadata.json b/test/test-pages/base-url-base-element/expected-metadata.json new file mode 100644 index 00000000..4918d381 --- /dev/null +++ b/test/test-pages/base-url-base-element/expected-metadata.json @@ -0,0 +1,7 @@ +{ + "title": "Base URL with base test", + "byline": null, + "dir": null, + "excerpt": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non\n proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", + "readerable": false +} diff --git a/test/test-pages/base-url-base-element/expected.html b/test/test-pages/base-url-base-element/expected.html new file mode 100644 index 00000000..7a52ff89 --- /dev/null +++ b/test/test-pages/base-url-base-element/expected.html @@ -0,0 +1,22 @@ +
    +
    +

    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.

    +

    Links

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    Images

    +

    +

    +

    +

    +

    +

    Foo

    +

    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.

    +
    +
    diff --git a/test/test-pages/base-url-base-element/source.html b/test/test-pages/base-url-base-element/source.html new file mode 100644 index 00000000..4b3c63c8 --- /dev/null +++ b/test/test-pages/base-url-base-element/source.html @@ -0,0 +1,44 @@ + + + + + + Base URL with base test + + +
    +

    Lorem

    +
    + 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. +
    +

    Links

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    link

    +

    Images

    +

    +

    +

    +

    +

    +

    Foo

    +
    + 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. +
    +
    + + diff --git a/test/test-pages/clean-links/expected.html b/test/test-pages/clean-links/expected.html index bc575ab0..441c3ba8 100644 --- a/test/test-pages/clean-links/expected.html +++ b/test/test-pages/clean-links/expected.html @@ -5,11 +5,10 @@

    Study Webtext

    "Bartleby the Scrivener: A Story of Wall-Street " (1853) 
    Herman Melville

    -

    To the story text without notes
+            <h2><a href=To the story text without notes

    -

    Prepared by Ann +

    Prepared by Ann Woodlief, Virginia Commonwealth University

    Click on text in red for hypertext notes and questions
    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.

    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.

    diff --git a/test/test-pages/gmw/expected.html b/test/test-pages/gmw/expected.html index 08b53413..70c1a984 100644 --- a/test/test-pages/gmw/expected.html +++ b/test/test-pages/gmw/expected.html @@ -39,7 +39,7 @@

      所以,当宇航员在地球轨道上时,将还不得不满足于通过欣赏外面的景色来振作精神,而不要指望沉溺于烈酒中。我们留在地球上的人,则可以准备好适量的香槟酒,以迎接他们的归来。

      原标题:他晚于阿姆斯特朗登月 却是首个敢在月球喝酒的人

      出品︱网易科学人栏目组 胖胖

    -

      作者︱春春

    +

      作者︱春春

    [责任编辑:肖春芳]

    \ No newline at end of file diff --git a/test/test-pages/hukumusume/expected.html b/test/test-pages/hukumusume/expected.html index 188019b4..09eb76a1 100644 --- a/test/test-pages/hukumusume/expected.html +++ b/test/test-pages/hukumusume/expected.html @@ -1,7 +1,7 @@
    -

    福娘童話集 > きょうのイソップ童話 > 1月のイソップ童話 > 欲張りなイヌ

    +

    福娘童話集 > きょうのイソップ童話 > 1月のイソップ童話 > 欲張りなイヌ

    - 元旦のイソップ童話

    よくばりなイヌ

    欲張りなイヌ

    ひらがな ←→ 日本語・英語 ←→ English

    + 元旦のイソップ童話

    よくばりなイヌ

    欲張りなイヌ

    ひらがな ←→ 日本語・英語 ←→ English

    @@ -9,14 +9,14 @@
    - + - + + 犬の顔の折り紙いぬのかお   犬の顔の紙いぬ
    おりがみをつくろう ( おりがみくらぶ より)
    @@ -24,7 +24,7 @@
    - 犬の顔の折り紙いぬのかお   犬の顔の紙いぬ
    diff --git a/test/test-pages/ietf-1/expected.html b/test/test-pages/ietf-1/expected.html index ace8e9df..0202963f 100644 --- a/test/test-pages/ietf-1/expected.html +++ b/test/test-pages/ietf-1/expected.html @@ -1,4 +1,4 @@ -
    [Docs] [txt|pdf] [Tracker] [Email] [Diff1] [Diff2] [Nits]

    Versions: 00 01 02 03 04

    +
    [Docs] [txt|pdf] [Tracker] [Email] [Diff1] [Diff2] [Nits]

    Versions: 00 01 02 03 04

    INTERNET DRAFT                                      Michiel B. de Jong
     Document: draft-dejong-remotestorage-04                   IndieHosters
                                                                  F. Kooman
    @@ -692,9 +692,9 @@
     
             POST /oauth HTTP/1.1
             Host: 3pp.io:4439
    -        Origin: https://3pp.io:4439
    +        Origin: https://3pp.io:4439
             Content-Type: application/x-www-form-urlencoded
    -        Referer: https://3pp.io:4439/oauth/michiel?redirect_uri=https%3\
    +        Referer: https://3pp.io:4439/oauth/michiel?redirect_uri=https%3\
     A%2F%2Fdrinks-unhosted.5apps.com%2F&scope=myfavoritedrinks%3Arw&client_\
     id=https%3A%2F%2Fdrinks-unhosted.5apps.com&response_type=token
     
    @@ -727,14 +727,14 @@
             OPTIONS /storage/michiel/myfavoritedrinks/ HTTP/1.1
             Host: 3pp.io:4439
             Access-Control-Request-Method: GET
    -        Origin: https://drinks-unhosted.5apps.com
    +        Origin: https://drinks-unhosted.5apps.com
             Access-Control-Request-Headers: Authorization
             Referer: https://drinks-unhosted.5apps.com/
     
         To which the server can for instance respond:
     
             HTTP/1.1 200 OK
    -        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
    +        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
             Access-Control-Allow-Methods: GET, PUT, DELETE
             Access-Control-Allow-Headers: Authorization, Content-Length, Co\
     ntent-Type, Origin, X-Requested-With, If-Match, If-None-Match
    @@ -746,20 +746,20 @@
             PUT /storage/michiel/myfavoritedrinks/test HTTP/1.1
             Host: 3pp.io:4439
             Content-Length: 91
    -        Origin: https://drinks-unhosted.5apps.com
    +        Origin: https://drinks-unhosted.5apps.com
             Authorization: Bearer j2YnGtXjzzzHNjkd1CJxoQubA1o=
             Content-Type: application/json; charset=UTF-8
             Referer: https://drinks-unhosted.5apps.com/?
             If-None-Match: *
     
    -        {"name":"test","@context":"http://remotestorage.io/spec/modules\
    +        {"name":"test","@context":"http://remotestorage.io/spec/modules\
     /myfavoritedrinks/drink"}
     
         And the server may respond with either a 201 Created or a 200 OK
         status:
     
             HTTP/1.1 201 Created
    -        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
    +        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
             ETag: "1382694045000"
     
     12.6. Subsequent PUT
    @@ -778,7 +778,7 @@
             PUT /storage/michiel/myfavoritedrinks/test HTTP/1.1
             Host: 3pp.io:4439
             Content-Length: 91
    -        Origin: https://drinks-unhosted.5apps.com
    +        Origin: https://drinks-unhosted.5apps.com
             Authorization: Bearer j2YnGtXjzzzHNjkd1CJxoQubA1o=
             Content-Type: application/json; charset=UTF-8
             Referer: https://drinks-unhosted.5apps.com/?
    @@ -790,7 +790,7 @@
         And the server may respond with a 412 Conflict or a 200 OK status:
     
             HTTP/1.1 200 OK
    -        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
    +        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
             ETag: "1382694048000"
     
     12.7. GET
    @@ -800,7 +800,7 @@
     
             GET /storage/michiel/myfavoritedrinks/test HTTP/1.1
             Host: 3pp.io:4439
    -        Origin: https://drinks-unhosted.5apps.com
    +        Origin: https://drinks-unhosted.5apps.com
             Authorization: Bearer j2YnGtXjzzzHNjkd1CJxoQubA1o=
             Referer: https://drinks-unhosted.5apps.com/?
             If-None-Match: "1382694045000", "1382694048000"
    @@ -808,7 +808,7 @@
         And the server may respond with a 304 Not Modified status:
     
             HTTP/1.1 304 Not Modified
    -        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
    +        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
             ETag: "1382694048000"
     
         Or a 200 OK status, plus a response body:
    @@ -822,7 +822,7 @@
     Internet-Draft              remoteStorage                  December 2014
     
     
    -        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
    +        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
             Content-Type: application/json; charset=UTF-8
             Content-Length: 106
             ETag: "1382694048000"
    @@ -836,7 +836,7 @@
         body:
     
             HTTP/1.1 200 OK
    -        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
    +        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
             Content-Type: application/ld+json
             Content-Length: 171
             ETag: "1382694048000"
    @@ -851,7 +851,7 @@
         Not Found status, and no ETag header:
     
             HTTP/1.1 404 Not Found
    -        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
    +        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
     
     12.8. DELETE
     
    @@ -859,7 +859,7 @@
     
             DELETE /storage/michiel/myfavoritedrinks/test HTTP/1.1
             Host: 3pp.io:4439
    -        Origin: https://drinks-unhosted.5apps.com
    +        Origin: https://drinks-unhosted.5apps.com
             Authorization: Bearer j2YnGtXjzzzHNjkd1CJxoQubA1o=
             Content-Type: application/json; charset=UTF-8
             Referer: https://drinks-unhosted.5apps.com/?
    @@ -876,7 +876,7 @@
         And the server may respond with a 412 Conflict or a 200 OK status:
     
             HTTP/1.1 412 Conflict
    -        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
    +        Access-Control-Allow-Origin: https://drinks-unhosted.5apps.com
             ETag: "1382694048000"
     
     13. Distributed versioning
    @@ -1126,4 +1126,4 @@
     
     

    Html markup produced by rfcmarkup 1.111, available from https://tools.ietf.org/tools/rfcmarkup/ -
    \ No newline at end of file +
    diff --git a/test/test-pages/table-style-attributes/expected.html b/test/test-pages/table-style-attributes/expected.html index d00804b0..84a9cf33 100644 --- a/test/test-pages/table-style-attributes/expected.html +++ b/test/test-pages/table-style-attributes/expected.html @@ -71,11 +71,11 @@
      Have you considered changing distributions?
    -

    Yes, every single time I try something like this, I very seriously consider getting a Mac.

    +

    Yes, every single time I try something like this, I very seriously consider getting a Mac.

    Really the only thing that's stopping me is that I fear the Emacs situation.

    (By which I mean, ``Lack of a usable version thereof.'' No, running RMSmacs inside a terminal window doesn't qualify. Nor does running an X server on the Mac: if I were going to switch, why in the world would I continue inflicting the X Windows Disaster on myself? Wouldn't getting away from that be the whole point?)

    -
      (I understand there is an almost-functional Aqua version of +

      By the way, the suggestion to switch Linux distrubutions in order to get a single app to work might sound absurd at first. And that's because it is. But I've been saturated with Unix-peanut-gallery effluvia for so long that it no longer even surprises me when every @@ -83,5 +83,5 @@ simple -- results in someone suggesting that you either A) patch your kernel or B) change distros. It's inevitable and inescapable, like Hitler.


      -

      [ up ]

      +

      [ up ]

    diff --git a/test/test-pages/wikia/expected.html b/test/test-pages/wikia/expected.html index 9aa2e41f..aceee796 100644 --- a/test/test-pages/wikia/expected.html +++ b/test/test-pages/wikia/expected.html @@ -21,7 +21,7 @@

    Why the Original Film Cuts Matter


    - Would you like to be part of the Fandom team? Join our Fan Contributor Program and share your voice on Fandom.com! + Would you like to be part of the Fandom team? Join our Fan Contributor Program and share your voice on Fandom.com!

    diff --git a/test/test-pages/wikipedia/expected.html b/test/test-pages/wikipedia/expected.html index b6c78f2f..bbc23306 100644 --- a/test/test-pages/wikipedia/expected.html +++ b/test/test-pages/wikipedia/expected.html @@ -298,7 +298,7 @@

    References[^ "Web Browser Market Share Trends". W3Counter. Awio Web Services LLC. Retrieved 2012-05-10.  -
  7. ^ "Top 5 Browsers". StatCounter Global Stats. StatCounter. Retrieved 2012-05-10.  +
  8. ^ "Top 5 Browsers". StatCounter Global Stats. StatCounter. Retrieved 2012-05-10. 
  9. ^ "Web browsers (Global marketshare)". Clicky. Roxr Software Ltd. Retrieved 2012-05-10.  @@ -364,7 +364,7 @@

    References[^ Larabel, Michael. "Servo Continues Making Progress For Shipping Components In Gecko, Browser.html". Phoronix.com. Retrieved 10 May 2016. 

  10. -
  11. ^ "Mozilla VR". Mozilla VR. Retrieved 2016-10-27.  +
  12. ^ "Mozilla VR". Mozilla VR. Retrieved 2016-10-27. 
  13. ^ Persona, Mozilla  @@ -402,4 +402,4 @@

    External links[Mozilla Mercurial Repository

  14. - \ No newline at end of file +