diff --git a/examples/server.ts b/examples/server.ts index f8150275..c89258b2 100644 --- a/examples/server.ts +++ b/examples/server.ts @@ -33,6 +33,10 @@ async function start() { title: "API Example", getUrl: (url) => `/viewer/index_api.html?url=${url}`, }, + { + title: "Static Placeholder PDF Example", + getUrl: (url) => `/viewer/index_pdf.html?url=${url}`, + }, ], }); diff --git a/package-lock.json b/package-lock.json index a54b884a..3eeea9ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "2.1.1", "license": "Apache-2.0", "dependencies": { + "@types/pdfjs-dist": "^2.7.4", "@types/sass": "^1.43.1", "browserslist-useragent": "^3.0.3", "cssesc": "^3.0.0", @@ -19,6 +20,7 @@ "lodash.clonedeep": "^4.5.0", "loglevel": "^1.8.0", "mark.js": "^8.11.1", + "pdfjs-dist": "2.16.105", "promise-polyfill": "^8.2.0", "r2-shared-js": "^1.0.51", "recursive-readdir": "^2.2.2", @@ -540,7 +542,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -554,7 +556,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6.0.0" } @@ -563,7 +565,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6.0.0" } @@ -572,7 +574,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -582,13 +584,13 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.14", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2085,7 +2087,7 @@ "version": "8.4.5", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@types/estree": "*", @@ -2096,7 +2098,7 @@ "version": "3.7.4", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@types/eslint": "*", @@ -2107,7 +2109,7 @@ "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@types/expect": { @@ -2162,7 +2164,7 @@ "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "devOptional": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2220,6 +2222,15 @@ "integrity": "sha512-oPwPSj4a1wu9rsXTEGIJz91ISU725t0BmSnUhb57sI+M8XEmvUop84lzuiYdq0Y5M6xLY8DBPg0C2xEQKLyvBA==", "dev": true }, + "node_modules/@types/pdfjs-dist": { + "version": "2.10.378", + "resolved": "https://registry.npmjs.org/@types/pdfjs-dist/-/pdfjs-dist-2.10.378.tgz", + "integrity": "sha512-TRdIPqdsvKmPla44kVy4jv5Nt5vjMfVjbIEke1CRULIrwKNRC4lIiZvNYDJvbUMNCFPNIUcOKhXTyMJrX18IMA==", + "deprecated": "This is a stub types definition. pdfjs-dist provides its own type definitions, so you do not need this installed.", + "dependencies": { + "pdfjs-dist": "*" + } + }, "node_modules/@types/promise-polyfill": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/promise-polyfill/-/promise-polyfill-6.0.3.tgz", @@ -2613,7 +2624,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.1", @@ -2624,28 +2635,28 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", @@ -2657,14 +2668,14 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -2677,7 +2688,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" @@ -2687,7 +2698,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@xtuc/long": "4.2.2" @@ -2697,14 +2708,14 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -2721,7 +2732,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -2735,7 +2746,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -2748,7 +2759,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -2763,7 +2774,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", @@ -2782,14 +2793,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/abbrev": { @@ -2821,7 +2832,7 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -2833,7 +2844,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, + "devOptional": true, "peer": true, "peerDependencies": { "acorn": "^8" @@ -2906,7 +2917,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, + "devOptional": true, "peer": true, "peerDependencies": { "ajv": "^6.9.1" @@ -3300,7 +3311,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, + "devOptional": true, "engines": { "node": "*" } @@ -3691,7 +3702,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6.0" } @@ -3804,7 +3815,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "devOptional": true }, "node_modules/compare-versions": { "version": "3.6.0", @@ -4420,6 +4431,11 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/dommatrix": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dommatrix/-/dommatrix-1.0.3.tgz", + "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==" + }, "node_modules/domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", @@ -4592,7 +4608,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 4" } @@ -4703,7 +4719,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/es-shim-unscopables": { @@ -5304,7 +5320,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, + "devOptional": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -5518,7 +5534,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "devOptional": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -5530,7 +5546,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=4.0" } @@ -5539,7 +5555,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=4.0" } @@ -5571,7 +5587,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=0.8.x" @@ -6137,7 +6153,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/global-modules": { @@ -6282,7 +6298,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -7038,7 +7054,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@types/node": "*", @@ -7053,7 +7069,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -7199,7 +7215,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "devOptional": true }, "node_modules/json-schema": { "version": "0.4.0", @@ -7226,7 +7242,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, + "devOptional": true, "bin": { "json5": "lib/cli.js" }, @@ -7373,7 +7389,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=6.11.5" @@ -7383,7 +7399,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, + "devOptional": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -7587,7 +7603,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/merge2": { @@ -7934,7 +7950,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, + "devOptional": true, "peer": true }, "node_modules/nise": { @@ -8515,6 +8531,23 @@ "node": "*" } }, + "node_modules/pdfjs-dist": { + "version": "2.16.105", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz", + "integrity": "sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==", + "dependencies": { + "dommatrix": "^1.0.3", + "web-streams-polyfill": "^3.2.1" + }, + "peerDependencies": { + "worker-loader": "^3.0.8" + }, + "peerDependenciesMeta": { + "worker-loader": { + "optional": true + } + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -9074,7 +9107,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + "devOptional": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -9519,7 +9552,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -9608,7 +9641,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, + "devOptional": true, "dependencies": { "randombytes": "^2.1.0" } @@ -9776,7 +9809,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -9793,7 +9826,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "devOptional": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -10188,7 +10221,7 @@ "version": "5.14.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -10206,7 +10239,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.7", @@ -10939,7 +10972,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -10965,11 +10998,19 @@ "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, "node_modules/webpack": { "version": "5.74.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -11017,7 +11058,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=10.13.0" @@ -11027,7 +11068,7 @@ "version": "5.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, + "devOptional": true, "peer": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -11041,7 +11082,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, + "devOptional": true, "peer": true, "engines": { "node": ">=6" @@ -11111,6 +11152,27 @@ "node": ">=0.10.0" } }, + "node_modules/worker-loader": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", + "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", + "optional": true, + "peer": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, "node_modules/workerpool": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", @@ -11723,7 +11785,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -11734,19 +11796,19 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "devOptional": true }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true + "devOptional": true }, "@jridgewell/source-map": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -11756,13 +11818,13 @@ "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "devOptional": true }, "@jridgewell/trace-mapping": { "version": "0.3.14", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -12776,7 +12838,7 @@ "version": "8.4.5", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@types/estree": "*", @@ -12787,7 +12849,7 @@ "version": "3.7.4", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@types/eslint": "*", @@ -12798,7 +12860,7 @@ "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true, + "devOptional": true, "peer": true }, "@types/expect": { @@ -12853,7 +12915,7 @@ "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "devOptional": true }, "@types/json5": { "version": "0.0.29", @@ -12911,6 +12973,14 @@ "integrity": "sha512-oPwPSj4a1wu9rsXTEGIJz91ISU725t0BmSnUhb57sI+M8XEmvUop84lzuiYdq0Y5M6xLY8DBPg0C2xEQKLyvBA==", "dev": true }, + "@types/pdfjs-dist": { + "version": "2.10.378", + "resolved": "https://registry.npmjs.org/@types/pdfjs-dist/-/pdfjs-dist-2.10.378.tgz", + "integrity": "sha512-TRdIPqdsvKmPla44kVy4jv5Nt5vjMfVjbIEke1CRULIrwKNRC4lIiZvNYDJvbUMNCFPNIUcOKhXTyMJrX18IMA==", + "requires": { + "pdfjs-dist": "*" + } + }, "@types/promise-polyfill": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/promise-polyfill/-/promise-polyfill-6.0.3.tgz", @@ -13202,7 +13272,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.1", @@ -13213,28 +13283,28 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true, + "devOptional": true, "peer": true }, "@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true, + "devOptional": true, "peer": true }, "@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true, + "devOptional": true, "peer": true }, "@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", @@ -13246,14 +13316,14 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true, + "devOptional": true, "peer": true }, "@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -13266,7 +13336,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@xtuc/ieee754": "^1.2.0" @@ -13276,7 +13346,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@xtuc/long": "4.2.2" @@ -13286,14 +13356,14 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true, + "devOptional": true, "peer": true }, "@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -13310,7 +13380,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -13324,7 +13394,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -13337,7 +13407,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -13352,7 +13422,7 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@webassemblyjs/ast": "1.11.1", @@ -13368,14 +13438,14 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, + "devOptional": true, "peer": true }, "@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, + "devOptional": true, "peer": true }, "abbrev": { @@ -13404,13 +13474,13 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true + "devOptional": true }, "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, + "devOptional": true, "peer": true, "requires": {} }, @@ -13465,7 +13535,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, + "devOptional": true, "peer": true, "requires": {} }, @@ -13753,7 +13823,7 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "devOptional": true }, "binary": { "version": "0.3.0", @@ -14029,7 +14099,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true + "devOptional": true }, "cliui": { "version": "7.0.4", @@ -14120,7 +14190,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "devOptional": true }, "compare-versions": { "version": "3.6.0", @@ -14598,6 +14668,11 @@ "domelementtype": "^2.2.0" } }, + "dommatrix": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dommatrix/-/dommatrix-1.0.3.tgz", + "integrity": "sha512-l32Xp/TLgWb8ReqbVJAFIvXmY7go4nTxxlWiAFyhoQw9RKEOHBZNnyGvJWqDVSPmq3Y9HlM4npqF/T6VMOXhww==" + }, "domutils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", @@ -14743,7 +14818,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "devOptional": true }, "encodeurl": { "version": "1.0.2", @@ -14830,7 +14905,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true, + "devOptional": true, "peer": true }, "es-shim-unscopables": { @@ -15341,7 +15416,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, + "devOptional": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -15422,7 +15497,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, + "devOptional": true, "requires": { "estraverse": "^5.2.0" }, @@ -15431,7 +15506,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true + "devOptional": true } } }, @@ -15439,7 +15514,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "devOptional": true }, "esutils": { "version": "2.0.3", @@ -15462,7 +15537,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, + "devOptional": true, "peer": true }, "expand-tilde": { @@ -15919,7 +15994,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, + "devOptional": true, "peer": true }, "global-modules": { @@ -16028,7 +16103,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "devOptional": true }, "has-glob": { "version": "0.1.1", @@ -16533,7 +16608,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@types/node": "*", @@ -16545,7 +16620,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "has-flag": "^4.0.0" @@ -16654,7 +16729,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "devOptional": true }, "json-schema": { "version": "0.4.0", @@ -16681,7 +16756,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true + "devOptional": true }, "jsonc-parser": { "version": "3.0.0", @@ -16803,14 +16878,14 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, + "devOptional": true, "peer": true }, "loader-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, + "devOptional": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -16968,7 +17043,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, + "devOptional": true, "peer": true }, "merge2": { @@ -17226,7 +17301,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, + "devOptional": true, "peer": true }, "nise": { @@ -17664,6 +17739,15 @@ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true }, + "pdfjs-dist": { + "version": "2.16.105", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.16.105.tgz", + "integrity": "sha512-J4dn41spsAwUxCpEoVf6GVoz908IAA3mYiLmNxg8J9kfRXc2jxpbUepcP0ocp0alVNLFthTAM8DZ1RaHh8sU0A==", + "requires": { + "dommatrix": "^1.0.3", + "web-streams-polyfill": "^3.2.1" + } + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -18081,7 +18165,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + "devOptional": true, "requires": { "safe-buffer": "^5.1.0" } @@ -18409,7 +18493,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@types/json-schema": "^7.0.8", @@ -18478,7 +18562,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, + "devOptional": true, "requires": { "randombytes": "^2.1.0" } @@ -18613,7 +18697,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "devOptional": true }, "source-map-js": { "version": "1.0.2", @@ -18624,7 +18708,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "devOptional": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -18939,7 +19023,7 @@ "version": "5.14.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -18951,7 +19035,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@jridgewell/trace-mapping": "^0.3.7", @@ -19523,7 +19607,7 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -19546,11 +19630,16 @@ "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", "dev": true }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" + }, "webpack": { "version": "5.74.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "@types/eslint-scope": "^3.7.3", @@ -19583,7 +19672,7 @@ "version": "5.10.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, + "devOptional": true, "peer": true, "requires": { "graceful-fs": "^4.2.4", @@ -19594,7 +19683,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, + "devOptional": true, "peer": true } } @@ -19603,7 +19692,7 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, + "devOptional": true, "peer": true }, "whatwg-fetch": { @@ -19652,6 +19741,17 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "worker-loader": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz", + "integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==", + "optional": true, + "peer": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + } + }, "workerpool": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", diff --git a/package.json b/package.json index 2f5d1baf..056b692d 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ }, "dependencies": { "@types/sass": "^1.43.1", + "@types/pdfjs-dist": "^2.7.4", "browserslist-useragent": "^3.0.3", "cssesc": "^3.0.0", "detect-browser": "^5.2.0", @@ -34,6 +35,7 @@ "lodash.clonedeep": "^4.5.0", "loglevel": "^1.8.0", "mark.js": "^8.11.1", + "pdfjs-dist": "2.16.105", "promise-polyfill": "^8.2.0", "r2-shared-js": "^1.0.51", "recursive-readdir": "^2.2.2", diff --git a/src/navigator/Navigator.ts b/src/navigator/Navigator.ts index c040c3f3..bf95eecb 100644 --- a/src/navigator/Navigator.ts +++ b/src/navigator/Navigator.ts @@ -17,6 +17,75 @@ * Licensed to: Bokbasen AS and CAST under one or more contributor license agreements. */ -interface Navigator {} +import { Locator } from "../model/Locator"; +import { IFrameAttributes } from "./IFrameNavigator"; + +interface Navigator { + publication: any; + rights?: any; + hasMediaOverlays?: any; + + addListener?(argument: any, argument2: any): void; + + startReadAloud?(): void; + + stopReadAloud?(): void; + + pauseReadAloud?(): void; + + resumeReadAloud?(): void; + + startReadAlong?(): void; + + stopReadAlong?(): void; + + pauseReadAlong?(): void; + + resumeReadAlong?(): void; + + hideLayer?(layer): any; + + showLayer?(layer): any; + + activateMarker?(id: string, position: string): any; + + deactivateMarker?(): any; + + tableOfContents(): any; + + readingOrder(): any; + + currentResource(): any; + + mostRecentNavigatedTocItem?(): any; + + totalResources(): any; + + currentLocator(): any; + + positions(): any; + + goTo(locator: Locator): void; + + goToPosition(value: number); + + nextResource(): void; + + previousResource(): void; + + nextPage(): void; + + previousPage(): void; + + atStart?(): any; + + atEnd?(): any; + + snapToSelector?(selector): void; + + applyAttributes?(value: IFrameAttributes): void; + + stop(): void; +} export default Navigator; diff --git a/src/navigator/PDFNavigator.ts b/src/navigator/PDFNavigator.ts new file mode 100644 index 00000000..46351094 --- /dev/null +++ b/src/navigator/PDFNavigator.ts @@ -0,0 +1,197 @@ +import EventEmitter from "eventemitter3"; +import Navigator from "./Navigator"; +import { UserSettings } from "../model/user-settings/UserSettings"; +import { Publication } from "../model/Publication"; +import { Locator } from "../model/Locator"; +import { getDocument, GlobalWorkerOptions } from "pdfjs-dist"; +import { findRequiredElement } from "../utils/HTMLUtilities"; + +export interface PDFNavigatorConfig { + mainElement: HTMLElement; + headerMenu?: HTMLElement | null; + footerMenu?: HTMLElement | null; + publication: Publication; + settings: UserSettings; +} + +export class PDFNavigator extends EventEmitter implements Navigator { + settings: UserSettings; + publication: Publication; + + headerMenu?: HTMLElement | null; + footerMenu?: HTMLElement | null; + mainElement: HTMLElement; + + pdfDoc: any = null; + pageNum = 1; + pageRendering = false; + pageNumPending: any = null; + scale = 1.0; + canvas: HTMLCanvasElement; + ctx: CanvasRenderingContext2D | null; + resourceIndex = 0; + resource: any; + + public static async create( + config: PDFNavigatorConfig + ): Promise { + const navigator = new this(config.settings, config.publication); + + await navigator.start( + config.mainElement, + config.headerMenu, + config.footerMenu + ); + return new Promise((resolve) => resolve(navigator)); + } + protected constructor(settings: UserSettings, publication: Publication) { + super(); + this.settings = settings; + this.publication = publication; + } + + protected async start( + mainElement: HTMLElement, + headerMenu?: HTMLElement | null, + footerMenu?: HTMLElement | null + ): Promise { + this.headerMenu = headerMenu; + this.footerMenu = footerMenu; + this.mainElement = mainElement; + + this.resourceIndex = 0; + this.resource = this.publication.readingOrder[this.resourceIndex]; + + console.log(this.resource); + console.log(this.resource.Href1); + + GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.worker.js`; + + this.canvas = document.getElementById("the-canvas") as HTMLCanvasElement; + this.ctx = this.canvas.getContext("2d"); + + const self = this; + + getDocument(this.resource.Href1).promise.then(function (pdfDoc_) { + self.pdfDoc = pdfDoc_; + self.renderPage(self.pageNum); + }); + } + + renderPage(num) { + const self = this; + const main = findRequiredElement(this.mainElement, "main"); + self.pageRendering = true; + + self.pdfDoc.getPage(num).then(function (page) { + let viewport = page.getViewport({ scale: self.scale }); + + const sc = main.clientHeight / viewport.height; + viewport = page.getViewport({ scale: sc }); + + self.canvas.height = viewport.height; + self.canvas.width = viewport.width; + + // Render PDF page into canvas context + const renderContext = { + canvasContext: self.ctx, + viewport: viewport, + }; + const renderTask = page.render(renderContext); + + // Wait for rendering to finish + renderTask.promise.then(function () { + self.pageRendering = false; + if (self.pageNumPending !== null) { + // New page rendering is pending + self.renderPage(self.pageNumPending); + self.pageNumPending = null; + } + }); + }); + } + + queueRenderPage(num) { + const self = this; + if (self.pageRendering) { + self.pageNumPending = num; + } else { + self.renderPage(num); + } + } + + readingOrder(): any {} + + tableOfContents(): any {} + + currentResource(): any {} + + totalResources(): any {} + + currentLocator(): any {} + + positions(): any {} + + nextPage(): void { + const self = this; + if (self.pageNum >= self.pdfDoc.numPages) { + this.nextResource(); + return; + } + this.pageNum++; + this.queueRenderPage(self.pageNum); + } + + previousPage(): void { + const self = this; + if (self.pageNum <= 1) { + this.previousResource(); + return; + } + self.pageNum--; + self.queueRenderPage(self.pageNum); + } + + nextResource(): void { + const self = this; + console.log(self.resourceIndex, this.publication.readingOrder.length - 1); + if (this.resourceIndex >= this.publication.readingOrder.length - 1) { + return; + } + self.pageNum = 1; + self.resourceIndex++; + self.resource = this.publication.readingOrder[self.resourceIndex]; + console.log(this.resource.Href1); + getDocument(this.resource.Href1).promise.then(function (pdfDoc_) { + self.pdfDoc = pdfDoc_; + self.renderPage(self.pageNum); + }); + } + + previousResource(): void { + const self = this; + console.log(self.resourceIndex, this.publication.readingOrder.length - 1); + if (this.resourceIndex === 0) { + return; + } + // TODO: how to know last page of previous resource + self.pageNum = 1; + self.resourceIndex--; + self.resource = this.publication.readingOrder[self.resourceIndex]; + console.log(this.resource.Href1); + getDocument(this.resource.Href1).promise.then(function (pdfDoc_) { + self.pdfDoc = pdfDoc_; + self.renderPage(self.pageNum); + }); + } + + goTo(locator: Locator): void { + console.log(locator); + } + + goToPosition(value: number): void { + console.log(value); + } + + stop(): void {} +} diff --git a/src/reader.ts b/src/reader.ts index 55222e0e..50fd8545 100644 --- a/src/reader.ts +++ b/src/reader.ts @@ -56,6 +56,8 @@ import LineFocusModule from "./modules/linefocus/LineFocusModule"; import { HistoryModule } from "./modules/history/HistoryModule"; import CitationModule from "./modules/citation/CitationModule"; import { TaJsonDeserialize } from "./utils/JsonUtil"; +import { PDFNavigator } from "./navigator/PDFNavigator"; +import Navigator from "./navigator/Navigator"; /** * A class that, once instantiated using the public `.build` method, @@ -70,8 +72,8 @@ import { TaJsonDeserialize } from "./utils/JsonUtil"; export default class D2Reader { private constructor( private readonly settings: UserSettings, - private readonly navigator: IFrameNavigator, - private readonly highlighter: TextHighlighter, + private readonly navigator: Navigator | IFrameNavigator | PDFNavigator, + private readonly highlighter?: TextHighlighter, private readonly bookmarkModule?: BookmarkModule, private readonly annotationModule?: AnnotationModule, private readonly ttsSettings?: TTSSettings, @@ -89,7 +91,9 @@ export default class D2Reader { ) {} addEventListener() { - this.navigator.addListener(arguments[0], arguments[1]); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.addListener(arguments[0], arguments[1]); + } } /** @@ -162,237 +166,256 @@ export default class D2Reader { // update our config based on what we know from the publication rights = updateConfig(rights, publication); - /** - * Set up publication positions and weights by either auto - * generating them or fetching them from provided services. - */ - if (rights.autoGeneratePositions) { - await publication.autoGeneratePositions(initialConfig.requestConfig); + if ( + publication.Metadata.ConformsTo && + publication.Metadata.ConformsTo.includes( + "https://readium.org/webpub-manifest/profiles/pdf" + ) + ) { + const settings = await UserSettings.create({ + store: settingsStore, + initialUserSettings: initialConfig.userSettings, + layout: "", + }); + const navigator = await PDFNavigator.create({ + mainElement: mainElement, + publication: publication, + settings: settings, + }); + return new D2Reader(settings, navigator); } else { - if (initialConfig.services?.positions) { - await publication.fetchPositionsFromService( - initialConfig.services?.positions.href, - initialConfig.requestConfig - ); - } - if (initialConfig.services?.weight) { - await publication.fetchWeightsFromService( - initialConfig.services?.weight.href, - initialConfig.requestConfig - ); + /** + * Set up publication positions and weights by either auto + * generating them or fetching them from provided services. + */ + if (rights.autoGeneratePositions) { + await publication.autoGeneratePositions(initialConfig.requestConfig); + } else { + if (initialConfig.services?.positions) { + await publication.fetchPositionsFromService( + initialConfig.services?.positions.href, + initialConfig.requestConfig + ); + } + if (initialConfig.services?.weight) { + await publication.fetchWeightsFromService( + initialConfig.services?.weight.href, + initialConfig.requestConfig + ); + } } - } - const layers = await LayerSettings.create({ store: layerStore }); - - // Settings - const settings = await UserSettings.create({ - store: settingsStore, - initialUserSettings: initialConfig.userSettings, - headerMenu: headerMenu, - api: initialConfig.api, - injectables: - (publication.Metadata.Rendition?.Layout ?? "unknown") === "fixed" - ? initialConfig.injectablesFixed - : initialConfig.injectables, - layout: - (publication.Metadata.Rendition?.Layout ?? "unknown") === "fixed" - ? "fixed" - : "reflowable", - }); + const layers = await LayerSettings.create({ store: layerStore }); - // Navigator - const navigator = await IFrameNavigator.create({ - mainElement: mainElement, - headerMenu: headerMenu, - footerMenu: footerMenu, - publication: publication, - settings, - annotator: annotator, - initialLastReadingPosition: initialConfig.lastReadingPosition, - api: initialConfig.api, - rights: rights, - tts: initialConfig.tts, - sample: initialConfig.sample, - requestConfig: initialConfig.requestConfig, - injectables: - (publication.Metadata.Rendition?.Layout ?? "unknown") === "fixed" - ? initialConfig.injectablesFixed ?? [] - : initialConfig.injectables, - attributes: initialConfig.attributes, - services: initialConfig.services, - }); + // Settings + const settings = await UserSettings.create({ + store: settingsStore, + initialUserSettings: initialConfig.userSettings, + headerMenu: headerMenu, + api: initialConfig.api, + injectables: + (publication.Metadata.Rendition?.Layout ?? "unknown") === "fixed" + ? initialConfig.injectablesFixed + : initialConfig.injectables, + layout: + (publication.Metadata.Rendition?.Layout ?? "unknown") === "fixed" + ? "fixed" + : "reflowable", + }); - // Highlighter - const highlighter = await TextHighlighter.create({ - delegate: navigator, - layerSettings: layers, - ...initialConfig.highlighter, - }); + // Navigator + const navigator = await IFrameNavigator.create({ + mainElement: mainElement, + headerMenu: headerMenu, + footerMenu: footerMenu, + publication: publication, + settings, + annotator: annotator, + initialLastReadingPosition: initialConfig.lastReadingPosition, + api: initialConfig.api, + rights: rights, + tts: initialConfig.tts, + sample: initialConfig.sample, + requestConfig: initialConfig.requestConfig, + injectables: + (publication.Metadata.Rendition?.Layout ?? "unknown") === "fixed" + ? initialConfig.injectablesFixed ?? [] + : initialConfig.injectables, + attributes: initialConfig.attributes, + services: initialConfig.services, + }); - // Bookmark Module - const bookmarkModule = rights.enableBookmarks - ? await BookmarkModule.create({ - annotator: annotator, - headerMenu: headerMenu, - rights: rights, - publication: publication, + // Highlighter + const highlighter = await TextHighlighter.create({ + delegate: navigator, + layerSettings: layers, + ...initialConfig.highlighter, + }); + + // Bookmark Module + const bookmarkModule = rights.enableBookmarks + ? await BookmarkModule.create({ + annotator: annotator, + headerMenu: headerMenu, + rights: rights, + publication: publication, + delegate: navigator, + initialAnnotations: initialConfig.initialAnnotations, + ...initialConfig.bookmarks, + }) + : undefined; + + // Annotation Module + const annotationModule = rights.enableAnnotations + ? await AnnotationModule.create({ + annotator: annotator, + rights: rights, + publication: publication, + delegate: navigator, + initialAnnotations: initialConfig.initialAnnotations, + highlighter: highlighter, + headerMenu: headerMenu, + ...initialConfig.annotations, + }) + : undefined; + + // TTS Module + const ttsEnabled = rights.enableTTS; + const ttsSettings = ttsEnabled + ? await TTSSettings.create({ + store: settingsStore, + initialTTSSettings: initialConfig.tts, + headerMenu: headerMenu, + }) + : undefined; + + let ttsModule: ReaderModule | undefined = undefined; + + if (ttsEnabled && ttsSettings) { + ttsModule = await TTSModule2.create({ delegate: navigator, - initialAnnotations: initialConfig.initialAnnotations, - ...initialConfig.bookmarks, - }) - : undefined; - - // Annotation Module - const annotationModule = rights.enableAnnotations - ? await AnnotationModule.create({ - annotator: annotator, + tts: ttsSettings, + headerMenu: headerMenu, rights: rights, - publication: publication, - delegate: navigator, - initialAnnotations: initialConfig.initialAnnotations, highlighter: highlighter, - headerMenu: headerMenu, - ...initialConfig.annotations, - }) - : undefined; - - // TTS Module - const ttsEnabled = rights.enableTTS; - const ttsSettings = ttsEnabled - ? await TTSSettings.create({ - store: settingsStore, - initialTTSSettings: initialConfig.tts, - headerMenu: headerMenu, - }) - : undefined; + ...initialConfig.tts, + }); + } - let ttsModule: ReaderModule | undefined = undefined; + // Search Module + const searchModule = rights.enableSearch + ? await SearchModule.create({ + headerMenu: headerMenu, + delegate: navigator, + publication: publication, + highlighter: highlighter, + ...initialConfig.search, + }) + : undefined; - if (ttsEnabled && ttsSettings) { - ttsModule = await TTSModule2.create({ - delegate: navigator, - tts: ttsSettings, - headerMenu: headerMenu, - rights: rights, - highlighter: highlighter, - ...initialConfig.tts, - }); - } + const definitionsModule = rights.enableDefinitions + ? await DefinitionsModule.create({ + delegate: navigator, + publication: publication, + highlighter: highlighter, + ...initialConfig.define, + }) + : undefined; - // Search Module - const searchModule = rights.enableSearch - ? await SearchModule.create({ - headerMenu: headerMenu, - delegate: navigator, - publication: publication, - highlighter: highlighter, - ...initialConfig.search, - }) - : undefined; + // Timeline Module + const timelineModule = rights.enableTimeline + ? await TimelineModule.create({ + publication: publication, + delegate: navigator, + }) + : undefined; - const definitionsModule = rights.enableDefinitions - ? await DefinitionsModule.create({ - delegate: navigator, - publication: publication, - highlighter: highlighter, - ...initialConfig.define, - }) - : undefined; - - // Timeline Module - const timelineModule = rights.enableTimeline - ? await TimelineModule.create({ - publication: publication, - delegate: navigator, - }) - : undefined; + // Content Protection Module + const contentProtectionModule = rights.enableContentProtection + ? await ContentProtectionModule.create({ + delegate: navigator, + ...initialConfig.protection, + }) + : undefined; - // Content Protection Module - const contentProtectionModule = rights.enableContentProtection - ? await ContentProtectionModule.create({ - delegate: navigator, - ...initialConfig.protection, - }) - : undefined; + const enableMediaOverlays = rights.enableMediaOverlays; - const enableMediaOverlays = rights.enableMediaOverlays; + const mediaOverlaySettings = enableMediaOverlays + ? await MediaOverlaySettings.create({ + store: settingsStore, + initialMediaOverlaySettings: initialConfig.mediaOverlays, + headerMenu: headerMenu, + ...initialConfig.mediaOverlays, + }) + : undefined; - const mediaOverlaySettings = enableMediaOverlays - ? await MediaOverlaySettings.create({ - store: settingsStore, - initialMediaOverlaySettings: initialConfig.mediaOverlays, - headerMenu: headerMenu, - ...initialConfig.mediaOverlays, - }) - : undefined; + const mediaOverlayModule = enableMediaOverlays + ? await MediaOverlayModule.create({ + publication: publication, + delegate: navigator, + settings: mediaOverlaySettings, + ...initialConfig.mediaOverlays, + }) + : undefined; - const mediaOverlayModule = enableMediaOverlays - ? await MediaOverlayModule.create({ - publication: publication, - delegate: navigator, - settings: mediaOverlaySettings, - ...initialConfig.mediaOverlays, - }) - : undefined; - - const enablePageBreaks = rights.enablePageBreaks; - const pageBreakModule = - enablePageBreaks && publication.isReflowable - ? await PageBreakModule.create({ + const enablePageBreaks = rights.enablePageBreaks; + const pageBreakModule = + enablePageBreaks && publication.isReflowable + ? await PageBreakModule.create({ + publication: publication, + headerMenu: headerMenu, + delegate: navigator, + ...initialConfig.pagebreak, + }) + : undefined; + + const lineFocusModule = rights.enableLineFocus + ? await LineFocusModule.create({ publication: publication, - headerMenu: headerMenu, delegate: navigator, - ...initialConfig.pagebreak, + highlighter: highlighter, + ...initialConfig.lineFocus, }) : undefined; - const lineFocusModule = rights.enableLineFocus - ? await LineFocusModule.create({ - publication: publication, - delegate: navigator, - highlighter: highlighter, - ...initialConfig.lineFocus, - }) - : undefined; - - const historyModule = rights.enableHistory - ? await HistoryModule.create({ - annotator: annotator, - publication: publication, - delegate: navigator, - headerMenu: headerMenu, - }) - : undefined; + const historyModule = rights.enableHistory + ? await HistoryModule.create({ + annotator: annotator, + publication: publication, + delegate: navigator, + headerMenu: headerMenu, + }) + : undefined; - const citationModule = rights.enableCitations - ? await CitationModule.create({ - publication: publication, - delegate: navigator, - highlighter: highlighter, - ...initialConfig.citations, - }) - : undefined; - - return new D2Reader( - settings, - navigator, - highlighter, - bookmarkModule, - annotationModule, - ttsSettings, - ttsModule, - searchModule, - definitionsModule, - contentProtectionModule, - timelineModule, - mediaOverlaySettings, - mediaOverlayModule, - pageBreakModule, - lineFocusModule, - historyModule, - citationModule - ); + const citationModule = rights.enableCitations + ? await CitationModule.create({ + publication: publication, + delegate: navigator, + highlighter: highlighter, + ...initialConfig.citations, + }) + : undefined; + + return new D2Reader( + settings, + navigator, + highlighter, + bookmarkModule, + annotationModule, + ttsSettings, + ttsModule, + searchModule, + definitionsModule, + contentProtectionModule, + timelineModule, + mediaOverlaySettings, + mediaOverlayModule, + pageBreakModule, + lineFocusModule, + historyModule, + citationModule + ); + } } /** @@ -401,19 +424,27 @@ export default class D2Reader { /** Start TTS Read Aloud */ startReadAloud = () => { - this.navigator.startReadAloud(); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.startReadAloud(); + } }; /** Start TTS Read Aloud */ stopReadAloud = () => { - this.navigator.stopReadAloud(); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.stopReadAloud(); + } }; /** Start TTS Read Aloud */ pauseReadAloud = () => { - this.navigator.pauseReadAloud(); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.pauseReadAloud(); + } }; /** Start TTS Read Aloud */ resumeReadAloud = () => { - this.navigator.resumeReadAloud(); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.resumeReadAloud(); + } }; /** @@ -422,22 +453,33 @@ export default class D2Reader { /** Start Media Overlay Read Along */ startReadAlong = () => { - this.navigator.startReadAlong(); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.startReadAlong(); + } }; /** Stop Media Overlay Read Along */ stopReadAlong = () => { - this.navigator.stopReadAlong(); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.stopReadAlong(); + } }; /** Pause Media Overlay Read Along */ pauseReadAlong = () => { - this.navigator.pauseReadAlong(); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.pauseReadAlong(); + } }; /** Resume Media Overlay Read Along */ resumeReadAlong = () => { - this.navigator.resumeReadAlong(); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.resumeReadAlong(); + } }; get hasMediaOverlays() { - return this.navigator.hasMediaOverlays; + if (this.navigator instanceof IFrameNavigator) { + return this.navigator.hasMediaOverlays; + } + return false; } /** @@ -476,21 +518,29 @@ export default class D2Reader { /** Hide Layer */ hideLayer = (layer) => { - return this.navigator?.hideLayer(layer); + return this.navigator instanceof IFrameNavigator + ? this.navigator?.hideLayer(layer) + : false; }; /** Show Layer */ showLayer = (layer) => { - return this.navigator?.showLayer(layer); + return this.navigator instanceof IFrameNavigator + ? this.navigator?.showLayer(layer) + : false; }; /** Activate Marker
* Activated Marker will be used for active annotation creation */ activateMarker = (id: string, position: string) => { - return this.navigator?.activateMarker(id, position); + return this.navigator instanceof IFrameNavigator + ? this.navigator?.activateMarker(id, position) + : false; }; /** Deactivate Marker */ deactivateMarker = () => { - return this.navigator?.deactivateMarker(); + return this.navigator instanceof IFrameNavigator + ? this.navigator?.deactivateMarker() + : false; }; /** @@ -533,17 +583,26 @@ export default class D2Reader { return (await this.searchModule?.search(term, current)) ?? []; }; goToSearchIndex = async (href: string, index: number, current: boolean) => { - if (this.navigator.rights.enableSearch) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableSearch + ) { await this.searchModule?.goToSearchIndex(href, index, current); } }; goToSearchID = async (href: string, index: number, current: boolean) => { - if (this.navigator.rights.enableSearch) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableSearch + ) { await this.searchModule?.goToSearchID(href, index, current); } }; clearSearch = async () => { - if (this.navigator.rights.enableSearch) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableSearch + ) { await this.searchModule?.clearSearch(); } }; @@ -555,7 +614,9 @@ export default class D2Reader { return this.navigator.currentResource(); } get mostRecentNavigatedTocItem() { - return this.navigator.mostRecentNavigatedTocItem(); + return this.navigator instanceof IFrameNavigator + ? this.navigator.mostRecentNavigatedTocItem() + : false; } get totalResources() { return this.navigator.totalResources(); @@ -612,11 +673,17 @@ export default class D2Reader { | MediaOverlayIncrementable ) => { if (this.isTTSIncrementable(incremental)) { - if (this.navigator.rights.enableTTS) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableTTS + ) { await this.ttsSettings?.increase(incremental); } } else if (this.isMOIncrementable(incremental)) { - if (this.navigator.rights.enableMediaOverlays) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableMediaOverlays + ) { await this.mediaOverlaySettings?.increase(incremental); } } else { @@ -635,11 +702,17 @@ export default class D2Reader { | MediaOverlayIncrementable ) => { if (this.isTTSIncrementable(incremental)) { - if (this.navigator.rights.enableTTS) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableTTS + ) { await this.ttsSettings?.decrease(incremental); } } else if (this.isMOIncrementable(incremental)) { - if (this.navigator.rights.enableMediaOverlays) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableMediaOverlays + ) { await this.mediaOverlaySettings?.decrease(incremental); } } else { @@ -659,12 +732,18 @@ export default class D2Reader { * TTS Settings */ resetTTSSettings = () => { - if (this.navigator.rights.enableTTS) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableTTS + ) { this.ttsSettings?.resetTTSSettings(); } }; applyTTSSettings = async (ttsSettings: Partial) => { - if (this.navigator.rights.enableTTS) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableTTS + ) { await this.ttsSettings?.applyTTSSettings(ttsSettings); } }; @@ -677,7 +756,10 @@ export default class D2Reader { // } // }; applyPreferredVoice = async (value: string) => { - if (this.navigator.rights.enableTTS) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableTTS + ) { await this.ttsSettings?.applyPreferredVoice(value); } }; @@ -686,14 +768,20 @@ export default class D2Reader { * Media Overlay Settings */ resetMediaOverlaySettings = async () => { - if (this.navigator.rights.enableMediaOverlays) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableMediaOverlays + ) { await this.mediaOverlaySettings?.resetMediaOverlaySettings(); } }; applyMediaOverlaySettings = async ( settings: Partial ) => { - if (this.navigator.rights.enableMediaOverlays) { + if ( + this.navigator instanceof IFrameNavigator && + this.navigator.rights.enableMediaOverlays + ) { await this.mediaOverlaySettings?.applyMediaOverlaySettings(settings); } }; @@ -727,20 +815,28 @@ export default class D2Reader { this.navigator.previousPage(); }; get atStart() { - return this.navigator.atStart(); + return this.navigator instanceof IFrameNavigator + ? this.navigator.atStart() + : false; } get atEnd() { - return this.navigator.atEnd(); + return this.navigator instanceof IFrameNavigator + ? this.navigator.atEnd() + : false; } snapToSelector = async (selector) => { - this.navigator.snapToSelector(selector); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.snapToSelector(selector); + } }; /** * You have attributes in the reader when you initialize it. You can set margin, navigationHeight etc... * This is in case you change the attributes after initializing the reader. */ applyAttributes = (value: IFrameAttributes) => { - this.navigator.applyAttributes(value); + if (this.navigator instanceof IFrameNavigator) { + this.navigator.applyAttributes(value); + } }; async applyLineFocusSettings(userSettings) { diff --git a/viewer/index_pdf.html b/viewer/index_pdf.html new file mode 100644 index 00000000..0cff5527 --- /dev/null +++ b/viewer/index_pdf.html @@ -0,0 +1,108 @@ + + + + + + + D2 Reader + + + + + + + + + + + + +
+ +
+
+
+
+ +

+ +
+
+

+ +
+
+

+ +
+
+

+ +
+
+
+ + +
+ +
+
+
+ +
+
+
+ + + + + + + diff --git a/viewer/pdf/manifest/sample.json b/viewer/pdf/manifest/sample.json new file mode 100644 index 00000000..3834d486 --- /dev/null +++ b/viewer/pdf/manifest/sample.json @@ -0,0 +1,40 @@ +{ + "context": "https://readium.org/webpub-manifest/context.jsonld", + "metadata": { + "@type": "https://schema.org/Book", + "title": "Alice’s Adventures in Wonderland", + "identifier": "urn:isbn:alice", + "conformsTo": "https://readium.org/webpub-manifest/profiles/pdf" + }, + "links": [ + { + "href": "https://alicepdf.dita.digital/lewis-carroll_alices-adventures-in-wonderland_john-tenniel.pdf", + "type": "application/pdf", + "rel": "alternate" + }, + { + "rel": "self", + "href": "https://alicepdf.dita.digital/alice.json", + "type": "application/webpub+json" + } + ], + "readingOrder": [ + { + "href": "https://alicepdf.dita.digital/lewis-carroll_alices-adventures-in-wonderland_john-tenniel.pdf", + "title": "Alice’s Adventures in Wonderland", + "type": "application/pdf" + } + ], + "resources": [ + { + "href": "https://alicepdf.dita.digital/lewis-carroll_alices-adventures-in-wonderland_john-tenniel.pdf", + "type": "application/pdf" + } + ], + "toc": [ + { + "href": "https://alicepdf.dita.digital/lewis-carroll_alices-adventures-in-wonderland_john-tenniel.pdf", + "title": "Alice’s Adventures in Wonderland" + } + ] +}