@prose-reader/enhancer-annotations 1.163.0 → 1.165.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/dist/index.js CHANGED
@@ -3,12 +3,39 @@ import { DestroyableClass } from '@prose-reader/core';
3
3
  import { isDefined } from 'reactjrx';
4
4
 
5
5
  const c = "@prose-reader", i = (e) => `[${e}]`, p = (e, n) => ({
6
- debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {
7
- } : e ? Function.prototype.bind.call(console.debug, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.debug, console, i(`${c}`)),
8
- info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {
9
- } : e ? Function.prototype.bind.call(console.info, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.info, console, i(`${c}`)),
10
- error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {
11
- } : e ? Function.prototype.bind.call(console.error, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.error, console, i(`${c}`))
6
+ debug: !n || (window == null ? undefined : window.__PROSE_READER_DEBUG) !== true ? () => {
7
+ } : e ? Function.prototype.bind.call(
8
+ console.debug,
9
+ console,
10
+ i(`${c}`),
11
+ i(e)
12
+ ) : Function.prototype.bind.call(
13
+ console.debug,
14
+ console,
15
+ i(`${c}`)
16
+ ),
17
+ info: !n || (window == null ? undefined : window.__PROSE_READER_DEBUG) !== true ? () => {
18
+ } : e ? Function.prototype.bind.call(
19
+ console.info,
20
+ console,
21
+ i(`${c}`),
22
+ i(e)
23
+ ) : Function.prototype.bind.call(
24
+ console.info,
25
+ console,
26
+ i(`${c}`)
27
+ ),
28
+ error: !n || (window == null ? undefined : window.__PROSE_READER_DEBUG) !== true ? () => {
29
+ } : e ? Function.prototype.bind.call(
30
+ console.error,
31
+ console,
32
+ i(`${c}`),
33
+ i(e)
34
+ ) : Function.prototype.bind.call(
35
+ console.error,
36
+ console,
37
+ i(`${c}`)
38
+ )
12
39
  }), x = {
13
40
  ...p(),
14
41
  namespace: (e, n) => p(e, n)
@@ -83,7 +110,7 @@ class SpineItemHighlight extends DestroyableClass {
83
110
  void this.spineItem;
84
111
  void this.reader;
85
112
  this.container = this.containerElement.ownerDocument.createElement("div");
86
- this.container.dataset["highlightContainer"] = this.highlight.id;
113
+ this.container.dataset.highlightContainer = this.highlight.id;
87
114
  this.containerElement.appendChild(this.container);
88
115
  this.tap$ = fromEvent(this.container, "click").pipe(
89
116
  map((event) => ({ event, highlight: this.highlight })),
@@ -110,11 +137,15 @@ class SpineItemHighlight extends DestroyableClass {
110
137
  if (!range) {
111
138
  return;
112
139
  }
113
- const rectElements = createElementForRange(range, this.container, this.highlight.color ?? "yellow");
140
+ const rectElements = createElementForRange(
141
+ range,
142
+ this.container,
143
+ this.highlight.color ?? "yellow"
144
+ );
114
145
  rectElements.forEach((elt) => {
115
146
  elt.style.pointerEvents = "initial";
116
147
  elt.style.cursor = "pointer";
117
- elt.dataset["highlightRect"] = this.highlight.id;
148
+ elt.dataset.highlightRect = this.highlight.id;
118
149
  this.container.appendChild(elt);
119
150
  });
120
151
  const firstElement = rectElements[0];
@@ -147,7 +178,10 @@ class SpineItemHighlights extends DestroyableClass {
147
178
  this.reader = reader;
148
179
  this.selectedHighlight = selectedHighlight;
149
180
  const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement("div");
150
- this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement);
181
+ this.layer = createAnnotationLayer(
182
+ this.spineItem.containerElement,
183
+ firstLayerElement
184
+ );
151
185
  const itemHighlights$ = this.highlights$.pipe(
152
186
  switchMap((annotations) => {
153
187
  this.highlights.forEach((highlight) => highlight.destroy());
@@ -158,7 +192,13 @@ class SpineItemHighlights extends DestroyableClass {
158
192
  map((id) => id === annotation.id),
159
193
  distinctUntilChanged()
160
194
  );
161
- const spineItemHighlight = new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation, isSelected$);
195
+ const spineItemHighlight = new SpineItemHighlight(
196
+ this.spineItem,
197
+ this.layer,
198
+ this.reader,
199
+ annotation,
200
+ isSelected$
201
+ );
162
202
  this.highlights.push(spineItemHighlight);
163
203
  });
164
204
  return of(this.highlights);
@@ -166,7 +206,11 @@ class SpineItemHighlights extends DestroyableClass {
166
206
  shareReplay(1),
167
207
  takeUntil(this.destroy$)
168
208
  );
169
- this.tap$ = itemHighlights$.pipe(switchMap((highlights) => merge(...highlights.map((highlight) => highlight.tap$))));
209
+ this.tap$ = itemHighlights$.pipe(
210
+ switchMap(
211
+ (highlights) => merge(...highlights.map((highlight) => highlight.tap$))
212
+ )
213
+ );
170
214
  highlights$.subscribe();
171
215
  }
172
216
  layer;
@@ -178,7 +222,9 @@ class SpineItemHighlights extends DestroyableClass {
178
222
  this.highlights.forEach((highlight) => highlight.render());
179
223
  }
180
224
  getHighlightsForTarget(target) {
181
- return this.highlights.filter((highlight) => target instanceof Node && highlight.isWithinTarget(target));
225
+ return this.highlights.filter(
226
+ (highlight) => target instanceof Node && highlight.isWithinTarget(target)
227
+ );
182
228
  }
183
229
  destroy() {
184
230
  super.destroy();
@@ -192,20 +238,39 @@ class ReaderHighlights extends DestroyableClass {
192
238
  this.reader = reader;
193
239
  this.highlights = highlights;
194
240
  this.selectedHighlight = selectedHighlight;
195
- this.reader.hookManager.register("item.onDocumentLoad", ({ itemId, destroy }) => {
196
- const spineItem = reader.spineItemsManager.get(itemId);
197
- if (!spineItem) return;
198
- const spineItemHighlights$ = this.highlights.pipe(
199
- map((highlights2) => highlights2.filter((highlight) => highlight.itemIndex === spineItem.item.index))
200
- );
201
- const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader, this.selectedHighlight);
202
- this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights]);
203
- destroy(() => {
204
- this.spineItemHighlights.next(this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights));
205
- spineItemHighlights.destroy();
206
- });
207
- });
208
- this.tap$ = this.spineItemHighlights.pipe(switchMap((layers) => merge(...layers.map((layer) => layer.tap$))));
241
+ this.reader.hookManager.register(
242
+ "item.onDocumentLoad",
243
+ ({ itemId, destroy }) => {
244
+ const spineItem = reader.spineItemsManager.get(itemId);
245
+ if (!spineItem) return;
246
+ const spineItemHighlights$ = this.highlights.pipe(
247
+ map(
248
+ (highlights2) => highlights2.filter(
249
+ (highlight) => highlight.itemIndex === spineItem.item.index
250
+ )
251
+ )
252
+ );
253
+ const spineItemHighlights = new SpineItemHighlights(
254
+ spineItemHighlights$,
255
+ spineItem,
256
+ reader,
257
+ this.selectedHighlight
258
+ );
259
+ this.spineItemHighlights.next([
260
+ ...this.spineItemHighlights.getValue(),
261
+ spineItemHighlights
262
+ ]);
263
+ destroy(() => {
264
+ this.spineItemHighlights.next(
265
+ this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights)
266
+ );
267
+ spineItemHighlights.destroy();
268
+ });
269
+ }
270
+ );
271
+ this.tap$ = this.spineItemHighlights.pipe(
272
+ switchMap((layers) => merge(...layers.map((layer) => layer.tap$)))
273
+ );
209
274
  }
210
275
  spineItemHighlights = new BehaviorSubject([]);
211
276
  tap$;
@@ -222,11 +287,21 @@ class ReaderHighlights extends DestroyableClass {
222
287
 
223
288
  class Commands extends DestroyableClass {
224
289
  commandSubject = new Subject();
225
- highlight$ = this.commandSubject.pipe(filter((command) => command.type === "highlight"));
226
- add$ = this.commandSubject.pipe(filter((command) => command.type === "add"));
227
- delete$ = this.commandSubject.pipe(filter((command) => command.type === "delete"));
228
- update$ = this.commandSubject.pipe(filter((command) => command.type === "update"));
229
- select$ = this.commandSubject.pipe(filter((command) => command.type === "select"));
290
+ highlight$ = this.commandSubject.pipe(
291
+ filter((command) => command.type === "highlight")
292
+ );
293
+ add$ = this.commandSubject.pipe(
294
+ filter((command) => command.type === "add")
295
+ );
296
+ delete$ = this.commandSubject.pipe(
297
+ filter((command) => command.type === "delete")
298
+ );
299
+ update$ = this.commandSubject.pipe(
300
+ filter((command) => command.type === "update")
301
+ );
302
+ select$ = this.commandSubject.pipe(
303
+ filter((command) => command.type === "select")
304
+ );
230
305
  highlight = (params) => {
231
306
  this.commandSubject.next({ type: "highlight", data: params });
232
307
  };
@@ -294,7 +369,9 @@ const consolidate = (highlight, reader) => {
294
369
  withLatestFrom(spineItem.isReady$),
295
370
  tap(([, isItemReady]) => {
296
371
  const startCfi = reader.cfi.resolveCfi({ cfi: highlight.cfi ?? "" });
297
- const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.endCfi ?? "" });
372
+ const resolvedFocusCfi = reader.cfi.resolveCfi({
373
+ cfi: highlight.endCfi ?? ""
374
+ });
298
375
  if (startCfi?.node && resolvedFocusCfi?.node && isItemReady) {
299
376
  const range = startCfi?.node.ownerDocument?.createRange();
300
377
  range?.setStart(startCfi?.node, startCfi.offset ?? 0);
@@ -302,7 +379,7 @@ const consolidate = (highlight, reader) => {
302
379
  highlight.range = range;
303
380
  highlight.selectionAsText = range?.toString();
304
381
  } else {
305
- highlight.range = void 0;
382
+ highlight.range = undefined;
306
383
  }
307
384
  }),
308
385
  map(() => highlight)
@@ -313,15 +390,24 @@ const annotationsEnhancer = (next) => (options) => {
313
390
  const reader = next(options);
314
391
  const commands = new Commands();
315
392
  const highlightsSubject = new BehaviorSubject([]);
316
- const selectedHighlightSubject = new BehaviorSubject(void 0);
393
+ const selectedHighlightSubject = new BehaviorSubject(
394
+ undefined
395
+ );
317
396
  const highlights$ = highlightsSubject.asObservable().pipe(distinctUntilChanged());
318
- const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject);
397
+ const readerHighlights = new ReaderHighlights(
398
+ reader,
399
+ highlightsSubject,
400
+ selectedHighlightSubject
401
+ );
319
402
  const highlighted$ = commands.highlight$.pipe(
320
403
  map(({ data: { itemIndex, selection, ...rest } }) => {
321
404
  const spineItem = reader.spineItemsManager.get(itemIndex);
322
- if (!spineItem) return void 0;
323
- const range = reader.selection.createOrderedRangeFromSelection({ selection, spineItem });
324
- if (!range) return void 0;
405
+ if (!spineItem) return undefined;
406
+ const range = reader.selection.createOrderedRangeFromSelection({
407
+ selection,
408
+ spineItem
409
+ });
410
+ if (!range) return undefined;
325
411
  const { start: startCfi, end: endCfi } = reader.cfi.generateCfiFromRange(range, spineItem.item);
326
412
  const highlight = new Highlight({
327
413
  cfi: startCfi,
@@ -344,12 +430,17 @@ const annotationsEnhancer = (next) => (options) => {
344
430
  const highlight = new Highlight({ ...annotation, itemIndex });
345
431
  return highlight;
346
432
  });
347
- highlightsSubject.next([...highlightsSubject.getValue(), ...addedHighlights]);
433
+ highlightsSubject.next([
434
+ ...highlightsSubject.getValue(),
435
+ ...addedHighlights
436
+ ]);
348
437
  })
349
438
  );
350
439
  const delete$ = commands.delete$.pipe(
351
440
  tap(({ id }) => {
352
- highlightsSubject.next(highlightsSubject.getValue().filter((highlight) => highlight.id !== id));
441
+ highlightsSubject.next(
442
+ highlightsSubject.getValue().filter((highlight) => highlight.id !== id)
443
+ );
353
444
  })
354
445
  );
355
446
  const update$ = commands.update$.pipe(
@@ -369,7 +460,13 @@ const annotationsEnhancer = (next) => (options) => {
369
460
  const highlightsConsolidation$ = merge(highlighted$, reader.layout$).pipe(
370
461
  debounceTime(50),
371
462
  withLatestFrom(highlights$),
372
- mergeMap(() => forkJoin(highlightsSubject.value.map((highlight) => consolidate(highlight, reader)))),
463
+ mergeMap(
464
+ () => forkJoin(
465
+ highlightsSubject.value.map(
466
+ (highlight) => consolidate(highlight, reader)
467
+ )
468
+ )
469
+ ),
373
470
  tap((consolidatedHighlights) => {
374
471
  const consolidatedExistingHighlights = highlightsSubject.value.map(
375
472
  (highlight) => consolidatedHighlights.find((c) => c.id === highlight.id) ?? highlight
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../shared/dist/index.js","../src/report.ts","../src/highlights/utils.ts","../src/highlights/SpineItemHighlight.ts","../src/highlights/SpineItemHighlights.ts","../src/highlights/ReaderHighlights.ts","../src/Commands.ts","../src/highlights/Highlight.ts","../src/highlights/consolidate.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["const f = (e) => {\n var n, t;\n return ((t = (n = e.split(/[#?]/)[0]) == null ? void 0 : n.split(\".\").pop()) == null ? void 0 : t.trim()) || \"\";\n};\nfunction a(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + e[0]);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + l);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), n.push(l));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction d(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return a(n);\n}\nfunction R(e) {\n const n = e.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst g = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n }\n}, w = ({ mimeType: e, uri: n }) => {\n const t = e ?? g(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, _ = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, m = \"prose-reader-resource-error\", E = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, O = (e, n, t) => {\n if (e === n)\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), r = Object.keys(n);\n if (o.length !== r.length)\n return !1;\n const l = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!E.call(n, u) || !l(e[u], n[u]))\n return !1;\n }\n return !0;\n}, y = (e, n) => e.reduce(\n (t, o) => {\n const r = n(o);\n return t[r] || (t[r] = []), t[r].push(o), t;\n },\n {}\n);\nfunction $(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const r = n[o];\n (r !== void 0 || !(o in e)) && (t[o] = r);\n }\n return t;\n}\nconst c = \"@prose-reader\", i = (e) => `[${e}]`, p = (e, n) => ({\n debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.debug, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.debug, console, i(`${c}`)),\n info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.info, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.info, console, i(`${c}`)),\n error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.error, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.error, console, i(`${c}`))\n}), x = {\n ...p(),\n namespace: (e, n) => p(e, n)\n}, D = (e, n) => e === n ? !0 : e.length !== n.length ? !1 : e.every((t, o) => t === n[o]);\nexport {\n m as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n x as Report,\n D as arrayEqual,\n g as detectMimeTypeFromName,\n R as getParentPath,\n f as getUrlExtension,\n y as groupBy,\n h as is,\n O as isShallowEqual,\n w as isXmlBasedMimeType,\n _ as parseContentType,\n $ as shallowMergeIfDefined,\n d as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(`enhancer-annotations`, IS_DEBUG_ENABLED)\n","export const createElementForRange = (range: Range, container: HTMLElement, color: string) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (container: HTMLElement, layer: HTMLElement) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (layer: HTMLElement, annotationLayer: HTMLElement) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n annotationLayer.style.position = \"absolute\"\n annotationLayer.style.top = \"0\"\n }\n\n // annotationLayer.style.backgroundColor = \"red\"\n annotationLayer.style.opacity = \"1\"\n annotationLayer.style.pointerEvents = \"none\"\n}\n","import { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { createElementForRange } from \"./utils\"\nimport { fromEvent, map, Observable, share, skip, takeUntil, tap } from \"rxjs\"\nimport { Highlight } from \"./Highlight\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n\n public readonly tap$: Observable<{ event: Event; highlight: Highlight }>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: Highlight,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n void this.reader\n\n this.container = this.containerElement.ownerDocument.createElement(\"div\")\n this.container.dataset[\"highlightContainer\"] = this.highlight.id\n this.containerElement.appendChild(this.container)\n\n this.tap$ = fromEvent(this.container, \"click\").pipe(\n map((event) => ({ event, highlight: this.highlight })),\n share(),\n )\n\n this.render()\n\n this.isSelected\n .pipe(\n skip(1),\n tap((isSelected) => {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n child.style.border = isSelected ? \"3px dashed red\" : \"3px dashed transparent\"\n }\n })\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n public render() {\n this.container.innerHTML = \"\"\n\n const range = this.highlight.range\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(range, this.container, this.highlight.color ?? \"yellow\")\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset[\"highlightRect\"] = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.contents?.length) {\n const noteIcon = document.createElement(\"span\")\n noteIcon.textContent = \"📝\"\n noteIcon.style.position = \"absolute\"\n noteIcon.style.top = \"0\"\n noteIcon.style.left = \"0\"\n noteIcon.style.transform = \"translate(-0%, -80%)\"\n noteIcon.style.fontSize = \"18px\"\n noteIcon.style.opacity = \"50%\"\n firstElement.appendChild(noteIcon)\n }\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import { distinctUntilChanged, map, merge, Observable, of, shareReplay, switchMap, takeUntil } from \"rxjs\"\nimport { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\nimport { Highlight } from \"./Highlight\"\n\nexport class SpineItemHighlights extends DestroyableClass {\n private layer: HTMLElement\n private highlights: SpineItemHighlight[] = []\n\n public readonly tap$: SpineItemHighlight[\"tap$\"]\n\n constructor(\n private highlights$: Observable<Highlight[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement)\n\n const itemHighlights$ = this.highlights$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => highlight.destroy())\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation, isSelected$)\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = itemHighlights$.pipe(switchMap((highlights) => merge(...highlights.map((highlight) => highlight.tap$))))\n\n highlights$.subscribe()\n }\n\n layout() {\n const firstLayerElement = this.spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n this.highlights.forEach((highlight) => highlight.render())\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter((highlight) => target instanceof Node && highlight.isWithinTarget(target))\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, map, merge, switchMap } from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport { Highlight } from \"./Highlight\"\n\nexport class ReaderHighlights extends DestroyableClass {\n private spineItemHighlights = new BehaviorSubject<SpineItemHighlights[]>([])\n\n public tap$: SpineItemHighlights[\"tap$\"]\n\n constructor(\n private reader: Reader,\n private highlights: BehaviorSubject<Highlight[]>,\n private selectedHighlight: BehaviorSubject<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\"item.onDocumentLoad\", ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) => highlights.filter((highlight) => highlight.itemIndex === spineItem.item.index)),\n )\n\n const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader, this.selectedHighlight)\n\n this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights])\n\n destroy(() => {\n this.spineItemHighlights.next(this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights))\n\n spineItemHighlights.destroy()\n })\n })\n\n this.tap$ = this.spineItemHighlights.pipe(switchMap((layers) => merge(...layers.map((layer) => layer.tap$))))\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n\n public layout() {\n this.spineItemHighlights.value.forEach((item) => item.layout())\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport { SerializableHighlight } from \"./types\"\n\ntype HighlightParams = { selection: Selection; itemIndex: number; color?: string; contents?: string[] }\n\ntype Command =\n | { type: \"highlight\"; data: HighlightParams }\n | { type: \"add\"; data: SerializableHighlight | SerializableHighlight[] }\n | { type: \"delete\"; id: string }\n | { type: \"update\"; id: string; data: Pick<HighlightParams, \"color\" | \"contents\"> }\n | { type: \"select\"; id: string | undefined }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly highlight$ = this.commandSubject.pipe(filter((command) => command.type === \"highlight\"))\n public readonly add$ = this.commandSubject.pipe(filter((command) => command.type === \"add\"))\n public readonly delete$ = this.commandSubject.pipe(filter((command) => command.type === \"delete\"))\n public readonly update$ = this.commandSubject.pipe(filter((command) => command.type === \"update\"))\n public readonly select$ = this.commandSubject.pipe(filter((command) => command.type === \"select\"))\n\n highlight = (params: HighlightParams) => {\n this.commandSubject.next({ type: \"highlight\", data: params })\n }\n\n add = (data: SerializableHighlight | SerializableHighlight[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (id: string, data: Pick<HighlightParams, \"color\" | \"contents\">) => {\n this.commandSubject.next({ type: \"update\", id, data })\n }\n\n select = (id: string | undefined) => {\n this.commandSubject.next({ type: \"select\", id })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","import { Commands } from \"../Commands\"\nimport { SerializableHighlight } from \"../types\"\n\nexport class Highlight {\n public cfi: string\n public endCfi: string | undefined\n public itemIndex?: number\n public color?: string\n public contents?: string[]\n public range?: Range\n public selectionAsText?: string\n /**\n * Unique local ID. This is to ensure unicity\n * for duplicate selections\n */\n public id: string\n\n constructor(params: SerializableHighlight & { itemIndex?: number }) {\n this.cfi = params.cfi\n this.endCfi = params.endCfi\n this.itemIndex = params.itemIndex\n this.color = params.color\n this.contents = params.contents\n this.id = params.id\n this.selectionAsText = params.selectionAsText\n }\n\n update(params: Parameters<Commands[\"update\"]>[1]) {\n Object.assign(this, params)\n\n return this\n }\n\n toJSON(): SerializableHighlight {\n return {\n cfi: this.cfi,\n endCfi: this.endCfi,\n color: this.color,\n contents: this.contents,\n id: this.id,\n selectionAsText: this.selectionAsText,\n }\n }\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { Highlight } from \"./Highlight\"\nimport { map, of, tap, withLatestFrom } from \"rxjs\"\n\nexport const consolidate = (highlight: Highlight, reader: Reader) => {\n const { itemIndex } = reader.cfi.parseCfi(highlight.cfi ?? \"\")\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return of(highlight)\n\n return of(highlight).pipe(\n withLatestFrom(spineItem.isReady$),\n tap(([, isItemReady]) => {\n const startCfi = reader.cfi.resolveCfi({ cfi: highlight.cfi ?? \"\" })\n const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.endCfi ?? \"\" })\n\n if (startCfi?.node && resolvedFocusCfi?.node && isItemReady) {\n const range = startCfi?.node.ownerDocument?.createRange()\n range?.setStart(startCfi?.node, startCfi.offset ?? 0)\n range?.setEnd(resolvedFocusCfi?.node, resolvedFocusCfi.offset ?? 0)\n\n highlight.range = range\n highlight.selectionAsText = range?.toString()\n } else {\n highlight.range = undefined\n }\n }),\n map(() => highlight),\n )\n}\n","import { Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n merge,\n takeUntil,\n tap,\n Observable,\n debounceTime,\n filter,\n mergeMap,\n map,\n share,\n distinctUntilChanged,\n withLatestFrom,\n forkJoin,\n} from \"rxjs\"\nimport { report } from \"./report\"\nimport { ReaderHighlights } from \"./highlights/ReaderHighlights\"\nimport { Commands } from \"./Commands\"\nimport { Highlight } from \"./highlights/Highlight\"\nimport { consolidate } from \"./highlights/consolidate\"\nimport { isDefined } from \"reactjrx\"\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\n (\n options: InheritOptions,\n ): InheritOutput & {\n annotations: {\n highlights$: Observable<Highlight[]>\n highlightTap$: ReaderHighlights[\"tap$\"]\n highlight: Commands[\"highlight\"]\n add: Commands[\"add\"]\n delete: Commands[\"delete\"]\n update: Commands[\"update\"]\n select: Commands[\"select\"]\n isTargetWithinHighlight: (target: EventTarget) => boolean\n }\n } => {\n const reader = next(options)\n const commands = new Commands()\n const highlightsSubject = new BehaviorSubject<Highlight[]>([])\n const selectedHighlightSubject = new BehaviorSubject<string | undefined>(undefined)\n\n const highlights$ = highlightsSubject.asObservable().pipe(distinctUntilChanged())\n\n const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject)\n\n const highlighted$ = commands.highlight$.pipe(\n map(({ data: { itemIndex, selection, ...rest } }) => {\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return undefined\n\n const range = reader.selection.createOrderedRangeFromSelection({ selection, spineItem })\n\n if (!range) return undefined\n\n const { start: startCfi, end: endCfi } = reader.cfi.generateCfiFromRange(range, spineItem.item)\n\n const highlight = new Highlight({\n cfi: startCfi,\n endCfi,\n itemIndex,\n id: window.crypto.randomUUID(),\n ...rest,\n })\n\n highlightsSubject.next([...highlightsSubject.getValue(), highlight])\n\n return [highlight.id]\n }),\n filter(isDefined),\n share(),\n )\n\n const add$ = commands.add$.pipe(\n map(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n const addedHighlights = annotations.map((annotation) => {\n const { itemIndex } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = new Highlight({ ...annotation, itemIndex })\n\n return highlight\n })\n\n highlightsSubject.next([...highlightsSubject.getValue(), ...addedHighlights])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n highlightsSubject.next(highlightsSubject.getValue().filter((highlight) => highlight.id !== id))\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n highlightsSubject.next(\n highlightsSubject.getValue().map((highlight) => {\n return highlight.id === id ? highlight.update(data) : highlight\n }),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const highlightsConsolidation$ = merge(highlighted$, reader.layout$).pipe(\n debounceTime(50),\n withLatestFrom(highlights$),\n mergeMap(() => forkJoin(highlightsSubject.value.map((highlight) => consolidate(highlight, reader)))),\n tap((consolidatedHighlights) => {\n const consolidatedExistingHighlights = highlightsSubject.value.map(\n (highlight) => consolidatedHighlights.find((c) => c.id === highlight.id) ?? highlight,\n )\n\n highlightsSubject.next(consolidatedExistingHighlights)\n\n readerHighlights.layout()\n }),\n )\n\n merge(\n highlighted$,\n add$,\n delete$,\n update$,\n select$,\n highlightsConsolidation$,\n highlights$.pipe(\n tap((annotations) => {\n report.debug(\"highlights\", annotations)\n }),\n ),\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n highlightsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n highlights$,\n highlightTap$: readerHighlights.tap$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n highlight: commands.highlight,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n select: commands.select,\n },\n }\n }\n"],"names":["Report","isSelected","highlights"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../shared/dist/index.js","../src/report.ts","../src/highlights/utils.ts","../src/highlights/SpineItemHighlight.ts","../src/highlights/SpineItemHighlights.ts","../src/highlights/ReaderHighlights.ts","../src/Commands.ts","../src/highlights/Highlight.ts","../src/highlights/consolidate.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["const f = (e) => {\n var n, t;\n return ((t = (n = e.split(/[#?]/)[0]) == null ? void 0 : n.split(\".\").pop()) == null ? void 0 : t.trim()) || \"\";\n};\nfunction a(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(`Url must be a string. Received ${l}`);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), n.push(l));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction d(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return a(n);\n}\nfunction R(e) {\n const n = e.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst g = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n }\n}, w = ({\n mimeType: e,\n uri: n\n}) => {\n const t = e ?? g(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, _ = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, m = \"prose-reader-resource-error\", E = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, O = (e, n, t) => {\n if (e === n)\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), r = Object.keys(n);\n if (o.length !== r.length)\n return !1;\n const l = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!E.call(n, u) || !l(e[u], n[u]))\n return !1;\n }\n return !0;\n}, y = (e, n) => e.reduce(\n (t, o) => {\n const r = n(o);\n return t[r] || (t[r] = []), t[r].push(o), t;\n },\n {}\n);\nfunction $(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const r = n[o];\n (r !== void 0 || !(o in e)) && (t[o] = r);\n }\n return t;\n}\nconst c = \"@prose-reader\", i = (e) => `[${e}]`, p = (e, n) => ({\n debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(\n console.debug,\n console,\n i(`${c}`),\n i(e)\n ) : Function.prototype.bind.call(\n console.debug,\n console,\n i(`${c}`)\n ),\n info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(\n console.info,\n console,\n i(`${c}`),\n i(e)\n ) : Function.prototype.bind.call(\n console.info,\n console,\n i(`${c}`)\n ),\n error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(\n console.error,\n console,\n i(`${c}`),\n i(e)\n ) : Function.prototype.bind.call(\n console.error,\n console,\n i(`${c}`)\n )\n}), x = {\n ...p(),\n namespace: (e, n) => p(e, n)\n}, D = (e, n) => e === n ? !0 : e.length !== n.length ? !1 : e.every((t, o) => t === n[o]);\nexport {\n m as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n x as Report,\n D as arrayEqual,\n g as detectMimeTypeFromName,\n R as getParentPath,\n f as getUrlExtension,\n y as groupBy,\n h as is,\n O as isShallowEqual,\n w as isXmlBasedMimeType,\n _ as parseContentType,\n $ as shallowMergeIfDefined,\n d as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(`enhancer-annotations`, IS_DEBUG_ENABLED)\n","export const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n annotationLayer.style.position = \"absolute\"\n annotationLayer.style.top = \"0\"\n }\n\n // annotationLayer.style.backgroundColor = \"red\"\n annotationLayer.style.opacity = \"1\"\n annotationLayer.style.pointerEvents = \"none\"\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport { createElementForRange } from \"./utils\"\nimport {\n fromEvent,\n map,\n type Observable,\n share,\n skip,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport type { Highlight } from \"./Highlight\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n\n public readonly tap$: Observable<{ event: Event; highlight: Highlight }>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: Highlight,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n void this.reader\n\n this.container = this.containerElement.ownerDocument.createElement(\"div\")\n this.container.dataset.highlightContainer = this.highlight.id\n this.containerElement.appendChild(this.container)\n\n this.tap$ = fromEvent(this.container, \"click\").pipe(\n map((event) => ({ event, highlight: this.highlight })),\n share(),\n )\n\n this.render()\n\n this.isSelected\n .pipe(\n skip(1),\n tap((isSelected) => {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n child.style.border = isSelected\n ? \"3px dashed red\"\n : \"3px dashed transparent\"\n }\n })\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n public render() {\n this.container.innerHTML = \"\"\n\n const range = this.highlight.range\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.color ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.contents?.length) {\n const noteIcon = document.createElement(\"span\")\n noteIcon.textContent = \"📝\"\n noteIcon.style.position = \"absolute\"\n noteIcon.style.top = \"0\"\n noteIcon.style.left = \"0\"\n noteIcon.style.transform = \"translate(-0%, -80%)\"\n noteIcon.style.fontSize = \"18px\"\n noteIcon.style.opacity = \"50%\"\n firstElement.appendChild(noteIcon)\n }\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import {\n distinctUntilChanged,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\nimport type { Highlight } from \"./Highlight\"\n\nexport class SpineItemHighlights extends DestroyableClass {\n private layer: HTMLElement\n private highlights: SpineItemHighlight[] = []\n\n public readonly tap$: SpineItemHighlight[\"tap$\"]\n\n constructor(\n private highlights$: Observable<Highlight[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.highlights$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => highlight.destroy())\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n highlights$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.layers[0]?.element ??\n document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n this.highlights.forEach((highlight) => highlight.render())\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, map, merge, switchMap } from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { Highlight } from \"./Highlight\"\n\nexport class ReaderHighlights extends DestroyableClass {\n private spineItemHighlights = new BehaviorSubject<SpineItemHighlights[]>([])\n\n public tap$: SpineItemHighlights[\"tap$\"]\n\n constructor(\n private reader: Reader,\n private highlights: BehaviorSubject<Highlight[]>,\n private selectedHighlight: BehaviorSubject<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n destroy(() => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n })\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n\n public layout() {\n this.spineItemHighlights.value.forEach((item) => item.layout())\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport type { SerializableHighlight } from \"./types\"\n\ntype HighlightParams = {\n selection: Selection\n itemIndex: number\n color?: string\n contents?: string[]\n}\n\ntype Command =\n | { type: \"highlight\"; data: HighlightParams }\n | { type: \"add\"; data: SerializableHighlight | SerializableHighlight[] }\n | { type: \"delete\"; id: string }\n | {\n type: \"update\"\n id: string\n data: Pick<HighlightParams, \"color\" | \"contents\">\n }\n | { type: \"select\"; id: string | undefined }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly highlight$ = this.commandSubject.pipe(\n filter((command) => command.type === \"highlight\"),\n )\n public readonly add$ = this.commandSubject.pipe(\n filter((command) => command.type === \"add\"),\n )\n public readonly delete$ = this.commandSubject.pipe(\n filter((command) => command.type === \"delete\"),\n )\n public readonly update$ = this.commandSubject.pipe(\n filter((command) => command.type === \"update\"),\n )\n public readonly select$ = this.commandSubject.pipe(\n filter((command) => command.type === \"select\"),\n )\n\n highlight = (params: HighlightParams) => {\n this.commandSubject.next({ type: \"highlight\", data: params })\n }\n\n add = (data: SerializableHighlight | SerializableHighlight[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (id: string, data: Pick<HighlightParams, \"color\" | \"contents\">) => {\n this.commandSubject.next({ type: \"update\", id, data })\n }\n\n select = (id: string | undefined) => {\n this.commandSubject.next({ type: \"select\", id })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","import type { Commands } from \"../Commands\"\nimport type { SerializableHighlight } from \"../types\"\n\nexport class Highlight {\n public cfi: string\n public endCfi: string | undefined\n public itemIndex?: number\n public color?: string\n public contents?: string[]\n public range?: Range\n public selectionAsText?: string\n /**\n * Unique local ID. This is to ensure unicity\n * for duplicate selections\n */\n public id: string\n\n constructor(params: SerializableHighlight & { itemIndex?: number }) {\n this.cfi = params.cfi\n this.endCfi = params.endCfi\n this.itemIndex = params.itemIndex\n this.color = params.color\n this.contents = params.contents\n this.id = params.id\n this.selectionAsText = params.selectionAsText\n }\n\n update(params: Parameters<Commands[\"update\"]>[1]) {\n Object.assign(this, params)\n\n return this\n }\n\n toJSON(): SerializableHighlight {\n return {\n cfi: this.cfi,\n endCfi: this.endCfi,\n color: this.color,\n contents: this.contents,\n id: this.id,\n selectionAsText: this.selectionAsText,\n }\n }\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { Highlight } from \"./Highlight\"\nimport { map, of, tap, withLatestFrom } from \"rxjs\"\n\nexport const consolidate = (highlight: Highlight, reader: Reader) => {\n const { itemIndex } = reader.cfi.parseCfi(highlight.cfi ?? \"\")\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return of(highlight)\n\n return of(highlight).pipe(\n withLatestFrom(spineItem.isReady$),\n tap(([, isItemReady]) => {\n const startCfi = reader.cfi.resolveCfi({ cfi: highlight.cfi ?? \"\" })\n const resolvedFocusCfi = reader.cfi.resolveCfi({\n cfi: highlight.endCfi ?? \"\",\n })\n\n if (startCfi?.node && resolvedFocusCfi?.node && isItemReady) {\n const range = startCfi?.node.ownerDocument?.createRange()\n range?.setStart(startCfi?.node, startCfi.offset ?? 0)\n range?.setEnd(resolvedFocusCfi?.node, resolvedFocusCfi.offset ?? 0)\n\n highlight.range = range\n highlight.selectionAsText = range?.toString()\n } else {\n highlight.range = undefined\n }\n }),\n map(() => highlight),\n )\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n merge,\n takeUntil,\n tap,\n type Observable,\n debounceTime,\n filter,\n mergeMap,\n map,\n share,\n distinctUntilChanged,\n withLatestFrom,\n forkJoin,\n} from \"rxjs\"\nimport { report } from \"./report\"\nimport { ReaderHighlights } from \"./highlights/ReaderHighlights\"\nimport { Commands } from \"./Commands\"\nimport { Highlight } from \"./highlights/Highlight\"\nimport { consolidate } from \"./highlights/consolidate\"\nimport { isDefined } from \"reactjrx\"\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions,\n ): InheritOutput & {\n annotations: {\n highlights$: Observable<Highlight[]>\n highlightTap$: ReaderHighlights[\"tap$\"]\n highlight: Commands[\"highlight\"]\n add: Commands[\"add\"]\n delete: Commands[\"delete\"]\n update: Commands[\"update\"]\n select: Commands[\"select\"]\n isTargetWithinHighlight: (target: EventTarget) => boolean\n }\n } => {\n const reader = next(options)\n const commands = new Commands()\n const highlightsSubject = new BehaviorSubject<Highlight[]>([])\n const selectedHighlightSubject = new BehaviorSubject<string | undefined>(\n undefined,\n )\n\n const highlights$ = highlightsSubject\n .asObservable()\n .pipe(distinctUntilChanged())\n\n const readerHighlights = new ReaderHighlights(\n reader,\n highlightsSubject,\n selectedHighlightSubject,\n )\n\n const highlighted$ = commands.highlight$.pipe(\n map(({ data: { itemIndex, selection, ...rest } }) => {\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return undefined\n\n const range = reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n\n if (!range) return undefined\n\n const { start: startCfi, end: endCfi } =\n reader.cfi.generateCfiFromRange(range, spineItem.item)\n\n const highlight = new Highlight({\n cfi: startCfi,\n endCfi,\n itemIndex,\n id: window.crypto.randomUUID(),\n ...rest,\n })\n\n highlightsSubject.next([...highlightsSubject.getValue(), highlight])\n\n return [highlight.id]\n }),\n filter(isDefined),\n share(),\n )\n\n const add$ = commands.add$.pipe(\n map(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n const addedHighlights = annotations.map((annotation) => {\n const { itemIndex } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = new Highlight({ ...annotation, itemIndex })\n\n return highlight\n })\n\n highlightsSubject.next([\n ...highlightsSubject.getValue(),\n ...addedHighlights,\n ])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n highlightsSubject.next(\n highlightsSubject\n .getValue()\n .filter((highlight) => highlight.id !== id),\n )\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n highlightsSubject.next(\n highlightsSubject.getValue().map((highlight) => {\n return highlight.id === id ? highlight.update(data) : highlight\n }),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const highlightsConsolidation$ = merge(highlighted$, reader.layout$).pipe(\n debounceTime(50),\n withLatestFrom(highlights$),\n mergeMap(() =>\n forkJoin(\n highlightsSubject.value.map((highlight) =>\n consolidate(highlight, reader),\n ),\n ),\n ),\n tap((consolidatedHighlights) => {\n const consolidatedExistingHighlights = highlightsSubject.value.map(\n (highlight) =>\n consolidatedHighlights.find((c) => c.id === highlight.id) ??\n highlight,\n )\n\n highlightsSubject.next(consolidatedExistingHighlights)\n\n readerHighlights.layout()\n }),\n )\n\n merge(\n highlighted$,\n add$,\n delete$,\n update$,\n select$,\n highlightsConsolidation$,\n highlights$.pipe(\n tap((annotations) => {\n report.debug(\"highlights\", annotations)\n }),\n ),\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n highlightsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n highlights$,\n highlightTap$: readerHighlights.tap$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n highlight: commands.highlight,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n select: commands.select,\n },\n }\n }\n"],"names":["Report","isSelected","highlights"],"mappings":"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"}
@@ -5,12 +5,39 @@
5
5
  })(this, (function (exports, rxjs, core, reactjrx) { 'use strict';
6
6
 
7
7
  const c = "@prose-reader", i = (e) => `[${e}]`, p = (e, n) => ({
8
- debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {
9
- } : e ? Function.prototype.bind.call(console.debug, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.debug, console, i(`${c}`)),
10
- info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {
11
- } : e ? Function.prototype.bind.call(console.info, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.info, console, i(`${c}`)),
12
- error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {
13
- } : e ? Function.prototype.bind.call(console.error, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.error, console, i(`${c}`))
8
+ debug: !n || (window == null ? undefined : window.__PROSE_READER_DEBUG) !== true ? () => {
9
+ } : e ? Function.prototype.bind.call(
10
+ console.debug,
11
+ console,
12
+ i(`${c}`),
13
+ i(e)
14
+ ) : Function.prototype.bind.call(
15
+ console.debug,
16
+ console,
17
+ i(`${c}`)
18
+ ),
19
+ info: !n || (window == null ? undefined : window.__PROSE_READER_DEBUG) !== true ? () => {
20
+ } : e ? Function.prototype.bind.call(
21
+ console.info,
22
+ console,
23
+ i(`${c}`),
24
+ i(e)
25
+ ) : Function.prototype.bind.call(
26
+ console.info,
27
+ console,
28
+ i(`${c}`)
29
+ ),
30
+ error: !n || (window == null ? undefined : window.__PROSE_READER_DEBUG) !== true ? () => {
31
+ } : e ? Function.prototype.bind.call(
32
+ console.error,
33
+ console,
34
+ i(`${c}`),
35
+ i(e)
36
+ ) : Function.prototype.bind.call(
37
+ console.error,
38
+ console,
39
+ i(`${c}`)
40
+ )
14
41
  }), x = {
15
42
  ...p(),
16
43
  namespace: (e, n) => p(e, n)
@@ -85,7 +112,7 @@
85
112
  void this.spineItem;
86
113
  void this.reader;
87
114
  this.container = this.containerElement.ownerDocument.createElement("div");
88
- this.container.dataset["highlightContainer"] = this.highlight.id;
115
+ this.container.dataset.highlightContainer = this.highlight.id;
89
116
  this.containerElement.appendChild(this.container);
90
117
  this.tap$ = rxjs.fromEvent(this.container, "click").pipe(
91
118
  rxjs.map((event) => ({ event, highlight: this.highlight })),
@@ -112,11 +139,15 @@
112
139
  if (!range) {
113
140
  return;
114
141
  }
115
- const rectElements = createElementForRange(range, this.container, this.highlight.color ?? "yellow");
142
+ const rectElements = createElementForRange(
143
+ range,
144
+ this.container,
145
+ this.highlight.color ?? "yellow"
146
+ );
116
147
  rectElements.forEach((elt) => {
117
148
  elt.style.pointerEvents = "initial";
118
149
  elt.style.cursor = "pointer";
119
- elt.dataset["highlightRect"] = this.highlight.id;
150
+ elt.dataset.highlightRect = this.highlight.id;
120
151
  this.container.appendChild(elt);
121
152
  });
122
153
  const firstElement = rectElements[0];
@@ -149,7 +180,10 @@
149
180
  this.reader = reader;
150
181
  this.selectedHighlight = selectedHighlight;
151
182
  const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement("div");
152
- this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement);
183
+ this.layer = createAnnotationLayer(
184
+ this.spineItem.containerElement,
185
+ firstLayerElement
186
+ );
153
187
  const itemHighlights$ = this.highlights$.pipe(
154
188
  rxjs.switchMap((annotations) => {
155
189
  this.highlights.forEach((highlight) => highlight.destroy());
@@ -160,7 +194,13 @@
160
194
  rxjs.map((id) => id === annotation.id),
161
195
  rxjs.distinctUntilChanged()
162
196
  );
163
- const spineItemHighlight = new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation, isSelected$);
197
+ const spineItemHighlight = new SpineItemHighlight(
198
+ this.spineItem,
199
+ this.layer,
200
+ this.reader,
201
+ annotation,
202
+ isSelected$
203
+ );
164
204
  this.highlights.push(spineItemHighlight);
165
205
  });
166
206
  return rxjs.of(this.highlights);
@@ -168,7 +208,11 @@
168
208
  rxjs.shareReplay(1),
169
209
  rxjs.takeUntil(this.destroy$)
170
210
  );
171
- this.tap$ = itemHighlights$.pipe(rxjs.switchMap((highlights) => rxjs.merge(...highlights.map((highlight) => highlight.tap$))));
211
+ this.tap$ = itemHighlights$.pipe(
212
+ rxjs.switchMap(
213
+ (highlights) => rxjs.merge(...highlights.map((highlight) => highlight.tap$))
214
+ )
215
+ );
172
216
  highlights$.subscribe();
173
217
  }
174
218
  layer;
@@ -180,7 +224,9 @@
180
224
  this.highlights.forEach((highlight) => highlight.render());
181
225
  }
182
226
  getHighlightsForTarget(target) {
183
- return this.highlights.filter((highlight) => target instanceof Node && highlight.isWithinTarget(target));
227
+ return this.highlights.filter(
228
+ (highlight) => target instanceof Node && highlight.isWithinTarget(target)
229
+ );
184
230
  }
185
231
  destroy() {
186
232
  super.destroy();
@@ -194,20 +240,39 @@
194
240
  this.reader = reader;
195
241
  this.highlights = highlights;
196
242
  this.selectedHighlight = selectedHighlight;
197
- this.reader.hookManager.register("item.onDocumentLoad", ({ itemId, destroy }) => {
198
- const spineItem = reader.spineItemsManager.get(itemId);
199
- if (!spineItem) return;
200
- const spineItemHighlights$ = this.highlights.pipe(
201
- rxjs.map((highlights2) => highlights2.filter((highlight) => highlight.itemIndex === spineItem.item.index))
202
- );
203
- const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader, this.selectedHighlight);
204
- this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights]);
205
- destroy(() => {
206
- this.spineItemHighlights.next(this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights));
207
- spineItemHighlights.destroy();
208
- });
209
- });
210
- this.tap$ = this.spineItemHighlights.pipe(rxjs.switchMap((layers) => rxjs.merge(...layers.map((layer) => layer.tap$))));
243
+ this.reader.hookManager.register(
244
+ "item.onDocumentLoad",
245
+ ({ itemId, destroy }) => {
246
+ const spineItem = reader.spineItemsManager.get(itemId);
247
+ if (!spineItem) return;
248
+ const spineItemHighlights$ = this.highlights.pipe(
249
+ rxjs.map(
250
+ (highlights2) => highlights2.filter(
251
+ (highlight) => highlight.itemIndex === spineItem.item.index
252
+ )
253
+ )
254
+ );
255
+ const spineItemHighlights = new SpineItemHighlights(
256
+ spineItemHighlights$,
257
+ spineItem,
258
+ reader,
259
+ this.selectedHighlight
260
+ );
261
+ this.spineItemHighlights.next([
262
+ ...this.spineItemHighlights.getValue(),
263
+ spineItemHighlights
264
+ ]);
265
+ destroy(() => {
266
+ this.spineItemHighlights.next(
267
+ this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights)
268
+ );
269
+ spineItemHighlights.destroy();
270
+ });
271
+ }
272
+ );
273
+ this.tap$ = this.spineItemHighlights.pipe(
274
+ rxjs.switchMap((layers) => rxjs.merge(...layers.map((layer) => layer.tap$)))
275
+ );
211
276
  }
212
277
  spineItemHighlights = new rxjs.BehaviorSubject([]);
213
278
  tap$;
@@ -224,11 +289,21 @@
224
289
 
225
290
  class Commands extends core.DestroyableClass {
226
291
  commandSubject = new rxjs.Subject();
227
- highlight$ = this.commandSubject.pipe(rxjs.filter((command) => command.type === "highlight"));
228
- add$ = this.commandSubject.pipe(rxjs.filter((command) => command.type === "add"));
229
- delete$ = this.commandSubject.pipe(rxjs.filter((command) => command.type === "delete"));
230
- update$ = this.commandSubject.pipe(rxjs.filter((command) => command.type === "update"));
231
- select$ = this.commandSubject.pipe(rxjs.filter((command) => command.type === "select"));
292
+ highlight$ = this.commandSubject.pipe(
293
+ rxjs.filter((command) => command.type === "highlight")
294
+ );
295
+ add$ = this.commandSubject.pipe(
296
+ rxjs.filter((command) => command.type === "add")
297
+ );
298
+ delete$ = this.commandSubject.pipe(
299
+ rxjs.filter((command) => command.type === "delete")
300
+ );
301
+ update$ = this.commandSubject.pipe(
302
+ rxjs.filter((command) => command.type === "update")
303
+ );
304
+ select$ = this.commandSubject.pipe(
305
+ rxjs.filter((command) => command.type === "select")
306
+ );
232
307
  highlight = (params) => {
233
308
  this.commandSubject.next({ type: "highlight", data: params });
234
309
  };
@@ -296,7 +371,9 @@
296
371
  rxjs.withLatestFrom(spineItem.isReady$),
297
372
  rxjs.tap(([, isItemReady]) => {
298
373
  const startCfi = reader.cfi.resolveCfi({ cfi: highlight.cfi ?? "" });
299
- const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.endCfi ?? "" });
374
+ const resolvedFocusCfi = reader.cfi.resolveCfi({
375
+ cfi: highlight.endCfi ?? ""
376
+ });
300
377
  if (startCfi?.node && resolvedFocusCfi?.node && isItemReady) {
301
378
  const range = startCfi?.node.ownerDocument?.createRange();
302
379
  range?.setStart(startCfi?.node, startCfi.offset ?? 0);
@@ -304,7 +381,7 @@
304
381
  highlight.range = range;
305
382
  highlight.selectionAsText = range?.toString();
306
383
  } else {
307
- highlight.range = void 0;
384
+ highlight.range = undefined;
308
385
  }
309
386
  }),
310
387
  rxjs.map(() => highlight)
@@ -315,15 +392,24 @@
315
392
  const reader = next(options);
316
393
  const commands = new Commands();
317
394
  const highlightsSubject = new rxjs.BehaviorSubject([]);
318
- const selectedHighlightSubject = new rxjs.BehaviorSubject(void 0);
395
+ const selectedHighlightSubject = new rxjs.BehaviorSubject(
396
+ undefined
397
+ );
319
398
  const highlights$ = highlightsSubject.asObservable().pipe(rxjs.distinctUntilChanged());
320
- const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject);
399
+ const readerHighlights = new ReaderHighlights(
400
+ reader,
401
+ highlightsSubject,
402
+ selectedHighlightSubject
403
+ );
321
404
  const highlighted$ = commands.highlight$.pipe(
322
405
  rxjs.map(({ data: { itemIndex, selection, ...rest } }) => {
323
406
  const spineItem = reader.spineItemsManager.get(itemIndex);
324
- if (!spineItem) return void 0;
325
- const range = reader.selection.createOrderedRangeFromSelection({ selection, spineItem });
326
- if (!range) return void 0;
407
+ if (!spineItem) return undefined;
408
+ const range = reader.selection.createOrderedRangeFromSelection({
409
+ selection,
410
+ spineItem
411
+ });
412
+ if (!range) return undefined;
327
413
  const { start: startCfi, end: endCfi } = reader.cfi.generateCfiFromRange(range, spineItem.item);
328
414
  const highlight = new Highlight({
329
415
  cfi: startCfi,
@@ -346,12 +432,17 @@
346
432
  const highlight = new Highlight({ ...annotation, itemIndex });
347
433
  return highlight;
348
434
  });
349
- highlightsSubject.next([...highlightsSubject.getValue(), ...addedHighlights]);
435
+ highlightsSubject.next([
436
+ ...highlightsSubject.getValue(),
437
+ ...addedHighlights
438
+ ]);
350
439
  })
351
440
  );
352
441
  const delete$ = commands.delete$.pipe(
353
442
  rxjs.tap(({ id }) => {
354
- highlightsSubject.next(highlightsSubject.getValue().filter((highlight) => highlight.id !== id));
443
+ highlightsSubject.next(
444
+ highlightsSubject.getValue().filter((highlight) => highlight.id !== id)
445
+ );
355
446
  })
356
447
  );
357
448
  const update$ = commands.update$.pipe(
@@ -371,7 +462,13 @@
371
462
  const highlightsConsolidation$ = rxjs.merge(highlighted$, reader.layout$).pipe(
372
463
  rxjs.debounceTime(50),
373
464
  rxjs.withLatestFrom(highlights$),
374
- rxjs.mergeMap(() => rxjs.forkJoin(highlightsSubject.value.map((highlight) => consolidate(highlight, reader)))),
465
+ rxjs.mergeMap(
466
+ () => rxjs.forkJoin(
467
+ highlightsSubject.value.map(
468
+ (highlight) => consolidate(highlight, reader)
469
+ )
470
+ )
471
+ ),
375
472
  rxjs.tap((consolidatedHighlights) => {
376
473
  const consolidatedExistingHighlights = highlightsSubject.value.map(
377
474
  (highlight) => consolidatedHighlights.find((c) => c.id === highlight.id) ?? highlight
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../../shared/dist/index.js","../src/report.ts","../src/highlights/utils.ts","../src/highlights/SpineItemHighlight.ts","../src/highlights/SpineItemHighlights.ts","../src/highlights/ReaderHighlights.ts","../src/Commands.ts","../src/highlights/Highlight.ts","../src/highlights/consolidate.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["const f = (e) => {\n var n, t;\n return ((t = (n = e.split(/[#?]/)[0]) == null ? void 0 : n.split(\".\").pop()) == null ? void 0 : t.trim()) || \"\";\n};\nfunction a(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + e[0]);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + l);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), n.push(l));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction d(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return a(n);\n}\nfunction R(e) {\n const n = e.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst g = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n }\n}, w = ({ mimeType: e, uri: n }) => {\n const t = e ?? g(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, _ = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, m = \"prose-reader-resource-error\", E = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, O = (e, n, t) => {\n if (e === n)\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), r = Object.keys(n);\n if (o.length !== r.length)\n return !1;\n const l = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!E.call(n, u) || !l(e[u], n[u]))\n return !1;\n }\n return !0;\n}, y = (e, n) => e.reduce(\n (t, o) => {\n const r = n(o);\n return t[r] || (t[r] = []), t[r].push(o), t;\n },\n {}\n);\nfunction $(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const r = n[o];\n (r !== void 0 || !(o in e)) && (t[o] = r);\n }\n return t;\n}\nconst c = \"@prose-reader\", i = (e) => `[${e}]`, p = (e, n) => ({\n debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.debug, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.debug, console, i(`${c}`)),\n info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.info, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.info, console, i(`${c}`)),\n error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(console.error, console, i(`${c}`), i(e)) : Function.prototype.bind.call(console.error, console, i(`${c}`))\n}), x = {\n ...p(),\n namespace: (e, n) => p(e, n)\n}, D = (e, n) => e === n ? !0 : e.length !== n.length ? !1 : e.every((t, o) => t === n[o]);\nexport {\n m as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n x as Report,\n D as arrayEqual,\n g as detectMimeTypeFromName,\n R as getParentPath,\n f as getUrlExtension,\n y as groupBy,\n h as is,\n O as isShallowEqual,\n w as isXmlBasedMimeType,\n _ as parseContentType,\n $ as shallowMergeIfDefined,\n d as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(`enhancer-annotations`, IS_DEBUG_ENABLED)\n","export const createElementForRange = (range: Range, container: HTMLElement, color: string) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (container: HTMLElement, layer: HTMLElement) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (layer: HTMLElement, annotationLayer: HTMLElement) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n annotationLayer.style.position = \"absolute\"\n annotationLayer.style.top = \"0\"\n }\n\n // annotationLayer.style.backgroundColor = \"red\"\n annotationLayer.style.opacity = \"1\"\n annotationLayer.style.pointerEvents = \"none\"\n}\n","import { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { createElementForRange } from \"./utils\"\nimport { fromEvent, map, Observable, share, skip, takeUntil, tap } from \"rxjs\"\nimport { Highlight } from \"./Highlight\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n\n public readonly tap$: Observable<{ event: Event; highlight: Highlight }>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: Highlight,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n void this.reader\n\n this.container = this.containerElement.ownerDocument.createElement(\"div\")\n this.container.dataset[\"highlightContainer\"] = this.highlight.id\n this.containerElement.appendChild(this.container)\n\n this.tap$ = fromEvent(this.container, \"click\").pipe(\n map((event) => ({ event, highlight: this.highlight })),\n share(),\n )\n\n this.render()\n\n this.isSelected\n .pipe(\n skip(1),\n tap((isSelected) => {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n child.style.border = isSelected ? \"3px dashed red\" : \"3px dashed transparent\"\n }\n })\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n public render() {\n this.container.innerHTML = \"\"\n\n const range = this.highlight.range\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(range, this.container, this.highlight.color ?? \"yellow\")\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset[\"highlightRect\"] = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.contents?.length) {\n const noteIcon = document.createElement(\"span\")\n noteIcon.textContent = \"📝\"\n noteIcon.style.position = \"absolute\"\n noteIcon.style.top = \"0\"\n noteIcon.style.left = \"0\"\n noteIcon.style.transform = \"translate(-0%, -80%)\"\n noteIcon.style.fontSize = \"18px\"\n noteIcon.style.opacity = \"50%\"\n firstElement.appendChild(noteIcon)\n }\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import { distinctUntilChanged, map, merge, Observable, of, shareReplay, switchMap, takeUntil } from \"rxjs\"\nimport { DestroyableClass, Reader, SpineItem } from \"@prose-reader/core\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\nimport { Highlight } from \"./Highlight\"\n\nexport class SpineItemHighlights extends DestroyableClass {\n private layer: HTMLElement\n private highlights: SpineItemHighlight[] = []\n\n public readonly tap$: SpineItemHighlight[\"tap$\"]\n\n constructor(\n private highlights$: Observable<Highlight[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement = spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(this.spineItem.containerElement, firstLayerElement)\n\n const itemHighlights$ = this.highlights$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => highlight.destroy())\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(this.spineItem, this.layer, this.reader, annotation, isSelected$)\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = itemHighlights$.pipe(switchMap((highlights) => merge(...highlights.map((highlight) => highlight.tap$))))\n\n highlights$.subscribe()\n }\n\n layout() {\n const firstLayerElement = this.spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n this.highlights.forEach((highlight) => highlight.render())\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter((highlight) => target instanceof Node && highlight.isWithinTarget(target))\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, map, merge, switchMap } from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport { Highlight } from \"./Highlight\"\n\nexport class ReaderHighlights extends DestroyableClass {\n private spineItemHighlights = new BehaviorSubject<SpineItemHighlights[]>([])\n\n public tap$: SpineItemHighlights[\"tap$\"]\n\n constructor(\n private reader: Reader,\n private highlights: BehaviorSubject<Highlight[]>,\n private selectedHighlight: BehaviorSubject<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\"item.onDocumentLoad\", ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) => highlights.filter((highlight) => highlight.itemIndex === spineItem.item.index)),\n )\n\n const spineItemHighlights = new SpineItemHighlights(spineItemHighlights$, spineItem, reader, this.selectedHighlight)\n\n this.spineItemHighlights.next([...this.spineItemHighlights.getValue(), spineItemHighlights])\n\n destroy(() => {\n this.spineItemHighlights.next(this.spineItemHighlights.getValue().filter((layer) => layer !== spineItemHighlights))\n\n spineItemHighlights.destroy()\n })\n })\n\n this.tap$ = this.spineItemHighlights.pipe(switchMap((layers) => merge(...layers.map((layer) => layer.tap$))))\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n\n public layout() {\n this.spineItemHighlights.value.forEach((item) => item.layout())\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport { SerializableHighlight } from \"./types\"\n\ntype HighlightParams = { selection: Selection; itemIndex: number; color?: string; contents?: string[] }\n\ntype Command =\n | { type: \"highlight\"; data: HighlightParams }\n | { type: \"add\"; data: SerializableHighlight | SerializableHighlight[] }\n | { type: \"delete\"; id: string }\n | { type: \"update\"; id: string; data: Pick<HighlightParams, \"color\" | \"contents\"> }\n | { type: \"select\"; id: string | undefined }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly highlight$ = this.commandSubject.pipe(filter((command) => command.type === \"highlight\"))\n public readonly add$ = this.commandSubject.pipe(filter((command) => command.type === \"add\"))\n public readonly delete$ = this.commandSubject.pipe(filter((command) => command.type === \"delete\"))\n public readonly update$ = this.commandSubject.pipe(filter((command) => command.type === \"update\"))\n public readonly select$ = this.commandSubject.pipe(filter((command) => command.type === \"select\"))\n\n highlight = (params: HighlightParams) => {\n this.commandSubject.next({ type: \"highlight\", data: params })\n }\n\n add = (data: SerializableHighlight | SerializableHighlight[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (id: string, data: Pick<HighlightParams, \"color\" | \"contents\">) => {\n this.commandSubject.next({ type: \"update\", id, data })\n }\n\n select = (id: string | undefined) => {\n this.commandSubject.next({ type: \"select\", id })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","import { Commands } from \"../Commands\"\nimport { SerializableHighlight } from \"../types\"\n\nexport class Highlight {\n public cfi: string\n public endCfi: string | undefined\n public itemIndex?: number\n public color?: string\n public contents?: string[]\n public range?: Range\n public selectionAsText?: string\n /**\n * Unique local ID. This is to ensure unicity\n * for duplicate selections\n */\n public id: string\n\n constructor(params: SerializableHighlight & { itemIndex?: number }) {\n this.cfi = params.cfi\n this.endCfi = params.endCfi\n this.itemIndex = params.itemIndex\n this.color = params.color\n this.contents = params.contents\n this.id = params.id\n this.selectionAsText = params.selectionAsText\n }\n\n update(params: Parameters<Commands[\"update\"]>[1]) {\n Object.assign(this, params)\n\n return this\n }\n\n toJSON(): SerializableHighlight {\n return {\n cfi: this.cfi,\n endCfi: this.endCfi,\n color: this.color,\n contents: this.contents,\n id: this.id,\n selectionAsText: this.selectionAsText,\n }\n }\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { Highlight } from \"./Highlight\"\nimport { map, of, tap, withLatestFrom } from \"rxjs\"\n\nexport const consolidate = (highlight: Highlight, reader: Reader) => {\n const { itemIndex } = reader.cfi.parseCfi(highlight.cfi ?? \"\")\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return of(highlight)\n\n return of(highlight).pipe(\n withLatestFrom(spineItem.isReady$),\n tap(([, isItemReady]) => {\n const startCfi = reader.cfi.resolveCfi({ cfi: highlight.cfi ?? \"\" })\n const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.endCfi ?? \"\" })\n\n if (startCfi?.node && resolvedFocusCfi?.node && isItemReady) {\n const range = startCfi?.node.ownerDocument?.createRange()\n range?.setStart(startCfi?.node, startCfi.offset ?? 0)\n range?.setEnd(resolvedFocusCfi?.node, resolvedFocusCfi.offset ?? 0)\n\n highlight.range = range\n highlight.selectionAsText = range?.toString()\n } else {\n highlight.range = undefined\n }\n }),\n map(() => highlight),\n )\n}\n","import { Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n merge,\n takeUntil,\n tap,\n Observable,\n debounceTime,\n filter,\n mergeMap,\n map,\n share,\n distinctUntilChanged,\n withLatestFrom,\n forkJoin,\n} from \"rxjs\"\nimport { report } from \"./report\"\nimport { ReaderHighlights } from \"./highlights/ReaderHighlights\"\nimport { Commands } from \"./Commands\"\nimport { Highlight } from \"./highlights/Highlight\"\nimport { consolidate } from \"./highlights/consolidate\"\nimport { isDefined } from \"reactjrx\"\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(next: (options: InheritOptions) => InheritOutput) =>\n (\n options: InheritOptions,\n ): InheritOutput & {\n annotations: {\n highlights$: Observable<Highlight[]>\n highlightTap$: ReaderHighlights[\"tap$\"]\n highlight: Commands[\"highlight\"]\n add: Commands[\"add\"]\n delete: Commands[\"delete\"]\n update: Commands[\"update\"]\n select: Commands[\"select\"]\n isTargetWithinHighlight: (target: EventTarget) => boolean\n }\n } => {\n const reader = next(options)\n const commands = new Commands()\n const highlightsSubject = new BehaviorSubject<Highlight[]>([])\n const selectedHighlightSubject = new BehaviorSubject<string | undefined>(undefined)\n\n const highlights$ = highlightsSubject.asObservable().pipe(distinctUntilChanged())\n\n const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject)\n\n const highlighted$ = commands.highlight$.pipe(\n map(({ data: { itemIndex, selection, ...rest } }) => {\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return undefined\n\n const range = reader.selection.createOrderedRangeFromSelection({ selection, spineItem })\n\n if (!range) return undefined\n\n const { start: startCfi, end: endCfi } = reader.cfi.generateCfiFromRange(range, spineItem.item)\n\n const highlight = new Highlight({\n cfi: startCfi,\n endCfi,\n itemIndex,\n id: window.crypto.randomUUID(),\n ...rest,\n })\n\n highlightsSubject.next([...highlightsSubject.getValue(), highlight])\n\n return [highlight.id]\n }),\n filter(isDefined),\n share(),\n )\n\n const add$ = commands.add$.pipe(\n map(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n const addedHighlights = annotations.map((annotation) => {\n const { itemIndex } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = new Highlight({ ...annotation, itemIndex })\n\n return highlight\n })\n\n highlightsSubject.next([...highlightsSubject.getValue(), ...addedHighlights])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n highlightsSubject.next(highlightsSubject.getValue().filter((highlight) => highlight.id !== id))\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n highlightsSubject.next(\n highlightsSubject.getValue().map((highlight) => {\n return highlight.id === id ? highlight.update(data) : highlight\n }),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const highlightsConsolidation$ = merge(highlighted$, reader.layout$).pipe(\n debounceTime(50),\n withLatestFrom(highlights$),\n mergeMap(() => forkJoin(highlightsSubject.value.map((highlight) => consolidate(highlight, reader)))),\n tap((consolidatedHighlights) => {\n const consolidatedExistingHighlights = highlightsSubject.value.map(\n (highlight) => consolidatedHighlights.find((c) => c.id === highlight.id) ?? highlight,\n )\n\n highlightsSubject.next(consolidatedExistingHighlights)\n\n readerHighlights.layout()\n }),\n )\n\n merge(\n highlighted$,\n add$,\n delete$,\n update$,\n select$,\n highlightsConsolidation$,\n highlights$.pipe(\n tap((annotations) => {\n report.debug(\"highlights\", annotations)\n }),\n ),\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n highlightsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n highlights$,\n highlightTap$: readerHighlights.tap$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n highlight: commands.highlight,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n select: commands.select,\n },\n }\n }\n"],"names":["Report","DestroyableClass","fromEvent","map","share","skip","tap","isSelected","takeUntil","switchMap","distinctUntilChanged","of","shareReplay","merge","highlights","BehaviorSubject","Subject","filter","withLatestFrom","isDefined","debounceTime","mergeMap","forkJoin"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../../shared/dist/index.js","../src/report.ts","../src/highlights/utils.ts","../src/highlights/SpineItemHighlight.ts","../src/highlights/SpineItemHighlights.ts","../src/highlights/ReaderHighlights.ts","../src/Commands.ts","../src/highlights/Highlight.ts","../src/highlights/consolidate.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["const f = (e) => {\n var n, t;\n return ((t = (n = e.split(/[#?]/)[0]) == null ? void 0 : n.split(\".\").pop()) == null ? void 0 : t.trim()) || \"\";\n};\nfunction a(e) {\n const n = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(`Url must be a string. Received ${l}`);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), n.push(l));\n }\n let t = n.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const o = t.split(\"?\");\n return t = o.shift() + (o.length > 0 ? \"?\" : \"\") + o.join(\"&\"), t;\n}\nfunction d(...e) {\n const n = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return a(n);\n}\nfunction R(e) {\n const n = e.split(\"/\");\n return n.pop(), n.join(\"/\");\n}\nconst g = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n }\n}, w = ({\n mimeType: e,\n uri: n\n}) => {\n const t = e ?? g(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, _ = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, m = \"prose-reader-resource-error\", E = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, O = (e, n, t) => {\n if (e === n)\n return !0;\n if (typeof e != \"object\" || e === null || typeof n != \"object\" || n === null)\n return !1;\n const o = Object.keys(e), r = Object.keys(n);\n if (o.length !== r.length)\n return !1;\n const l = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!E.call(n, u) || !l(e[u], n[u]))\n return !1;\n }\n return !0;\n}, y = (e, n) => e.reduce(\n (t, o) => {\n const r = n(o);\n return t[r] || (t[r] = []), t[r].push(o), t;\n },\n {}\n);\nfunction $(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const r = n[o];\n (r !== void 0 || !(o in e)) && (t[o] = r);\n }\n return t;\n}\nconst c = \"@prose-reader\", i = (e) => `[${e}]`, p = (e, n) => ({\n debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(\n console.debug,\n console,\n i(`${c}`),\n i(e)\n ) : Function.prototype.bind.call(\n console.debug,\n console,\n i(`${c}`)\n ),\n info: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(\n console.info,\n console,\n i(`${c}`),\n i(e)\n ) : Function.prototype.bind.call(\n console.info,\n console,\n i(`${c}`)\n ),\n error: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {\n } : e ? Function.prototype.bind.call(\n console.error,\n console,\n i(`${c}`),\n i(e)\n ) : Function.prototype.bind.call(\n console.error,\n console,\n i(`${c}`)\n )\n}), x = {\n ...p(),\n namespace: (e, n) => p(e, n)\n}, D = (e, n) => e === n ? !0 : e.length !== n.length ? !1 : e.every((t, o) => t === n[o]);\nexport {\n m as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n x as Report,\n D as arrayEqual,\n g as detectMimeTypeFromName,\n R as getParentPath,\n f as getUrlExtension,\n y as groupBy,\n h as is,\n O as isShallowEqual,\n w as isXmlBasedMimeType,\n _ as parseContentType,\n $ as shallowMergeIfDefined,\n d as urlJoin\n};\n//# sourceMappingURL=index.js.map\n","import { Report } from \"@prose-reader/shared\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(`enhancer-annotations`, IS_DEBUG_ENABLED)\n","export const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n target.style.cssText = source.style.cssText\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n annotationLayer.style.position = \"absolute\"\n annotationLayer.style.top = \"0\"\n }\n\n // annotationLayer.style.backgroundColor = \"red\"\n annotationLayer.style.opacity = \"1\"\n annotationLayer.style.pointerEvents = \"none\"\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport { createElementForRange } from \"./utils\"\nimport {\n fromEvent,\n map,\n type Observable,\n share,\n skip,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport type { Highlight } from \"./Highlight\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n\n public readonly tap$: Observable<{ event: Event; highlight: Highlight }>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public readonly highlight: Highlight,\n private isSelected: Observable<boolean>,\n ) {\n super()\n\n void this.spineItem\n void this.reader\n\n this.container = this.containerElement.ownerDocument.createElement(\"div\")\n this.container.dataset.highlightContainer = this.highlight.id\n this.containerElement.appendChild(this.container)\n\n this.tap$ = fromEvent(this.container, \"click\").pipe(\n map((event) => ({ event, highlight: this.highlight })),\n share(),\n )\n\n this.render()\n\n this.isSelected\n .pipe(\n skip(1),\n tap((isSelected) => {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n child.style.border = isSelected\n ? \"3px dashed red\"\n : \"3px dashed transparent\"\n }\n })\n }),\n takeUntil(this.destroy$),\n )\n .subscribe()\n }\n\n public render() {\n this.container.innerHTML = \"\"\n\n const range = this.highlight.range\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.color ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.contents?.length) {\n const noteIcon = document.createElement(\"span\")\n noteIcon.textContent = \"📝\"\n noteIcon.style.position = \"absolute\"\n noteIcon.style.top = \"0\"\n noteIcon.style.left = \"0\"\n noteIcon.style.transform = \"translate(-0%, -80%)\"\n noteIcon.style.fontSize = \"18px\"\n noteIcon.style.opacity = \"50%\"\n firstElement.appendChild(noteIcon)\n }\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import {\n distinctUntilChanged,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\nimport type { Highlight } from \"./Highlight\"\n\nexport class SpineItemHighlights extends DestroyableClass {\n private layer: HTMLElement\n private highlights: SpineItemHighlight[] = []\n\n public readonly tap$: SpineItemHighlight[\"tap$\"]\n\n constructor(\n private highlights$: Observable<Highlight[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.layers[0]?.element ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.highlights$.pipe(\n switchMap((annotations) => {\n this.highlights.forEach((highlight) => highlight.destroy())\n this.highlights = []\n\n annotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n highlights$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.layers[0]?.element ??\n document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n this.highlights.forEach((highlight) => highlight.render())\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport { BehaviorSubject, map, merge, switchMap } from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { Highlight } from \"./Highlight\"\n\nexport class ReaderHighlights extends DestroyableClass {\n private spineItemHighlights = new BehaviorSubject<SpineItemHighlights[]>([])\n\n public tap$: SpineItemHighlights[\"tap$\"]\n\n constructor(\n private reader: Reader,\n private highlights: BehaviorSubject<Highlight[]>,\n private selectedHighlight: BehaviorSubject<string | undefined>,\n ) {\n super()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n ({ itemId, destroy }) => {\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n destroy(() => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n })\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n\n public layout() {\n this.spineItemHighlights.value.forEach((item) => item.layout())\n }\n}\n","import { DestroyableClass } from \"@prose-reader/core\"\nimport { filter, Subject } from \"rxjs\"\nimport type { SerializableHighlight } from \"./types\"\n\ntype HighlightParams = {\n selection: Selection\n itemIndex: number\n color?: string\n contents?: string[]\n}\n\ntype Command =\n | { type: \"highlight\"; data: HighlightParams }\n | { type: \"add\"; data: SerializableHighlight | SerializableHighlight[] }\n | { type: \"delete\"; id: string }\n | {\n type: \"update\"\n id: string\n data: Pick<HighlightParams, \"color\" | \"contents\">\n }\n | { type: \"select\"; id: string | undefined }\n\nexport class Commands extends DestroyableClass {\n private commandSubject = new Subject<Command>()\n\n public readonly highlight$ = this.commandSubject.pipe(\n filter((command) => command.type === \"highlight\"),\n )\n public readonly add$ = this.commandSubject.pipe(\n filter((command) => command.type === \"add\"),\n )\n public readonly delete$ = this.commandSubject.pipe(\n filter((command) => command.type === \"delete\"),\n )\n public readonly update$ = this.commandSubject.pipe(\n filter((command) => command.type === \"update\"),\n )\n public readonly select$ = this.commandSubject.pipe(\n filter((command) => command.type === \"select\"),\n )\n\n highlight = (params: HighlightParams) => {\n this.commandSubject.next({ type: \"highlight\", data: params })\n }\n\n add = (data: SerializableHighlight | SerializableHighlight[]) => {\n this.commandSubject.next({ type: \"add\", data })\n }\n\n delete = (id: string) => {\n this.commandSubject.next({ type: \"delete\", id })\n }\n\n update = (id: string, data: Pick<HighlightParams, \"color\" | \"contents\">) => {\n this.commandSubject.next({ type: \"update\", id, data })\n }\n\n select = (id: string | undefined) => {\n this.commandSubject.next({ type: \"select\", id })\n }\n\n destroy() {\n super.destroy()\n this.commandSubject.complete()\n }\n}\n","import type { Commands } from \"../Commands\"\nimport type { SerializableHighlight } from \"../types\"\n\nexport class Highlight {\n public cfi: string\n public endCfi: string | undefined\n public itemIndex?: number\n public color?: string\n public contents?: string[]\n public range?: Range\n public selectionAsText?: string\n /**\n * Unique local ID. This is to ensure unicity\n * for duplicate selections\n */\n public id: string\n\n constructor(params: SerializableHighlight & { itemIndex?: number }) {\n this.cfi = params.cfi\n this.endCfi = params.endCfi\n this.itemIndex = params.itemIndex\n this.color = params.color\n this.contents = params.contents\n this.id = params.id\n this.selectionAsText = params.selectionAsText\n }\n\n update(params: Parameters<Commands[\"update\"]>[1]) {\n Object.assign(this, params)\n\n return this\n }\n\n toJSON(): SerializableHighlight {\n return {\n cfi: this.cfi,\n endCfi: this.endCfi,\n color: this.color,\n contents: this.contents,\n id: this.id,\n selectionAsText: this.selectionAsText,\n }\n }\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport type { Highlight } from \"./Highlight\"\nimport { map, of, tap, withLatestFrom } from \"rxjs\"\n\nexport const consolidate = (highlight: Highlight, reader: Reader) => {\n const { itemIndex } = reader.cfi.parseCfi(highlight.cfi ?? \"\")\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return of(highlight)\n\n return of(highlight).pipe(\n withLatestFrom(spineItem.isReady$),\n tap(([, isItemReady]) => {\n const startCfi = reader.cfi.resolveCfi({ cfi: highlight.cfi ?? \"\" })\n const resolvedFocusCfi = reader.cfi.resolveCfi({\n cfi: highlight.endCfi ?? \"\",\n })\n\n if (startCfi?.node && resolvedFocusCfi?.node && isItemReady) {\n const range = startCfi?.node.ownerDocument?.createRange()\n range?.setStart(startCfi?.node, startCfi.offset ?? 0)\n range?.setEnd(resolvedFocusCfi?.node, resolvedFocusCfi.offset ?? 0)\n\n highlight.range = range\n highlight.selectionAsText = range?.toString()\n } else {\n highlight.range = undefined\n }\n }),\n map(() => highlight),\n )\n}\n","import type { Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n merge,\n takeUntil,\n tap,\n type Observable,\n debounceTime,\n filter,\n mergeMap,\n map,\n share,\n distinctUntilChanged,\n withLatestFrom,\n forkJoin,\n} from \"rxjs\"\nimport { report } from \"./report\"\nimport { ReaderHighlights } from \"./highlights/ReaderHighlights\"\nimport { Commands } from \"./Commands\"\nimport { Highlight } from \"./highlights/Highlight\"\nimport { consolidate } from \"./highlights/consolidate\"\nimport { isDefined } from \"reactjrx\"\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions,\n ): InheritOutput & {\n annotations: {\n highlights$: Observable<Highlight[]>\n highlightTap$: ReaderHighlights[\"tap$\"]\n highlight: Commands[\"highlight\"]\n add: Commands[\"add\"]\n delete: Commands[\"delete\"]\n update: Commands[\"update\"]\n select: Commands[\"select\"]\n isTargetWithinHighlight: (target: EventTarget) => boolean\n }\n } => {\n const reader = next(options)\n const commands = new Commands()\n const highlightsSubject = new BehaviorSubject<Highlight[]>([])\n const selectedHighlightSubject = new BehaviorSubject<string | undefined>(\n undefined,\n )\n\n const highlights$ = highlightsSubject\n .asObservable()\n .pipe(distinctUntilChanged())\n\n const readerHighlights = new ReaderHighlights(\n reader,\n highlightsSubject,\n selectedHighlightSubject,\n )\n\n const highlighted$ = commands.highlight$.pipe(\n map(({ data: { itemIndex, selection, ...rest } }) => {\n const spineItem = reader.spineItemsManager.get(itemIndex)\n\n if (!spineItem) return undefined\n\n const range = reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n\n if (!range) return undefined\n\n const { start: startCfi, end: endCfi } =\n reader.cfi.generateCfiFromRange(range, spineItem.item)\n\n const highlight = new Highlight({\n cfi: startCfi,\n endCfi,\n itemIndex,\n id: window.crypto.randomUUID(),\n ...rest,\n })\n\n highlightsSubject.next([...highlightsSubject.getValue(), highlight])\n\n return [highlight.id]\n }),\n filter(isDefined),\n share(),\n )\n\n const add$ = commands.add$.pipe(\n map(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n const addedHighlights = annotations.map((annotation) => {\n const { itemIndex } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = new Highlight({ ...annotation, itemIndex })\n\n return highlight\n })\n\n highlightsSubject.next([\n ...highlightsSubject.getValue(),\n ...addedHighlights,\n ])\n }),\n )\n\n const delete$ = commands.delete$.pipe(\n tap(({ id }) => {\n highlightsSubject.next(\n highlightsSubject\n .getValue()\n .filter((highlight) => highlight.id !== id),\n )\n }),\n )\n\n const update$ = commands.update$.pipe(\n tap(({ id, data }) => {\n highlightsSubject.next(\n highlightsSubject.getValue().map((highlight) => {\n return highlight.id === id ? highlight.update(data) : highlight\n }),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const highlightsConsolidation$ = merge(highlighted$, reader.layout$).pipe(\n debounceTime(50),\n withLatestFrom(highlights$),\n mergeMap(() =>\n forkJoin(\n highlightsSubject.value.map((highlight) =>\n consolidate(highlight, reader),\n ),\n ),\n ),\n tap((consolidatedHighlights) => {\n const consolidatedExistingHighlights = highlightsSubject.value.map(\n (highlight) =>\n consolidatedHighlights.find((c) => c.id === highlight.id) ??\n highlight,\n )\n\n highlightsSubject.next(consolidatedExistingHighlights)\n\n readerHighlights.layout()\n }),\n )\n\n merge(\n highlighted$,\n add$,\n delete$,\n update$,\n select$,\n highlightsConsolidation$,\n highlights$.pipe(\n tap((annotations) => {\n report.debug(\"highlights\", annotations)\n }),\n ),\n )\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n destroy: () => {\n highlightsSubject.complete()\n commands.destroy()\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n highlights$,\n highlightTap$: readerHighlights.tap$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n highlight: commands.highlight,\n add: commands.add,\n delete: commands.delete,\n update: commands.update,\n select: commands.select,\n },\n }\n }\n"],"names":["Report","DestroyableClass","fromEvent","map","share","skip","tap","isSelected","takeUntil","switchMap","distinctUntilChanged","of","shareReplay","merge","highlights","BehaviorSubject","Subject","filter","withLatestFrom","isDefined","debounceTime","mergeMap","forkJoin"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/enhancer-annotations",
3
- "version": "1.163.0",
3
+ "version": "1.165.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.umd.cjs",
6
6
  "module": "./dist/index.js",
@@ -16,12 +16,10 @@
16
16
  },
17
17
  "scripts": {
18
18
  "start": "vite build --watch --mode development",
19
- "build": "tsc && vite build",
20
- "lint:read": "prettier --check . && eslint . --ext .ts,.tsx,.js,.jsx",
21
- "lint:write": "prettier --write . && eslint --fix . --ext .ts,.tsx,.js,.jsx"
19
+ "build": "tsc && vite build"
22
20
  },
23
21
  "peerDependencies": {
24
22
  "@prose-reader/core": "^1.117.0"
25
23
  },
26
- "gitHead": "2e5a50829a706c02bb25911b15c3cc2785231904"
24
+ "gitHead": "59799628bd1974e31ae4bb40104f441b517db554"
27
25
  }