@prose-reader/enhancer-annotations 1.126.0 → 1.128.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.
@@ -1,3 +1,4 @@
1
+ import { Commands } from '../Commands';
1
2
  import { SerializableHighlight } from '../types';
2
3
  export declare class Highlight {
3
4
  anchorCfi: string | undefined;
@@ -8,7 +9,7 @@ export declare class Highlight {
8
9
  spineItemPageIndex?: number;
9
10
  absolutePageIndex?: number;
10
11
  range?: Range;
11
- lastSelectionText?: string;
12
+ selectionAsText?: string;
12
13
  /**
13
14
  * Unique local ID. This is to ensure unicity
14
15
  * for duplicate selections
@@ -17,5 +18,6 @@ export declare class Highlight {
17
18
  constructor(params: SerializableHighlight & {
18
19
  itemIndex?: number;
19
20
  });
21
+ update(params: Parameters<Commands["update"]>[1]): this;
20
22
  toJSON(): SerializableHighlight;
21
23
  }
@@ -1,3 +1,3 @@
1
1
  import { Reader } from '@prose-reader/core';
2
2
  import { Highlight } from './Highlight';
3
- export declare const consolidate: (highlight: Highlight, reader: Reader) => void;
3
+ export declare const consolidate: (highlight: Highlight, reader: Reader) => import('rxjs').Observable<Highlight>;
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
- import { DestroyableClass, waitForSwitch } from '@prose-reader/core';
2
- import { fromEvent, map, share, skip, tap, takeUntil, switchMap, distinctUntilChanged, of, shareReplay, merge, BehaviorSubject, Subject, filter, debounceTime, withLatestFrom } from 'rxjs';
1
+ import { fromEvent, map, share, skip, tap, takeUntil, switchMap, distinctUntilChanged, of, shareReplay, merge, BehaviorSubject, Subject, filter, withLatestFrom, buffer, debounceTime, mergeMap, combineLatest } from 'rxjs';
2
+ import { DestroyableClass } from '@prose-reader/core';
3
+ import { isDefined } from 'reactjrx';
3
4
 
4
5
  const c = "@prose-reader", i = (e) => `[${e}]`, p = (e, n) => ({
5
6
  debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {
@@ -45,7 +46,7 @@ const createElementForRange = (range, container, color) => {
45
46
  rectElt.style.cssText = `
46
47
  height: 100%;
47
48
  width: 100%;
48
- opacity: 25%;
49
+ opacity: 40%;
49
50
  background-color: ${color}
50
51
  `;
51
52
  rectEltContainer.appendChild(rectElt);
@@ -215,7 +216,7 @@ class ReaderHighlights extends DestroyableClass {
215
216
  return !!this.getHighlightsForTarget(target).length;
216
217
  };
217
218
  layout() {
218
- this.spineItemHighlights.getValue().forEach((item) => item.layout());
219
+ this.spineItemHighlights.value.forEach((item) => item.layout());
219
220
  }
220
221
  }
221
222
 
@@ -256,7 +257,7 @@ class Highlight {
256
257
  spineItemPageIndex;
257
258
  absolutePageIndex;
258
259
  range;
259
- lastSelectionText;
260
+ selectionAsText;
260
261
  /**
261
262
  * Unique local ID. This is to ensure unicity
262
263
  * for duplicate selections
@@ -269,7 +270,11 @@ class Highlight {
269
270
  this.color = params.color;
270
271
  this.contents = params.contents;
271
272
  this.id = params.id;
272
- this.lastSelectionText = params.lastSelectionText;
273
+ this.selectionAsText = params.selectionAsText;
274
+ }
275
+ update(params) {
276
+ Object.assign(this, params);
277
+ return this;
273
278
  }
274
279
  toJSON() {
275
280
  return {
@@ -278,7 +283,7 @@ class Highlight {
278
283
  color: this.color,
279
284
  contents: this.contents,
280
285
  id: this.id,
281
- lastSelectionText: this.lastSelectionText
286
+ selectionAsText: this.selectionAsText
282
287
  };
283
288
  }
284
289
  }
@@ -286,41 +291,47 @@ class Highlight {
286
291
  const consolidate = (highlight, reader) => {
287
292
  const { itemIndex } = reader.cfi.parseCfi(highlight.anchorCfi ?? "");
288
293
  const spineItem = reader.spineItemsManager.get(itemIndex);
289
- const resolvedAnchorCfi = reader.cfi.resolveCfi({ cfi: highlight.anchorCfi ?? "" });
290
- const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.focusCfi ?? "" });
291
- if (!spineItem) return;
292
- if (spineItem.item.renditionLayout === `pre-paginated`) {
293
- highlight.spineItemPageIndex = 0;
294
- } else {
295
- if (resolvedAnchorCfi?.node) {
296
- highlight.spineItemPageIndex = reader.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(
297
- resolvedAnchorCfi.node,
298
- resolvedAnchorCfi.offset ?? 0,
299
- spineItem
300
- );
301
- }
302
- }
303
- if (resolvedAnchorCfi?.node && resolvedFocusCfi?.node && spineItem.isReady) {
304
- const range = reader.selection.createRangeFromSelection({
305
- selection: {
306
- anchorNode: resolvedAnchorCfi.node,
307
- anchorOffset: resolvedAnchorCfi.offset ?? 0,
308
- focusNode: resolvedFocusCfi.node,
309
- focusOffset: resolvedFocusCfi.offset ?? 0
310
- },
311
- spineItem
312
- });
313
- highlight.range = range;
314
- highlight.lastSelectionText = range?.toString();
315
- } else {
316
- highlight.range = void 0;
317
- }
318
- if (highlight.spineItemPageIndex !== void 0) {
319
- highlight.absolutePageIndex = reader.spine.locator.getAbsolutePageIndexFromPageIndex({
320
- pageIndex: highlight.spineItemPageIndex,
321
- spineItemOrId: spineItem
322
- });
323
- }
294
+ if (!spineItem) return of(highlight);
295
+ return of(highlight).pipe(
296
+ withLatestFrom(spineItem.isReady$),
297
+ tap(([, isItemReady]) => {
298
+ const resolvedAnchorCfi = reader.cfi.resolveCfi({ cfi: highlight.anchorCfi ?? "" });
299
+ const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.focusCfi ?? "" });
300
+ if (spineItem.item.renditionLayout === `pre-paginated`) {
301
+ highlight.spineItemPageIndex = 0;
302
+ } else {
303
+ if (resolvedAnchorCfi?.node) {
304
+ highlight.spineItemPageIndex = reader.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(
305
+ resolvedAnchorCfi.node,
306
+ resolvedAnchorCfi.offset ?? 0,
307
+ spineItem
308
+ );
309
+ }
310
+ }
311
+ if (resolvedAnchorCfi?.node && resolvedFocusCfi?.node && isItemReady) {
312
+ const range = reader.selection.createRangeFromSelection({
313
+ selection: {
314
+ anchorNode: resolvedAnchorCfi.node,
315
+ anchorOffset: resolvedAnchorCfi.offset ?? 0,
316
+ focusNode: resolvedFocusCfi.node,
317
+ focusOffset: resolvedFocusCfi.offset ?? 0
318
+ },
319
+ spineItem
320
+ });
321
+ highlight.range = range;
322
+ highlight.selectionAsText = range?.toString();
323
+ } else {
324
+ highlight.range = void 0;
325
+ }
326
+ if (highlight.spineItemPageIndex !== void 0) {
327
+ highlight.absolutePageIndex = reader.spine.locator.getAbsolutePageIndexFromPageIndex({
328
+ pageIndex: highlight.spineItemPageIndex,
329
+ spineItemOrId: spineItem
330
+ });
331
+ }
332
+ }),
333
+ map(() => highlight)
334
+ );
324
335
  };
325
336
 
326
337
  const annotationsEnhancer = (next) => (options) => {
@@ -330,28 +341,29 @@ const annotationsEnhancer = (next) => (options) => {
330
341
  const selectedHighlightSubject = new BehaviorSubject(void 0);
331
342
  const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject);
332
343
  const highlight$ = commands.highlight$.pipe(
333
- tap(({ data: { itemIndex, selection, ...rest } }) => {
344
+ map(({ data: { itemIndex, selection, ...rest } }) => {
334
345
  const item = reader.spineItemsManager.get(itemIndex)?.item;
335
- if (!item) return;
346
+ if (!item) return void 0;
336
347
  const { anchorCfi, focusCfi } = reader.cfi.generateCfiFromSelection({ item, selection });
337
348
  const highlight = new Highlight({ anchorCfi, focusCfi, itemIndex, id: window.crypto.randomUUID(), ...rest });
338
- consolidate(highlight, reader);
339
349
  highlightsSubject.next([...highlightsSubject.getValue(), highlight]);
340
- })
350
+ return [highlight.id];
351
+ }),
352
+ filter(isDefined),
353
+ share()
341
354
  );
342
355
  const add$ = commands.add$.pipe(
343
- tap(({ data }) => {
356
+ map(({ data }) => {
344
357
  const annotations = Array.isArray(data) ? data : [data];
345
- highlightsSubject.next([
346
- ...highlightsSubject.getValue(),
347
- ...annotations.map((annotation) => {
348
- const { itemIndex } = reader.cfi.parseCfi(annotation.anchorCfi ?? "");
349
- const highlight = new Highlight({ ...annotation, itemIndex });
350
- consolidate(highlight, reader);
351
- return highlight;
352
- })
353
- ]);
354
- })
358
+ const addedHighlights = annotations.map((annotation) => {
359
+ const { itemIndex } = reader.cfi.parseCfi(annotation.anchorCfi ?? "");
360
+ const highlight = new Highlight({ ...annotation, itemIndex });
361
+ return highlight;
362
+ });
363
+ highlightsSubject.next([...highlightsSubject.getValue(), ...addedHighlights]);
364
+ return addedHighlights.map((highlight) => highlight.id);
365
+ }),
366
+ share()
355
367
  );
356
368
  const delete$ = commands.delete$.pipe(
357
369
  tap(({ id }) => {
@@ -361,7 +373,9 @@ const annotationsEnhancer = (next) => (options) => {
361
373
  const update$ = commands.update$.pipe(
362
374
  tap(({ id, data }) => {
363
375
  highlightsSubject.next(
364
- highlightsSubject.getValue().map((highlight) => highlight.id === id ? new Highlight({ ...highlight, ...data }) : highlight)
376
+ highlightsSubject.getValue().map((highlight) => {
377
+ return highlight.id === id ? highlight.update(data) : highlight;
378
+ })
365
379
  );
366
380
  })
367
381
  );
@@ -370,14 +384,29 @@ const annotationsEnhancer = (next) => (options) => {
370
384
  selectedHighlightSubject.next(id);
371
385
  })
372
386
  );
373
- const highlights$ = highlightsSubject.asObservable();
374
- const highlightsConsolidation$ = reader.layout$.pipe(
375
- debounceTime(50),
376
- waitForSwitch(reader.viewportFree$),
377
- withLatestFrom(highlights$),
378
- tap(([, highlights]) => {
379
- highlights.forEach((highlight) => consolidate(highlight, reader));
380
- highlightsSubject.next(highlights);
387
+ const highlights$ = highlightsSubject.asObservable().pipe(
388
+ distinctUntilChanged()
389
+ );
390
+ const highlightsToConsolidate$ = merge(
391
+ add$,
392
+ highlight$,
393
+ reader.layout$.pipe(map(() => highlightsSubject.value.map(({ id }) => id)))
394
+ ).pipe(share());
395
+ const highlightsConsolidation$ = highlightsToConsolidate$.pipe(
396
+ buffer(highlightsToConsolidate$.pipe(debounceTime(100))),
397
+ map((arrays) => {
398
+ const ids = Array.from(new Set(arrays.flat()));
399
+ return highlightsSubject.value.filter((highlight) => ids.includes(highlight.id));
400
+ }),
401
+ mergeMap((highlightsToConsolidate) => {
402
+ report.debug("consolidating", highlightsToConsolidate);
403
+ return combineLatest(highlightsToConsolidate.map((highlight) => consolidate(highlight, reader)));
404
+ }),
405
+ tap((consolidatedHighlights) => {
406
+ const consolidatedExistingHighlights = highlightsSubject.value.map(
407
+ (highlight) => consolidatedHighlights.find((c) => c.id === highlight.id) ?? highlight
408
+ );
409
+ highlightsSubject.next(consolidatedExistingHighlights);
381
410
  readerHighlights.layout();
382
411
  })
383
412
  );
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 l = 0; l < e.length; l++) {\n let r = e[l];\n if (typeof r != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + r);\n r !== \"\" && (l > 0 && (r = r.replace(/^[/]+/, \"\")), l < e.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\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}\nconst E = (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}, R = ({ mimeType: e, uri: n }) => {\n const t = e ?? E(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, w = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, _ = \"prose-reader-resource-error\", g = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, m = (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), l = Object.keys(n);\n if (o.length !== l.length)\n return !1;\n const r = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!g.call(n, u) || !r(e[u], n[u]))\n return !1;\n }\n return !0;\n}, O = (e, n) => e.reduce(\n (t, o) => {\n const l = n(o);\n return t[l] || (t[l] = []), t[l].push(o), t;\n },\n {}\n);\nfunction y(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const l = n[o];\n (l !== void 0 || !(o in e)) && (t[o] = l);\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}), $ = {\n ...p(),\n namespace: (e, n) => p(e, n)\n};\nexport {\n _ as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n $ as Report,\n E as detectMimeTypeFromName,\n f as getUrlExtension,\n O as groupBy,\n h as is,\n m as isShallowEqual,\n R as isXmlBasedMimeType,\n w as parseContentType,\n y 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: 25%;\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.getValue().forEach((item) => item.layout())\n }\n}\n","import { DestroyableClass, Reader } from \"@prose-reader/core\"\nimport { filter, ObservedValueOf, Subject } from \"rxjs\"\nimport { SerializableHighlight } from \"./types\"\n\ntype HighlightParams = ObservedValueOf<Reader[\"selection\"][\"selection$\"]> & { 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 { SerializableHighlight } from \"../types\"\n\nexport class Highlight {\n public anchorCfi: string | undefined\n public focusCfi: string | undefined\n public itemIndex?: number\n public color?: string\n public contents?: string[]\n public spineItemPageIndex?: number\n public absolutePageIndex?: number\n public range?: Range\n public lastSelectionText?: 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.anchorCfi = params.anchorCfi\n this.focusCfi = params.focusCfi\n this.itemIndex = params.itemIndex\n this.color = params.color\n this.contents = params.contents\n this.id = params.id\n this.lastSelectionText = params.lastSelectionText\n }\n\n toJSON(): SerializableHighlight {\n return {\n anchorCfi: this.anchorCfi,\n focusCfi: this.focusCfi,\n color: this.color,\n contents: this.contents,\n id: this.id,\n lastSelectionText: this.lastSelectionText,\n }\n }\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { Highlight } from \"./Highlight\"\n\nexport const consolidate = (highlight: Highlight, reader: Reader) => {\n const { itemIndex } = reader.cfi.parseCfi(highlight.anchorCfi ?? \"\")\n const spineItem = reader.spineItemsManager.get(itemIndex)\n const resolvedAnchorCfi = reader.cfi.resolveCfi({ cfi: highlight.anchorCfi ?? \"\" })\n const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.focusCfi ?? \"\" })\n\n if (!spineItem) return\n\n if (spineItem.item.renditionLayout === `pre-paginated`) {\n highlight.spineItemPageIndex = 0\n } else {\n if (resolvedAnchorCfi?.node) {\n highlight.spineItemPageIndex = reader.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(\n resolvedAnchorCfi.node,\n resolvedAnchorCfi.offset ?? 0,\n spineItem,\n )\n }\n }\n\n if (resolvedAnchorCfi?.node && resolvedFocusCfi?.node && spineItem.isReady) {\n const range = reader.selection.createRangeFromSelection({\n selection: {\n anchorNode: resolvedAnchorCfi.node,\n anchorOffset: resolvedAnchorCfi.offset ?? 0,\n focusNode: resolvedFocusCfi.node,\n focusOffset: resolvedFocusCfi.offset ?? 0,\n },\n spineItem,\n })\n\n highlight.range = range\n highlight.lastSelectionText = range?.toString()\n } else {\n highlight.range = undefined\n }\n\n if (highlight.spineItemPageIndex !== undefined) {\n highlight.absolutePageIndex = reader.spine.locator.getAbsolutePageIndexFromPageIndex({\n pageIndex: highlight.spineItemPageIndex,\n spineItemOrId: spineItem,\n })\n }\n}\n","import { Reader, waitForSwitch } from \"@prose-reader/core\"\nimport { BehaviorSubject, merge, takeUntil, tap, Observable, withLatestFrom, debounceTime } 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\"\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 const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject)\n\n const highlight$ = commands.highlight$.pipe(\n tap(({ data: { itemIndex, selection, ...rest } }) => {\n const item = reader.spineItemsManager.get(itemIndex)?.item\n\n if (!item) return\n\n const { anchorCfi, focusCfi } = reader.cfi.generateCfiFromSelection({ item, selection })\n\n const highlight = new Highlight({ anchorCfi, focusCfi, itemIndex, id: window.crypto.randomUUID(), ...rest })\n\n consolidate(highlight, reader)\n\n highlightsSubject.next([...highlightsSubject.getValue(), highlight])\n }),\n )\n\n const add$ = commands.add$.pipe(\n tap(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n highlightsSubject.next([\n ...highlightsSubject.getValue(),\n ...annotations.map((annotation) => {\n const { itemIndex } = reader.cfi.parseCfi(annotation.anchorCfi ?? \"\")\n\n const highlight = new Highlight({ ...annotation, itemIndex })\n\n consolidate(highlight, reader)\n\n return highlight\n }),\n ])\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\n .getValue()\n .map((highlight) => (highlight.id === id ? new Highlight({ ...highlight, ...data }) : highlight)),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const highlights$ = highlightsSubject.asObservable()\n\n /**\n * @todo consolidation should be more optimized\n */\n const highlightsConsolidation$ = reader.layout$.pipe(\n debounceTime(50),\n waitForSwitch(reader.viewportFree$),\n withLatestFrom(highlights$),\n tap(([, highlights]) => {\n highlights.forEach((highlight) => consolidate(highlight, reader))\n highlightsSubject.next(highlights)\n readerHighlights.layout()\n }),\n )\n\n merge(\n highlight$,\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 l = 0; l < e.length; l++) {\n let r = e[l];\n if (typeof r != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + r);\n r !== \"\" && (l > 0 && (r = r.replace(/^[/]+/, \"\")), l < e.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\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}\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}, R = ({ mimeType: e, uri: n }) => {\n const t = e ?? g(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, w = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, _ = \"prose-reader-resource-error\", E = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, m = (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), l = Object.keys(n);\n if (o.length !== l.length)\n return !1;\n const r = 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) || !r(e[u], n[u]))\n return !1;\n }\n return !0;\n}, O = (e, n) => e.reduce(\n (t, o) => {\n const l = n(o);\n return t[l] || (t[l] = []), t[l].push(o), t;\n },\n {}\n);\nfunction y(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const l = n[o];\n (l !== void 0 || !(o in e)) && (t[o] = l);\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}), $ = {\n ...p(),\n namespace: (e, n) => p(e, n)\n}, x = (e, n) => e.length === n.length && e.every((t, o) => t === n[o]);\nexport {\n _ as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n $ as Report,\n x as arrayEqual,\n g as detectMimeTypeFromName,\n f as getUrlExtension,\n O as groupBy,\n h as is,\n m as isShallowEqual,\n R as isXmlBasedMimeType,\n w as parseContentType,\n y 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, Reader } from \"@prose-reader/core\"\nimport { filter, ObservedValueOf, Subject } from \"rxjs\"\nimport { SerializableHighlight } from \"./types\"\n\ntype HighlightParams = ObservedValueOf<Reader[\"selection\"][\"selection$\"]> & { 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 anchorCfi: string | undefined\n public focusCfi: string | undefined\n public itemIndex?: number\n public color?: string\n public contents?: string[]\n public spineItemPageIndex?: number\n public absolutePageIndex?: number\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.anchorCfi = params.anchorCfi\n this.focusCfi = params.focusCfi\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 anchorCfi: this.anchorCfi,\n focusCfi: this.focusCfi,\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.anchorCfi ?? \"\")\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 resolvedAnchorCfi = reader.cfi.resolveCfi({ cfi: highlight.anchorCfi ?? \"\" })\n const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.focusCfi ?? \"\" })\n\n if (spineItem.item.renditionLayout === `pre-paginated`) {\n highlight.spineItemPageIndex = 0\n } else {\n if (resolvedAnchorCfi?.node) {\n highlight.spineItemPageIndex = reader.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(\n resolvedAnchorCfi.node,\n resolvedAnchorCfi.offset ?? 0,\n spineItem,\n )\n }\n }\n\n if (resolvedAnchorCfi?.node && resolvedFocusCfi?.node && isItemReady) {\n const range = reader.selection.createRangeFromSelection({\n selection: {\n anchorNode: resolvedAnchorCfi.node,\n anchorOffset: resolvedAnchorCfi.offset ?? 0,\n focusNode: resolvedFocusCfi.node,\n focusOffset: resolvedFocusCfi.offset ?? 0,\n },\n spineItem,\n })\n\n highlight.range = range\n highlight.selectionAsText = range?.toString()\n } else {\n highlight.range = undefined\n }\n\n if (highlight.spineItemPageIndex !== undefined) {\n highlight.absolutePageIndex = reader.spine.locator.getAbsolutePageIndexFromPageIndex({\n pageIndex: highlight.spineItemPageIndex,\n spineItemOrId: spineItem,\n })\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 combineLatest,\n filter,\n mergeMap,\n map,\n share,\n buffer,\n distinctUntilChanged,\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 const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject)\n\n const highlight$ = commands.highlight$.pipe(\n map(({ data: { itemIndex, selection, ...rest } }) => {\n const item = reader.spineItemsManager.get(itemIndex)?.item\n\n if (!item) return undefined\n\n const { anchorCfi, focusCfi } = reader.cfi.generateCfiFromSelection({ item, selection })\n\n const highlight = new Highlight({ anchorCfi, focusCfi, itemIndex, id: window.crypto.randomUUID(), ...rest })\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.anchorCfi ?? \"\")\n\n const highlight = new Highlight({ ...annotation, itemIndex })\n\n return highlight\n })\n\n highlightsSubject.next([...highlightsSubject.getValue(), ...addedHighlights])\n\n return addedHighlights.map((highlight) => highlight.id)\n }),\n share(),\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 highlights$ = highlightsSubject.asObservable().pipe(\n distinctUntilChanged()\n )\n\n const highlightsToConsolidate$ = merge(\n add$,\n highlight$,\n reader.layout$.pipe(map(() => highlightsSubject.value.map(({ id }) => id))),\n ).pipe(share())\n\n const highlightsConsolidation$ = highlightsToConsolidate$.pipe(\n buffer(highlightsToConsolidate$.pipe(debounceTime(100))),\n map((arrays) => {\n const ids = Array.from(new Set(arrays.flat()))\n\n return highlightsSubject.value.filter((highlight) => ids.includes(highlight.id))\n }),\n mergeMap((highlightsToConsolidate) => {\n report.debug(\"consolidating\", highlightsToConsolidate)\n\n return combineLatest(highlightsToConsolidate.map((highlight) => consolidate(highlight, reader)))\n }),\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 highlight$,\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,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@prose-reader/core'), require('rxjs')) :
3
- typeof define === 'function' && define.amd ? define(['exports', '@prose-reader/core', 'rxjs'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["prose-reader-enhancer-annotations"] = {}, global.core, global.rxjs));
5
- })(this, (function (exports, core, rxjs) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('@prose-reader/core'), require('reactjrx')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'rxjs', '@prose-reader/core', 'reactjrx'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["prose-reader-enhancer-annotations"] = {}, global.rxjs, global.core, global.reactjrx));
5
+ })(this, (function (exports, rxjs, core, reactjrx) { 'use strict';
6
6
 
7
7
  const c = "@prose-reader", i = (e) => `[${e}]`, p = (e, n) => ({
8
8
  debug: !n || (window == null ? void 0 : window.__PROSE_READER_DEBUG) !== !0 ? () => {
@@ -48,7 +48,7 @@
48
48
  rectElt.style.cssText = `
49
49
  height: 100%;
50
50
  width: 100%;
51
- opacity: 25%;
51
+ opacity: 40%;
52
52
  background-color: ${color}
53
53
  `;
54
54
  rectEltContainer.appendChild(rectElt);
@@ -218,7 +218,7 @@
218
218
  return !!this.getHighlightsForTarget(target).length;
219
219
  };
220
220
  layout() {
221
- this.spineItemHighlights.getValue().forEach((item) => item.layout());
221
+ this.spineItemHighlights.value.forEach((item) => item.layout());
222
222
  }
223
223
  }
224
224
 
@@ -259,7 +259,7 @@
259
259
  spineItemPageIndex;
260
260
  absolutePageIndex;
261
261
  range;
262
- lastSelectionText;
262
+ selectionAsText;
263
263
  /**
264
264
  * Unique local ID. This is to ensure unicity
265
265
  * for duplicate selections
@@ -272,7 +272,11 @@
272
272
  this.color = params.color;
273
273
  this.contents = params.contents;
274
274
  this.id = params.id;
275
- this.lastSelectionText = params.lastSelectionText;
275
+ this.selectionAsText = params.selectionAsText;
276
+ }
277
+ update(params) {
278
+ Object.assign(this, params);
279
+ return this;
276
280
  }
277
281
  toJSON() {
278
282
  return {
@@ -281,7 +285,7 @@
281
285
  color: this.color,
282
286
  contents: this.contents,
283
287
  id: this.id,
284
- lastSelectionText: this.lastSelectionText
288
+ selectionAsText: this.selectionAsText
285
289
  };
286
290
  }
287
291
  }
@@ -289,41 +293,47 @@
289
293
  const consolidate = (highlight, reader) => {
290
294
  const { itemIndex } = reader.cfi.parseCfi(highlight.anchorCfi ?? "");
291
295
  const spineItem = reader.spineItemsManager.get(itemIndex);
292
- const resolvedAnchorCfi = reader.cfi.resolveCfi({ cfi: highlight.anchorCfi ?? "" });
293
- const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.focusCfi ?? "" });
294
- if (!spineItem) return;
295
- if (spineItem.item.renditionLayout === `pre-paginated`) {
296
- highlight.spineItemPageIndex = 0;
297
- } else {
298
- if (resolvedAnchorCfi?.node) {
299
- highlight.spineItemPageIndex = reader.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(
300
- resolvedAnchorCfi.node,
301
- resolvedAnchorCfi.offset ?? 0,
302
- spineItem
303
- );
304
- }
305
- }
306
- if (resolvedAnchorCfi?.node && resolvedFocusCfi?.node && spineItem.isReady) {
307
- const range = reader.selection.createRangeFromSelection({
308
- selection: {
309
- anchorNode: resolvedAnchorCfi.node,
310
- anchorOffset: resolvedAnchorCfi.offset ?? 0,
311
- focusNode: resolvedFocusCfi.node,
312
- focusOffset: resolvedFocusCfi.offset ?? 0
313
- },
314
- spineItem
315
- });
316
- highlight.range = range;
317
- highlight.lastSelectionText = range?.toString();
318
- } else {
319
- highlight.range = void 0;
320
- }
321
- if (highlight.spineItemPageIndex !== void 0) {
322
- highlight.absolutePageIndex = reader.spine.locator.getAbsolutePageIndexFromPageIndex({
323
- pageIndex: highlight.spineItemPageIndex,
324
- spineItemOrId: spineItem
325
- });
326
- }
296
+ if (!spineItem) return rxjs.of(highlight);
297
+ return rxjs.of(highlight).pipe(
298
+ rxjs.withLatestFrom(spineItem.isReady$),
299
+ rxjs.tap(([, isItemReady]) => {
300
+ const resolvedAnchorCfi = reader.cfi.resolveCfi({ cfi: highlight.anchorCfi ?? "" });
301
+ const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.focusCfi ?? "" });
302
+ if (spineItem.item.renditionLayout === `pre-paginated`) {
303
+ highlight.spineItemPageIndex = 0;
304
+ } else {
305
+ if (resolvedAnchorCfi?.node) {
306
+ highlight.spineItemPageIndex = reader.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(
307
+ resolvedAnchorCfi.node,
308
+ resolvedAnchorCfi.offset ?? 0,
309
+ spineItem
310
+ );
311
+ }
312
+ }
313
+ if (resolvedAnchorCfi?.node && resolvedFocusCfi?.node && isItemReady) {
314
+ const range = reader.selection.createRangeFromSelection({
315
+ selection: {
316
+ anchorNode: resolvedAnchorCfi.node,
317
+ anchorOffset: resolvedAnchorCfi.offset ?? 0,
318
+ focusNode: resolvedFocusCfi.node,
319
+ focusOffset: resolvedFocusCfi.offset ?? 0
320
+ },
321
+ spineItem
322
+ });
323
+ highlight.range = range;
324
+ highlight.selectionAsText = range?.toString();
325
+ } else {
326
+ highlight.range = void 0;
327
+ }
328
+ if (highlight.spineItemPageIndex !== void 0) {
329
+ highlight.absolutePageIndex = reader.spine.locator.getAbsolutePageIndexFromPageIndex({
330
+ pageIndex: highlight.spineItemPageIndex,
331
+ spineItemOrId: spineItem
332
+ });
333
+ }
334
+ }),
335
+ rxjs.map(() => highlight)
336
+ );
327
337
  };
328
338
 
329
339
  const annotationsEnhancer = (next) => (options) => {
@@ -333,28 +343,29 @@
333
343
  const selectedHighlightSubject = new rxjs.BehaviorSubject(void 0);
334
344
  const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject);
335
345
  const highlight$ = commands.highlight$.pipe(
336
- rxjs.tap(({ data: { itemIndex, selection, ...rest } }) => {
346
+ rxjs.map(({ data: { itemIndex, selection, ...rest } }) => {
337
347
  const item = reader.spineItemsManager.get(itemIndex)?.item;
338
- if (!item) return;
348
+ if (!item) return void 0;
339
349
  const { anchorCfi, focusCfi } = reader.cfi.generateCfiFromSelection({ item, selection });
340
350
  const highlight = new Highlight({ anchorCfi, focusCfi, itemIndex, id: window.crypto.randomUUID(), ...rest });
341
- consolidate(highlight, reader);
342
351
  highlightsSubject.next([...highlightsSubject.getValue(), highlight]);
343
- })
352
+ return [highlight.id];
353
+ }),
354
+ rxjs.filter(reactjrx.isDefined),
355
+ rxjs.share()
344
356
  );
345
357
  const add$ = commands.add$.pipe(
346
- rxjs.tap(({ data }) => {
358
+ rxjs.map(({ data }) => {
347
359
  const annotations = Array.isArray(data) ? data : [data];
348
- highlightsSubject.next([
349
- ...highlightsSubject.getValue(),
350
- ...annotations.map((annotation) => {
351
- const { itemIndex } = reader.cfi.parseCfi(annotation.anchorCfi ?? "");
352
- const highlight = new Highlight({ ...annotation, itemIndex });
353
- consolidate(highlight, reader);
354
- return highlight;
355
- })
356
- ]);
357
- })
360
+ const addedHighlights = annotations.map((annotation) => {
361
+ const { itemIndex } = reader.cfi.parseCfi(annotation.anchorCfi ?? "");
362
+ const highlight = new Highlight({ ...annotation, itemIndex });
363
+ return highlight;
364
+ });
365
+ highlightsSubject.next([...highlightsSubject.getValue(), ...addedHighlights]);
366
+ return addedHighlights.map((highlight) => highlight.id);
367
+ }),
368
+ rxjs.share()
358
369
  );
359
370
  const delete$ = commands.delete$.pipe(
360
371
  rxjs.tap(({ id }) => {
@@ -364,7 +375,9 @@
364
375
  const update$ = commands.update$.pipe(
365
376
  rxjs.tap(({ id, data }) => {
366
377
  highlightsSubject.next(
367
- highlightsSubject.getValue().map((highlight) => highlight.id === id ? new Highlight({ ...highlight, ...data }) : highlight)
378
+ highlightsSubject.getValue().map((highlight) => {
379
+ return highlight.id === id ? highlight.update(data) : highlight;
380
+ })
368
381
  );
369
382
  })
370
383
  );
@@ -373,14 +386,29 @@
373
386
  selectedHighlightSubject.next(id);
374
387
  })
375
388
  );
376
- const highlights$ = highlightsSubject.asObservable();
377
- const highlightsConsolidation$ = reader.layout$.pipe(
378
- rxjs.debounceTime(50),
379
- core.waitForSwitch(reader.viewportFree$),
380
- rxjs.withLatestFrom(highlights$),
381
- rxjs.tap(([, highlights]) => {
382
- highlights.forEach((highlight) => consolidate(highlight, reader));
383
- highlightsSubject.next(highlights);
389
+ const highlights$ = highlightsSubject.asObservable().pipe(
390
+ rxjs.distinctUntilChanged()
391
+ );
392
+ const highlightsToConsolidate$ = rxjs.merge(
393
+ add$,
394
+ highlight$,
395
+ reader.layout$.pipe(rxjs.map(() => highlightsSubject.value.map(({ id }) => id)))
396
+ ).pipe(rxjs.share());
397
+ const highlightsConsolidation$ = highlightsToConsolidate$.pipe(
398
+ rxjs.buffer(highlightsToConsolidate$.pipe(rxjs.debounceTime(100))),
399
+ rxjs.map((arrays) => {
400
+ const ids = Array.from(new Set(arrays.flat()));
401
+ return highlightsSubject.value.filter((highlight) => ids.includes(highlight.id));
402
+ }),
403
+ rxjs.mergeMap((highlightsToConsolidate) => {
404
+ report.debug("consolidating", highlightsToConsolidate);
405
+ return rxjs.combineLatest(highlightsToConsolidate.map((highlight) => consolidate(highlight, reader)));
406
+ }),
407
+ rxjs.tap((consolidatedHighlights) => {
408
+ const consolidatedExistingHighlights = highlightsSubject.value.map(
409
+ (highlight) => consolidatedHighlights.find((c) => c.id === highlight.id) ?? highlight
410
+ );
411
+ highlightsSubject.next(consolidatedExistingHighlights);
384
412
  readerHighlights.layout();
385
413
  })
386
414
  );
@@ -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 l = 0; l < e.length; l++) {\n let r = e[l];\n if (typeof r != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + r);\n r !== \"\" && (l > 0 && (r = r.replace(/^[/]+/, \"\")), l < e.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\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}\nconst E = (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}, R = ({ mimeType: e, uri: n }) => {\n const t = e ?? E(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, w = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, _ = \"prose-reader-resource-error\", g = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, m = (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), l = Object.keys(n);\n if (o.length !== l.length)\n return !1;\n const r = t && typeof t.customEqual == \"function\" ? t.customEqual : h;\n for (let s = 0; s < o.length; s++) {\n const u = o[s] || \"\";\n if (!g.call(n, u) || !r(e[u], n[u]))\n return !1;\n }\n return !0;\n}, O = (e, n) => e.reduce(\n (t, o) => {\n const l = n(o);\n return t[l] || (t[l] = []), t[l].push(o), t;\n },\n {}\n);\nfunction y(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const l = n[o];\n (l !== void 0 || !(o in e)) && (t[o] = l);\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}), $ = {\n ...p(),\n namespace: (e, n) => p(e, n)\n};\nexport {\n _ as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n $ as Report,\n E as detectMimeTypeFromName,\n f as getUrlExtension,\n O as groupBy,\n h as is,\n m as isShallowEqual,\n R as isXmlBasedMimeType,\n w as parseContentType,\n y 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: 25%;\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.getValue().forEach((item) => item.layout())\n }\n}\n","import { DestroyableClass, Reader } from \"@prose-reader/core\"\nimport { filter, ObservedValueOf, Subject } from \"rxjs\"\nimport { SerializableHighlight } from \"./types\"\n\ntype HighlightParams = ObservedValueOf<Reader[\"selection\"][\"selection$\"]> & { 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 { SerializableHighlight } from \"../types\"\n\nexport class Highlight {\n public anchorCfi: string | undefined\n public focusCfi: string | undefined\n public itemIndex?: number\n public color?: string\n public contents?: string[]\n public spineItemPageIndex?: number\n public absolutePageIndex?: number\n public range?: Range\n public lastSelectionText?: 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.anchorCfi = params.anchorCfi\n this.focusCfi = params.focusCfi\n this.itemIndex = params.itemIndex\n this.color = params.color\n this.contents = params.contents\n this.id = params.id\n this.lastSelectionText = params.lastSelectionText\n }\n\n toJSON(): SerializableHighlight {\n return {\n anchorCfi: this.anchorCfi,\n focusCfi: this.focusCfi,\n color: this.color,\n contents: this.contents,\n id: this.id,\n lastSelectionText: this.lastSelectionText,\n }\n }\n}\n","import { Reader } from \"@prose-reader/core\"\nimport { Highlight } from \"./Highlight\"\n\nexport const consolidate = (highlight: Highlight, reader: Reader) => {\n const { itemIndex } = reader.cfi.parseCfi(highlight.anchorCfi ?? \"\")\n const spineItem = reader.spineItemsManager.get(itemIndex)\n const resolvedAnchorCfi = reader.cfi.resolveCfi({ cfi: highlight.anchorCfi ?? \"\" })\n const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.focusCfi ?? \"\" })\n\n if (!spineItem) return\n\n if (spineItem.item.renditionLayout === `pre-paginated`) {\n highlight.spineItemPageIndex = 0\n } else {\n if (resolvedAnchorCfi?.node) {\n highlight.spineItemPageIndex = reader.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(\n resolvedAnchorCfi.node,\n resolvedAnchorCfi.offset ?? 0,\n spineItem,\n )\n }\n }\n\n if (resolvedAnchorCfi?.node && resolvedFocusCfi?.node && spineItem.isReady) {\n const range = reader.selection.createRangeFromSelection({\n selection: {\n anchorNode: resolvedAnchorCfi.node,\n anchorOffset: resolvedAnchorCfi.offset ?? 0,\n focusNode: resolvedFocusCfi.node,\n focusOffset: resolvedFocusCfi.offset ?? 0,\n },\n spineItem,\n })\n\n highlight.range = range\n highlight.lastSelectionText = range?.toString()\n } else {\n highlight.range = undefined\n }\n\n if (highlight.spineItemPageIndex !== undefined) {\n highlight.absolutePageIndex = reader.spine.locator.getAbsolutePageIndexFromPageIndex({\n pageIndex: highlight.spineItemPageIndex,\n spineItemOrId: spineItem,\n })\n }\n}\n","import { Reader, waitForSwitch } from \"@prose-reader/core\"\nimport { BehaviorSubject, merge, takeUntil, tap, Observable, withLatestFrom, debounceTime } 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\"\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 const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject)\n\n const highlight$ = commands.highlight$.pipe(\n tap(({ data: { itemIndex, selection, ...rest } }) => {\n const item = reader.spineItemsManager.get(itemIndex)?.item\n\n if (!item) return\n\n const { anchorCfi, focusCfi } = reader.cfi.generateCfiFromSelection({ item, selection })\n\n const highlight = new Highlight({ anchorCfi, focusCfi, itemIndex, id: window.crypto.randomUUID(), ...rest })\n\n consolidate(highlight, reader)\n\n highlightsSubject.next([...highlightsSubject.getValue(), highlight])\n }),\n )\n\n const add$ = commands.add$.pipe(\n tap(({ data }) => {\n const annotations = Array.isArray(data) ? data : [data]\n\n highlightsSubject.next([\n ...highlightsSubject.getValue(),\n ...annotations.map((annotation) => {\n const { itemIndex } = reader.cfi.parseCfi(annotation.anchorCfi ?? \"\")\n\n const highlight = new Highlight({ ...annotation, itemIndex })\n\n consolidate(highlight, reader)\n\n return highlight\n }),\n ])\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\n .getValue()\n .map((highlight) => (highlight.id === id ? new Highlight({ ...highlight, ...data }) : highlight)),\n )\n }),\n )\n\n const select$ = commands.select$.pipe(\n tap(({ id }) => {\n selectedHighlightSubject.next(id)\n }),\n )\n\n const highlights$ = highlightsSubject.asObservable()\n\n /**\n * @todo consolidation should be more optimized\n */\n const highlightsConsolidation$ = reader.layout$.pipe(\n debounceTime(50),\n waitForSwitch(reader.viewportFree$),\n withLatestFrom(highlights$),\n tap(([, highlights]) => {\n highlights.forEach((highlight) => consolidate(highlight, reader))\n highlightsSubject.next(highlights)\n readerHighlights.layout()\n }),\n )\n\n merge(\n highlight$,\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","debounceTime","waitForSwitch","withLatestFrom"],"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 l = 0; l < e.length; l++) {\n let r = e[l];\n if (typeof r != \"string\")\n throw new TypeError(\"Url must be a string. Received \" + r);\n r !== \"\" && (l > 0 && (r = r.replace(/^[/]+/, \"\")), l < e.length - 1 ? r = r.replace(/[/]+$/, \"\") : r = r.replace(/[/]+$/, \"/\"), n.push(r));\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}\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}, R = ({ mimeType: e, uri: n }) => {\n const t = e ?? g(n ?? \"\");\n return t == null ? void 0 : t.startsWith(\"application/xhtml+xml\");\n}, w = (e) => e.length ? e.indexOf(\";\") ? e.substring(0, e.indexOf(\";\")) : e : void 0, _ = \"prose-reader-resource-error\", E = Object.prototype.hasOwnProperty, h = (e, n) => e === n ? e !== 0 || n !== 0 || 1 / e === 1 / n : !1, m = (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), l = Object.keys(n);\n if (o.length !== l.length)\n return !1;\n const r = 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) || !r(e[u], n[u]))\n return !1;\n }\n return !0;\n}, O = (e, n) => e.reduce(\n (t, o) => {\n const l = n(o);\n return t[l] || (t[l] = []), t[l].push(o), t;\n },\n {}\n);\nfunction y(e, n) {\n const t = { ...e };\n for (const o in n)\n if (Object.prototype.hasOwnProperty.call(n, o)) {\n const l = n[o];\n (l !== void 0 || !(o in e)) && (t[o] = l);\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}), $ = {\n ...p(),\n namespace: (e, n) => p(e, n)\n}, x = (e, n) => e.length === n.length && e.every((t, o) => t === n[o]);\nexport {\n _ as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n $ as Report,\n x as arrayEqual,\n g as detectMimeTypeFromName,\n f as getUrlExtension,\n O as groupBy,\n h as is,\n m as isShallowEqual,\n R as isXmlBasedMimeType,\n w as parseContentType,\n y 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, Reader } from \"@prose-reader/core\"\nimport { filter, ObservedValueOf, Subject } from \"rxjs\"\nimport { SerializableHighlight } from \"./types\"\n\ntype HighlightParams = ObservedValueOf<Reader[\"selection\"][\"selection$\"]> & { 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 anchorCfi: string | undefined\n public focusCfi: string | undefined\n public itemIndex?: number\n public color?: string\n public contents?: string[]\n public spineItemPageIndex?: number\n public absolutePageIndex?: number\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.anchorCfi = params.anchorCfi\n this.focusCfi = params.focusCfi\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 anchorCfi: this.anchorCfi,\n focusCfi: this.focusCfi,\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.anchorCfi ?? \"\")\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 resolvedAnchorCfi = reader.cfi.resolveCfi({ cfi: highlight.anchorCfi ?? \"\" })\n const resolvedFocusCfi = reader.cfi.resolveCfi({ cfi: highlight.focusCfi ?? \"\" })\n\n if (spineItem.item.renditionLayout === `pre-paginated`) {\n highlight.spineItemPageIndex = 0\n } else {\n if (resolvedAnchorCfi?.node) {\n highlight.spineItemPageIndex = reader.spine.locator.spineItemLocator.getSpineItemPageIndexFromNode(\n resolvedAnchorCfi.node,\n resolvedAnchorCfi.offset ?? 0,\n spineItem,\n )\n }\n }\n\n if (resolvedAnchorCfi?.node && resolvedFocusCfi?.node && isItemReady) {\n const range = reader.selection.createRangeFromSelection({\n selection: {\n anchorNode: resolvedAnchorCfi.node,\n anchorOffset: resolvedAnchorCfi.offset ?? 0,\n focusNode: resolvedFocusCfi.node,\n focusOffset: resolvedFocusCfi.offset ?? 0,\n },\n spineItem,\n })\n\n highlight.range = range\n highlight.selectionAsText = range?.toString()\n } else {\n highlight.range = undefined\n }\n\n if (highlight.spineItemPageIndex !== undefined) {\n highlight.absolutePageIndex = reader.spine.locator.getAbsolutePageIndexFromPageIndex({\n pageIndex: highlight.spineItemPageIndex,\n spineItemOrId: spineItem,\n })\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 combineLatest,\n filter,\n mergeMap,\n map,\n share,\n buffer,\n distinctUntilChanged,\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 const readerHighlights = new ReaderHighlights(reader, highlightsSubject, selectedHighlightSubject)\n\n const highlight$ = commands.highlight$.pipe(\n map(({ data: { itemIndex, selection, ...rest } }) => {\n const item = reader.spineItemsManager.get(itemIndex)?.item\n\n if (!item) return undefined\n\n const { anchorCfi, focusCfi } = reader.cfi.generateCfiFromSelection({ item, selection })\n\n const highlight = new Highlight({ anchorCfi, focusCfi, itemIndex, id: window.crypto.randomUUID(), ...rest })\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.anchorCfi ?? \"\")\n\n const highlight = new Highlight({ ...annotation, itemIndex })\n\n return highlight\n })\n\n highlightsSubject.next([...highlightsSubject.getValue(), ...addedHighlights])\n\n return addedHighlights.map((highlight) => highlight.id)\n }),\n share(),\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 highlights$ = highlightsSubject.asObservable().pipe(\n distinctUntilChanged()\n )\n\n const highlightsToConsolidate$ = merge(\n add$,\n highlight$,\n reader.layout$.pipe(map(() => highlightsSubject.value.map(({ id }) => id))),\n ).pipe(share())\n\n const highlightsConsolidation$ = highlightsToConsolidate$.pipe(\n buffer(highlightsToConsolidate$.pipe(debounceTime(100))),\n map((arrays) => {\n const ids = Array.from(new Set(arrays.flat()))\n\n return highlightsSubject.value.filter((highlight) => ids.includes(highlight.id))\n }),\n mergeMap((highlightsToConsolidate) => {\n report.debug(\"consolidating\", highlightsToConsolidate)\n\n return combineLatest(highlightsToConsolidate.map((highlight) => consolidate(highlight, reader)))\n }),\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 highlight$,\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","buffer","debounceTime","mergeMap","combineLatest"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -6,7 +6,7 @@ export type SerializableHighlight = {
6
6
  /**
7
7
  * Not required, only used for display purposes
8
8
  */
9
- lastSelectionText?: string;
9
+ selectionAsText?: string;
10
10
  /**
11
11
  * Unique local ID. This is to ensure unicity
12
12
  * for duplicate selections
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/enhancer-annotations",
3
- "version": "1.126.0",
3
+ "version": "1.128.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.umd.cjs",
6
6
  "module": "./dist/index.js",
@@ -23,5 +23,5 @@
23
23
  "peerDependencies": {
24
24
  "@prose-reader/core": "^1.117.0"
25
25
  },
26
- "gitHead": "f17c8db176c5f917d91776aeb1e6f31f99abd0b7"
26
+ "gitHead": "019a6db06a80e8bb22e99e247144dd9b7ae74ac6"
27
27
  }