From 5f77d3719b6bb2da9a92f764afb744b835ab36a0 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sun, 31 Oct 2021 17:46:42 +0100 Subject: [PATCH] Tweak the Bidi-detection heuristics for very short RTL strings (issue 11656) Very short strings can narrowly miss the existing Bidi-detection threshold, leading to incorrect text-selection and copying behaviour. In my testing, neither Adobe Reader or PDFium seem to handle copying "correctly" for this document. Hence it's not entirely clear to me that we actually want to fix this, since tweaking these heuristics can *obviously* cause regressions elsewhere (and our test coverage for RTL-text isn't exactly great). --- src/core/bidi.js | 5 +++-- test/pdfs/.gitignore | 1 + test/pdfs/issue11656.pdf | Bin 0 -> 28291 bytes test/test_manifest.json | 6 ++++++ test/unit/bidi_spec.js | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 test/pdfs/issue11656.pdf diff --git a/src/core/bidi.js b/src/core/bidi.js index b0c6ed6d3..ece975154 100644 --- a/src/core/bidi.js +++ b/src/core/bidi.js @@ -158,7 +158,8 @@ function bidi(str, startLevel = -1, vertical = false) { // Detect the bidi method // - If there are no rtl characters then no bidi needed - // - If less than 30% chars are rtl then string is primarily ltr + // - If less than 30% chars are rtl then string is primarily ltr, + // unless the string is very short. // - If more than 30% chars are rtl then string is primarily rtl if (numBidi === 0) { isLTR = true; @@ -166,7 +167,7 @@ function bidi(str, startLevel = -1, vertical = false) { } if (startLevel === -1) { - if (numBidi / strLength < 0.3) { + if (numBidi / strLength < 0.3 && strLength > 4) { isLTR = true; startLevel = 0; } else { diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index f5828ff53..99338cdc8 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -448,6 +448,7 @@ !annotation-square-circle-without-appearance.pdf !annotation-stamp.pdf !issue14048.pdf +!issue11656.pdf !annotation-fileattachment.pdf !annotation-text-widget.pdf !annotation-choice-widget.pdf diff --git a/test/pdfs/issue11656.pdf b/test/pdfs/issue11656.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8a3d8d303ca5cca1c1fcf903ea6ba499f2bf4fab GIT binary patch literal 28291 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 H?@s?0o@)L4 literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index 4b97ddc7e..3c69a633b 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -5080,6 +5080,12 @@ "lastPage": 1, "type": "eq" }, + { "id": "issue11656", + "file": "pdfs/issue11656.pdf", + "md5": "82d5d4f5978a4974707deb1ea98e62f2", + "rounds": 1, + "type": "text" + }, { "id": "vertical", "file": "pdfs/vertical.pdf", "md5": "8a74d33504701edcefeef2afd022765e", diff --git a/test/unit/bidi_spec.js b/test/unit/bidi_spec.js index 24bbe597d..807454470 100644 --- a/test/unit/bidi_spec.js +++ b/test/unit/bidi_spec.js @@ -16,6 +16,28 @@ import { bidi } from "../../src/core/bidi.js"; describe("bidi", function () { + it( + "should mark text as LTR if there's only LTR-characters, " + + "when the string is very short", + function () { + const str = "foo"; + const bidiText = bidi(str, -1, false); + + expect(bidiText.str).toEqual("foo"); + expect(bidiText.dir).toEqual("ltr"); + } + ); + + it("should mark text as LTR if there's only LTR-characters", function () { + const str = "Lorem ipsum dolor sit amet, consectetur adipisicing elit."; + const bidiText = bidi(str, -1, false); + + expect(bidiText.str).toEqual( + "Lorem ipsum dolor sit amet, consectetur adipisicing elit." + ); + expect(bidiText.dir).toEqual("ltr"); + }); + it("should mark text as RTL if more than 30% of text is RTL", function () { // 33% of test text are RTL characters const test = "\u0645\u0635\u0631 Egypt"; @@ -34,4 +56,16 @@ describe("bidi", function () { expect(bidiText.str).toEqual(result); expect(bidiText.dir).toEqual("ltr"); }); + + it( + "should mark text as RTL if less than 30% of text is RTL, " + + "when the string is very short (issue 11656)", + function () { + const str = "()\u05d1("; // 25% of the string is RTL characters. + const bidiText = bidi(str, -1, false); + + expect(bidiText.str).toEqual("(\u05d1)("); + expect(bidiText.dir).toEqual("rtl"); + } + ); });