@u1f992/pdfdiff 0.0.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/gh-pages.yml +60 -0
- package/.github/workflows/publish.yml +34 -0
- package/.vscode/extensions.json +3 -0
- package/.vscode/settings.json +20 -0
- package/LICENSE +674 -0
- package/README.md +24 -45
- package/dist/browser.d.ts +2 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +3690 -0
- package/dist/browser.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +39856 -0
- package/dist/cli.js.map +1 -0
- package/dist/coi-serviceworker.min.js +2 -0
- package/dist/diff.d.ts +15 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/image.d.ts +13 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.html +72 -0
- package/dist/index.js +3554 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/iterable.d.ts +2 -0
- package/dist/iterable.d.ts.map +1 -0
- package/dist/iterable.test.d.ts +2 -0
- package/dist/iterable.test.d.ts.map +1 -0
- package/dist/jimp.d.ts +6 -0
- package/dist/jimp.d.ts.map +1 -0
- package/dist/mupdf-wasm.wasm +0 -0
- package/dist/pdf.d.ts +5 -0
- package/dist/pdf.d.ts.map +1 -0
- package/dist/rgba-color.d.ts +4 -0
- package/dist/rgba-color.d.ts.map +1 -0
- package/dist/rgba-color.test.d.ts +2 -0
- package/dist/rgba-color.test.d.ts.map +1 -0
- package/dist/style.css +19 -0
- package/dist/worker.d.ts +42 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +3515 -0
- package/dist/worker.js.map +1 -0
- package/package.json +45 -7
- package/prettier.config.js +3 -0
- package/prototyping/README.md +1 -0
- package/prototyping/flat-map-concurrency.js +218 -0
- package/prototyping/worker.js +10 -0
- package/rollup.config.js +108 -0
- package/src/browser.ts +196 -0
- package/src/cli.ts +195 -0
- package/src/diff.ts +85 -0
- package/src/image.ts +150 -0
- package/src/index.html +72 -0
- package/src/index.test.ts +97 -0
- package/src/index.ts +275 -0
- package/src/iterable.test.ts +40 -0
- package/src/iterable.ts +24 -0
- package/src/jimp.ts +15 -0
- package/src/pdf.ts +74 -0
- package/src/rgba-color.test.ts +43 -0
- package/src/rgba-color.ts +63 -0
- package/src/style.css +19 -0
- package/src/worker.ts +159 -0
- package/test/a.pdf +0 -0
- package/test/b.pdf +0 -0
- package/test/base.xcf +0 -0
- package/test/expected.png +0 -0
- package/test/mask.pdf +0 -0
- package/tsconfig.json +50 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! coi-serviceworker v0.1.7 - Guido Zuidhof and contributors, licensed under MIT */
|
|
2
|
+
let coepCredentialless=!1;"undefined"==typeof window?(self.addEventListener("install",(()=>self.skipWaiting())),self.addEventListener("activate",(e=>e.waitUntil(self.clients.claim()))),self.addEventListener("message",(e=>{e.data&&("deregister"===e.data.type?self.registration.unregister().then((()=>self.clients.matchAll())).then((e=>{e.forEach((e=>e.navigate(e.url)))})):"coepCredentialless"===e.data.type&&(coepCredentialless=e.data.value))})),self.addEventListener("fetch",(function(e){const r=e.request;if("only-if-cached"===r.cache&&"same-origin"!==r.mode)return;const s=coepCredentialless&&"no-cors"===r.mode?new Request(r,{credentials:"omit"}):r;e.respondWith(fetch(s).then((e=>{if(0===e.status)return e;const r=new Headers(e.headers);return r.set("Cross-Origin-Embedder-Policy",coepCredentialless?"credentialless":"require-corp"),coepCredentialless||r.set("Cross-Origin-Resource-Policy","cross-origin"),r.set("Cross-Origin-Opener-Policy","same-origin"),new Response(e.body,{status:e.status,statusText:e.statusText,headers:r})})).catch((e=>console.error(e))))}))):(()=>{const e={shouldRegister:()=>!0,shouldDeregister:()=>!1,coepCredentialless:()=>!(window.chrome||window.netscape),doReload:()=>window.location.reload(),quiet:!1,...window.coi},r=navigator;r.serviceWorker&&r.serviceWorker.controller&&(r.serviceWorker.controller.postMessage({type:"coepCredentialless",value:e.coepCredentialless()}),e.shouldDeregister()&&r.serviceWorker.controller.postMessage({type:"deregister"})),!1===window.crossOriginIsolated&&e.shouldRegister()&&(window.isSecureContext?r.serviceWorker&&r.serviceWorker.register(window.document.currentScript.src).then((s=>{!e.quiet&&console.log("COOP/COEP Service Worker registered",s.scope),s.addEventListener("updatefound",(()=>{!e.quiet&&console.log("Reloading page to make use of updated COOP/COEP Service Worker."),e.doReload()})),s.active&&!r.serviceWorker.controller&&(!e.quiet&&console.log("Reloading page to make use of COOP/COEP Service Worker."),e.doReload())}),(r=>{!e.quiet&&console.error("COOP/COEP Service Worker failed to register:",r)})):!e.quiet&&console.log("COOP/COEP Service Worker not registered, a secure context is required."))})();
|
package/dist/diff.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type JimpInstance } from "./jimp.ts";
|
|
2
|
+
import { type AlignStrategy } from "./image.ts";
|
|
3
|
+
import { type RGBAColor } from "./rgba-color.ts";
|
|
4
|
+
export type Pallet = {
|
|
5
|
+
addition: RGBAColor;
|
|
6
|
+
deletion: RGBAColor;
|
|
7
|
+
modification: RGBAColor;
|
|
8
|
+
};
|
|
9
|
+
export declare function drawDifference(a: JimpInstance, b: JimpInstance, mask: JimpInstance, pallet: Readonly<Pallet>, align: AlignStrategy): {
|
|
10
|
+
diff: JimpInstance;
|
|
11
|
+
addition: [number, number][];
|
|
12
|
+
deletion: [number, number][];
|
|
13
|
+
modification: [number, number][];
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAA+B,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,YAAY,EAAE,SAAS,CAAC;CACzB,CAAC;AAEF,wBAAgB,cAAc,CAC5B,CAAC,EAAE,YAAY,EACf,CAAC,EAAE,YAAY,EACf,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EACxB,KAAK,EAAE,aAAa;;;;;EAoDrB"}
|
package/dist/image.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type JimpInstance } from "./jimp.ts";
|
|
2
|
+
export declare function createEmptyImage(width: number, height: number): JimpInstance;
|
|
3
|
+
export declare function fillWithEmpty(images: [JimpInstance, JimpInstance] | [JimpInstance, null] | [null, JimpInstance]): [JimpInstance, JimpInstance];
|
|
4
|
+
export declare function fillWithEmpty(images: [JimpInstance, JimpInstance, JimpInstance] | [JimpInstance, JimpInstance, null] | [JimpInstance, null, JimpInstance] | [JimpInstance, null, null] | [null, JimpInstance, JimpInstance] | [null, JimpInstance, null] | [null, null, JimpInstance]): [JimpInstance, JimpInstance, JimpInstance];
|
|
5
|
+
declare const alignStrategyValues: Set<"resize" | "top-left" | "top-center" | "top-right" | "middle-left" | "middle-center" | "middle-right" | "bottom-left" | "bottom-center" | "bottom-right">;
|
|
6
|
+
type UnwrapSet<T> = T extends Set<infer U> ? U : never;
|
|
7
|
+
export type AlignStrategy = UnwrapSet<typeof alignStrategyValues>;
|
|
8
|
+
export declare const isValidAlignStrategy: (str: string) => str is AlignStrategy;
|
|
9
|
+
export declare function alignSize(images: [JimpInstance, JimpInstance], align: AlignStrategy): [JimpInstance, JimpInstance];
|
|
10
|
+
export declare function alignSize(images: [JimpInstance, JimpInstance, JimpInstance], align: AlignStrategy): [JimpInstance, JimpInstance, JimpInstance];
|
|
11
|
+
export declare function composeLayers(canvasWidth: number, canvasHeight: number, layers: [JimpInstance, number][]): JimpInstance;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../src/image.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAKtD,YAAY,CACnB;AAED,wBAAgB,aAAa,CAC3B,MAAM,EACF,CAAC,YAAY,EAAE,YAAY,CAAC,GAC5B,CAAC,YAAY,EAAE,IAAI,CAAC,GACpB,CAAC,IAAI,EAAE,YAAY,CAAC,GACvB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAChC,wBAAgB,aAAa,CAC3B,MAAM,EACF,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,GAC1C,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,GAClC,CAAC,YAAY,EAAE,IAAI,EAAE,YAAY,CAAC,GAClC,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,GAC1B,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,GAClC,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,GAC1B,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,GAC7B,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAK9C,QAAA,MAAM,mBAAmB,+JAWd,CAAC;AACZ,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACvD,MAAM,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAO,MAAM,oBAAoB,GAAI,KAAK,MAAM,KAAG,GAAG,IAAI,aACX,CAAC;AA2BhD,wBAAgB,SAAS,CACvB,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,EACpC,KAAK,EAAE,aAAa,GACnB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAChC,wBAAgB,SAAS,CACvB,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,EAClD,KAAK,EAAE,aAAa,GACnB,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAiB9C,wBAAgB,aAAa,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,gBAgCjC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Pallet } from "./diff.ts";
|
|
2
|
+
import { isValidAlignStrategy, type AlignStrategy } from "./image.ts";
|
|
3
|
+
import { withIndex } from "./iterable.ts";
|
|
4
|
+
import { parseHex, formatHex } from "./rgba-color.ts";
|
|
5
|
+
import type { JimpInstance } from "./jimp.ts";
|
|
6
|
+
export { withIndex, isValidAlignStrategy, parseHex, formatHex };
|
|
7
|
+
type Options = {
|
|
8
|
+
dpi: number;
|
|
9
|
+
alpha: boolean;
|
|
10
|
+
mask: Uint8Array | undefined;
|
|
11
|
+
align: AlignStrategy;
|
|
12
|
+
pallet: Pallet;
|
|
13
|
+
workers: number;
|
|
14
|
+
};
|
|
15
|
+
type Result = {
|
|
16
|
+
a: JimpInstance;
|
|
17
|
+
b: JimpInstance;
|
|
18
|
+
diff: JimpInstance;
|
|
19
|
+
addition: [number, number][];
|
|
20
|
+
deletion: [number, number][];
|
|
21
|
+
modification: [number, number][];
|
|
22
|
+
};
|
|
23
|
+
export declare const defaultOptions: Options;
|
|
24
|
+
export declare function visualizeDifferences(a: Uint8Array, b: Uint8Array, options: Partial<Omit<Options, "pallet"> & {
|
|
25
|
+
pallet: Partial<Pallet>;
|
|
26
|
+
}>): AsyncGenerator<Result, void, unknown>;
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAQ9C,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAEhE,KAAK,OAAO,GAAG;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,CAAC,EAAE,YAAY,CAAC;IAChB,CAAC,EAAE,YAAY,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC7B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,OAW5B,CAAC;AAoGF,wBAAuB,oBAAoB,CACzC,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,UAAU,EACb,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,yCA2GxE"}
|
package/dist/index.html
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="ja">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>pdfdiff</title>
|
|
7
|
+
<link rel="stylesheet" href="./style.css" />
|
|
8
|
+
<script src="./coi-serviceworker.min.js"></script>
|
|
9
|
+
<script type="module" src="./browser.js"></script>
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<h1>pdfdiff</h1>
|
|
13
|
+
<div class="form-container">
|
|
14
|
+
<form id="pdf-diff-form">
|
|
15
|
+
<div>
|
|
16
|
+
<label for="pdf-a">A:</label>
|
|
17
|
+
<input type="file" id="pdf-a" accept="application/pdf" required />
|
|
18
|
+
</div>
|
|
19
|
+
<div>
|
|
20
|
+
<label for="pdf-b">B:</label>
|
|
21
|
+
<input type="file" id="pdf-b" accept="application/pdf" required />
|
|
22
|
+
</div>
|
|
23
|
+
<div>
|
|
24
|
+
<label for="pdf-mask">Mask:</label>
|
|
25
|
+
<input type="file" id="pdf-mask" accept="application/pdf" />
|
|
26
|
+
</div>
|
|
27
|
+
<div>
|
|
28
|
+
<label for="dpi">DPI:</label>
|
|
29
|
+
<input type="number" id="dpi" value="150" />
|
|
30
|
+
</div>
|
|
31
|
+
<div>
|
|
32
|
+
<label for="alpha">Alpha:</label>
|
|
33
|
+
<input type="checkbox" id="alpha" checked />
|
|
34
|
+
</div>
|
|
35
|
+
<div>
|
|
36
|
+
<label for="align">Align:</label>
|
|
37
|
+
<select id="align">
|
|
38
|
+
<option value="resize">resize</option>
|
|
39
|
+
<option value="top-left">top-left</option>
|
|
40
|
+
<option value="top-center">top-center</option>
|
|
41
|
+
<option value="top-right">top-right</option>
|
|
42
|
+
<option value="middle-left">middle-left</option>
|
|
43
|
+
<option value="middle-center">middle-center</option>
|
|
44
|
+
<option value="middle-right">middle-right</option>
|
|
45
|
+
<option value="bottom-left">bottom-left</option>
|
|
46
|
+
<option value="bottom-center">bottom-center</option>
|
|
47
|
+
<option value="bottom-right">bottom-right</option>
|
|
48
|
+
</select>
|
|
49
|
+
</div>
|
|
50
|
+
<div>
|
|
51
|
+
<label for="workers">Workers:</label>
|
|
52
|
+
<input type="number" id="workers" value="1" min="1" />
|
|
53
|
+
</div>
|
|
54
|
+
<div>
|
|
55
|
+
<label for="addition-color">Addition:</label>
|
|
56
|
+
<input type="color" id="addition-color" value="#4cae4f" />
|
|
57
|
+
</div>
|
|
58
|
+
<div>
|
|
59
|
+
<label for="deletion-color">Deletion:</label>
|
|
60
|
+
<input type="color" id="deletion-color" value="#ff5724" />
|
|
61
|
+
</div>
|
|
62
|
+
<div>
|
|
63
|
+
<label for="modification-color">Modification:</label>
|
|
64
|
+
<input type="color" id="modification-color" value="#ffc105" />
|
|
65
|
+
</div>
|
|
66
|
+
<button type="submit">Submit</button>
|
|
67
|
+
</form>
|
|
68
|
+
</div>
|
|
69
|
+
<div class="error" id="error-message"></div>
|
|
70
|
+
<div class="results" id="results"></div>
|
|
71
|
+
</body>
|
|
72
|
+
</html>
|