@laminapdf/viewer 0.2.0-alpha.4 → 0.2.0-alpha.6

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.
Files changed (127) hide show
  1. package/README.md +79 -10
  2. package/dist/client.d.ts +60 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +241 -22
  5. package/dist/client.js.map +1 -1
  6. package/dist/edit/session.d.ts +91 -0
  7. package/dist/edit/session.d.ts.map +1 -0
  8. package/dist/edit/session.js +179 -0
  9. package/dist/edit/session.js.map +1 -0
  10. package/dist/edit-log.d.ts +32 -0
  11. package/dist/edit-log.d.ts.map +1 -0
  12. package/dist/edit-log.js +74 -0
  13. package/dist/edit-log.js.map +1 -0
  14. package/dist/find/controller.d.ts +6 -0
  15. package/dist/find/controller.d.ts.map +1 -1
  16. package/dist/find/controller.js +69 -2
  17. package/dist/find/controller.js.map +1 -1
  18. package/dist/first-draw.d.ts +10 -0
  19. package/dist/first-draw.d.ts.map +1 -0
  20. package/dist/first-draw.js +33 -0
  21. package/dist/first-draw.js.map +1 -0
  22. package/dist/history/history.d.ts +74 -0
  23. package/dist/history/history.d.ts.map +1 -0
  24. package/dist/history/history.js +135 -0
  25. package/dist/history/history.js.map +1 -0
  26. package/dist/index.d.ts +11 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/layers/copy.d.ts +26 -0
  31. package/dist/layers/copy.d.ts.map +1 -0
  32. package/dist/layers/copy.js +150 -0
  33. package/dist/layers/copy.js.map +1 -0
  34. package/dist/layers/link-layer.d.ts +101 -0
  35. package/dist/layers/link-layer.d.ts.map +1 -0
  36. package/dist/layers/link-layer.js +527 -0
  37. package/dist/layers/link-layer.js.map +1 -0
  38. package/dist/layers/link-preview.d.ts +77 -0
  39. package/dist/layers/link-preview.d.ts.map +1 -0
  40. package/dist/layers/link-preview.js +202 -0
  41. package/dist/layers/link-preview.js.map +1 -0
  42. package/dist/layers/link-url.d.ts +19 -0
  43. package/dist/layers/link-url.d.ts.map +1 -0
  44. package/dist/layers/link-url.js +47 -0
  45. package/dist/layers/link-url.js.map +1 -0
  46. package/dist/layers/spans.d.ts +0 -6
  47. package/dist/layers/spans.d.ts.map +1 -1
  48. package/dist/layers/spans.js +2 -20
  49. package/dist/layers/spans.js.map +1 -1
  50. package/dist/layers/structure-layer.d.ts.map +1 -1
  51. package/dist/layers/structure-layer.js +3 -0
  52. package/dist/layers/structure-layer.js.map +1 -1
  53. package/dist/layers/text-layer.d.ts +27 -6
  54. package/dist/layers/text-layer.d.ts.map +1 -1
  55. package/dist/layers/text-layer.js +310 -28
  56. package/dist/layers/text-layer.js.map +1 -1
  57. package/dist/layout/page-layout.d.ts +7 -0
  58. package/dist/layout/page-layout.d.ts.map +1 -1
  59. package/dist/layout/page-layout.js +15 -0
  60. package/dist/layout/page-layout.js.map +1 -1
  61. package/dist/protocol.d.ts +197 -5
  62. package/dist/protocol.d.ts.map +1 -1
  63. package/dist/protocol.js +33 -6
  64. package/dist/protocol.js.map +1 -1
  65. package/dist/source/opfs.d.ts +35 -0
  66. package/dist/source/opfs.d.ts.map +1 -0
  67. package/dist/source/opfs.js +178 -0
  68. package/dist/source/opfs.js.map +1 -0
  69. package/dist/thumbnails/strip.d.ts +1 -1
  70. package/dist/thumbnails/strip.d.ts.map +1 -1
  71. package/dist/thumbnails/strip.js +48 -4
  72. package/dist/thumbnails/strip.js.map +1 -1
  73. package/dist/view/previews.d.ts +47 -0
  74. package/dist/view/previews.d.ts.map +1 -0
  75. package/dist/view/previews.js +97 -0
  76. package/dist/view/previews.js.map +1 -0
  77. package/dist/view/user-select.d.ts +3 -0
  78. package/dist/view/user-select.d.ts.map +1 -0
  79. package/dist/view/user-select.js +10 -0
  80. package/dist/view/user-select.js.map +1 -0
  81. package/dist/view/viewer.d.ts +143 -5
  82. package/dist/view/viewer.d.ts.map +1 -1
  83. package/dist/view/viewer.js +590 -50
  84. package/dist/view/viewer.js.map +1 -1
  85. package/dist/worker/document.d.ts +66 -6
  86. package/dist/worker/document.d.ts.map +1 -1
  87. package/dist/worker/document.js +139 -23
  88. package/dist/worker/document.js.map +1 -1
  89. package/dist/worker/edit.d.ts +35 -0
  90. package/dist/worker/edit.d.ts.map +1 -0
  91. package/dist/worker/edit.js +305 -0
  92. package/dist/worker/edit.js.map +1 -0
  93. package/dist/worker/find.d.ts +2 -2
  94. package/dist/worker/find.d.ts.map +1 -1
  95. package/dist/worker/find.js +8 -21
  96. package/dist/worker/find.js.map +1 -1
  97. package/dist/worker/fingerprint.d.ts +10 -0
  98. package/dist/worker/fingerprint.d.ts.map +1 -0
  99. package/dist/worker/fingerprint.js +42 -0
  100. package/dist/worker/fingerprint.js.map +1 -0
  101. package/dist/worker/methods.d.ts.map +1 -1
  102. package/dist/worker/methods.js +42 -4
  103. package/dist/worker/methods.js.map +1 -1
  104. package/dist/worker/navigation.d.ts +5 -1
  105. package/dist/worker/navigation.d.ts.map +1 -1
  106. package/dist/worker/navigation.js +22 -4
  107. package/dist/worker/navigation.js.map +1 -1
  108. package/dist/worker/print.d.ts +14 -0
  109. package/dist/worker/print.d.ts.map +1 -0
  110. package/dist/worker/print.js +49 -0
  111. package/dist/worker/print.js.map +1 -0
  112. package/dist/worker/recent-pages.d.ts +16 -0
  113. package/dist/worker/recent-pages.d.ts.map +1 -0
  114. package/dist/worker/recent-pages.js +68 -0
  115. package/dist/worker/recent-pages.js.map +1 -0
  116. package/dist/worker/render.d.ts.map +1 -1
  117. package/dist/worker/render.js +5 -2
  118. package/dist/worker/render.js.map +1 -1
  119. package/dist/worker/session.d.ts +59 -0
  120. package/dist/worker/session.d.ts.map +1 -0
  121. package/dist/worker/session.js +152 -0
  122. package/dist/worker/session.js.map +1 -0
  123. package/dist/worker/text.d.ts +11 -3
  124. package/dist/worker/text.d.ts.map +1 -1
  125. package/dist/worker/text.js +33 -25
  126. package/dist/worker/text.js.map +1 -1
  127. package/package.json +9 -8
@@ -0,0 +1,135 @@
1
+ // Back and forward through the places a reader jumped from and to (web-app §6 C6, R07): links,
2
+ // the outline, thumbnails, go to page and find each record a jump; scrolling alone never does.
3
+ // A jump first notes where the view is now (so Back returns to where the reader had scrolled,
4
+ // not only to where they last landed), then adds the place it lands on, cutting off whatever
5
+ // Forward held. A jump that lands where the view already is adds nothing. Each entry has an id
6
+ // that outlives the oldest entries' removal, so an app can tie its own history (the browser's,
7
+ // through the address fragment) to these entries and come back to one by id.
8
+ /** Whether `a` and `b` show the same view: one page, a point within a thousandth of the page, one zoom. */
9
+ function samePlace(a, b) {
10
+ const near = (x, y) => Math.abs(x - y) < 1e-3;
11
+ return a.point.page === b.point.page && near(a.point.x, b.point.x) && near(a.point.y, b.point.y) && a.zoom === b.zoom;
12
+ }
13
+ /** One viewer's back and forward history. */
14
+ export class NavigationHistory {
15
+ #host;
16
+ #max;
17
+ #entries = [];
18
+ #index = -1;
19
+ #nextId = 1;
20
+ #state = { current: undefined, back: undefined, forward: undefined };
21
+ #listeners = new Set();
22
+ #pushes = new Set();
23
+ constructor(host, options = {}) {
24
+ this.#host = host;
25
+ this.#max = Math.max(2, Math.trunc(options.max ?? 100));
26
+ }
27
+ /** What Back and Forward do now (a new object after each change). */
28
+ getState() {
29
+ return this.#state;
30
+ }
31
+ /** Calls `listener` after every change (for `useSyncExternalStore`). */
32
+ subscribe(listener) {
33
+ this.#listeners.add(listener);
34
+ return () => this.#listeners.delete(listener);
35
+ }
36
+ /**
37
+ * Calls `listener` when an entry is added: by a jump (`replaced` false), or as the first entry
38
+ * of a document (`replaced` true, as `history.replaceState` would). Back, Forward and `goTo`
39
+ * add nothing, so they never call it.
40
+ */
41
+ onEntry(listener) {
42
+ this.#pushes.add(listener);
43
+ return () => this.#pushes.delete(listener);
44
+ }
45
+ /** Forgets every entry: a new document starts a history of its own. */
46
+ reset() {
47
+ this.#entries = [];
48
+ this.#index = -1;
49
+ this.#changed();
50
+ }
51
+ /**
52
+ * Runs `go` (which moves the view) as a jump: where the view was is kept for Back, and where it
53
+ * lands is the new current entry, with nothing left for Forward. Landing where it was adds
54
+ * nothing.
55
+ */
56
+ jump(go) {
57
+ const before = this.#host.place();
58
+ if (before !== undefined)
59
+ this.#note(before);
60
+ go();
61
+ const after = this.#host.place();
62
+ if (after === undefined)
63
+ return;
64
+ const current = this.#entries[this.#index];
65
+ if (current !== undefined && samePlace(current, after))
66
+ return;
67
+ this.#entries.splice(this.#index + 1);
68
+ const entry = this.#add(after);
69
+ for (const listener of this.#pushes)
70
+ listener(entry, false);
71
+ this.#changed();
72
+ }
73
+ /** Goes back one entry; `false` when there is none. */
74
+ back() {
75
+ const entry = this.#entries[this.#index - 1];
76
+ return entry === undefined ? false : this.goTo(entry.id);
77
+ }
78
+ /** Goes forward one entry; `false` when there is none. */
79
+ forward() {
80
+ const entry = this.#entries[this.#index + 1];
81
+ return entry === undefined ? false : this.goTo(entry.id);
82
+ }
83
+ /**
84
+ * Goes to the entry `id` (Back or Forward, by the browser's history or the app's own): the
85
+ * view moves there and the entries stay. `false` when that entry is gone (pushed out, or from
86
+ * another document).
87
+ */
88
+ goTo(id) {
89
+ const index = this.#entries.findIndex((e) => e.id === id);
90
+ const entry = this.#entries[index];
91
+ if (entry === undefined)
92
+ return false;
93
+ const here = this.#host.place();
94
+ // Where the reader scrolled to since landing is where coming back returns.
95
+ if (here !== undefined)
96
+ this.#update(here);
97
+ this.#index = index;
98
+ this.#host.show(entry);
99
+ this.#changed();
100
+ return true;
101
+ }
102
+ /** The current entry takes `place`, or the first entry is made from it. */
103
+ #note(place) {
104
+ if (this.#index < 0) {
105
+ const entry = this.#add(place);
106
+ for (const listener of this.#pushes)
107
+ listener(entry, true);
108
+ return;
109
+ }
110
+ this.#update(place);
111
+ }
112
+ #update(place) {
113
+ const current = this.#entries[this.#index];
114
+ if (current !== undefined)
115
+ this.#entries[this.#index] = { ...place, id: current.id };
116
+ }
117
+ #add(place) {
118
+ const entry = { ...place, id: this.#nextId++ };
119
+ this.#entries.push(entry);
120
+ if (this.#entries.length > this.#max)
121
+ this.#entries.splice(0, this.#entries.length - this.#max);
122
+ this.#index = this.#entries.length - 1;
123
+ return entry;
124
+ }
125
+ #changed() {
126
+ this.#state = {
127
+ current: this.#entries[this.#index],
128
+ back: this.#entries[this.#index - 1],
129
+ forward: this.#entries[this.#index + 1],
130
+ };
131
+ for (const listener of this.#listeners)
132
+ listener();
133
+ }
134
+ }
135
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/history/history.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,23 @@
1
1
  export type { CanvasPoolOptions } from "./canvas/pool.js";
2
2
  export type { RestartReason, ViewerCallOptions, ViewerEvent, ViewerEvents, ViewerOptions } from "./client.js";
3
3
  export { ViewerClient } from "./client.js";
4
+ export { CLOSED_SESSION, type EditBlock, type EditFailure, type EditSession, type EditSessionState, type FailureListener, type RevertListener, } from "./edit/session.js";
4
5
  export type { FindController, FindResult, FindState } from "./find/controller.js";
5
6
  export type { FindOptions } from "./find/fold.js";
6
7
  export type { FindSnippet } from "./find/page.js";
8
+ export type { HistoryEntry, HistoryPlace, HistoryState, NavigationHistory, NavigationHistoryOptions, ViewPosition, } from "./history/history.js";
9
+ export type { CopyMode } from "./layers/copy.js";
10
+ export type { LinkLayerOptions, LinkPreviewPointer, LinkPreviewRequest, LinkWords } from "./layers/link-layer.js";
11
+ export { type ExternalLink, externalLink, type OpenableLink } from "./layers/link-url.js";
7
12
  export type { TextLayerOptions, TextSelection } from "./layers/text-layer.js";
8
- export type { Rotation } from "./layout/page-layout.js";
13
+ export type { PageSize, Rotation } from "./layout/page-layout.js";
9
14
  export { type NetworkSink, watchNetwork } from "./network/watch.js";
10
- export type { BackendInit, BackendName, FindPageResult, LoadProgress, MethodName, Methods, NetworkRecord, NetworkSource, OpenedDocument, PageTextData, Params, PolicyViolation, Priority, RemoteSource, RenderedBitmap, Result, SourceInit, StructureData, TextRunData, ViewerOpenOptions, WorkerMemory, WorkerNetworkLog, } from "./protocol.js";
15
+ export type { BackendInit, BackendName, EditHistory, EditResult, EditStep, FindPageResult, LoadProgress, MethodName, Methods, NetworkRecord, NetworkSource, OpenedDocument, PageTextData, Params, PolicyViolation, PrintedPage, PrintOptions, Priority, ReadingBlock, RemoteSource, RenderedBitmap, ReplayedStep, Result, RevertedStep, SourceInit, StructureData, TextRunData, ViewerOpenOptions, WorkerMemory, WorkerNetworkLog, } from "./protocol.js";
16
+ export { EMPTY_HISTORY, HISTORY_DEPTH } from "./protocol.js";
17
+ export { CACHE_FOLDER } from "./source/opfs.js";
11
18
  export { ThumbnailStrip, type ThumbnailStripOptions } from "./thumbnails/strip.js";
12
- export type { CreateViewerOptions, PageLayer, PageRenderState, RenderStats, ViewerEventMap, ViewState, } from "./view/viewer.js";
19
+ export type { LinkPreviewPicture } from "./view/previews.js";
20
+ export type { CreateViewerOptions, InvalidatedPage, PageLayer, PageRegionOptions, PageRenderState, RenderStats, ViewerEventMap, ViewState, } from "./view/viewer.js";
13
21
  export { createViewer, Viewer } from "./view/viewer.js";
14
22
  export type { DocumentPoint, Point, Zoom, ZoomMode } from "./zoom/zoom.js";
15
23
  export { MAX_ZOOM, MIN_ZOOM } from "./zoom/zoom.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9G,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC9E,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,YAAY,EACZ,UAAU,EACV,OAAO,EACP,aAAa,EACb,aAAa,EACb,cAAc,EACd,YAAY,EACZ,MAAM,EACN,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,MAAM,EACN,UAAU,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnF,YAAY,EACV,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,WAAW,EACX,cAAc,EACd,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9G,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,cAAc,EACd,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAClF,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClH,OAAO,EAAE,KAAK,YAAY,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC1F,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC9E,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,UAAU,EACV,OAAO,EACP,aAAa,EACb,aAAa,EACb,cAAc,EACd,YAAY,EACZ,MAAM,EACN,eAAe,EACf,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnF,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,cAAc,EACd,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -3,7 +3,11 @@
3
3
  // canvas pool, the bitmap cache, the tile and zoom maths) are not exported: the README describes
4
4
  // them, and their unit tests import them by path within the package.
5
5
  export { ViewerClient } from "./client.js";
6
+ export { CLOSED_SESSION, } from "./edit/session.js";
7
+ export { externalLink } from "./layers/link-url.js";
6
8
  export { watchNetwork } from "./network/watch.js";
9
+ export { EMPTY_HISTORY, HISTORY_DEPTH } from "./protocol.js";
10
+ export { CACHE_FOLDER } from "./source/opfs.js";
7
11
  export { ThumbnailStrip } from "./thumbnails/strip.js";
8
12
  export { createViewer, Viewer } from "./view/viewer.js";
9
13
  export { MAX_ZOOM, MIN_ZOOM } from "./zoom/zoom.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,iGAAiG;AACjG,iGAAiG;AACjG,qEAAqE;AAIrE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,OAAO,EAAoB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAyBpE,OAAO,EAAE,cAAc,EAA8B,MAAM,uBAAuB,CAAC;AASnF,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,iGAAiG;AACjG,iGAAiG;AACjG,qEAAqE;AAIrE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,cAAc,GAOf,MAAM,mBAAmB,CAAC;AAc3B,OAAO,EAAqB,YAAY,EAAqB,MAAM,sBAAsB,CAAC;AAG1F,OAAO,EAAoB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiCpE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAA8B,MAAM,uBAAuB,CAAC;AAYnF,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ReadingBlock } from "../protocol.js";
2
+ import { type Piece } from "./spans.js";
3
+ /** How copy joins a selection: by paragraph (reading order) or as laid out. */
4
+ export type CopyMode = "paragraph" | "exact";
5
+ /** What copy writes to the clipboard. */
6
+ export interface Copied {
7
+ readonly text: string;
8
+ readonly html: string;
9
+ }
10
+ /** `text` with each ligature written as its letters, so the copied words can be searched. */
11
+ export declare function expandLigatures(text: string): string;
12
+ /**
13
+ * The copy of `pieces` (the selection's, in page and run order). `blocks` gives a page's
14
+ * reading-order blocks, or `undefined` when they aren't known (yet): that page's pieces then form
15
+ * one block in run order.
16
+ */
17
+ export declare function copySelection(pieces: readonly Piece[], mode: CopyMode, blocks: (page: number) => readonly ReadingBlock[] | undefined): Copied;
18
+ /**
19
+ * `lines` as one, by the extraction's own rule (`join_lines` in laminapdf-extract's
20
+ * `text_fix.rs`), so a paragraph copies as `extract()` gives it: joined by a space, except after
21
+ * a soft hyphen or a word-final hyphen. There a lowercase continuation joins the word again (the
22
+ * hyphen dropped), and anything else follows the hyphen with no space ("Jean-" "Paul" gives
23
+ * "Jean-Paul"; a soft hyphen becomes a hyphen). A spaced dash ("a -") is followed by a space.
24
+ */
25
+ export declare function joinLines(lines: readonly string[]): string;
26
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/layers/copy.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,YAAY,CAAC;AAEnD,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAE7C,yCAAyC;AACzC,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAgBD,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAQD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,YAAY,EAAE,GAAG,SAAS,GAC5D,MAAM,CAWR;AAiFD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAQ1D"}
@@ -0,0 +1,150 @@
1
+ // What copy writes (UI/UX plan §5.3): the selected pieces of the text layer's spans, joined in one
2
+ // of two modes. Copy as paragraph, the default, follows the reading order of Lamina PDF's
3
+ // extraction: the pieces go block by block, a block's lines join into one line (a word broken by
4
+ // a hyphen at a line's end joined again), and blocks are separated by a blank line, so a paragraph
5
+ // pasted from a two-column page reads as one paragraph, column after column. Copy exact keeps the
6
+ // layout's line breaks. Both write the same text as HTML too, a paragraph per block. A table's
7
+ // lines keep their breaks in both modes, since joining them would merge its cells.
8
+ import { separator } from "./spans.js";
9
+ /** U+00AD, which marks where a word may break: written as a code, since it is invisible. */
10
+ const SOFT_HYPHEN = String.fromCharCode(0xad);
11
+ /** The Latin ligatures of Unicode's Alphabetic Presentation Forms, as the letters they join. */
12
+ const LIGATURES = {
13
+ ff: "ff",
14
+ fi: "fi",
15
+ fl: "fl",
16
+ ffi: "ffi",
17
+ ffl: "ffl",
18
+ ſt: "st",
19
+ st: "st",
20
+ };
21
+ /** `text` with each ligature written as its letters, so the copied words can be searched. */
22
+ export function expandLigatures(text) {
23
+ return text.replace(/[ff-st]/g, (c) => LIGATURES[c] ?? c);
24
+ }
25
+ /**
26
+ * The copy of `pieces` (the selection's, in page and run order). `blocks` gives a page's
27
+ * reading-order blocks, or `undefined` when they aren't known (yet): that page's pieces then form
28
+ * one block in run order.
29
+ */
30
+ export function copySelection(pieces, mode, blocks) {
31
+ const groups = mode === "paragraph" ? byBlock(pieces, blocks) : byPage(pieces);
32
+ const paragraphs = groups
33
+ .map((group) => {
34
+ const lines = linesOf(group.pieces);
35
+ return mode === "exact" || group.table ? lines.map((l) => l.replaceAll(SOFT_HYPHEN, "")) : [joinLines(lines)];
36
+ })
37
+ .filter((lines) => lines.some((l) => l !== ""));
38
+ const text = paragraphs.map((lines) => lines.join("\n")).join(mode === "paragraph" ? "\n\n" : "\n");
39
+ const html = paragraphs.map((lines) => `<p>${lines.map(escapeHtml).join("<br>")}</p>`).join("");
40
+ return { text, html };
41
+ }
42
+ /** The pieces page by page, in run order (copy exact). */
43
+ function byPage(pieces) {
44
+ const groups = [];
45
+ for (const piece of pieces) {
46
+ const last = groups.at(-1);
47
+ if (last !== undefined && last.pieces[0]?.page === piece.page)
48
+ last.pieces.push(piece);
49
+ else
50
+ groups.push({ pieces: [piece], table: false });
51
+ }
52
+ return groups;
53
+ }
54
+ /**
55
+ * The pieces block by block, in the page's reading order: each piece goes to the block its span's
56
+ * centre is in, or the nearest one; within a block they keep their run order.
57
+ */
58
+ function byBlock(pieces, blocks) {
59
+ const keyed = new Map();
60
+ pieces.forEach((piece, k) => {
61
+ const found = blocks(piece.page);
62
+ const index = found === undefined || found.length === 0 ? -1 : nearest(found, centreOf(piece));
63
+ const key = `${piece.page}:${index}`;
64
+ let entry = keyed.get(key);
65
+ if (entry === undefined) {
66
+ // A page without blocks keeps its place by its first piece; a block, by its reading order.
67
+ const order = index === -1 ? k : index;
68
+ entry = { page: piece.page, order, group: { pieces: [], table: found?.[index]?.type === "table" } };
69
+ keyed.set(key, entry);
70
+ }
71
+ entry.group.pieces.push(piece);
72
+ });
73
+ return [...keyed.values()].sort((a, b) => a.page - b.page || a.order - b.order).map((e) => e.group);
74
+ }
75
+ /** The centre of `piece`'s span, in page space. */
76
+ function centreOf(piece) {
77
+ const { left, top, width, height, angle } = piece.span;
78
+ const along = { x: Math.cos(angle), y: Math.sin(angle) };
79
+ const down = { x: -along.y, y: along.x };
80
+ return {
81
+ x: left + (along.x * width) / 2 + (down.x * height) / 2,
82
+ y: top + (along.y * width) / 2 + (down.y * height) / 2,
83
+ };
84
+ }
85
+ /** The index of the block whose box holds `p`, or else the one nearest it. */
86
+ function nearest(blocks, p) {
87
+ let best = 0;
88
+ let bestDistance = Infinity;
89
+ blocks.forEach((block, k) => {
90
+ const [x, y, w, h] = block.bbox;
91
+ const dx = Math.max(x - p.x, 0, p.x - (x + w));
92
+ const dy = Math.max(y - p.y, 0, p.y - (y + h));
93
+ const distance = Math.hypot(dx, dy);
94
+ if (distance < bestDistance) {
95
+ best = k;
96
+ bestDistance = distance;
97
+ }
98
+ });
99
+ return best;
100
+ }
101
+ /** `pieces` as the lines they are laid out on (the text layer's rule: `separator`). */
102
+ function linesOf(pieces) {
103
+ const lines = [];
104
+ let line = "";
105
+ let before;
106
+ for (const piece of pieces) {
107
+ const gap = before === undefined ? "" : separator(before, piece);
108
+ if (gap === "\n") {
109
+ lines.push(line);
110
+ line = "";
111
+ }
112
+ else
113
+ line += gap;
114
+ line += piece.text;
115
+ before = piece;
116
+ }
117
+ lines.push(line);
118
+ return lines.map((l) => expandLigatures(l).trimEnd());
119
+ }
120
+ /**
121
+ * `lines` as one, by the extraction's own rule (`join_lines` in laminapdf-extract's
122
+ * `text_fix.rs`), so a paragraph copies as `extract()` gives it: joined by a space, except after
123
+ * a soft hyphen or a word-final hyphen. There a lowercase continuation joins the word again (the
124
+ * hyphen dropped), and anything else follows the hyphen with no space ("Jean-" "Paul" gives
125
+ * "Jean-Paul"; a soft hyphen becomes a hyphen). A spaced dash ("a -") is followed by a space.
126
+ */
127
+ export function joinLines(lines) {
128
+ let out = "";
129
+ for (const raw of lines) {
130
+ const line = raw.trim();
131
+ if (line === "")
132
+ continue;
133
+ out = out === "" ? line : joinTwo(out, line);
134
+ }
135
+ return out.replaceAll(SOFT_HYPHEN, "");
136
+ }
137
+ /** `out` followed by the next `line`, by `joinLines`' rule. */
138
+ function joinTwo(out, line) {
139
+ const lowerNext = /^\p{Ll}/u.test(line);
140
+ if (out.endsWith(SOFT_HYPHEN))
141
+ return out.slice(0, -1) + (lowerNext ? "" : "-") + line;
142
+ if (out.endsWith("-") && !out.endsWith(" -"))
143
+ return (lowerNext ? out.slice(0, -1) : out) + line;
144
+ return `${out} ${line}`;
145
+ }
146
+ /** `text` safe in HTML. */
147
+ function escapeHtml(text) {
148
+ return text.replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" })[c] ?? c);
149
+ }
150
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/layers/copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import type { PageLink, Target } from "@laminapdf/sdk";
2
+ import type { ViewerClient } from "../client.js";
3
+ import type { PageSize, Rotation } from "../layout/page-layout.js";
4
+ import type { PageLayer } from "../view/viewer.js";
5
+ import { type OpenableLink } from "./link-url.js";
6
+ /** The words the layer gives links without a description of their own, and its hover notes. */
7
+ export interface LinkWords {
8
+ /** A link to page `page` (0-based). */
9
+ page(page: number): string;
10
+ readonly nextPage: string;
11
+ readonly previousPage: string;
12
+ readonly firstPage: string;
13
+ readonly lastPage: string;
14
+ /** A link to another file, named when the file says which. */
15
+ otherFile(file: string | undefined): string;
16
+ /** A link whose address can't be opened (a `javascript:`, `file:` or `data:` one). */
17
+ refused(uri: string): string;
18
+ /** A link that asks to run an action, which the reader never does (`Launch`, `JavaScript`…). */
19
+ readonly unsupported: string;
20
+ /** A link whose destination isn't in the document. */
21
+ readonly broken: string;
22
+ }
23
+ /** The link layer's options (`createViewer`'s `links`). */
24
+ export interface LinkLayerOptions {
25
+ /**
26
+ * The address of page `page` (0-based) of this document, for an internal link's `href`, so a
27
+ * new tab opens the same document there; `undefined` leaves the link without one.
28
+ */
29
+ readonly href?: (page: number) => string | undefined;
30
+ /** A web or email link was followed: ask the reader before opening it (normalised, punycode host). */
31
+ readonly onExternal?: (link: OpenableLink) => void;
32
+ /** The words for links without a description, and the hover notes (default English). */
33
+ readonly words?: LinkWords;
34
+ /**
35
+ * A link that does nothing was followed (another file, an action never run, a refused
36
+ * address, a broken destination), with the note it shows: for the app's debug log.
37
+ */
38
+ readonly onInert?: (link: PageLink, note: string) => void;
39
+ }
40
+ /** How the pointer asked for a preview. */
41
+ export type LinkPreviewPointer = "fine" | "keyboard" | "touch";
42
+ /** A link asking to be previewed (the viewer's `linkpreview` event). */
43
+ export interface LinkPreviewRequest {
44
+ readonly link: PageLink;
45
+ /** What the preview shows: where the link goes, or a sentence saying what it does. */
46
+ readonly shows: {
47
+ readonly kind: "target";
48
+ readonly target: Target;
49
+ } | {
50
+ readonly kind: "page";
51
+ readonly page: number;
52
+ readonly note: string;
53
+ } | {
54
+ readonly kind: "note";
55
+ readonly note: string;
56
+ };
57
+ /** The link's anchor, which the preview describes (`aria-describedby`). */
58
+ readonly anchor: HTMLElement;
59
+ readonly pointer: LinkPreviewPointer;
60
+ }
61
+ /** What the link layer needs of its viewer. */
62
+ export interface LinkHost {
63
+ /** The viewer's root, where a selection drag starts. */
64
+ readonly root: HTMLElement;
65
+ readonly client: Pick<ViewerClient, "pageLinks">;
66
+ /** Page `page`'s displayed size in points. */
67
+ points(page: number): PageSize | undefined;
68
+ rotation(): Rotation;
69
+ /** The number of pages. */
70
+ pageCount(): number;
71
+ /** Goes to `target` as a history jump. */
72
+ goTo(target: Target): void;
73
+ /** Goes to page `page` (0-based) as a history jump. */
74
+ goToPage(page: number): void;
75
+ /** Shows a preview of a link. */
76
+ preview?(request: LinkPreviewRequest): void;
77
+ /** Hides the preview of `anchor`'s link. */
78
+ previewEnd?(anchor: HTMLElement): void;
79
+ }
80
+ /** The link layer of one viewer. */
81
+ export declare class LinkLayer implements PageLayer {
82
+ #private;
83
+ readonly name = "annot";
84
+ constructor(host: LinkHost, options?: LinkLayerOptions);
85
+ /** Stops listening: the viewer is going. */
86
+ destroy(): void;
87
+ /** The pointer is over the preview (`true`) or has left it (`false`): a hovered preview stays. */
88
+ hold(held: boolean): void;
89
+ /** Escape or Close: hides the preview, which stays hidden until its link is left. */
90
+ dismiss(): void;
91
+ /** Whether a link is previewed or focused, so `follow` has one to follow. */
92
+ canFollow(): boolean;
93
+ /** Follows the previewed link, else the focused one (`nav.follow-link`); `false` when there is neither. */
94
+ follow(): boolean;
95
+ onMount(page: number, slot: HTMLElement): void;
96
+ onUnmount(page: number): void;
97
+ onZoom(page: number, _slot: HTMLElement, size: PageSize): void;
98
+ /** Places every page again: the view turned. */
99
+ refresh(): void;
100
+ }
101
+ //# sourceMappingURL=link-layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-layer.d.ts","sourceRoot":"","sources":["../../src/layers/link-layer.ts"],"names":[],"mappings":"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"}