From 888a7680ce5032b30b95051307b08daec192eea9 Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Mon, 18 May 2026 23:39:00 -0700 Subject: [PATCH 1/2] fix(Readability): treat S and BDI as phrasing content --- Readability.js | 2 ++ test/test-readability.js | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Readability.js b/Readability.js index 5cff4540..b6de5ca0 100644 --- a/Readability.js +++ b/Readability.js @@ -223,6 +223,7 @@ Readability.prototype = { "ABBR", "AUDIO", "B", + "BDI", "BDO", "BR", "BUTTON", @@ -247,6 +248,7 @@ Readability.prototype = { "PROGRESS", "Q", "RUBY", + "S", "SAMP", "SCRIPT", "SELECT", diff --git a/test/test-readability.js b/test/test-readability.js index ebd4e618..10fc0eda 100644 --- a/test/test-readability.js +++ b/test/test-readability.js @@ -340,6 +340,19 @@ describe("Readability API", function () { expect(content).eql(expected_xhtml); }); + it("should keep S and BDI inline within paragraphs", function () { + var dom = new JSDOM( + "
Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + + "Nunc mollis leo lacus, vitae semper nisl " + + "ullamcorper ut praesent in lectus eu nibh dapibus tincidunt.
" + ); + var content = new Readability(dom.window.document, { + charThreshold: 20, + }).parse().content; + expect(content).not.to.contain("

"); + expect(content).not.to.contain("

"); + }); + it("should use custom video regex sent as option", function () { var dom = new JSDOM( "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mollis leo lacus, vitae semper nisl ullamcorper ut.

" + From ae4cfaf08b640bf23794c56cab320fce3c849dfc Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Fri, 10 Jul 2026 12:58:04 -0700 Subject: [PATCH 2/2] Treat U as phrasing content and add test-page fixture for S, BDI, U Signed-off-by: Sai Asish Y --- Readability.js | 1 + .../expected-metadata.json | 9 +++++++++ .../phrasing-elements-s-bdi-u/expected.html | 6 ++++++ .../phrasing-elements-s-bdi-u/source.html | 20 +++++++++++++++++++ test/test-readability.js | 13 ------------ 5 files changed, 36 insertions(+), 13 deletions(-) create mode 100644 test/test-pages/phrasing-elements-s-bdi-u/expected-metadata.json create mode 100644 test/test-pages/phrasing-elements-s-bdi-u/expected.html create mode 100644 test/test-pages/phrasing-elements-s-bdi-u/source.html diff --git a/Readability.js b/Readability.js index b6de5ca0..1718e886 100644 --- a/Readability.js +++ b/Readability.js @@ -259,6 +259,7 @@ Readability.prototype = { "SUP", "TEXTAREA", "TIME", + "U", "VAR", "WBR", ], diff --git a/test/test-pages/phrasing-elements-s-bdi-u/expected-metadata.json b/test/test-pages/phrasing-elements-s-bdi-u/expected-metadata.json new file mode 100644 index 00000000..745c548a --- /dev/null +++ b/test/test-pages/phrasing-elements-s-bdi-u/expected-metadata.json @@ -0,0 +1,9 @@ +{ + "title": "Phrasing elements test", + "byline": null, + "dir": null, + "excerpt": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mollis leo lacus,\n vitae semper nisl ullamcorper ut praesent in lectus eu\n nibh dapibus tincidunt. Vestibulum ante ipsum primis in faucibus orci luctus et\n ultrices posuere cubilia curae, donec pharetra libero nec massa ultricies, id\n fermentum arcu tincidunt. Curabitur sed dui vitae quam viverra sodales.", + "siteName": null, + "publishedTime": null, + "readerable": false +} diff --git a/test/test-pages/phrasing-elements-s-bdi-u/expected.html b/test/test-pages/phrasing-elements-s-bdi-u/expected.html new file mode 100644 index 00000000..362e478c --- /dev/null +++ b/test/test-pages/phrasing-elements-s-bdi-u/expected.html @@ -0,0 +1,6 @@ +
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mollis leo lacus, vitae semper nisl ullamcorper ut praesent in lectus eu nibh dapibus tincidunt. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae, donec pharetra libero nec massa ultricies, id fermentum arcu tincidunt. Curabitur sed dui vitae quam viverra sodales.

+

Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

+
+
\ No newline at end of file diff --git a/test/test-pages/phrasing-elements-s-bdi-u/source.html b/test/test-pages/phrasing-elements-s-bdi-u/source.html new file mode 100644 index 00000000..c8ac21fa --- /dev/null +++ b/test/test-pages/phrasing-elements-s-bdi-u/source.html @@ -0,0 +1,20 @@ + + + + Phrasing elements test + + +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mollis leo lacus, + vitae semper nisl ullamcorper ut praesent in lectus eu + nibh dapibus tincidunt. Vestibulum ante ipsum primis in faucibus orci luctus et + ultrices posuere cubilia curae, donec pharetra libero nec massa ultricies, id + fermentum arcu tincidunt. Curabitur sed dui vitae quam viverra sodales. +
+ Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. + Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu + ad litora torquent per conubia nostra, per inceptos himenaeos. +
+
+ + diff --git a/test/test-readability.js b/test/test-readability.js index 10fc0eda..ebd4e618 100644 --- a/test/test-readability.js +++ b/test/test-readability.js @@ -340,19 +340,6 @@ describe("Readability API", function () { expect(content).eql(expected_xhtml); }); - it("should keep S and BDI inline within paragraphs", function () { - var dom = new JSDOM( - "
Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + - "Nunc mollis leo lacus, vitae semper nisl " + - "ullamcorper ut praesent in lectus eu nibh dapibus tincidunt.
" - ); - var content = new Readability(dom.window.document, { - charThreshold: 20, - }).parse().content; - expect(content).not.to.contain("

"); - expect(content).not.to.contain("

"); - }); - it("should use custom video regex sent as option", function () { var dom = new JSDOM( "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc mollis leo lacus, vitae semper nisl ullamcorper ut.

" +