From e0b2146ba667d10452287148e7f8fde61e028dc5 Mon Sep 17 00:00:00 2001 From: Ujjwal Sharma Date: Tue, 12 Nov 2024 11:26:32 +0530 Subject: [PATCH] Enable automatic URL linking Automatically detect links in the text content of a file and automatically generate link annotations at the appropriate locations to achieve automatic link detection and hyperlinking. --- extensions/chromium/preferences_schema.json | 5 + src/display/annotation_layer.js | 23 +++ src/pdf.js | 4 + test/integration/autolinker_spec.mjs | 91 +++++++++ test/integration/jasmine-boot.js | 1 + test/pdfs/.gitignore | 2 + test/pdfs/bug1019475_1.pdf | Bin 0 -> 68512 bytes test/pdfs/bug1019475_2.pdf | Bin 0 -> 27694 bytes test/unit/autolinker_spec.js | 194 ++++++++++++++++++++ test/unit/clitests.json | 1 + test/unit/pdf_spec.js | 4 + web/annotation_layer_builder.js | 140 +++++++++++++- web/app.js | 2 + web/app_options.js | 5 + web/autolinker.js | 147 +++++++++++++++ web/pdf_find_controller.js | 2 +- web/pdf_page_view.js | 16 +- web/pdf_viewer.js | 6 + web/pdfjs.js | 4 + 19 files changed, 635 insertions(+), 12 deletions(-) create mode 100644 test/integration/autolinker_spec.mjs create mode 100644 test/pdfs/bug1019475_1.pdf create mode 100644 test/pdfs/bug1019475_2.pdf create mode 100644 test/unit/autolinker_spec.js create mode 100644 web/autolinker.js diff --git a/extensions/chromium/preferences_schema.json b/extensions/chromium/preferences_schema.json index 886cc87b44029..0bd7f9db3fa42 100644 --- a/extensions/chromium/preferences_schema.json +++ b/extensions/chromium/preferences_schema.json @@ -220,6 +220,11 @@ "description": "The color is a string as defined in CSS. Its goal is to help improve readability in high contrast mode", "type": "string", "default": "CanvasText" + }, + "enableAutoLinking": { + "description": "Automatically detect URLs in the text and create links for them", + "type": "boolean", + "default": false } } } diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index 1b55f3d51f94c..c93ea4cc495e2 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -3264,6 +3264,29 @@ class AnnotationLayer { this.#setAnnotationCanvasMap(); } + /** + * Add link annotations to the annotation layer. + * + * @param {Array} annotations + * @param {IPDFLinkService} linkService + * @memberof AnnotationLayer + */ + async addLinkAnnotations(annotations, linkService) { + const elementParams = { + data: null, + layer: this.div, + linkService, + svgFactory: new DOMSVGFactory(), + parent: this, + }; + for (const data of annotations) { + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + const rendered = element.render(); + await this.#appendElement(rendered, data.id); + } + } + /** * Update the annotation elements on existing annotation layer. * diff --git a/src/pdf.js b/src/pdf.js index 757e97e4ccf11..11569852e6039 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -24,9 +24,11 @@ import { AbortException, + AnnotationBorderStyleType, AnnotationEditorParamsType, AnnotationEditorType, AnnotationMode, + AnnotationType, createValidAbsoluteUrl, FeatureTest, ImageKind, @@ -89,12 +91,14 @@ if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("TESTING || GENERIC")) { export { AbortException, + AnnotationBorderStyleType, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, + AnnotationType, build, ColorPicker, createValidAbsoluteUrl, diff --git a/test/integration/autolinker_spec.mjs b/test/integration/autolinker_spec.mjs new file mode 100644 index 0000000000000..a39c18f7931ec --- /dev/null +++ b/test/integration/autolinker_spec.mjs @@ -0,0 +1,91 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { closePages, loadAndWait } from "./test_utils.mjs"; + +describe("autolinker", function () { + describe("bug1019475_2.pdf", function () { + let pages; + + beforeAll(async () => { + pages = await loadAndWait( + "bug1019475_2.pdf", + ".annotationLayer", + null, + null, + { + enableAutoLinking: true, + } + ); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must appropriately add link annotations when relevant", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const url = await page.$$eval( + ".annotationLayer > .linkAnnotation > a", + annotations => annotations.map(a => a.href) + ); + expect(url.length).withContext(`In ${browserName}`).toEqual(1); + expect(url[0]) + .withContext(`In ${browserName}`) + .toEqual("http://www.mozilla.org/"); + }) + ); + }); + }); + + describe("bug1019475_1.pdf", function () { + let pages; + + beforeAll(async () => { + pages = await loadAndWait( + "bug1019475_1.pdf", + ".annotationLayer", + null, + null, + { + enableAutoLinking: true, + } + ); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must not add links when unnecessary", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const linkIds = await page.$$eval( + ".annotationLayer > .linkAnnotation > a", + annotations => + annotations.map(a => a.getAttribute("data-element-id")) + ); + expect(linkIds.length).withContext(`In ${browserName}`).toEqual(3); + linkIds.forEach(id => + expect(id) + .withContext(`In ${browserName}`) + .not.toContain("added_link_") + ); + }) + ); + }); + }); +}); diff --git a/test/integration/jasmine-boot.js b/test/integration/jasmine-boot.js index 3dff4d9f0a389..b6d904c84a168 100644 --- a/test/integration/jasmine-boot.js +++ b/test/integration/jasmine-boot.js @@ -28,6 +28,7 @@ async function runTests(results) { spec_files: [ "accessibility_spec.mjs", "annotation_spec.mjs", + "autolinker_spec.mjs", "caret_browsing_spec.mjs", "copy_paste_spec.mjs", "find_spec.mjs", diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 3001e51b4b03b..14660ecd31060 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -698,3 +698,5 @@ !issue19207.pdf !issue19239.pdf !issue19360.pdf +!bug1019475_1.pdf +!bug1019475_2.pdf diff --git a/test/pdfs/bug1019475_1.pdf b/test/pdfs/bug1019475_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..54e80411fad1fce88f0467d816989792ad9c53fd GIT binary patch literal 68512 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 LNJvCvMPdF61$tv3 literal 0 HcmV?d00001 diff --git a/test/pdfs/bug1019475_2.pdf b/test/pdfs/bug1019475_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..569b5f6ce212b1fba7dd395a2474831b168bc778 GIT binary patch literal 27694 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 F{69C)nrZ+5 literal 0 HcmV?d00001 diff --git a/test/unit/autolinker_spec.js b/test/unit/autolinker_spec.js new file mode 100644 index 0000000000000..23a30446c54b3 --- /dev/null +++ b/test/unit/autolinker_spec.js @@ -0,0 +1,194 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Autolinker } from "../../web/autolinker.js"; + +function testLinks(links) { + const matches = Autolinker.findLinks(links.map(link => link[0]).join("\n")); + expect(matches.length).toEqual(links.length); + for (let i = 0; i < links.length; i++) { + expect(matches[i].url).toEqual(links[i][1]); + } +} + +describe("autolinker", function () { + it("should correctly find URLs", function () { + const [matched] = Autolinker.findLinks("http://www.example.com"); + expect(matched.url).toEqual("http://www.example.com/"); + }); + + it("should correctly find simple valid URLs", function () { + testLinks([ + [ + "http://subdomain.example.com/path/to/page?query=param", + "http://subdomain.example.com/path/to/page?query=param", + ], + [ + "www.example.com/path/to/resource", + "http://www.example.com/path/to/resource", + ], + [ + "http://example.com/path?query=value#fragment", + "http://example.com/path?query=value#fragment", + ], + ]); + }); + + it("should correctly find emails", function () { + testLinks([ + ["mailto:username@example.com", "mailto:username@example.com"], + [ + "mailto:someone@subdomain.example.com", + "mailto:someone@subdomain.example.com", + ], + ["peter@abc.de", "mailto:peter@abc.de"], + ["red.teddy.b@abc.com", "mailto:red.teddy.b@abc.com"], + [ + "abc_@gmail.com", // '_' is ok before '@'. + "mailto:abc_@gmail.com", + ], + [ + "dummy-hi@gmail.com", // '-' is ok in user name. + "mailto:dummy-hi@gmail.com", + ], + [ + "a..df@gmail.com", // Stop at consecutive '.'. + "mailto:a..df@gmail.com", + ], + [ + ".john@yahoo.com", // Remove heading '.'. + "mailto:john@yahoo.com", + ], + [ + "abc@xyz.org?/", // Trim ending invalid chars. + "mailto:abc@xyz.org", + ], + [ + "fan{abc@xyz.org", // Trim beginning invalid chars. + "mailto:abc@xyz.org", + ], + [ + "fan@g.com..", // Trim the ending periods. + "mailto:fan@g.com", + ], + [ + "CAP.cap@Gmail.Com", // Keep the original case. + "mailto:CAP.cap@Gmail.Com", + ], + ]); + }); + + it("should correctly handle complex or edge cases", function () { + testLinks([ + [ + "https://example.com/path/to/page?query=param&another=val#section", + "https://example.com/path/to/page?query=param&another=val#section", + ], + [ + "www.example.com/resource/(parentheses)-allowed/", + "http://www.example.com/resource/(parentheses)-allowed/", + ], + [ + "http://example.com/path_with_underscores", + "http://example.com/path_with_underscores", + ], + [ + "http://www.example.com:8080/port/test", + "http://www.example.com:8080/port/test", + ], + [ + "https://example.com/encoded%20spaces%20in%20path", + "https://example.com/encoded%20spaces%20in%20path", + ], + ["mailto:hello+world@example.com", "mailto:hello+world@example.com"], + ["www.a.com/#a=@?q=rr&r=y", "http://www.a.com/#a=@?q=rr&r=y"], + ["http://a.com/1/2/3/4\\5\\6", "http://a.com/1/2/3/4/5/6"], + ["http://www.example.com/foo;bar", "http://www.example.com/foo;bar"], + // ["www.abc.com/#%%^&&*(", "http://www.abc.com/#%%^&&*("], TODO: Patch the regex to accept the whole URL. + ]); + }); + + it("shouldn't find false positives", function () { + const matches = Autolinker.findLinks( + [ + "not a valid URL", + "htp://misspelled-protocol.com", + "example.com (missing protocol)", + "https://[::1] (IPv6 loopback)", + "http:// (just protocol)", + "", // Blank. + "http", // No colon. + "www.", // Missing domain. + "https-and-www", // Dash not colon. + "http:/abc.com", // Missing slash. + "http://((()),", // Only invalid chars in host name. + "ftp://example.com", // Ftp scheme is not supported. + "http:example.com", // Missing slashes. + "http//[example.com", // Invalid IPv6 address. + "http//[00:00:00:00:00:00", // Invalid IPv6 address. + "http//[]", // Empty IPv6 address. + "abc.example.com", // URL without scheme. + ].join("\n") + ); + expect(matches.length).toEqual(0); + }); + + it("should correctly find links among mixed content", function () { + const matches = Autolinker.findLinks( + [ + "Here's a URL: https://example.com and an email: mailto:test@example.com", + "www.example.com and more text", + "Check this: http://example.com/path?query=1 and this mailto:info@domain.com", + ].join("\n") + ); + expect(matches.length).toEqual(5); + expect(matches[0].url).toEqual("https://example.com/"); + expect(matches[1].url).toEqual("mailto:test@example.com"); + expect(matches[2].url).toEqual("http://www.example.com/"); + expect(matches[3].url).toEqual("http://example.com/path?query=1"); + expect(matches[4].url).toEqual("mailto:info@domain.com"); + }); + + it("should correctly work with special characters", function () { + testLinks([ + [ + "https://example.com/path/to/page?query=value&symbol=£", + "https://example.com/path/to/page?query=value&symbol=%C2%A3", + ], + [ + "mailto:user.name+alias@example-domain.com", + "mailto:user.name+alias@example-domain.com", + ], + ["http://example.com/@user", "http://example.com/@user"], + ["https://example.com/path#@anchor", "https://example.com/path#@anchor"], + ["www.测试.net", "http://www.xn--0zwm56d.net/"], + ["www.测试.net;", "http://www.xn--0zwm56d.net/"], + // [ "www.测试。net。", "http://www.xn--0zwm56d.net/" ] TODO: Patch `createValidAbsoluteUrl` to accept this. + ]); + }); + + it("should correctly find links with dashes and newlines between numbers", function () { + const matches = Autolinker.findLinks("http://abcd.efg/test1-\n2/test.html"); + expect(matches.length).toEqual(1); + expect(matches[0].url).toEqual("http://abcd.efg/test1-2/test.html"); + }); + + it("should correctly identify emails with special prefixes", function () { + testLinks([ + ["wwwtest@email.com", "mailto:wwwtest@email.com"], + ["httptest@email.com", "mailto:httptest@email.com"], + ]); + }); +}); diff --git a/test/unit/clitests.json b/test/unit/clitests.json index 492687985c2c3..1328b612461bc 100644 --- a/test/unit/clitests.json +++ b/test/unit/clitests.json @@ -8,6 +8,7 @@ "annotation_storage_spec.js", "api_spec.js", "app_options_spec.js", + "autolinker_spec.js", "bidi_spec.js", "canvas_factory_spec.js", "cff_parser_spec.js", diff --git a/test/unit/pdf_spec.js b/test/unit/pdf_spec.js index e5f0caceb5e59..377de2d0664e3 100644 --- a/test/unit/pdf_spec.js +++ b/test/unit/pdf_spec.js @@ -15,9 +15,11 @@ import { AbortException, + AnnotationBorderStyleType, AnnotationEditorParamsType, AnnotationEditorType, AnnotationMode, + AnnotationType, createValidAbsoluteUrl, FeatureTest, ImageKind, @@ -66,12 +68,14 @@ import { XfaLayer } from "../../src/display/xfa_layer.js"; const expectedAPI = Object.freeze({ AbortException, + AnnotationBorderStyleType, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, + AnnotationType, build, ColorPicker, createValidAbsoluteUrl, diff --git a/web/annotation_layer_builder.js b/web/annotation_layer_builder.js index b6e31404c20a8..6bd22ab01ad5b 100644 --- a/web/annotation_layer_builder.js +++ b/web/annotation_layer_builder.js @@ -27,7 +27,12 @@ // eslint-disable-next-line max-len /** @typedef {import("../src/display/editor/tools.js").AnnotationEditorUIManager} AnnotationEditorUIManager */ -import { AnnotationLayer } from "pdfjs-lib"; +import { + AnnotationLayer, + AnnotationType, + setLayerDimensions, + Util, +} from "pdfjs-lib"; import { PresentationModeState } from "./ui_utils.js"; /** @@ -56,7 +61,16 @@ import { PresentationModeState } from "./ui_utils.js"; * @property {StructTreeLayerBuilder} [structTreeLayer] */ +/** + * @typedef {Object} InjectLinkAnnotationsOptions + * @property {Array} inferredLinks + * @property {PageViewport} viewport + * @property {StructTreeLayerBuilder} [structTreeLayer] + */ + class AnnotationLayerBuilder { + #annotations = null; + #onAppend = null; #eventAbortController = null; @@ -137,15 +151,7 @@ class AnnotationLayerBuilder { return; } - this.annotationLayer = new AnnotationLayer({ - div, - accessibilityManager: this._accessibilityManager, - annotationCanvasMap: this._annotationCanvasMap, - annotationEditorUIManager: this._annotationEditorUIManager, - page: this.pdfPage, - viewport: viewport.clone({ dontFlip: true }), - structTreeLayer, - }); + this.#initAnnotationLayer(viewport, structTreeLayer); await this.annotationLayer.render({ annotations, @@ -159,6 +165,8 @@ class AnnotationLayerBuilder { fieldObjects, }); + this.#annotations = annotations; + // Ensure that interactive form elements in the annotationLayer are // disabled while PresentationMode is active (see issue 12232). if (this.linkService.isInPresentationMode) { @@ -177,6 +185,18 @@ class AnnotationLayerBuilder { } } + #initAnnotationLayer(viewport, structTreeLayer) { + this.annotationLayer = new AnnotationLayer({ + div: this.div, + accessibilityManager: this._accessibilityManager, + annotationCanvasMap: this._annotationCanvasMap, + annotationEditorUIManager: this._annotationEditorUIManager, + page: this.pdfPage, + viewport: viewport.clone({ dontFlip: true }), + structTreeLayer, + }); + } + cancel() { this._cancelled = true; @@ -195,6 +215,37 @@ class AnnotationLayerBuilder { return !!this.annotationLayer?.hasEditableAnnotations(); } + /** + * @param {InjectLinkAnnotationsOptions} options + * @returns {Promise} A promise that is resolved when the inferred links + * are added to the annotation layer. + */ + async injectLinkAnnotations({ + inferredLinks, + viewport, + structTreeLayer = null, + }) { + if (this._cancelled) { + return; + } + + const newLinks = this.#annotations + ? this.#checkInferredLinks(inferredLinks) + : inferredLinks; + + if (!newLinks.length) { + return; + } + + if (!this.annotationLayer) { + this.#initAnnotationLayer(viewport, structTreeLayer); + setLayerDimensions(this.annotationLayer.div, viewport); + } + + await this.annotationLayer.addLinkAnnotations(newLinks, this.linkService); + this.div.hidden = false; + } + #updatePresentationModeState(state) { if (!this.div) { return; @@ -217,6 +268,75 @@ class AnnotationLayerBuilder { section.inert = disableFormElements; } } + + #checkInferredLinks(inferredLinks) { + function annotationRects(annot) { + if (!annot.quadPoints) { + return [annot.rect]; + } + const rects = []; + for (let i = 2, ii = annot.quadPoints.length; i < ii; i += 8) { + const trX = annot.quadPoints[i]; + const trY = annot.quadPoints[i + 1]; + const blX = annot.quadPoints[i + 2]; + const blY = annot.quadPoints[i + 3]; + rects.push([blX, blY, trX, trY]); + } + return rects; + } + + function intersectAnnotations(annot1, annot2) { + const intersections = []; + const annot1Rects = annotationRects(annot1); + const annot2Rects = annotationRects(annot2); + for (const rect1 of annot1Rects) { + for (const rect2 of annot2Rects) { + const intersection = Util.intersect(rect1, rect2); + if (intersection) { + intersections.push(intersection); + } + } + } + return intersections; + } + + function areaRects(rects) { + let totalArea = 0; + for (const rect of rects) { + totalArea += Math.abs((rect[2] - rect[0]) * (rect[3] - rect[1])); + } + return totalArea; + } + + return inferredLinks.filter(link => { + let linkAreaRects; + + for (const annotation of this.#annotations) { + if ( + annotation.annotationType !== AnnotationType.LINK || + annotation.url !== link.url + ) { + continue; + } + // TODO: Add a test case to verify that we can find the intersection + // between two annotations with quadPoints properly. + const intersections = intersectAnnotations(annotation, link); + + if (intersections.length === 0) { + continue; + } + linkAreaRects ??= areaRects(annotationRects(link)); + + if ( + areaRects(intersections) / linkAreaRects > + 0.5 /* If the overlap is more than 50%. */ + ) { + return false; + } + } + return true; + }); + } } export { AnnotationLayerBuilder }; diff --git a/web/app.js b/web/app.js index a935e8eb1f658..f92ac821127c7 100644 --- a/web/app.js +++ b/web/app.js @@ -353,6 +353,7 @@ const PDFViewerApplication = { if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("TESTING")) { Object.assign(opts, { enableAltText: x => x === "true", + enableAutoLinking: x => x === "true", enableFakeMLManager: x => x === "true", enableGuessAltText: x => x === "true", enableUpdatedAddImage: x => x === "true", @@ -492,6 +493,7 @@ const PDFViewerApplication = { abortSignal: this._globalAbortController.signal, enableHWA, supportsPinchToZoom: this.supportsPinchToZoom, + enableAutoLinking: AppOptions.get("enableAutoLinking"), }); this.pdfViewer = pdfViewer; diff --git a/web/app_options.js b/web/app_options.js index 31e47c40f13db..3df12837fabf3 100644 --- a/web/app_options.js +++ b/web/app_options.js @@ -195,6 +195,11 @@ const defaultOptions = { value: true, kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH, }, + enableAutoLinking: { + /** @type {boolean} */ + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE, + }, enableGuessAltText: { /** @type {boolean} */ value: true, diff --git a/web/autolinker.js b/web/autolinker.js new file mode 100644 index 0000000000000..09200f46a96a1 --- /dev/null +++ b/web/autolinker.js @@ -0,0 +1,147 @@ +/* Copyright 2025 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + AnnotationBorderStyleType, + AnnotationType, + createValidAbsoluteUrl, + Util, +} from "pdfjs-lib"; +import { getOriginalIndex, normalize } from "./pdf_find_controller.js"; + +function DOMRectToPDF({ width, height, left, top }, pdfPageView) { + if (width === 0 || height === 0) { + return null; + } + + const pageBox = pdfPageView.textLayer.div.getBoundingClientRect(); + const bottomLeft = pdfPageView.getPagePoint( + left - pageBox.left, + top - pageBox.top + ); + const topRight = pdfPageView.getPagePoint( + left - pageBox.left + width, + top - pageBox.top + height + ); + + return Util.normalizeRect([ + bottomLeft[0], + bottomLeft[1], + topRight[0], + topRight[1], + ]); +} + +function calculateLinkPosition(range, pdfPageView) { + const rangeRects = range.getClientRects(); + if (rangeRects.length === 1) { + return { rect: DOMRectToPDF(rangeRects[0], pdfPageView) }; + } + + const rect = [Infinity, Infinity, -Infinity, -Infinity]; + const quadPoints = []; + let i = 0; + for (const domRect of rangeRects) { + const normalized = DOMRectToPDF(domRect, pdfPageView); + if (normalized === null) { + continue; + } + + quadPoints[i] = quadPoints[i + 4] = normalized[0]; + quadPoints[i + 1] = quadPoints[i + 3] = normalized[3]; + quadPoints[i + 2] = quadPoints[i + 6] = normalized[2]; + quadPoints[i + 5] = quadPoints[i + 7] = normalized[1]; + + rect[0] = Math.min(rect[0], normalized[0]); + rect[1] = Math.min(rect[1], normalized[1]); + rect[2] = Math.max(rect[2], normalized[2]); + rect[3] = Math.max(rect[3], normalized[3]); + + i += 8; + } + return { quadPoints, rect }; +} + +function createLinkAnnotation({ url, index, length }, pdfPageView, id) { + const highlighter = pdfPageView._textHighlighter; + const [{ begin, end }] = highlighter._convertMatches([index], [length]); + + const range = new Range(); + range.setStart(highlighter.textDivs[begin.divIdx].firstChild, begin.offset); + range.setEnd(highlighter.textDivs[end.divIdx].firstChild, end.offset); + + return { + id: `added_link_${id}`, + unsafeUrl: url, + url, + annotationType: AnnotationType.LINK, + rotation: 0, + ...calculateLinkPosition(range, pdfPageView), + // This is just the default for AnnotationBorderStyle. + borderStyle: { + width: 1, + rawWidth: 1, + style: AnnotationBorderStyleType.SOLID, + dashArray: [3], + horizontalCornerRadius: 0, + verticalCornerRadius: 0, + }, + }; +} + +class Autolinker { + static #index = 0; + + static #regex; + + static findLinks(text) { + // Regex can be tested and verified at https://regex101.com/r/zgDwPE/1. + this.#regex ??= + /\b(?:https?:\/\/|mailto:|www\.)(?:[[\S--\[]--\p{P}]|\/|[\p{P}--\[]+[[\S--\[]--\p{P}])+|\b[[\S--@]--\{]+@[\S--.]+\.[[\S--\[]--\p{P}]{2,}/gmv; + + const [normalizedText, diffs] = normalize(text); + const matches = normalizedText.matchAll(this.#regex); + const links = []; + for (const match of matches) { + const raw = + match[0].startsWith("www.") || + match[0].startsWith("mailto:") || + match[0].startsWith("http://") || + match[0].startsWith("https://") + ? match[0] + : `mailto:${match[0]}`; + const url = createValidAbsoluteUrl(raw, null, { + addDefaultProtocol: true, + }); + if (url) { + const [index, length] = getOriginalIndex( + diffs, + match.index, + match[0].length + ); + links.push({ url: url.href, index, length }); + } + } + return links; + } + + static processLinks(pdfPageView) { + return this.findLinks( + pdfPageView._textHighlighter.textContentItemsStr.join("\n") + ).map(link => createLinkAnnotation(link, pdfPageView, this.#index++)); + } +} + +export { Autolinker }; diff --git a/web/pdf_find_controller.js b/web/pdf_find_controller.js index 0b46117e9f986..a9fa441a13728 100644 --- a/web/pdf_find_controller.js +++ b/web/pdf_find_controller.js @@ -1185,4 +1185,4 @@ class PDFFindController { } } -export { FindState, PDFFindController }; +export { FindState, getOriginalIndex, normalize, PDFFindController }; diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index fd33e3b762e52..9be250b2bc0e6 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -43,6 +43,7 @@ import { import { AnnotationEditorLayerBuilder } from "./annotation_editor_layer_builder.js"; import { AnnotationLayerBuilder } from "./annotation_layer_builder.js"; import { AppOptions } from "./app_options.js"; +import { Autolinker } from "./autolinker.js"; import { DrawLayerBuilder } from "./draw_layer_builder.js"; import { GenericL10n } from "web-null_l10n"; import { SimpleLinkService } from "./pdf_link_service.js"; @@ -84,6 +85,8 @@ import { XfaLayerBuilder } from "./xfa_layer_builder.js"; * the necessary layer-properties. * @property {boolean} [enableHWA] - Enables hardware acceleration for * rendering. The default value is `false`. + * @property {boolean} [enableAutoLinking] - Enable creation of hyperlinks from + * text that look like URLs. The default value is `false`. */ const DEFAULT_LAYER_PROPERTIES = @@ -120,6 +123,8 @@ class PDFPageView { #enableHWA = false; + #enableAutoLinking = false; + #hasRestrictedScaling = false; #isEditing = false; @@ -177,6 +182,7 @@ class PDFPageView { options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); this.pageColors = options.pageColors || null; this.#enableHWA = options.enableHWA || false; + this.#enableAutoLinking = options.enableAutoLinking || false; this.eventBus = options.eventBus; this.renderingQueue = options.renderingQueue; @@ -1100,10 +1106,18 @@ class PDFPageView { viewport.rawDims ); - this.#renderTextLayer(); + const textLayerPromise = this.#renderTextLayer(); if (this.annotationLayer) { await this.#renderAnnotationLayer(); + if (this.#enableAutoLinking) { + await textLayerPromise; + this.annotationLayer.injectLinkAnnotations({ + inferredLinks: Autolinker.processLinks(this), + viewport: this.viewport, + structTreeLayer: this.structTreeLayer, + }); + } } const { annotationEditorUIManager } = this.#layerProperties; diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index 986cfa71236ac..0880a40146611 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -128,6 +128,8 @@ function isValidAnnotationEditorMode(mode) { * rendering. The default value is `false`. * @property {boolean} [supportsPinchToZoom] - Enable zooming on pinch gesture. * The default value is `true`. + * @property {boolean} [enableAutoLinking] - Enable creation of hyperlinks from + * text that look like URLs. The default value is `false`. */ class PDFPageViewBuffer { @@ -228,6 +230,8 @@ class PDFViewer { #enableNewAltTextWhenAddingImage = false; + #enableAutoLinking = false; + #eventAbortController = null; #mlManager = null; @@ -321,6 +325,7 @@ class PDFViewer { this.#mlManager = options.mlManager || null; this.#enableHWA = options.enableHWA || false; this.#supportsPinchToZoom = options.supportsPinchToZoom !== false; + this.#enableAutoLinking = options.enableAutoLinking || false; this.defaultRenderingQueue = !options.renderingQueue; if ( @@ -990,6 +995,7 @@ class PDFViewer { l10n: this.l10n, layerProperties: this._layerProperties, enableHWA: this.#enableHWA, + enableAutoLinking: this.#enableAutoLinking, }); this._pages.push(pageView); } diff --git a/web/pdfjs.js b/web/pdfjs.js index 7ac129513be5a..ac5d6432cf6ae 100644 --- a/web/pdfjs.js +++ b/web/pdfjs.js @@ -15,12 +15,14 @@ const { AbortException, + AnnotationBorderStyleType, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, + AnnotationType, build, ColorPicker, createValidAbsoluteUrl, @@ -62,12 +64,14 @@ const { export { AbortException, + AnnotationBorderStyleType, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, + AnnotationType, build, ColorPicker, createValidAbsoluteUrl,