@laminapdf/viewer 0.2.0-alpha.3 → 0.2.0-alpha.4
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/README.md +71 -5
- package/dist/client.d.ts +48 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +89 -29
- package/dist/client.js.map +1 -1
- package/dist/find/controller.d.ts +73 -0
- package/dist/find/controller.d.ts.map +1 -0
- package/dist/find/controller.js +227 -0
- package/dist/find/controller.js.map +1 -0
- package/dist/find/fold.d.ts +23 -0
- package/dist/find/fold.d.ts.map +1 -0
- package/dist/find/fold.js +99 -0
- package/dist/find/fold.js.map +1 -0
- package/dist/find/page.d.ts +44 -0
- package/dist/find/page.d.ts.map +1 -0
- package/dist/find/page.js +173 -0
- package/dist/find/page.js.map +1 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/layers/box.d.ts +10 -0
- package/dist/layers/box.d.ts.map +1 -0
- package/dist/layers/box.js +19 -0
- package/dist/layers/box.js.map +1 -0
- package/dist/layers/highlight-layer.d.ts +31 -0
- package/dist/layers/highlight-layer.d.ts.map +1 -0
- package/dist/layers/highlight-layer.js +95 -0
- package/dist/layers/highlight-layer.js.map +1 -0
- package/dist/layers/spans.d.ts +42 -0
- package/dist/layers/spans.d.ts.map +1 -0
- package/dist/layers/spans.js +121 -0
- package/dist/layers/spans.js.map +1 -0
- package/dist/layers/structure-layer.d.ts +15 -0
- package/dist/layers/structure-layer.d.ts.map +1 -0
- package/dist/layers/structure-layer.js +152 -0
- package/dist/layers/structure-layer.js.map +1 -0
- package/dist/layers/text-layer.d.ts +53 -0
- package/dist/layers/text-layer.d.ts.map +1 -0
- package/dist/layers/text-layer.js +292 -0
- package/dist/layers/text-layer.js.map +1 -0
- package/dist/layout/range.d.ts +3 -0
- package/dist/layout/range.d.ts.map +1 -0
- package/dist/layout/range.js +5 -0
- package/dist/layout/range.js.map +1 -0
- package/dist/network/watch.d.ts +30 -0
- package/dist/network/watch.d.ts.map +1 -0
- package/dist/network/watch.js +181 -0
- package/dist/network/watch.js.map +1 -0
- package/dist/protocol.d.ts +115 -2
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js.map +1 -1
- package/dist/render/tiles.d.ts +43 -3
- package/dist/render/tiles.d.ts.map +1 -1
- package/dist/render/tiles.js +62 -10
- package/dist/render/tiles.js.map +1 -1
- package/dist/source/http-range.d.ts +59 -0
- package/dist/source/http-range.d.ts.map +1 -0
- package/dist/source/http-range.js +284 -0
- package/dist/source/http-range.js.map +1 -0
- package/dist/thumbnails/strip.d.ts +37 -0
- package/dist/thumbnails/strip.d.ts.map +1 -0
- package/dist/thumbnails/strip.js +313 -0
- package/dist/thumbnails/strip.js.map +1 -0
- package/dist/view/budgets.d.ts +29 -0
- package/dist/view/budgets.d.ts.map +1 -0
- package/dist/view/budgets.js +63 -0
- package/dist/view/budgets.js.map +1 -0
- package/dist/view/touch.d.ts +71 -0
- package/dist/view/touch.d.ts.map +1 -0
- package/dist/view/touch.js +220 -0
- package/dist/view/touch.js.map +1 -0
- package/dist/view/viewer.d.ts +42 -1
- package/dist/view/viewer.d.ts.map +1 -1
- package/dist/view/viewer.js +425 -68
- package/dist/view/viewer.js.map +1 -1
- package/dist/worker/document.d.ts +30 -0
- package/dist/worker/document.d.ts.map +1 -1
- package/dist/worker/document.js +176 -24
- package/dist/worker/document.js.map +1 -1
- package/dist/worker/entry.d.ts +1 -1
- package/dist/worker/entry.d.ts.map +1 -1
- package/dist/worker/entry.js +2 -0
- package/dist/worker/entry.js.map +1 -1
- package/dist/worker/find.d.ts +7 -0
- package/dist/worker/find.d.ts.map +1 -0
- package/dist/worker/find.js +59 -0
- package/dist/worker/find.js.map +1 -0
- package/dist/worker/methods.d.ts.map +1 -1
- package/dist/worker/methods.js +28 -2
- package/dist/worker/methods.js.map +1 -1
- package/dist/worker/navigation.d.ts +6 -0
- package/dist/worker/navigation.d.ts.map +1 -0
- package/dist/worker/navigation.js +16 -0
- package/dist/worker/navigation.js.map +1 -0
- package/dist/worker/network.d.ts +4 -0
- package/dist/worker/network.d.ts.map +1 -0
- package/dist/worker/network.js +24 -0
- package/dist/worker/network.js.map +1 -0
- package/dist/worker/render.d.ts +5 -2
- package/dist/worker/render.d.ts.map +1 -1
- package/dist/worker/render.js +13 -6
- package/dist/worker/render.js.map +1 -1
- package/dist/worker/text.d.ts +17 -0
- package/dist/worker/text.d.ts.map +1 -0
- package/dist/worker/text.js +75 -0
- package/dist/worker/text.js.map +1 -0
- package/dist/zoom/destination.d.ts +18 -0
- package/dist/zoom/destination.d.ts.map +1 -0
- package/dist/zoom/destination.js +56 -0
- package/dist/zoom/destination.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// Find in document (web-app §4, R05): the viewer's find controller. A query searches the whole
|
|
2
|
+
// document from the current page forward and wraps round to the start. The document Web Worker
|
|
3
|
+
// searches a few pages per call at `background` priority, and the next call goes out only when
|
|
4
|
+
// one returns, so renders run in between and scrolling never waits. Results stream in by page: the
|
|
5
|
+
// count grows, the first match after the start shows as soon as it is found, and the highlights
|
|
6
|
+
// paint on the pages mounted now and on each page as it mounts. A new query, new options or
|
|
7
|
+
// `close()` aborts the search under way, and its late results are dropped by the search's id.
|
|
8
|
+
/** Pages searched per call: small enough that a render queued meanwhile waits little. */
|
|
9
|
+
const PAGES_PER_CALL = 4;
|
|
10
|
+
const IDLE = {
|
|
11
|
+
query: "",
|
|
12
|
+
options: {},
|
|
13
|
+
total: 0,
|
|
14
|
+
current: undefined,
|
|
15
|
+
searched: 0,
|
|
16
|
+
pageCount: 0,
|
|
17
|
+
done: true,
|
|
18
|
+
pagesWithoutText: 0,
|
|
19
|
+
search: 0,
|
|
20
|
+
};
|
|
21
|
+
/** Find in one viewer's document. Reach it as `viewer.find`. */
|
|
22
|
+
export class FindController {
|
|
23
|
+
#host;
|
|
24
|
+
#listeners = new Set();
|
|
25
|
+
#state = IDLE;
|
|
26
|
+
#byPage = new Map();
|
|
27
|
+
#snippets = new Map();
|
|
28
|
+
/** The last list `results()` made, and the state it was made for. */
|
|
29
|
+
#results;
|
|
30
|
+
#current;
|
|
31
|
+
#abort;
|
|
32
|
+
#start = 0;
|
|
33
|
+
constructor(host) {
|
|
34
|
+
this.#host = host;
|
|
35
|
+
}
|
|
36
|
+
/** Find's state now (a new object after each change). */
|
|
37
|
+
getState = () => this.#state;
|
|
38
|
+
/** Calls `listener` after every change of state (for `useSyncExternalStore`); returns a function that stops it. */
|
|
39
|
+
subscribe = (listener) => {
|
|
40
|
+
this.#listeners.add(listener);
|
|
41
|
+
return () => this.#listeners.delete(listener);
|
|
42
|
+
};
|
|
43
|
+
/** Searches for `query` with `options`, replacing any search under way. An empty query clears. */
|
|
44
|
+
find(query, options = {}) {
|
|
45
|
+
this.#stop();
|
|
46
|
+
const search = this.#state.search + 1;
|
|
47
|
+
const cleared = [...this.#byPage.keys()];
|
|
48
|
+
this.#byPage = new Map();
|
|
49
|
+
this.#snippets = new Map();
|
|
50
|
+
this.#current = undefined;
|
|
51
|
+
const pageCount = this.#host.pageCount();
|
|
52
|
+
this.#start = Math.min(Math.max(0, this.#host.currentPage()), Math.max(0, pageCount - 1));
|
|
53
|
+
const searching = query.trim() !== "" && pageCount > 0;
|
|
54
|
+
this.#set({ ...IDLE, query, options, pageCount, done: !searching, search });
|
|
55
|
+
this.#host.redraw(cleared);
|
|
56
|
+
if (searching)
|
|
57
|
+
void this.#run(query, options, search);
|
|
58
|
+
}
|
|
59
|
+
/** The next match, wrapping to the first; scrolls it into view. */
|
|
60
|
+
next() {
|
|
61
|
+
this.#move(1);
|
|
62
|
+
}
|
|
63
|
+
/** The previous match, wrapping to the last; scrolls it into view. */
|
|
64
|
+
previous() {
|
|
65
|
+
this.#move(-1);
|
|
66
|
+
}
|
|
67
|
+
/** Makes the match at `ordinal` (as `FindResult.ordinal`) current and scrolls it into view. */
|
|
68
|
+
goTo(ordinal) {
|
|
69
|
+
if (Number.isInteger(ordinal) && ordinal >= 0 && ordinal < this.#state.total)
|
|
70
|
+
this.#select(ordinal);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Every match found so far, in document order. While a search runs the list grows as pages are
|
|
74
|
+
* searched; the same array comes back until find's state next changes.
|
|
75
|
+
*/
|
|
76
|
+
results() {
|
|
77
|
+
if (this.#results?.state === this.#state)
|
|
78
|
+
return this.#results.list;
|
|
79
|
+
const list = [];
|
|
80
|
+
for (const page of [...this.#snippets.keys()].sort((a, b) => a - b)) {
|
|
81
|
+
for (const snippet of this.#snippets.get(page) ?? [])
|
|
82
|
+
list.push({ ordinal: list.length, page, snippet });
|
|
83
|
+
}
|
|
84
|
+
this.#results = { state: this.#state, list };
|
|
85
|
+
return list;
|
|
86
|
+
}
|
|
87
|
+
/** Ends find: the search stops and every highlight goes. */
|
|
88
|
+
close() {
|
|
89
|
+
this.find("");
|
|
90
|
+
}
|
|
91
|
+
/** Page `page`'s matches, and which is current (for the highlight layer). */
|
|
92
|
+
matchesOn(page) {
|
|
93
|
+
return {
|
|
94
|
+
matches: this.#byPage.get(page) ?? [],
|
|
95
|
+
current: this.#current?.page === page ? this.#current.index : undefined,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Stops the search and drops the results: a new document opened. */
|
|
99
|
+
reset() {
|
|
100
|
+
this.#stop();
|
|
101
|
+
this.#byPage = new Map();
|
|
102
|
+
this.#snippets = new Map();
|
|
103
|
+
this.#current = undefined;
|
|
104
|
+
this.#set({ ...IDLE, search: this.#state.search + 1 });
|
|
105
|
+
}
|
|
106
|
+
// --- internals ---
|
|
107
|
+
/** Pages from the start page to the end, then from the first back to the start. */
|
|
108
|
+
#order(pageCount) {
|
|
109
|
+
return Array.from({ length: pageCount }, (_, k) => (this.#start + k) % pageCount);
|
|
110
|
+
}
|
|
111
|
+
async #run(query, options, search) {
|
|
112
|
+
const abort = new AbortController();
|
|
113
|
+
this.#abort = abort;
|
|
114
|
+
const order = this.#order(this.#state.pageCount);
|
|
115
|
+
for (let at = 0; at < order.length; at += PAGES_PER_CALL) {
|
|
116
|
+
const pages = order.slice(at, at + PAGES_PER_CALL);
|
|
117
|
+
let results;
|
|
118
|
+
try {
|
|
119
|
+
results = await this.#host.find(query, options, pages, abort.signal);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
// A newer search, or close(): this one's results never show.
|
|
123
|
+
if (abort.signal.aborted || this.#state.search !== search)
|
|
124
|
+
return;
|
|
125
|
+
// The search stops where it failed; what it found stays.
|
|
126
|
+
this.#set({ done: true });
|
|
127
|
+
reportError(error);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (abort.signal.aborted || this.#state.search !== search)
|
|
131
|
+
return;
|
|
132
|
+
this.#take(results, search);
|
|
133
|
+
}
|
|
134
|
+
if (this.#state.search === search)
|
|
135
|
+
this.#set({ done: true });
|
|
136
|
+
}
|
|
137
|
+
/** Adds one call's results: the count, the first match to show, the pages to paint. */
|
|
138
|
+
#take(results, search) {
|
|
139
|
+
let total = this.#state.total;
|
|
140
|
+
let noText = this.#state.pagesWithoutText;
|
|
141
|
+
const painted = [];
|
|
142
|
+
for (const { page, matches, snippets, noText: empty } of results) {
|
|
143
|
+
if (empty === true)
|
|
144
|
+
noText += 1;
|
|
145
|
+
if (matches.length === 0)
|
|
146
|
+
continue;
|
|
147
|
+
this.#byPage.set(page, matches);
|
|
148
|
+
this.#snippets.set(page, snippets);
|
|
149
|
+
total += matches.length;
|
|
150
|
+
painted.push(page);
|
|
151
|
+
}
|
|
152
|
+
// The first match from the start page on is the current one, shown as soon as it is found.
|
|
153
|
+
let first = false;
|
|
154
|
+
if (this.#current === undefined) {
|
|
155
|
+
const page = results.find((r) => r.matches.length > 0)?.page;
|
|
156
|
+
if (page !== undefined) {
|
|
157
|
+
this.#current = { page, index: 0 };
|
|
158
|
+
first = true;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
this.#set({
|
|
162
|
+
total,
|
|
163
|
+
pagesWithoutText: noText,
|
|
164
|
+
searched: this.#state.searched + results.length,
|
|
165
|
+
current: this.#current === undefined ? undefined : this.#ordinal(this.#current),
|
|
166
|
+
search,
|
|
167
|
+
});
|
|
168
|
+
this.#host.redraw(painted);
|
|
169
|
+
if (first)
|
|
170
|
+
this.#reveal();
|
|
171
|
+
}
|
|
172
|
+
/** `place`'s position among every match found so far, in document order. */
|
|
173
|
+
#ordinal(place) {
|
|
174
|
+
let before = 0;
|
|
175
|
+
for (const [page, matches] of this.#byPage)
|
|
176
|
+
if (page < place.page)
|
|
177
|
+
before += matches.length;
|
|
178
|
+
return before + place.index;
|
|
179
|
+
}
|
|
180
|
+
/** The match at position `ordinal` in document order. */
|
|
181
|
+
#placeAt(ordinal) {
|
|
182
|
+
let left = ordinal;
|
|
183
|
+
for (const page of [...this.#byPage.keys()].sort((a, b) => a - b)) {
|
|
184
|
+
const count = this.#byPage.get(page)?.length ?? 0;
|
|
185
|
+
if (left < count)
|
|
186
|
+
return { page, index: left };
|
|
187
|
+
left -= count;
|
|
188
|
+
}
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
#move(step) {
|
|
192
|
+
const total = this.#state.total;
|
|
193
|
+
if (total === 0)
|
|
194
|
+
return;
|
|
195
|
+
const now = this.#state.current;
|
|
196
|
+
// A search makes its first match current as soon as it finds one, so `now` is set whenever
|
|
197
|
+
// there is a match; the fallback only guards the types.
|
|
198
|
+
this.#select(now === undefined ? 0 : (now + step + total) % total);
|
|
199
|
+
}
|
|
200
|
+
/** Makes match `next` current, repaints the pages that changed and scrolls it into view. */
|
|
201
|
+
#select(next) {
|
|
202
|
+
const place = this.#placeAt(next);
|
|
203
|
+
if (place === undefined)
|
|
204
|
+
return;
|
|
205
|
+
const before = this.#current?.page;
|
|
206
|
+
this.#current = place;
|
|
207
|
+
this.#set({ current: next });
|
|
208
|
+
this.#host.redraw(before === undefined || before === place.page ? [place.page] : [before, place.page]);
|
|
209
|
+
this.#reveal();
|
|
210
|
+
}
|
|
211
|
+
#reveal() {
|
|
212
|
+
const place = this.#current;
|
|
213
|
+
const quads = place === undefined ? undefined : this.#byPage.get(place.page)?.[place.index];
|
|
214
|
+
if (place !== undefined && quads !== undefined)
|
|
215
|
+
this.#host.reveal(place.page, quads);
|
|
216
|
+
}
|
|
217
|
+
#stop() {
|
|
218
|
+
this.#abort?.abort();
|
|
219
|
+
this.#abort = undefined;
|
|
220
|
+
}
|
|
221
|
+
#set(next) {
|
|
222
|
+
this.#state = { ...this.#state, ...next };
|
|
223
|
+
for (const listener of this.#listeners)
|
|
224
|
+
listener();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/find/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** How find compares text. */
|
|
2
|
+
export interface FindOptions {
|
|
3
|
+
/** Upper and lower case differ (default: they don't). */
|
|
4
|
+
readonly matchCase?: boolean;
|
|
5
|
+
/** Only whole words match (default: any part of a word). */
|
|
6
|
+
readonly wholeWords?: boolean;
|
|
7
|
+
/** Accents and other combining marks count (default: they don't). */
|
|
8
|
+
readonly matchDiacritics?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Folded text and, for each of its UTF-16 units, the source unit it came from. */
|
|
11
|
+
export interface Folded {
|
|
12
|
+
readonly text: string;
|
|
13
|
+
readonly from: Int32Array;
|
|
14
|
+
}
|
|
15
|
+
/** `source` as find compares it. */
|
|
16
|
+
export declare function fold(source: string, options?: FindOptions): Folded;
|
|
17
|
+
/** The query as find compares it: folded, and trimmed of the spaces at its ends. */
|
|
18
|
+
export declare function foldQuery(query: string, options?: FindOptions): string;
|
|
19
|
+
/** Whether UTF-16 unit `code` is the second half of a surrogate pair. */
|
|
20
|
+
export declare const isLowSurrogate: (code: number) => boolean;
|
|
21
|
+
/** Every `[start, end)` of `query` (already folded) in `text`, in order, never overlapping. */
|
|
22
|
+
export declare function matches(text: string, query: string, wholeWords?: boolean): [number, number][];
|
|
23
|
+
//# sourceMappingURL=fold.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.d.ts","sourceRoot":"","sources":["../../src/find/fold.ts"],"names":[],"mappings":"AAUA,8BAA8B;AAC9B,MAAM,WAAW,WAAW;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,4DAA4D;IAC5D,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,mFAAmF;AACnF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAcD,oCAAoC;AACpC,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CA6BtE;AAED,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAE1E;AAID,yEAAyE;AACzE,eAAO,MAAM,cAAc,SAAU,MAAM,KAAG,OAA2C,CAAC;AAwB1F,+FAA+F;AAC/F,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAa3F"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// Text as find compares it, close to pdf.js's rules so match counts agree: compatibility forms
|
|
2
|
+
// folded (NFKC: `fi` → `fi`, a no-break space → a space), soft hyphens dropped, a hyphen that ends a
|
|
3
|
+
// line joined to the next line's word, runs of white space as one space, and unless asked
|
|
4
|
+
// otherwise, case and diacritics ignored (pdf.js's defaults). Case folds with `toLowerCase`, not
|
|
5
|
+
// `toLocaleLowerCase`: a document's language isn't the reader's, and a Turkish locale would make
|
|
6
|
+
// `I` miss `i`. Diacritics are every combining mark (`\p{M}`), as pdf.js takes them: Latin
|
|
7
|
+
// accents, and also Hebrew points, Arabic harakat and Indic vowel signs, which the query loses
|
|
8
|
+
// too, so `שלום` finds the pointed `שָׁלוֹם`.
|
|
9
|
+
// Each folded UTF-16 unit remembers which source unit it came from, so a match maps back.
|
|
10
|
+
const SOFT_HYPHEN = 0xad;
|
|
11
|
+
const DIACRITICS = /\p{M}/gu;
|
|
12
|
+
const SPACE = /\s/;
|
|
13
|
+
/** One source character as find compares it. */
|
|
14
|
+
function foldOne(char, options) {
|
|
15
|
+
let out = char.normalize("NFKC");
|
|
16
|
+
if (options.matchDiacritics !== true)
|
|
17
|
+
out = out.normalize("NFD").replace(DIACRITICS, "");
|
|
18
|
+
if (options.matchCase !== true)
|
|
19
|
+
out = out.toLowerCase();
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
/** `source` as find compares it. */
|
|
23
|
+
export function fold(source, options = {}) {
|
|
24
|
+
let text = "";
|
|
25
|
+
const from = [];
|
|
26
|
+
const push = (s, at) => {
|
|
27
|
+
for (let k = 0; k < s.length; k++)
|
|
28
|
+
from.push(at);
|
|
29
|
+
text += s;
|
|
30
|
+
};
|
|
31
|
+
for (let i = 0; i < source.length;) {
|
|
32
|
+
const cp = source.codePointAt(i) ?? 0;
|
|
33
|
+
const char = String.fromCodePoint(cp);
|
|
34
|
+
const next = i + char.length;
|
|
35
|
+
if (cp === SOFT_HYPHEN) {
|
|
36
|
+
i = next;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// A hyphen at a line's end joins the word it splits (pdf.js does the same).
|
|
40
|
+
if (char === "-" && source[next] === "\n" && /\p{L}/u.test(text.at(-1) ?? "")) {
|
|
41
|
+
i = next + 1;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const folded = SPACE.test(char) ? " " : foldOne(char, options);
|
|
45
|
+
if (folded === " " && (text === "" || text.endsWith(" "))) {
|
|
46
|
+
i = next;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
push(folded, i);
|
|
50
|
+
i = next;
|
|
51
|
+
}
|
|
52
|
+
return { text, from: Int32Array.from(from) };
|
|
53
|
+
}
|
|
54
|
+
/** The query as find compares it: folded, and trimmed of the spaces at its ends. */
|
|
55
|
+
export function foldQuery(query, options = {}) {
|
|
56
|
+
return fold(query, options).text.trim();
|
|
57
|
+
}
|
|
58
|
+
const WORD = /[\p{L}\p{N}\p{M}_]/u;
|
|
59
|
+
/** Whether UTF-16 unit `code` is the second half of a surrogate pair. */
|
|
60
|
+
export const isLowSurrogate = (code) => code >= 0xdc00 && code <= 0xdfff;
|
|
61
|
+
/** The character that ends just before `at` in `text`, a surrogate pair whole. */
|
|
62
|
+
function charBefore(text, at) {
|
|
63
|
+
if (at <= 0)
|
|
64
|
+
return "";
|
|
65
|
+
const low = text.charCodeAt(at - 1);
|
|
66
|
+
const pair = isLowSurrogate(low) && at >= 2;
|
|
67
|
+
return String.fromCodePoint(text.codePointAt(pair ? at - 2 : at - 1) ?? 0);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Whether `text[start, end)` stands as whole words: no letter, digit or mark runs on at either
|
|
71
|
+
* end. This is pdf.js's test, by character class, rather than `Intl.Segmenter`'s word breaks,
|
|
72
|
+
* so whole-word counts agree with pdf.js's.
|
|
73
|
+
*/
|
|
74
|
+
function wholeAt(text, start, end) {
|
|
75
|
+
const before = charBefore(text, start);
|
|
76
|
+
const after = end < text.length ? String.fromCodePoint(text.codePointAt(end) ?? 0) : "";
|
|
77
|
+
// A query that starts or ends in a non-word character may sit against a word.
|
|
78
|
+
const first = text.slice(start, start + 2);
|
|
79
|
+
const last = text.slice(Math.max(start, end - 2), end);
|
|
80
|
+
return (!WORD.test(before) || !WORD.test(first.at(0) ?? "")) && (!WORD.test(after) || !WORD.test(last.at(-1) ?? ""));
|
|
81
|
+
}
|
|
82
|
+
/** Every `[start, end)` of `query` (already folded) in `text`, in order, never overlapping. */
|
|
83
|
+
export function matches(text, query, wholeWords = false) {
|
|
84
|
+
const out = [];
|
|
85
|
+
if (query === "")
|
|
86
|
+
return out;
|
|
87
|
+
for (let at = text.indexOf(query); at >= 0;) {
|
|
88
|
+
const end = at + query.length;
|
|
89
|
+
if (!wholeWords || wholeAt(text, at, end)) {
|
|
90
|
+
out.push([at, end]);
|
|
91
|
+
at = text.indexOf(query, end);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
at = text.indexOf(query, at + 1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=fold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fold.js","sourceRoot":"","sources":["../../src/find/fold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { TextRunData } from "../protocol.js";
|
|
2
|
+
import { type FindOptions, type Folded } from "./fold.js";
|
|
3
|
+
/** A page's runs and glyphs, as the document Web Worker keeps them. */
|
|
4
|
+
export interface PageGlyphs {
|
|
5
|
+
readonly runs: readonly TextRunData[];
|
|
6
|
+
/** 8 numbers per glyph: bottom-left, bottom-right, top-right, top-left, each `x, y`, in page space. */
|
|
7
|
+
readonly quads: Float32Array;
|
|
8
|
+
/** Glyph `i`'s text is `glyphText.slice(glyphOffsets[i], glyphOffsets[i + 1])`. */
|
|
9
|
+
readonly glyphText: string;
|
|
10
|
+
readonly glyphOffsets: Uint32Array;
|
|
11
|
+
}
|
|
12
|
+
/** A page's text for searching, with the glyphs behind each UTF-16 unit. */
|
|
13
|
+
export interface SearchText {
|
|
14
|
+
readonly text: string;
|
|
15
|
+
/** For unit `i`, the glyphs `[lo[i], hi[i])`; an empty range for a separator. */
|
|
16
|
+
readonly lo: Int32Array;
|
|
17
|
+
readonly hi: Int32Array;
|
|
18
|
+
/** The run each glyph belongs to. */
|
|
19
|
+
readonly runOf: Int32Array;
|
|
20
|
+
}
|
|
21
|
+
/** One match: a quad (8 numbers, as above) per run it touches, in order. */
|
|
22
|
+
export type MatchQuads = readonly number[];
|
|
23
|
+
/** `page`'s text in reading order, mapped to its glyphs. */
|
|
24
|
+
export declare function searchText(page: PageGlyphs): SearchText;
|
|
25
|
+
/** Every match of `query` in `search`'s text, as `[start, end)` of the folded text, with that text. */
|
|
26
|
+
export declare function matchRanges(search: SearchText, query: string, options: FindOptions): {
|
|
27
|
+
readonly folded: Folded;
|
|
28
|
+
readonly ranges: [number, number][];
|
|
29
|
+
};
|
|
30
|
+
/** The quads of matches `ranges` of `folded`, the folded text of `search`. */
|
|
31
|
+
export declare function quadsOfMatches(page: PageGlyphs, search: SearchText, folded: Folded, ranges: readonly (readonly [number, number])[]): MatchQuads[];
|
|
32
|
+
/** Every match of `query` on `page`, each as its quads. */
|
|
33
|
+
export declare function findOnPage(page: PageGlyphs, search: SearchText, query: string, options: FindOptions): MatchQuads[];
|
|
34
|
+
/** A match in its line: the text before it, the match, and the text after, as the page has them. */
|
|
35
|
+
export interface FindSnippet {
|
|
36
|
+
/** Up to about 40 characters, starting at a word, "…" first where cut. */
|
|
37
|
+
readonly before: string;
|
|
38
|
+
readonly match: string;
|
|
39
|
+
/** Up to about 40 characters, ending at a word, "…" last where cut. */
|
|
40
|
+
readonly after: string;
|
|
41
|
+
}
|
|
42
|
+
/** The snippet of the match `range` of `folded`, the folded text of `search`. */
|
|
43
|
+
export declare function snippetOf(search: SearchText, folded: Folded, range: readonly [number, number]): FindSnippet;
|
|
44
|
+
//# sourceMappingURL=page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../src/find/page.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,EAA4C,MAAM,WAAW,CAAC;AAEpG,uEAAuE;AACvE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,uGAAuG;IACvG,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;CACpC;AAED,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,4EAA4E;AAC5E,MAAM,MAAM,UAAU,GAAG,SAAS,MAAM,EAAE,CAAC;AAqB3C,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CA6BvD;AA4BD,uGAAuG;AACvG,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,GACnB;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;CAAE,CAGlE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,GAC7C,UAAU,EAAE,CAMd;AAED,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,UAAU,EAAE,CAGlH;AAED,oGAAoG;AACpG,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAmDD,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,CAe3G"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// A page's text as find searches it: its runs joined as copy joins them (a new line at a new
|
|
2
|
+
// baseline, a space at a gap), with, for every character, the glyphs it came from. A run's text
|
|
3
|
+
// is in logical order and its glyphs in drawing order, so a character maps to its glyph when the
|
|
4
|
+
// glyphs spell the run forwards, or backwards (right-to-left text), and to the whole run when
|
|
5
|
+
// they spell neither (an `/ActualText` replacement, or reordered marks). A match then becomes one
|
|
6
|
+
// quad per run it touches, from its first glyph to its last.
|
|
7
|
+
import { layoutSpans, separator } from "../layers/spans.js";
|
|
8
|
+
import { fold, foldQuery, isLowSurrogate, matches } from "./fold.js";
|
|
9
|
+
/** Glyph `g`'s text. */
|
|
10
|
+
function glyphString(page, g) {
|
|
11
|
+
return page.glyphText.slice(page.glyphOffsets[g] ?? 0, page.glyphOffsets[g + 1] ?? 0);
|
|
12
|
+
}
|
|
13
|
+
/** For each UTF-16 unit of `run.text`, the glyph range it came from. */
|
|
14
|
+
function mapRun(page, run) {
|
|
15
|
+
const [start, end] = run.glyphRange;
|
|
16
|
+
const units = [];
|
|
17
|
+
const walk = (glyphs) => {
|
|
18
|
+
units.length = 0;
|
|
19
|
+
for (const g of glyphs)
|
|
20
|
+
for (let k = 0; k < glyphString(page, g).length; k++)
|
|
21
|
+
units.push([g, g + 1]);
|
|
22
|
+
return units.length === run.text.length && glyphs.map((g) => glyphString(page, g)).join("") === run.text;
|
|
23
|
+
};
|
|
24
|
+
const forwards = Array.from({ length: end - start }, (_, k) => start + k);
|
|
25
|
+
if (walk(forwards) || walk([...forwards].reverse()))
|
|
26
|
+
return units;
|
|
27
|
+
return Array.from({ length: run.text.length }, () => [start, end]);
|
|
28
|
+
}
|
|
29
|
+
/** `page`'s text in reading order, mapped to its glyphs. */
|
|
30
|
+
export function searchText(page) {
|
|
31
|
+
const spans = layoutSpans(page.runs, page.quads);
|
|
32
|
+
let text = "";
|
|
33
|
+
const lo = [];
|
|
34
|
+
const hi = [];
|
|
35
|
+
const glyphs = Math.max(0, page.glyphOffsets.length - 1);
|
|
36
|
+
const runOf = new Int32Array(glyphs).fill(-1);
|
|
37
|
+
let before;
|
|
38
|
+
for (const span of spans) {
|
|
39
|
+
const run = page.runs[span.run];
|
|
40
|
+
if (run === undefined)
|
|
41
|
+
continue;
|
|
42
|
+
const piece = { page: 0, text: run.text, span };
|
|
43
|
+
if (before !== undefined) {
|
|
44
|
+
const gap = separator(before, piece);
|
|
45
|
+
for (let k = 0; k < gap.length; k++) {
|
|
46
|
+
lo.push(0);
|
|
47
|
+
hi.push(0);
|
|
48
|
+
}
|
|
49
|
+
text += gap;
|
|
50
|
+
}
|
|
51
|
+
for (const [a, b] of mapRun(page, run)) {
|
|
52
|
+
lo.push(a);
|
|
53
|
+
hi.push(b);
|
|
54
|
+
}
|
|
55
|
+
for (let g = run.glyphRange[0]; g < run.glyphRange[1]; g++)
|
|
56
|
+
runOf[g] = span.run;
|
|
57
|
+
text += run.text;
|
|
58
|
+
before = piece;
|
|
59
|
+
}
|
|
60
|
+
return { text, lo: Int32Array.from(lo), hi: Int32Array.from(hi), runOf };
|
|
61
|
+
}
|
|
62
|
+
/** The glyphs `[first, last]` that source units `[start, end)` cover, per run. */
|
|
63
|
+
function glyphsByRun(search, start, end) {
|
|
64
|
+
const byRun = new Map();
|
|
65
|
+
for (let u = start; u < end; u++) {
|
|
66
|
+
const a = search.lo[u] ?? 0;
|
|
67
|
+
const b = search.hi[u] ?? 0;
|
|
68
|
+
if (b <= a)
|
|
69
|
+
continue;
|
|
70
|
+
const run = search.runOf[a] ?? -1;
|
|
71
|
+
const seen = byRun.get(run);
|
|
72
|
+
byRun.set(run, seen === undefined ? [a, b - 1] : [Math.min(seen[0], a), Math.max(seen[1], b - 1)]);
|
|
73
|
+
}
|
|
74
|
+
return byRun;
|
|
75
|
+
}
|
|
76
|
+
/** The quads of source units `[start, end)`: one per run, from its first glyph to its last. */
|
|
77
|
+
function quadsOf(page, search, start, end) {
|
|
78
|
+
const q = page.quads;
|
|
79
|
+
const at = (i) => q[i] ?? 0;
|
|
80
|
+
return [...glyphsByRun(search, start, end).values()].flatMap(([first, last]) => {
|
|
81
|
+
const f = first * 8;
|
|
82
|
+
const l = last * 8;
|
|
83
|
+
// Bottom-left and top-left of the first glyph, bottom-right and top-right of the last.
|
|
84
|
+
return [at(f), at(f + 1), at(l + 2), at(l + 3), at(l + 4), at(l + 5), at(f + 6), at(f + 7)];
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** Every match of `query` in `search`'s text, as `[start, end)` of the folded text, with that text. */
|
|
88
|
+
export function matchRanges(search, query, options) {
|
|
89
|
+
const folded = fold(search.text, options);
|
|
90
|
+
return { folded, ranges: matches(folded.text, foldQuery(query, options), options.wholeWords === true) };
|
|
91
|
+
}
|
|
92
|
+
/** The quads of matches `ranges` of `folded`, the folded text of `search`. */
|
|
93
|
+
export function quadsOfMatches(page, search, folded, ranges) {
|
|
94
|
+
return ranges.map(([a, b]) => {
|
|
95
|
+
const start = folded.from[a] ?? 0;
|
|
96
|
+
const end = (folded.from[b - 1] ?? start) + 1;
|
|
97
|
+
return quadsOf(page, search, start, end);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/** Every match of `query` on `page`, each as its quads. */
|
|
101
|
+
export function findOnPage(page, search, query, options) {
|
|
102
|
+
const { folded, ranges } = matchRanges(search, query, options);
|
|
103
|
+
return quadsOfMatches(page, search, folded, ranges);
|
|
104
|
+
}
|
|
105
|
+
/** About how many characters of context a snippet keeps on each side of its match. */
|
|
106
|
+
const SNIPPET_CONTEXT = 40;
|
|
107
|
+
const SPACES = /\s+/gu;
|
|
108
|
+
/** `text[from, to)` with white space collapsed to single spaces. */
|
|
109
|
+
const collapsed = (text, from, to) => text.slice(from, to).replace(SPACES, " ");
|
|
110
|
+
const SPACE = /\s/u;
|
|
111
|
+
const MARK = /\p{M}/u;
|
|
112
|
+
/** Where context starting `SNIPPET_CONTEXT` units before `start` begins: at a word, or a whole character. */
|
|
113
|
+
function contextStart(text, start) {
|
|
114
|
+
let at = Math.max(0, start - SNIPPET_CONTEXT);
|
|
115
|
+
if (at === 0 || SPACE.test(text[at - 1] ?? ""))
|
|
116
|
+
return at;
|
|
117
|
+
// The first word that starts inside the window, unless only spaces lie between it and the match.
|
|
118
|
+
const space = text.slice(at, start).search(/\s/u);
|
|
119
|
+
if (space >= 0 && /\S/u.test(text.slice(at + space + 1, start)))
|
|
120
|
+
return at + space + 1;
|
|
121
|
+
// Inside a long word: start at a whole character, never on its second half or its marks.
|
|
122
|
+
if (isLowSurrogate(text.charCodeAt(at)))
|
|
123
|
+
at += 1;
|
|
124
|
+
while (at < start && MARK.test(String.fromCodePoint(text.codePointAt(at) ?? 0)))
|
|
125
|
+
at += 1;
|
|
126
|
+
return at;
|
|
127
|
+
}
|
|
128
|
+
/** Where context ending `SNIPPET_CONTEXT` units after `end` stops: after a word, or at a whole character. */
|
|
129
|
+
function contextEnd(text, end) {
|
|
130
|
+
let at = Math.min(text.length, end + SNIPPET_CONTEXT);
|
|
131
|
+
if (at === text.length || SPACE.test(text[at] ?? ""))
|
|
132
|
+
return at;
|
|
133
|
+
// Before the last word cut by the window, unless only spaces lie between the match and it.
|
|
134
|
+
const space = text.slice(end, at).search(/\s\S*$/u);
|
|
135
|
+
if (space > 0 && /\S/u.test(text.slice(end, end + space)))
|
|
136
|
+
return end + space;
|
|
137
|
+
// Inside a long word: stop after a whole character, with its second half and its marks.
|
|
138
|
+
if (isLowSurrogate(text.charCodeAt(at)))
|
|
139
|
+
at -= 1;
|
|
140
|
+
return wholeCharacterEnd(text, at);
|
|
141
|
+
}
|
|
142
|
+
/** Past the character that starts at `at - 1`: its low surrogate and any combining marks after it. */
|
|
143
|
+
function wholeCharacterEnd(text, at) {
|
|
144
|
+
let end = at;
|
|
145
|
+
if (end < text.length && isLowSurrogate(text.charCodeAt(end)))
|
|
146
|
+
end += 1;
|
|
147
|
+
while (end < text.length) {
|
|
148
|
+
const code = text.codePointAt(end) ?? 0;
|
|
149
|
+
const char = String.fromCodePoint(code);
|
|
150
|
+
if (!MARK.test(char))
|
|
151
|
+
break;
|
|
152
|
+
end += char.length;
|
|
153
|
+
}
|
|
154
|
+
return end;
|
|
155
|
+
}
|
|
156
|
+
/** The snippet of the match `range` of `folded`, the folded text of `search`. */
|
|
157
|
+
export function snippetOf(search, folded, range) {
|
|
158
|
+
const text = search.text;
|
|
159
|
+
const [a, b] = range;
|
|
160
|
+
const start = folded.from[a] ?? 0;
|
|
161
|
+
// Folding maps a character to its first unit and drops its marks: the match takes them back.
|
|
162
|
+
const end = wholeCharacterEnd(text, (folded.from[b - 1] ?? start) + 1);
|
|
163
|
+
const from = contextStart(text, start);
|
|
164
|
+
const to = contextEnd(text, end);
|
|
165
|
+
const before = collapsed(text, from, start).trimStart();
|
|
166
|
+
const after = collapsed(text, end, to).trimEnd();
|
|
167
|
+
return {
|
|
168
|
+
before: from > 0 && before !== "" ? `…${before}` : before,
|
|
169
|
+
match: collapsed(text, start, end),
|
|
170
|
+
after: to < text.length && after !== "" ? `${after}…` : after,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/find/page.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,14 @@
|
|
|
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 type { FindController, FindResult, FindState } from "./find/controller.js";
|
|
5
|
+
export type { FindOptions } from "./find/fold.js";
|
|
6
|
+
export type { FindSnippet } from "./find/page.js";
|
|
7
|
+
export type { TextLayerOptions, TextSelection } from "./layers/text-layer.js";
|
|
4
8
|
export type { Rotation } from "./layout/page-layout.js";
|
|
5
|
-
export
|
|
9
|
+
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";
|
|
11
|
+
export { ThumbnailStrip, type ThumbnailStripOptions } from "./thumbnails/strip.js";
|
|
6
12
|
export type { CreateViewerOptions, PageLayer, PageRenderState, RenderStats, ViewerEventMap, ViewState, } from "./view/viewer.js";
|
|
7
13
|
export { createViewer, Viewer } from "./view/viewer.js";
|
|
8
14
|
export type { DocumentPoint, Point, Zoom, ZoomMode } from "./zoom/zoom.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,OAAO,EACP,cAAc,EACd,MAAM,EACN,QAAQ,EACR,cAAc,EACd,MAAM,EACN,UAAU,EACV,iBAAiB,EACjB,YAAY,
|
|
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"}
|