[api-minor] Re-factor the basic textLayer-functionality

This is very old code, and predates e.g. the introduction of JavaScript classes, which creates unnecessarily unwieldy code in the viewer.
By introducing a new `TextLayer` class in the API, similar to how e.g. the `AnnotationLayer` looks, we're able to keep most parameters on the class-instance itself. This removes the need to manually track them in the viewer, and simplifies the call-sites.

This also removes the `numTextDivs` parameter from the "textlayerrendered" event, since that's only added to support default-viewer functionality that no longer exists.

Finally we try, as far as possible, to polyfill the old `renderTextLayer` and `updateTextLayer` functions since they are exposed in the library API.
For *simple* invocations of `renderTextLayer` the behaviour should thus be the same, with only a warning printed in the console.
This commit is contained in:
Jonas Jenwald 2024-05-16 11:28:06 +02:00
parent 63b66b412c
commit 15b5808eee
9 changed files with 383 additions and 377 deletions

View file

@ -13,13 +13,10 @@
* limitations under the License.
*/
import {
renderTextLayer,
TextLayerRenderTask,
} from "../../src/display/text_layer.js";
import { buildGetDocumentParams } from "./test_utils.js";
import { getDocument } from "../../src/display/api.js";
import { isNodeJS } from "../../src/shared/util.js";
import { TextLayer } from "../../src/display/text_layer.js";
describe("textLayer", function () {
it("creates textLayer from ReadableStream", async function () {
@ -30,18 +27,14 @@ describe("textLayer", function () {
const pdfDocument = await loadingTask.promise;
const page = await pdfDocument.getPage(1);
const textContentItemsStr = [];
const textLayerRenderTask = renderTextLayer({
const textLayer = new TextLayer({
textContentSource: page.streamTextContent(),
container: document.createElement("div"),
viewport: page.getViewport({ scale: 1 }),
textContentItemsStr,
});
expect(textLayerRenderTask instanceof TextLayerRenderTask).toEqual(true);
await textLayer.render();
await textLayerRenderTask.promise;
expect(textContentItemsStr).toEqual([
expect(textLayer.textContentItemsStr).toEqual([
"Table Of Content",
"",
"Chapter 1",
@ -70,18 +63,14 @@ describe("textLayer", function () {
const pdfDocument = await loadingTask.promise;
const page = await pdfDocument.getPage(1);
const textContentItemsStr = [];
const textLayerRenderTask = renderTextLayer({
const textLayer = new TextLayer({
textContentSource: await page.getTextContent(),
container: document.createElement("div"),
viewport: page.getViewport({ scale: 1 }),
textContentItemsStr,
});
expect(textLayerRenderTask instanceof TextLayerRenderTask).toEqual(true);
await textLayer.render();
await textLayerRenderTask.promise;
expect(textContentItemsStr).toEqual([
expect(textLayer.textContentItemsStr).toEqual([
"Table Of Content",
"",
"Chapter 1",