diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index acd3a66ad..6bef34dd9 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -765,3 +765,4 @@ !two_paragraphs.pdf !paragraph_and_link.pdf !issue20225.pdf +!issue20516.pdf diff --git a/test/pdfs/issue20516.pdf b/test/pdfs/issue20516.pdf new file mode 100644 index 000000000..77695291b Binary files /dev/null and b/test/pdfs/issue20516.pdf differ diff --git a/test/unit/pdf_find_controller_spec.js b/test/unit/pdf_find_controller_spec.js index 25f940861..f20023faf 100644 --- a/test/unit/pdf_find_controller_spec.js +++ b/test/unit/pdf_find_controller_spec.js @@ -1158,6 +1158,26 @@ describe("pdf_find_controller", function () { }); }); + it("performs a search with a group of punctuation signs to escape", async () => { + const { eventBus, pdfFindController } = + await initPdfFindController("issue20516.pdf"); + + await testSearch({ + eventBus, + pdfFindController, + state: { + query: `("client")`, + }, + matchesPerPage: [1], + selectedMatch: { + pageIndex: 0, + matchIndex: 0, + }, + pageMatches: [[6]], + pageMatchesLength: [[10]], + }); + }); + describe("custom matcher", () => { it("calls to the matcher with the right arguments", async () => { const QUERY = "Foo bar"; diff --git a/web/pdf_find_controller.js b/web/pdf_find_controller.js index eaa4456f0..0f3f04c55 100644 --- a/web/pdf_find_controller.js +++ b/web/pdf_find_controller.js @@ -77,8 +77,8 @@ const DIACRITICS_EXCEPTION = new Set([ let DIACRITICS_EXCEPTION_STR; // Lazily initialized, see below. const DIACRITICS_REG_EXP = /\p{M}+/gu; -const SPECIAL_CHARS_REG_EXP = - /([*+^${}()|[\]\\])|(\p{P}+)|(\s+)|(\p{M})|(\p{L})/gu; +const SPECIAL_PUNCTUATION_CHARACTERS = /[.?*{}()[\]\\]/g; +const SPECIAL_CHARS_REG_EXP = /([+^$|])|(\p{P}+)|(\s+)|(\p{M})|(\p{L})/gu; const NOT_DIACRITIC_FROM_END_REG_EXP = /([^\p{M}])\p{M}*$/u; const NOT_DIACRITIC_FROM_START_REG_EXP = /^\p{M}*([^\p{M}])/u; @@ -739,7 +739,10 @@ class PDFFindController { } if (p2) { // Allow whitespaces around group of punctuation signs. - return addExtraWhitespaces(p2, p2.replaceAll(/[.?]/g, "\\$&")); + return addExtraWhitespaces( + p2, + p2.replaceAll(SPECIAL_PUNCTUATION_CHARACTERS, "\\$&") + ); } if (p3) { // Replace spaces by \s+ to be sure to match any spaces.