@prose-reader/enhancer-annotations 1.322.0 → 1.323.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 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/annotations/utils.ts","../src/annotations/SpineItemHighlight.ts","../src/annotations/SpineItemHighlights.ts","../src/annotations/ReaderHighlights.ts","../../shared/dist/index.js","../package.json","../src/report.ts","../src/Settings.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["import {\n setPropertyIfChanged,\n setStylePropertyIfChanged,\n} from \"@prose-reader/core\"\n\nexport const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n setPropertyIfChanged(target.style, `cssText`, source.style.cssText)\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n setStylePropertyIfChanged(annotationLayer.style, `position`, `absolute`)\n setStylePropertyIfChanged(annotationLayer.style, `top`, `0`)\n }\n\n // annotationLayer.style.backgroundColor = \"red\"\n setStylePropertyIfChanged(annotationLayer.style, `opacity`, `1`)\n setStylePropertyIfChanged(annotationLayer.style, `pointer-events`, `none`)\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n setStylePropertyIfChanged,\n} from \"@prose-reader/core\"\nimport {\n first,\n fromEvent,\n map,\n merge,\n type Observable,\n share,\n shareReplay,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createElementForRange } from \"./utils\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n public readonly tap$: Observable<{\n event: Event\n highlight: RuntimeAnnotation\n }>\n private resolvedCfi$: Observable<ReturnType<Reader[\"cfi\"][\"resolveCfi\"]>>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public highlight: RuntimeAnnotation,\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.resolvedCfi$ = this.spineItem.watch(\"isLoaded\").pipe(\n map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const updateStateOnSelection$ = this.isSelected.pipe(\n tap((isSelected) => {\n this.updateStateOnSelection(isSelected)\n }),\n )\n\n merge(this.resolvedCfi$, updateStateOnSelection$)\n .pipe(takeUntil(this.destroy$))\n .subscribe()\n }\n\n public updateStateOnSelection(isSelected: boolean) {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n setStylePropertyIfChanged(\n child.style,\n `border`,\n isSelected ? \"3px dashed red\" : \"3px dashed transparent\",\n )\n }\n })\n }\n\n public render() {\n return this.resolvedCfi$.pipe(\n first(),\n withLatestFrom(this.isSelected),\n map(([resolvedCfi, isSelected]) => {\n if (!resolvedCfi?.isCfiRange) return undefined\n\n const range = resolvedCfi.range\n\n this.container.innerHTML = \"\"\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.highlightColor ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.notes) {\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 this.updateStateOnSelection(isSelected)\n\n return null\n }),\n )\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n defaultIfEmpty,\n distinctUntilChanged,\n forkJoin,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\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 annotations$: Observable<RuntimeAnnotation[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n const newAnnotations = annotations.filter(\n (annotation) =>\n !this.highlights.some(\n (highlight) => highlight.highlight.id === annotation.id,\n ),\n )\n const oldAnnotations = this.highlights.filter(\n (highlight) =>\n highlight.highlight.itemIndex !== this.spineItem.item.index,\n )\n\n this.highlights.forEach((highlight, index) => {\n const existingAnnotation = annotations.find(\n (annotation) => annotation.id === highlight.highlight.id,\n )\n\n if (oldAnnotations.includes(highlight)) {\n highlight.destroy()\n this.highlights = this.highlights.splice(index, 1)\n }\n\n if (existingAnnotation) {\n highlight.highlight = existingAnnotation\n }\n })\n\n newAnnotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n annotations$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n return forkJoin(\n this.highlights.map((highlight) => highlight.render()),\n ).pipe(defaultIfEmpty(null))\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n defaultIfEmpty,\n forkJoin,\n map,\n merge,\n type Observable,\n switchMap,\n} from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { RuntimeAnnotation } from \"./types\"\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: Observable<RuntimeAnnotation[]>,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const cleanupByItemId = new Map<string, () => void>()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n async ({ itemId }) => {\n cleanupByItemId.get(itemId)?.()\n cleanupByItemId.delete(itemId)\n\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n const cleanup = () => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n }\n\n cleanupByItemId.set(itemId, cleanup)\n },\n )\n\n this.reader.hookManager.register(\n \"item.onDocumentUnload\",\n async ({ itemId }) => {\n cleanupByItemId.get(itemId)?.()\n cleanupByItemId.delete(itemId)\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n\n public layout() {\n return forkJoin(\n this.spineItemHighlights.value.map((item) => item.layout()),\n ).pipe(defaultIfEmpty(null))\n }\n}\n","//#region src/array.ts\nvar e = (e, t) => e === t || e.length === t.length && e.every((e, n) => e === t[n]), t = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction n(e) {\n\tlet t = [];\n\tif (e.length === 0) return \"\";\n\tif (typeof e[0] != \"string\") throw TypeError(`Url must be a string. Received ${e[0]}`);\n\te[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\tfor (let n = 0; n < e.length; n++) {\n\t\tlet r = e[n];\n\t\tif (typeof r != \"string\") throw TypeError(`Url must be a string. Received ${r}`);\n\t\tr !== \"\" && (n > 0 && (r = r.replace(/^[/]+/, \"\")), r = n < e.length - 1 ? r.replace(/[/]+$/, \"\") : r.replace(/[/]+$/, \"/\"), t.push(r));\n\t}\n\tlet n = t.join(\"/\");\n\tn = n.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n\tlet r = n.split(\"?\");\n\treturn n = r.shift() + (r.length > 0 ? \"?\" : \"\") + r.join(\"&\"), n;\n}\nfunction r(...e) {\n\treturn n(Array.from(Array.isArray(e[0]) ? e[0] : e));\n}\nfunction i(e) {\n\tlet t = e.split(\"/\");\n\treturn t.pop(), t.join(\"/\");\n}\n//#endregion\n//#region src/contentType.ts\nvar a = (e) => {\n\tswitch (t(e)) {\n\t\tcase \"png\": return \"image/png\";\n\t\tcase \"jpg\": return \"image/jpg\";\n\t\tcase \"jpeg\": return \"image/jpeg\";\n\t\tcase \"txt\": return \"text/plain\";\n\t\tcase \"webp\": return \"image/webp\";\n\t\tcase \"xhtml\": return \"application/xhtml+xml\";\n\t\tcase \"mp3\": return \"audio/mpeg\";\n\t\tcase \"m4a\":\n\t\tcase \"m4b\": return \"audio/mp4\";\n\t\tcase \"aac\": return \"audio/aac\";\n\t\tcase \"ogg\":\n\t\tcase \"oga\": return \"audio/ogg\";\n\t\tcase \"wav\": return \"audio/wav\";\n\t\tcase \"flac\": return \"audio/flac\";\n\t\tcase \"opus\": return \"audio/opus\";\n\t}\n}, o = ({ mimeType: e, uri: t }) => (e ?? a(t ?? \"\"))?.startsWith(\"application/xhtml+xml\"), s = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), c = (e) => {\n\tif (!e.length) return;\n\tlet t = e.indexOf(\";\");\n\treturn t >= 0 ? e.substring(0, t) : e;\n}, l = /^[A-Za-z0-9_][A-Za-z0-9_.-]*$/, u = /^[A-Za-z0-9_]/, d = /^xml/i, f = /[^A-Za-z0-9_.-]+/g, p = \"_\", m = (e) => e.replace(/^_+|_+$/g, \"\"), h = (e) => m(e.trim().replaceAll(\"/\", \"_\").replace(f, \"_\")), g = (e) => {\n\tif (l.test(e) && !d.test(e)) return e;\n\tlet t = h(e), n = t && !d.test(t) ? t : `${p}${t}`;\n\treturn u.test(n) ? n : `${p}${n}`;\n}, _ = (e, t) => {\n\tlet n = g(e);\n\tif (!t.has(n)) return t.add(n), n;\n\tlet r = 2, i = `${n}-${r}`;\n\tfor (; t.has(i);) r += 1, i = `${n}-${r}`;\n\treturn t.add(i), i;\n}, v = () => {\n\tlet e = /* @__PURE__ */ new Set();\n\treturn (t) => _(t, e);\n}, y = (e) => {\n\tlet t = e.pageSpreadLeft === !0;\n\tif (t !== (e.pageSpreadRight === !0)) return t ? \"left\" : \"right\";\n}, b = (e, t, n) => {\n\tif (Object.is(e, t)) return !0;\n\tif (typeof e != \"object\" || !e || typeof t != \"object\" || !t) return !1;\n\tlet r = Object.keys(e), i = Object.keys(t);\n\tif (r.length !== i.length) return !1;\n\tlet a = n?.customEqual ?? Object.is, o = e, s = t;\n\tfor (let e of r) if (!Object.hasOwn(s, e) || !a(o[e], s[e])) return !1;\n\treturn !0;\n}, x = (e, t) => e.reduce((e, n) => {\n\tlet r = t(n);\n\treturn e[r] || (e[r] = []), e[r].push(n), e;\n}, {});\nfunction S(e, t) {\n\tlet n = { ...e };\n\tfor (let r in t) if (Object.hasOwn(t, r)) {\n\t\tlet i = t[r];\n\t\t(i !== void 0 || !(r in e)) && (n[r] = i);\n\t}\n\treturn n;\n}\n//#endregion\n//#region src/report.ts\nfunction C() {\n\tlet e = globalThis.__PROSE_READER_DEBUG;\n\treturn e === !0 || e === \"true\";\n}\nvar w = (e, t) => typeof e == \"boolean\" ? {\n\tenabled: e,\n\toptions: t\n} : {\n\tenabled: e?.enabled,\n\toptions: e ?? t\n}, T = (e) => e.at(-1)?.color, E = (e) => {\n\tif (!e.length) return;\n\tif (!e.some((e) => e.color)) return [e.map((e) => e.label).join(\" \")];\n\tlet t = \"\", n = [];\n\tfor (let r of e) t += `%c${t ? ` ${r.label}` : r.label}`, n.push(r.color ? `color: ${r.color}` : \"\");\n\treturn [t, ...n];\n}, D = (e = [], t = C()) => {\n\tlet n = t, r = {\n\t\tenable: (e) => {\n\t\t\ta(e);\n\t\t},\n\t\tnamespace: (t, r, i) => {\n\t\t\tlet a = w(r, i), o = a.options?.color ?? T(e);\n\t\t\treturn D([...e, {\n\t\t\t\tlabel: `[${t}]`,\n\t\t\t\tcolor: o\n\t\t\t}], a.enabled ?? n);\n\t\t},\n\t\tisEnabled: () => n,\n\t\tdebug: () => {},\n\t\tinfo: () => {},\n\t\tlog: () => {},\n\t\tgroupCollapsed: () => {},\n\t\tgroupEnd: () => {},\n\t\tgetGroupArgs: (t) => {\n\t\t\tlet n = E(e);\n\t\t\tif (!n) return [t];\n\t\t\tlet [r, ...i] = n;\n\t\t\treturn [`${r} ${t}`, ...i];\n\t\t},\n\t\twarn: () => {},\n\t\terror: () => {}\n\t}, i = (t) => {\n\t\tif (!t) {\n\t\t\tr.debug = () => {}, r.info = () => {}, r.log = () => {}, r.groupCollapsed = () => {}, r.groupEnd = () => {}, r.warn = () => {}, r.error = () => {};\n\t\t\treturn;\n\t\t}\n\t\tlet n = E(e) ?? [];\n\t\tr.debug = Function.prototype.bind.call(console.debug, console, ...n), r.info = Function.prototype.bind.call(console.info, console, ...n), r.log = Function.prototype.bind.call(console.log, console, ...n), r.groupCollapsed = Function.prototype.bind.call(console.groupCollapsed, console), r.groupEnd = Function.prototype.bind.call(console.groupEnd, console), r.warn = Function.prototype.bind.call(console.warn, console, ...n), r.error = Function.prototype.bind.call(console.error, console, ...n);\n\t}, a = (e) => {\n\t\tn !== e && (n = e, i(n));\n\t};\n\treturn i(n), r;\n}, O = D(), k = \"prose-reader-resource-error\", A = (e, t) => {\n\tlet n = e.split(/(\\d+)/), r = t.split(/(\\d+)/);\n\tfor (let e = 0, t = n.length; e < t; e++) if (n[e] !== r[e]) return n[e]?.match(/\\d/) ? (n[e] || \"\") - +(r[e] || \"\") : (n[e] || \"\").localeCompare(r[e] || \"\");\n\treturn 1;\n}, j = (e) => e.endsWith(\"/\") ? e.slice(0, -1) : e, M = (e) => {\n\tlet t = j(e);\n\treturn t.substring(t.lastIndexOf(\"/\") + 1) || t;\n}, N = (e) => {\n\tlet t = e.lastIndexOf(\"/\");\n\treturn t >= 0 ? e.substring(0, t) : \"\";\n}, P = (e) => e.replaceAll(\"&\", \"&amp;\").replaceAll(\"\\\"\", \"&quot;\").replaceAll(\"'\", \"&apos;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n//#endregion\nexport { k as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME, O as Report, e as arrayEqual, _ as createUniqueXmlSafeId, g as createXmlSafeId, v as createXmlSafeIdFactory, a as detectMimeTypeFromName, P as escapeXmlAttributeValue, y as getItemSpreadPosition, i as getParentPath, N as getUriBasePath, M as getUriBasename, t as getUrlExtension, x as groupBy, s as isMediaContentMimeType, b as isShallowEqual, o as isXmlBasedMimeType, c as parseContentType, j as removeTrailingSlash, S as shallowMergeIfDefined, A as sortByTitleComparator, r as urlJoin };\n\n//# sourceMappingURL=index.js.map","{\n \"name\": \"@prose-reader/enhancer-annotations\",\n \"version\": \"1.321.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"/dist\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"scripts\": {\n \"start\": \"vite build --watch --mode development\",\n \"build\": \"tsc && vite build\"\n },\n \"peerDependencies\": {\n \"@prose-reader/core\": \"^1.117.0\"\n }\n}\n","import { Report } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(name, IS_DEBUG_ENABLED)\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerOptions } from \"./types\"\n\nexport class Settings extends ReactiveEntity<AnnotationsEnhancerOptions> {\n update(settings: AnnotationsEnhancerOptions) {\n super.mergeCompare(settings)\n }\n}\n","import { isShallowEqual, type Reader } from \"@prose-reader/core\"\nimport {\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n NEVER,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport { ReaderHighlights } from \"./annotations/ReaderHighlights\"\nimport type { RuntimeAnnotation } from \"./annotations/types\"\nimport { report } from \"./report\"\nimport { Settings } from \"./Settings\"\nimport type {\n AnnotateAbsolutePageParams,\n AnnotateParams,\n AnnotationsEnhancerAPI,\n AnnotationsEnhancerOptions,\n} from \"./types\"\n\nexport type { AnnotationsEnhancerAPI }\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & { annotations?: AnnotationsEnhancerOptions },\n ): InheritOutput & AnnotationsEnhancerAPI => {\n const { annotations: annotationsOptions, ...rest } = options\n const settings = new Settings({\n annotations$: annotationsOptions?.annotations$,\n })\n const reader = next(rest as InheritOptions)\n\n const annotations$ = settings\n .watch(\"annotations$\")\n .pipe(switchMap((annotations) => annotations ?? NEVER))\n\n const runtimeAnnotations$ = annotations$.pipe(\n distinctUntilChanged(isShallowEqual),\n map((annotations) => {\n const runtimeAnnotations: RuntimeAnnotation[] = annotations.map(\n (annotation) => {\n const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = {\n ...annotation,\n itemIndex,\n } satisfies RuntimeAnnotation\n\n return highlight\n },\n )\n\n return runtimeAnnotations\n }),\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n shareReplay({\n refCount: true,\n bufferSize: 1,\n }),\n )\n\n const selectedHighlight$ = runtimeAnnotations$.pipe(\n map(\n (annotations) =>\n annotations.find((annotation) => annotation.selected)?.id,\n ),\n distinctUntilChanged(),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const readerHighlights = new ReaderHighlights(\n reader,\n runtimeAnnotations$,\n selectedHighlight$,\n )\n\n const resolveItemInformation = (params: {\n absolutePageIndex?: number\n itemIndex?: number\n }) => {\n if (params.itemIndex !== undefined)\n return { itemIndex: params.itemIndex, pageIndex: undefined }\n\n if (params.absolutePageIndex !== undefined) {\n return reader.spine.pages.fromAbsolutePageIndex(\n params.absolutePageIndex,\n )\n }\n\n return undefined\n }\n\n const createAnnotation = ({\n selection,\n ...rest\n }: (AnnotateParams | AnnotateAbsolutePageParams) & {\n absolutePageIndex?: number\n }) => {\n const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {}\n const spineItem = reader.spineItemsManager.get(itemIndex)\n const id = window.crypto.randomUUID()\n\n if (!spineItem) return undefined\n\n const range = selection\n ? reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n : undefined\n\n const pageEntry = reader.spine.pages.fromSpineItemPageIndex(\n spineItem,\n pageIndex,\n )\n\n const cfiWithRangeOrFirstNodeOrRoot = range\n ? reader.cfi.generateCfiFromRange(range, spineItem.item)\n : pageEntry?.firstVisibleNode\n ? reader.cfi.generateCfiForSpineItemPage({\n spineItem: spineItem.item,\n pageNode: pageEntry.firstVisibleNode,\n })\n : reader.cfi.generateRootCfi(spineItem.item)\n\n const highlight = {\n cfi: cfiWithRangeOrFirstNodeOrRoot,\n itemIndex: spineItem.index,\n id,\n ...rest,\n } satisfies RuntimeAnnotation\n\n return highlight\n }\n\n const renderAnnotations$ = merge(runtimeAnnotations$, reader.layout$).pipe(\n debounceTime(50),\n switchMap(() => readerHighlights.layout()),\n )\n\n const candidates$ = reader.layoutInfo$.pipe(\n switchMap(({ pages }) =>\n combineLatest(\n pages.map((page) => {\n const item = reader.spineItemsManager.get(page.itemIndex)\n\n if (!item) return of(false)\n\n // pre-paginated can always be annotated on their unique page\n if (item.renditionLayout === \"pre-paginated\") return of(true)\n\n if (page.firstVisibleNode) return of(true)\n\n return of(false)\n }),\n ),\n ),\n )\n\n merge(renderAnnotations$, annotations$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_ANNOTATIONS: true,\n destroy: () => {\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$: runtimeAnnotations$,\n highlightTap$: readerHighlights.tap$,\n candidates$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n createAnnotation,\n update: settings.update.bind(settings),\n },\n }\n }\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/annotations/utils.ts","../src/annotations/SpineItemHighlight.ts","../src/annotations/SpineItemHighlights.ts","../src/annotations/ReaderHighlights.ts","../../shared/dist/index.js","../package.json","../src/report.ts","../src/Settings.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["import {\n setPropertyIfChanged,\n setStylePropertyIfChanged,\n} from \"@prose-reader/core\"\n\nexport const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n setPropertyIfChanged(target.style, `cssText`, source.style.cssText)\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n setStylePropertyIfChanged(annotationLayer.style, `position`, `absolute`)\n setStylePropertyIfChanged(annotationLayer.style, `top`, `0`)\n }\n\n // annotationLayer.style.backgroundColor = \"red\"\n setStylePropertyIfChanged(annotationLayer.style, `opacity`, `1`)\n setStylePropertyIfChanged(annotationLayer.style, `pointer-events`, `none`)\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n setStylePropertyIfChanged,\n} from \"@prose-reader/core\"\nimport {\n first,\n fromEvent,\n map,\n merge,\n type Observable,\n share,\n shareReplay,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createElementForRange } from \"./utils\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n public readonly tap$: Observable<{\n event: Event\n highlight: RuntimeAnnotation\n }>\n private resolvedCfi$: Observable<ReturnType<Reader[\"cfi\"][\"resolveCfi\"]>>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public highlight: RuntimeAnnotation,\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.resolvedCfi$ = this.spineItem.watch(\"isLoaded\").pipe(\n map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const updateStateOnSelection$ = this.isSelected.pipe(\n tap((isSelected) => {\n this.updateStateOnSelection(isSelected)\n }),\n )\n\n merge(this.resolvedCfi$, updateStateOnSelection$)\n .pipe(takeUntil(this.destroy$))\n .subscribe()\n }\n\n public updateStateOnSelection(isSelected: boolean) {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n setStylePropertyIfChanged(\n child.style,\n `border`,\n isSelected ? \"3px dashed red\" : \"3px dashed transparent\",\n )\n }\n })\n }\n\n public render() {\n return this.resolvedCfi$.pipe(\n first(),\n withLatestFrom(this.isSelected),\n map(([resolvedCfi, isSelected]) => {\n if (!resolvedCfi?.isCfiRange) return undefined\n\n const range = resolvedCfi.range\n\n this.container.innerHTML = \"\"\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.highlightColor ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.notes) {\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 this.updateStateOnSelection(isSelected)\n\n return null\n }),\n )\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n defaultIfEmpty,\n distinctUntilChanged,\n forkJoin,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\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 annotations$: Observable<RuntimeAnnotation[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n const newAnnotations = annotations.filter(\n (annotation) =>\n !this.highlights.some(\n (highlight) => highlight.highlight.id === annotation.id,\n ),\n )\n const oldAnnotations = this.highlights.filter(\n (highlight) =>\n highlight.highlight.itemIndex !== this.spineItem.item.index,\n )\n\n this.highlights.forEach((highlight, index) => {\n const existingAnnotation = annotations.find(\n (annotation) => annotation.id === highlight.highlight.id,\n )\n\n if (oldAnnotations.includes(highlight)) {\n highlight.destroy()\n this.highlights = this.highlights.splice(index, 1)\n }\n\n if (existingAnnotation) {\n highlight.highlight = existingAnnotation\n }\n })\n\n newAnnotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n annotations$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n return forkJoin(\n this.highlights.map((highlight) => highlight.render()),\n ).pipe(defaultIfEmpty(null))\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n defaultIfEmpty,\n forkJoin,\n map,\n merge,\n type Observable,\n switchMap,\n} from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { RuntimeAnnotation } from \"./types\"\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: Observable<RuntimeAnnotation[]>,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const cleanupByItemId = new Map<string, () => void>()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n async ({ itemId }) => {\n cleanupByItemId.get(itemId)?.()\n cleanupByItemId.delete(itemId)\n\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n const cleanup = () => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n }\n\n cleanupByItemId.set(itemId, cleanup)\n },\n )\n\n this.reader.hookManager.register(\n \"item.onDocumentUnload\",\n async ({ itemId }) => {\n cleanupByItemId.get(itemId)?.()\n cleanupByItemId.delete(itemId)\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n\n public layout() {\n return forkJoin(\n this.spineItemHighlights.value.map((item) => item.layout()),\n ).pipe(defaultIfEmpty(null))\n }\n}\n","//#region src/array.ts\nvar e = (e, t) => e === t || e.length === t.length && e.every((e, n) => e === t[n]), t = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction n(e) {\n\tlet t = [];\n\tif (e.length === 0) return \"\";\n\tif (typeof e[0] != \"string\") throw TypeError(`Url must be a string. Received ${e[0]}`);\n\te[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\tfor (let n = 0; n < e.length; n++) {\n\t\tlet r = e[n];\n\t\tif (typeof r != \"string\") throw TypeError(`Url must be a string. Received ${r}`);\n\t\tr !== \"\" && (n > 0 && (r = r.replace(/^[/]+/, \"\")), r = n < e.length - 1 ? r.replace(/[/]+$/, \"\") : r.replace(/[/]+$/, \"/\"), t.push(r));\n\t}\n\tlet n = t.join(\"/\");\n\tn = n.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n\tlet r = n.split(\"?\");\n\treturn n = r.shift() + (r.length > 0 ? \"?\" : \"\") + r.join(\"&\"), n;\n}\nfunction r(...e) {\n\treturn n(Array.from(Array.isArray(e[0]) ? e[0] : e));\n}\nfunction i(e) {\n\tlet t = e.split(\"/\");\n\treturn t.pop(), t.join(\"/\");\n}\n//#endregion\n//#region src/contentType.ts\nvar a = (e) => {\n\tswitch (t(e)) {\n\t\tcase \"png\": return \"image/png\";\n\t\tcase \"jpg\": return \"image/jpg\";\n\t\tcase \"jpeg\": return \"image/jpeg\";\n\t\tcase \"txt\": return \"text/plain\";\n\t\tcase \"webp\": return \"image/webp\";\n\t\tcase \"xhtml\": return \"application/xhtml+xml\";\n\t\tcase \"mp3\": return \"audio/mpeg\";\n\t\tcase \"m4a\":\n\t\tcase \"m4b\": return \"audio/mp4\";\n\t\tcase \"aac\": return \"audio/aac\";\n\t\tcase \"ogg\":\n\t\tcase \"oga\": return \"audio/ogg\";\n\t\tcase \"wav\": return \"audio/wav\";\n\t\tcase \"flac\": return \"audio/flac\";\n\t\tcase \"opus\": return \"audio/opus\";\n\t}\n}, o = ({ mimeType: e, uri: t }) => (e ?? a(t ?? \"\"))?.startsWith(\"application/xhtml+xml\"), s = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), c = (e) => {\n\tif (!e.length) return;\n\tlet t = e.indexOf(\";\");\n\treturn t >= 0 ? e.substring(0, t) : e;\n}, l = /^[A-Za-z0-9_][A-Za-z0-9_.-]*$/, u = /^[A-Za-z0-9_]/, d = /^xml/i, f = /[^A-Za-z0-9_.-]+/g, p = \"_\", m = (e) => e.replace(/^_+|_+$/g, \"\"), h = (e) => m(e.trim().replaceAll(\"/\", \"_\").replace(f, \"_\")), g = (e) => {\n\tif (l.test(e) && !d.test(e)) return e;\n\tlet t = h(e), n = t && !d.test(t) ? t : `${p}${t}`;\n\treturn u.test(n) ? n : `${p}${n}`;\n}, _ = (e, t) => {\n\tlet n = g(e);\n\tif (!t.has(n)) return t.add(n), n;\n\tlet r = 2, i = `${n}-${r}`;\n\tfor (; t.has(i);) r += 1, i = `${n}-${r}`;\n\treturn t.add(i), i;\n}, v = () => {\n\tlet e = /* @__PURE__ */ new Set();\n\treturn (t) => _(t, e);\n}, y = (e) => {\n\tlet t = e.pageSpreadLeft === !0;\n\tif (t !== (e.pageSpreadRight === !0)) return t ? \"left\" : \"right\";\n}, b = (e, t, n) => {\n\tif (Object.is(e, t)) return !0;\n\tif (typeof e != \"object\" || !e || typeof t != \"object\" || !t) return !1;\n\tlet r = Object.keys(e), i = Object.keys(t);\n\tif (r.length !== i.length) return !1;\n\tlet a = n?.customEqual ?? Object.is, o = e, s = t;\n\tfor (let e of r) if (!Object.hasOwn(s, e) || !a(o[e], s[e])) return !1;\n\treturn !0;\n}, x = (e, t) => e.reduce((e, n) => {\n\tlet r = t(n);\n\treturn e[r] || (e[r] = []), e[r].push(n), e;\n}, {});\nfunction S(e, t) {\n\tlet n = { ...e };\n\tfor (let r in t) if (Object.hasOwn(t, r)) {\n\t\tlet i = t[r];\n\t\t(i !== void 0 || !(r in e)) && (n[r] = i);\n\t}\n\treturn n;\n}\n//#endregion\n//#region src/report.ts\nfunction C() {\n\tlet e = globalThis.__PROSE_READER_DEBUG;\n\treturn e === !0 || e === \"true\";\n}\nvar w = (e, t) => typeof e == \"boolean\" ? {\n\tenabled: e,\n\toptions: t\n} : {\n\tenabled: e?.enabled,\n\toptions: e ?? t\n}, T = (e) => e.at(-1)?.color, E = (e) => {\n\tif (!e.length) return;\n\tif (!e.some((e) => e.color)) return [e.map((e) => e.label).join(\" \")];\n\tlet t = \"\", n = [];\n\tfor (let r of e) t += `%c${t ? ` ${r.label}` : r.label}`, n.push(r.color ? `color: ${r.color}` : \"\");\n\treturn [t, ...n];\n}, D = (e = [], t = C()) => {\n\tlet n = t, r = {\n\t\tenable: (e) => {\n\t\t\ta(e);\n\t\t},\n\t\tnamespace: (t, r, i) => {\n\t\t\tlet a = w(r, i), o = a.options?.color ?? T(e);\n\t\t\treturn D([...e, {\n\t\t\t\tlabel: `[${t}]`,\n\t\t\t\tcolor: o\n\t\t\t}], a.enabled ?? n);\n\t\t},\n\t\tisEnabled: () => n,\n\t\tdebug: () => {},\n\t\tinfo: () => {},\n\t\tlog: () => {},\n\t\tgroupCollapsed: () => {},\n\t\tgroupEnd: () => {},\n\t\tgetGroupArgs: (t) => {\n\t\t\tlet n = E(e);\n\t\t\tif (!n) return [t];\n\t\t\tlet [r, ...i] = n;\n\t\t\treturn [`${r} ${t}`, ...i];\n\t\t},\n\t\twarn: () => {},\n\t\terror: () => {}\n\t}, i = (t) => {\n\t\tif (!t) {\n\t\t\tr.debug = () => {}, r.info = () => {}, r.log = () => {}, r.groupCollapsed = () => {}, r.groupEnd = () => {}, r.warn = () => {}, r.error = () => {};\n\t\t\treturn;\n\t\t}\n\t\tlet n = E(e) ?? [];\n\t\tr.debug = Function.prototype.bind.call(console.debug, console, ...n), r.info = Function.prototype.bind.call(console.info, console, ...n), r.log = Function.prototype.bind.call(console.log, console, ...n), r.groupCollapsed = Function.prototype.bind.call(console.groupCollapsed, console), r.groupEnd = Function.prototype.bind.call(console.groupEnd, console), r.warn = Function.prototype.bind.call(console.warn, console, ...n), r.error = Function.prototype.bind.call(console.error, console, ...n);\n\t}, a = (e) => {\n\t\tn !== e && (n = e, i(n));\n\t};\n\treturn i(n), r;\n}, O = D(), k = \"prose-reader-resource-error\", A = (e, t) => {\n\tlet n = e.split(/(\\d+)/), r = t.split(/(\\d+)/);\n\tfor (let e = 0, t = n.length; e < t; e++) if (n[e] !== r[e]) return n[e]?.match(/\\d/) ? (n[e] || \"\") - +(r[e] || \"\") : (n[e] || \"\").localeCompare(r[e] || \"\");\n\treturn 1;\n}, j = (e) => e.endsWith(\"/\") ? e.slice(0, -1) : e, M = (e) => {\n\tlet t = j(e);\n\treturn t.substring(t.lastIndexOf(\"/\") + 1) || t;\n}, N = (e) => {\n\tlet t = e.lastIndexOf(\"/\");\n\treturn t >= 0 ? e.substring(0, t) : \"\";\n}, P = (e) => e.replaceAll(\"&\", \"&amp;\").replaceAll(\"\\\"\", \"&quot;\").replaceAll(\"'\", \"&apos;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n//#endregion\nexport { k as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME, O as Report, e as arrayEqual, _ as createUniqueXmlSafeId, g as createXmlSafeId, v as createXmlSafeIdFactory, a as detectMimeTypeFromName, P as escapeXmlAttributeValue, y as getItemSpreadPosition, i as getParentPath, N as getUriBasePath, M as getUriBasename, t as getUrlExtension, x as groupBy, s as isMediaContentMimeType, b as isShallowEqual, o as isXmlBasedMimeType, c as parseContentType, j as removeTrailingSlash, S as shallowMergeIfDefined, A as sortByTitleComparator, r as urlJoin };\n\n//# sourceMappingURL=index.js.map","{\n \"name\": \"@prose-reader/enhancer-annotations\",\n \"version\": \"1.322.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"/dist\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"scripts\": {\n \"start\": \"vite build --watch --mode development\",\n \"build\": \"tsc && vite build\"\n },\n \"peerDependencies\": {\n \"@prose-reader/core\": \"^1.117.0\"\n }\n}\n","import { Report } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(name, IS_DEBUG_ENABLED)\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerOptions } from \"./types\"\n\nexport class Settings extends ReactiveEntity<AnnotationsEnhancerOptions> {\n update(settings: AnnotationsEnhancerOptions) {\n super.mergeCompare(settings)\n }\n}\n","import { isShallowEqual, type Reader } from \"@prose-reader/core\"\nimport {\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n NEVER,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport { ReaderHighlights } from \"./annotations/ReaderHighlights\"\nimport type { RuntimeAnnotation } from \"./annotations/types\"\nimport { report } from \"./report\"\nimport { Settings } from \"./Settings\"\nimport type {\n AnnotateAbsolutePageParams,\n AnnotateParams,\n AnnotationsEnhancerAPI,\n AnnotationsEnhancerOptions,\n} from \"./types\"\n\nexport type { AnnotationsEnhancerAPI }\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & { annotations?: AnnotationsEnhancerOptions },\n ): InheritOutput & AnnotationsEnhancerAPI => {\n const { annotations: annotationsOptions, ...rest } = options\n const settings = new Settings({\n annotations$: annotationsOptions?.annotations$,\n })\n const reader = next(rest as InheritOptions)\n\n const annotations$ = settings\n .watch(\"annotations$\")\n .pipe(switchMap((annotations) => annotations ?? NEVER))\n\n const runtimeAnnotations$ = annotations$.pipe(\n distinctUntilChanged(isShallowEqual),\n map((annotations) => {\n const runtimeAnnotations: RuntimeAnnotation[] = annotations.map(\n (annotation) => {\n const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = {\n ...annotation,\n itemIndex,\n } satisfies RuntimeAnnotation\n\n return highlight\n },\n )\n\n return runtimeAnnotations\n }),\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n shareReplay({\n refCount: true,\n bufferSize: 1,\n }),\n )\n\n const selectedHighlight$ = runtimeAnnotations$.pipe(\n map(\n (annotations) =>\n annotations.find((annotation) => annotation.selected)?.id,\n ),\n distinctUntilChanged(),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const readerHighlights = new ReaderHighlights(\n reader,\n runtimeAnnotations$,\n selectedHighlight$,\n )\n\n const resolveItemInformation = (params: {\n absolutePageIndex?: number\n itemIndex?: number\n }) => {\n if (params.itemIndex !== undefined)\n return { itemIndex: params.itemIndex, pageIndex: undefined }\n\n if (params.absolutePageIndex !== undefined) {\n return reader.spine.pages.fromAbsolutePageIndex(\n params.absolutePageIndex,\n )\n }\n\n return undefined\n }\n\n const createAnnotation = ({\n selection,\n ...rest\n }: (AnnotateParams | AnnotateAbsolutePageParams) & {\n absolutePageIndex?: number\n }) => {\n const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {}\n const spineItem = reader.spineItemsManager.get(itemIndex)\n const id = window.crypto.randomUUID()\n\n if (!spineItem) return undefined\n\n const range = selection\n ? reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n : undefined\n\n const pageEntry = reader.spine.pages.fromSpineItemPageIndex(\n spineItem,\n pageIndex,\n )\n\n const cfiWithRangeOrFirstNodeOrRoot = range\n ? reader.cfi.generateCfiFromRange(range, spineItem.item)\n : pageEntry?.firstVisibleNode\n ? reader.cfi.generateCfiForSpineItemPage({\n spineItem: spineItem.item,\n pageNode: pageEntry.firstVisibleNode,\n })\n : reader.cfi.generateRootCfi(spineItem.item)\n\n const highlight = {\n cfi: cfiWithRangeOrFirstNodeOrRoot,\n itemIndex: spineItem.index,\n id,\n ...rest,\n } satisfies RuntimeAnnotation\n\n return highlight\n }\n\n const renderAnnotations$ = merge(runtimeAnnotations$, reader.layout$).pipe(\n debounceTime(50),\n switchMap(() => readerHighlights.layout()),\n )\n\n const candidates$ = reader.layoutInfo$.pipe(\n switchMap(({ pages }) =>\n combineLatest(\n pages.map((page) => {\n const item = reader.spineItemsManager.get(page.itemIndex)\n\n if (!item) return of(false)\n\n // pre-paginated can always be annotated on their unique page\n if (item.renditionLayout === \"pre-paginated\") return of(true)\n\n if (page.firstVisibleNode) return of(true)\n\n return of(false)\n }),\n ),\n ),\n )\n\n merge(renderAnnotations$, annotations$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_ANNOTATIONS: true,\n destroy: () => {\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$: runtimeAnnotations$,\n highlightTap$: readerHighlights.tap$,\n candidates$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n createAnnotation,\n update: settings.update.bind(settings),\n },\n }\n }\n"],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/annotations/utils.ts","../src/annotations/SpineItemHighlight.ts","../src/annotations/SpineItemHighlights.ts","../src/annotations/ReaderHighlights.ts","../../shared/dist/index.js","../package.json","../src/report.ts","../src/Settings.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["import {\n setPropertyIfChanged,\n setStylePropertyIfChanged,\n} from \"@prose-reader/core\"\n\nexport const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n setPropertyIfChanged(target.style, `cssText`, source.style.cssText)\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n setStylePropertyIfChanged(annotationLayer.style, `position`, `absolute`)\n setStylePropertyIfChanged(annotationLayer.style, `top`, `0`)\n }\n\n // annotationLayer.style.backgroundColor = \"red\"\n setStylePropertyIfChanged(annotationLayer.style, `opacity`, `1`)\n setStylePropertyIfChanged(annotationLayer.style, `pointer-events`, `none`)\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n setStylePropertyIfChanged,\n} from \"@prose-reader/core\"\nimport {\n first,\n fromEvent,\n map,\n merge,\n type Observable,\n share,\n shareReplay,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createElementForRange } from \"./utils\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n public readonly tap$: Observable<{\n event: Event\n highlight: RuntimeAnnotation\n }>\n private resolvedCfi$: Observable<ReturnType<Reader[\"cfi\"][\"resolveCfi\"]>>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public highlight: RuntimeAnnotation,\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.resolvedCfi$ = this.spineItem.watch(\"isLoaded\").pipe(\n map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const updateStateOnSelection$ = this.isSelected.pipe(\n tap((isSelected) => {\n this.updateStateOnSelection(isSelected)\n }),\n )\n\n merge(this.resolvedCfi$, updateStateOnSelection$)\n .pipe(takeUntil(this.destroy$))\n .subscribe()\n }\n\n public updateStateOnSelection(isSelected: boolean) {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n setStylePropertyIfChanged(\n child.style,\n `border`,\n isSelected ? \"3px dashed red\" : \"3px dashed transparent\",\n )\n }\n })\n }\n\n public render() {\n return this.resolvedCfi$.pipe(\n first(),\n withLatestFrom(this.isSelected),\n map(([resolvedCfi, isSelected]) => {\n if (!resolvedCfi?.isCfiRange) return undefined\n\n const range = resolvedCfi.range\n\n this.container.innerHTML = \"\"\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.highlightColor ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.notes) {\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 this.updateStateOnSelection(isSelected)\n\n return null\n }),\n )\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n defaultIfEmpty,\n distinctUntilChanged,\n forkJoin,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\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 annotations$: Observable<RuntimeAnnotation[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n const newAnnotations = annotations.filter(\n (annotation) =>\n !this.highlights.some(\n (highlight) => highlight.highlight.id === annotation.id,\n ),\n )\n const oldAnnotations = this.highlights.filter(\n (highlight) =>\n highlight.highlight.itemIndex !== this.spineItem.item.index,\n )\n\n this.highlights.forEach((highlight, index) => {\n const existingAnnotation = annotations.find(\n (annotation) => annotation.id === highlight.highlight.id,\n )\n\n if (oldAnnotations.includes(highlight)) {\n highlight.destroy()\n this.highlights = this.highlights.splice(index, 1)\n }\n\n if (existingAnnotation) {\n highlight.highlight = existingAnnotation\n }\n })\n\n newAnnotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n annotations$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n return forkJoin(\n this.highlights.map((highlight) => highlight.render()),\n ).pipe(defaultIfEmpty(null))\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n defaultIfEmpty,\n forkJoin,\n map,\n merge,\n type Observable,\n switchMap,\n} from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { RuntimeAnnotation } from \"./types\"\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: Observable<RuntimeAnnotation[]>,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const cleanupByItemId = new Map<string, () => void>()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n async ({ itemId }) => {\n cleanupByItemId.get(itemId)?.()\n cleanupByItemId.delete(itemId)\n\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n const cleanup = () => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n }\n\n cleanupByItemId.set(itemId, cleanup)\n },\n )\n\n this.reader.hookManager.register(\n \"item.onDocumentUnload\",\n async ({ itemId }) => {\n cleanupByItemId.get(itemId)?.()\n cleanupByItemId.delete(itemId)\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n\n public layout() {\n return forkJoin(\n this.spineItemHighlights.value.map((item) => item.layout()),\n ).pipe(defaultIfEmpty(null))\n }\n}\n","//#region src/array.ts\nvar e = (e, t) => e === t || e.length === t.length && e.every((e, n) => e === t[n]), t = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction n(e) {\n\tlet t = [];\n\tif (e.length === 0) return \"\";\n\tif (typeof e[0] != \"string\") throw TypeError(`Url must be a string. Received ${e[0]}`);\n\te[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\tfor (let n = 0; n < e.length; n++) {\n\t\tlet r = e[n];\n\t\tif (typeof r != \"string\") throw TypeError(`Url must be a string. Received ${r}`);\n\t\tr !== \"\" && (n > 0 && (r = r.replace(/^[/]+/, \"\")), r = n < e.length - 1 ? r.replace(/[/]+$/, \"\") : r.replace(/[/]+$/, \"/\"), t.push(r));\n\t}\n\tlet n = t.join(\"/\");\n\tn = n.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n\tlet r = n.split(\"?\");\n\treturn n = r.shift() + (r.length > 0 ? \"?\" : \"\") + r.join(\"&\"), n;\n}\nfunction r(...e) {\n\treturn n(Array.from(Array.isArray(e[0]) ? e[0] : e));\n}\nfunction i(e) {\n\tlet t = e.split(\"/\");\n\treturn t.pop(), t.join(\"/\");\n}\n//#endregion\n//#region src/contentType.ts\nvar a = (e) => {\n\tswitch (t(e)) {\n\t\tcase \"png\": return \"image/png\";\n\t\tcase \"jpg\": return \"image/jpg\";\n\t\tcase \"jpeg\": return \"image/jpeg\";\n\t\tcase \"txt\": return \"text/plain\";\n\t\tcase \"webp\": return \"image/webp\";\n\t\tcase \"xhtml\": return \"application/xhtml+xml\";\n\t\tcase \"mp3\": return \"audio/mpeg\";\n\t\tcase \"m4a\":\n\t\tcase \"m4b\": return \"audio/mp4\";\n\t\tcase \"aac\": return \"audio/aac\";\n\t\tcase \"ogg\":\n\t\tcase \"oga\": return \"audio/ogg\";\n\t\tcase \"wav\": return \"audio/wav\";\n\t\tcase \"flac\": return \"audio/flac\";\n\t\tcase \"opus\": return \"audio/opus\";\n\t}\n}, o = ({ mimeType: e, uri: t }) => (e ?? a(t ?? \"\"))?.startsWith(\"application/xhtml+xml\"), s = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), c = (e) => {\n\tif (!e.length) return;\n\tlet t = e.indexOf(\";\");\n\treturn t >= 0 ? e.substring(0, t) : e;\n}, l = /^[A-Za-z0-9_][A-Za-z0-9_.-]*$/, u = /^[A-Za-z0-9_]/, d = /^xml/i, f = /[^A-Za-z0-9_.-]+/g, p = \"_\", m = (e) => e.replace(/^_+|_+$/g, \"\"), h = (e) => m(e.trim().replaceAll(\"/\", \"_\").replace(f, \"_\")), g = (e) => {\n\tif (l.test(e) && !d.test(e)) return e;\n\tlet t = h(e), n = t && !d.test(t) ? t : `${p}${t}`;\n\treturn u.test(n) ? n : `${p}${n}`;\n}, _ = (e, t) => {\n\tlet n = g(e);\n\tif (!t.has(n)) return t.add(n), n;\n\tlet r = 2, i = `${n}-${r}`;\n\tfor (; t.has(i);) r += 1, i = `${n}-${r}`;\n\treturn t.add(i), i;\n}, v = () => {\n\tlet e = /* @__PURE__ */ new Set();\n\treturn (t) => _(t, e);\n}, y = (e) => {\n\tlet t = e.pageSpreadLeft === !0;\n\tif (t !== (e.pageSpreadRight === !0)) return t ? \"left\" : \"right\";\n}, b = (e, t, n) => {\n\tif (Object.is(e, t)) return !0;\n\tif (typeof e != \"object\" || !e || typeof t != \"object\" || !t) return !1;\n\tlet r = Object.keys(e), i = Object.keys(t);\n\tif (r.length !== i.length) return !1;\n\tlet a = n?.customEqual ?? Object.is, o = e, s = t;\n\tfor (let e of r) if (!Object.hasOwn(s, e) || !a(o[e], s[e])) return !1;\n\treturn !0;\n}, x = (e, t) => e.reduce((e, n) => {\n\tlet r = t(n);\n\treturn e[r] || (e[r] = []), e[r].push(n), e;\n}, {});\nfunction S(e, t) {\n\tlet n = { ...e };\n\tfor (let r in t) if (Object.hasOwn(t, r)) {\n\t\tlet i = t[r];\n\t\t(i !== void 0 || !(r in e)) && (n[r] = i);\n\t}\n\treturn n;\n}\n//#endregion\n//#region src/report.ts\nfunction C() {\n\tlet e = globalThis.__PROSE_READER_DEBUG;\n\treturn e === !0 || e === \"true\";\n}\nvar w = (e, t) => typeof e == \"boolean\" ? {\n\tenabled: e,\n\toptions: t\n} : {\n\tenabled: e?.enabled,\n\toptions: e ?? t\n}, T = (e) => e.at(-1)?.color, E = (e) => {\n\tif (!e.length) return;\n\tif (!e.some((e) => e.color)) return [e.map((e) => e.label).join(\" \")];\n\tlet t = \"\", n = [];\n\tfor (let r of e) t += `%c${t ? ` ${r.label}` : r.label}`, n.push(r.color ? `color: ${r.color}` : \"\");\n\treturn [t, ...n];\n}, D = (e = [], t = C()) => {\n\tlet n = t, r = {\n\t\tenable: (e) => {\n\t\t\ta(e);\n\t\t},\n\t\tnamespace: (t, r, i) => {\n\t\t\tlet a = w(r, i), o = a.options?.color ?? T(e);\n\t\t\treturn D([...e, {\n\t\t\t\tlabel: `[${t}]`,\n\t\t\t\tcolor: o\n\t\t\t}], a.enabled ?? n);\n\t\t},\n\t\tisEnabled: () => n,\n\t\tdebug: () => {},\n\t\tinfo: () => {},\n\t\tlog: () => {},\n\t\tgroupCollapsed: () => {},\n\t\tgroupEnd: () => {},\n\t\tgetGroupArgs: (t) => {\n\t\t\tlet n = E(e);\n\t\t\tif (!n) return [t];\n\t\t\tlet [r, ...i] = n;\n\t\t\treturn [`${r} ${t}`, ...i];\n\t\t},\n\t\twarn: () => {},\n\t\terror: () => {}\n\t}, i = (t) => {\n\t\tif (!t) {\n\t\t\tr.debug = () => {}, r.info = () => {}, r.log = () => {}, r.groupCollapsed = () => {}, r.groupEnd = () => {}, r.warn = () => {}, r.error = () => {};\n\t\t\treturn;\n\t\t}\n\t\tlet n = E(e) ?? [];\n\t\tr.debug = Function.prototype.bind.call(console.debug, console, ...n), r.info = Function.prototype.bind.call(console.info, console, ...n), r.log = Function.prototype.bind.call(console.log, console, ...n), r.groupCollapsed = Function.prototype.bind.call(console.groupCollapsed, console), r.groupEnd = Function.prototype.bind.call(console.groupEnd, console), r.warn = Function.prototype.bind.call(console.warn, console, ...n), r.error = Function.prototype.bind.call(console.error, console, ...n);\n\t}, a = (e) => {\n\t\tn !== e && (n = e, i(n));\n\t};\n\treturn i(n), r;\n}, O = D(), k = \"prose-reader-resource-error\", A = (e, t) => {\n\tlet n = e.split(/(\\d+)/), r = t.split(/(\\d+)/);\n\tfor (let e = 0, t = n.length; e < t; e++) if (n[e] !== r[e]) return n[e]?.match(/\\d/) ? (n[e] || \"\") - +(r[e] || \"\") : (n[e] || \"\").localeCompare(r[e] || \"\");\n\treturn 1;\n}, j = (e) => e.endsWith(\"/\") ? e.slice(0, -1) : e, M = (e) => {\n\tlet t = j(e);\n\treturn t.substring(t.lastIndexOf(\"/\") + 1) || t;\n}, N = (e) => {\n\tlet t = e.lastIndexOf(\"/\");\n\treturn t >= 0 ? e.substring(0, t) : \"\";\n}, P = (e) => e.replaceAll(\"&\", \"&amp;\").replaceAll(\"\\\"\", \"&quot;\").replaceAll(\"'\", \"&apos;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n//#endregion\nexport { k as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME, O as Report, e as arrayEqual, _ as createUniqueXmlSafeId, g as createXmlSafeId, v as createXmlSafeIdFactory, a as detectMimeTypeFromName, P as escapeXmlAttributeValue, y as getItemSpreadPosition, i as getParentPath, N as getUriBasePath, M as getUriBasename, t as getUrlExtension, x as groupBy, s as isMediaContentMimeType, b as isShallowEqual, o as isXmlBasedMimeType, c as parseContentType, j as removeTrailingSlash, S as shallowMergeIfDefined, A as sortByTitleComparator, r as urlJoin };\n\n//# sourceMappingURL=index.js.map","{\n \"name\": \"@prose-reader/enhancer-annotations\",\n \"version\": \"1.321.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"/dist\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"scripts\": {\n \"start\": \"vite build --watch --mode development\",\n \"build\": \"tsc && vite build\"\n },\n \"peerDependencies\": {\n \"@prose-reader/core\": \"^1.117.0\"\n }\n}\n","import { Report } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(name, IS_DEBUG_ENABLED)\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerOptions } from \"./types\"\n\nexport class Settings extends ReactiveEntity<AnnotationsEnhancerOptions> {\n update(settings: AnnotationsEnhancerOptions) {\n super.mergeCompare(settings)\n }\n}\n","import { isShallowEqual, type Reader } from \"@prose-reader/core\"\nimport {\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n NEVER,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport { ReaderHighlights } from \"./annotations/ReaderHighlights\"\nimport type { RuntimeAnnotation } from \"./annotations/types\"\nimport { report } from \"./report\"\nimport { Settings } from \"./Settings\"\nimport type {\n AnnotateAbsolutePageParams,\n AnnotateParams,\n AnnotationsEnhancerAPI,\n AnnotationsEnhancerOptions,\n} from \"./types\"\n\nexport type { AnnotationsEnhancerAPI }\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & { annotations?: AnnotationsEnhancerOptions },\n ): InheritOutput & AnnotationsEnhancerAPI => {\n const { annotations: annotationsOptions, ...rest } = options\n const settings = new Settings({\n annotations$: annotationsOptions?.annotations$,\n })\n const reader = next(rest as InheritOptions)\n\n const annotations$ = settings\n .watch(\"annotations$\")\n .pipe(switchMap((annotations) => annotations ?? NEVER))\n\n const runtimeAnnotations$ = annotations$.pipe(\n distinctUntilChanged(isShallowEqual),\n map((annotations) => {\n const runtimeAnnotations: RuntimeAnnotation[] = annotations.map(\n (annotation) => {\n const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = {\n ...annotation,\n itemIndex,\n } satisfies RuntimeAnnotation\n\n return highlight\n },\n )\n\n return runtimeAnnotations\n }),\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n shareReplay({\n refCount: true,\n bufferSize: 1,\n }),\n )\n\n const selectedHighlight$ = runtimeAnnotations$.pipe(\n map(\n (annotations) =>\n annotations.find((annotation) => annotation.selected)?.id,\n ),\n distinctUntilChanged(),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const readerHighlights = new ReaderHighlights(\n reader,\n runtimeAnnotations$,\n selectedHighlight$,\n )\n\n const resolveItemInformation = (params: {\n absolutePageIndex?: number\n itemIndex?: number\n }) => {\n if (params.itemIndex !== undefined)\n return { itemIndex: params.itemIndex, pageIndex: undefined }\n\n if (params.absolutePageIndex !== undefined) {\n return reader.spine.pages.fromAbsolutePageIndex(\n params.absolutePageIndex,\n )\n }\n\n return undefined\n }\n\n const createAnnotation = ({\n selection,\n ...rest\n }: (AnnotateParams | AnnotateAbsolutePageParams) & {\n absolutePageIndex?: number\n }) => {\n const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {}\n const spineItem = reader.spineItemsManager.get(itemIndex)\n const id = window.crypto.randomUUID()\n\n if (!spineItem) return undefined\n\n const range = selection\n ? reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n : undefined\n\n const pageEntry = reader.spine.pages.fromSpineItemPageIndex(\n spineItem,\n pageIndex,\n )\n\n const cfiWithRangeOrFirstNodeOrRoot = range\n ? reader.cfi.generateCfiFromRange(range, spineItem.item)\n : pageEntry?.firstVisibleNode\n ? reader.cfi.generateCfiForSpineItemPage({\n spineItem: spineItem.item,\n pageNode: pageEntry.firstVisibleNode,\n })\n : reader.cfi.generateRootCfi(spineItem.item)\n\n const highlight = {\n cfi: cfiWithRangeOrFirstNodeOrRoot,\n itemIndex: spineItem.index,\n id,\n ...rest,\n } satisfies RuntimeAnnotation\n\n return highlight\n }\n\n const renderAnnotations$ = merge(runtimeAnnotations$, reader.layout$).pipe(\n debounceTime(50),\n switchMap(() => readerHighlights.layout()),\n )\n\n const candidates$ = reader.layoutInfo$.pipe(\n switchMap(({ pages }) =>\n combineLatest(\n pages.map((page) => {\n const item = reader.spineItemsManager.get(page.itemIndex)\n\n if (!item) return of(false)\n\n // pre-paginated can always be annotated on their unique page\n if (item.renditionLayout === \"pre-paginated\") return of(true)\n\n if (page.firstVisibleNode) return of(true)\n\n return of(false)\n }),\n ),\n ),\n )\n\n merge(renderAnnotations$, annotations$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_ANNOTATIONS: true,\n destroy: () => {\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$: runtimeAnnotations$,\n highlightTap$: readerHighlights.tap$,\n candidates$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n createAnnotation,\n update: settings.update.bind(settings),\n },\n }\n }\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/annotations/utils.ts","../src/annotations/SpineItemHighlight.ts","../src/annotations/SpineItemHighlights.ts","../src/annotations/ReaderHighlights.ts","../../shared/dist/index.js","../package.json","../src/report.ts","../src/Settings.ts","../src/annotationsEnhancer.ts"],"sourcesContent":["import {\n setPropertyIfChanged,\n setStylePropertyIfChanged,\n} from \"@prose-reader/core\"\n\nexport const createElementForRange = (\n range: Range,\n container: HTMLElement,\n color: string,\n) => {\n // Get all rects and group them by line (based on vertical position)\n const rects = Array.from(range.getClientRects())\n const lineGroups = new Map<number, DOMRect[]>()\n\n rects.forEach((rect) => {\n const lineY = Math.round(rect.top) // Round to handle minor pixel differences\n if (!lineGroups.has(lineY)) {\n lineGroups.set(lineY, [])\n }\n lineGroups.get(lineY)?.push(rect)\n })\n\n // Create one highlight element per line\n return Array.from(lineGroups.values()).map((lineRects) => {\n // Find the leftmost and rightmost points\n const left = Math.min(...lineRects.map((r) => r.left))\n const right = Math.max(...lineRects.map((r) => r.right))\n const top = lineRects[0]?.top\n const height = lineRects[0]?.height\n\n const rectEltContainer = container.ownerDocument.createElement(\"div\")\n const rectElt = container.ownerDocument.createElement(\"div\")\n rectEltContainer.style.cssText = `\n position: absolute;\n width: ${right - left}px;\n height: ${height}px;\n top: ${top}px;\n left: ${left}px;\n box-sizing: border-box;\n border: 3px dashed transparent;\n `\n rectElt.style.cssText = `\n height: 100%;\n width: 100%;\n opacity: 40%;\n background-color: ${color}\n `\n\n rectEltContainer.appendChild(rectElt)\n\n return rectEltContainer\n })\n}\n\nexport const copyPositionStyle = (source: HTMLElement, target: HTMLElement) => {\n setPropertyIfChanged(target.style, `cssText`, source.style.cssText)\n}\n\nexport const createAnnotationLayer = (\n container: HTMLElement,\n layer: HTMLElement,\n) => {\n const annotationLayer = container.ownerDocument.createElement(\"div\")\n\n layoutAnnotationLayer(layer, annotationLayer)\n\n container.appendChild(annotationLayer)\n\n return annotationLayer\n}\n\nexport const layoutAnnotationLayer = (\n layer: HTMLElement,\n annotationLayer: HTMLElement,\n) => {\n copyPositionStyle(layer, annotationLayer)\n\n if (layer.style.position === \"\") {\n setStylePropertyIfChanged(annotationLayer.style, `position`, `absolute`)\n setStylePropertyIfChanged(annotationLayer.style, `top`, `0`)\n }\n\n // annotationLayer.style.backgroundColor = \"red\"\n setStylePropertyIfChanged(annotationLayer.style, `opacity`, `1`)\n setStylePropertyIfChanged(annotationLayer.style, `pointer-events`, `none`)\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n setStylePropertyIfChanged,\n} from \"@prose-reader/core\"\nimport {\n first,\n fromEvent,\n map,\n merge,\n type Observable,\n share,\n shareReplay,\n takeUntil,\n tap,\n withLatestFrom,\n} from \"rxjs\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createElementForRange } from \"./utils\"\n\nexport class SpineItemHighlight extends DestroyableClass {\n private container: HTMLElement\n public readonly tap$: Observable<{\n event: Event\n highlight: RuntimeAnnotation\n }>\n private resolvedCfi$: Observable<ReturnType<Reader[\"cfi\"][\"resolveCfi\"]>>\n\n constructor(\n private spineItem: SpineItem,\n private containerElement: HTMLElement,\n private reader: Reader,\n public highlight: RuntimeAnnotation,\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.resolvedCfi$ = this.spineItem.watch(\"isLoaded\").pipe(\n map(() => this.reader.cfi.resolveCfi({ cfi: this.highlight.cfi })),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const updateStateOnSelection$ = this.isSelected.pipe(\n tap((isSelected) => {\n this.updateStateOnSelection(isSelected)\n }),\n )\n\n merge(this.resolvedCfi$, updateStateOnSelection$)\n .pipe(takeUntil(this.destroy$))\n .subscribe()\n }\n\n public updateStateOnSelection(isSelected: boolean) {\n Array.from(this.container.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n setStylePropertyIfChanged(\n child.style,\n `border`,\n isSelected ? \"3px dashed red\" : \"3px dashed transparent\",\n )\n }\n })\n }\n\n public render() {\n return this.resolvedCfi$.pipe(\n first(),\n withLatestFrom(this.isSelected),\n map(([resolvedCfi, isSelected]) => {\n if (!resolvedCfi?.isCfiRange) return undefined\n\n const range = resolvedCfi.range\n\n this.container.innerHTML = \"\"\n\n /**\n * The nodes can be undefined if the cfi is not found.\n * This can happens if the item is not loaded (legit) or if the cfi\n * are just invalid.\n */\n if (!range) {\n return\n }\n\n const rectElements = createElementForRange(\n range,\n this.container,\n this.highlight.highlightColor ?? \"yellow\",\n )\n\n rectElements.forEach((elt) => {\n elt.style.pointerEvents = \"initial\"\n elt.style.cursor = \"pointer\"\n elt.dataset.highlightRect = this.highlight.id\n\n this.container.appendChild(elt)\n })\n\n const firstElement = rectElements[0]\n\n if (firstElement && this.highlight.notes) {\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 this.updateStateOnSelection(isSelected)\n\n return null\n }),\n )\n }\n\n isWithinTarget(target: Node) {\n return this.container.contains(target)\n }\n\n public destroy() {\n super.destroy()\n\n this.container.remove()\n }\n}\n","import {\n DestroyableClass,\n type Reader,\n type SpineItem,\n} from \"@prose-reader/core\"\nimport {\n defaultIfEmpty,\n distinctUntilChanged,\n forkJoin,\n map,\n merge,\n type Observable,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n} from \"rxjs\"\nimport { SpineItemHighlight } from \"./SpineItemHighlight\"\nimport type { RuntimeAnnotation } from \"./types\"\nimport { createAnnotationLayer, layoutAnnotationLayer } from \"./utils\"\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 annotations$: Observable<RuntimeAnnotation[]>,\n private spineItem: SpineItem,\n private reader: Reader,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const firstLayerElement =\n spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n this.layer = createAnnotationLayer(\n this.spineItem.containerElement,\n firstLayerElement,\n )\n\n const itemHighlights$ = this.annotations$.pipe(\n switchMap((annotations) => {\n const newAnnotations = annotations.filter(\n (annotation) =>\n !this.highlights.some(\n (highlight) => highlight.highlight.id === annotation.id,\n ),\n )\n const oldAnnotations = this.highlights.filter(\n (highlight) =>\n highlight.highlight.itemIndex !== this.spineItem.item.index,\n )\n\n this.highlights.forEach((highlight, index) => {\n const existingAnnotation = annotations.find(\n (annotation) => annotation.id === highlight.highlight.id,\n )\n\n if (oldAnnotations.includes(highlight)) {\n highlight.destroy()\n this.highlights = this.highlights.splice(index, 1)\n }\n\n if (existingAnnotation) {\n highlight.highlight = existingAnnotation\n }\n })\n\n newAnnotations.forEach((annotation) => {\n if (annotation.itemIndex !== this.spineItem.item.index) return\n\n const isSelected$ = this.selectedHighlight.pipe(\n map((id) => id === annotation.id),\n distinctUntilChanged(),\n )\n\n const spineItemHighlight = new SpineItemHighlight(\n this.spineItem,\n this.layer,\n this.reader,\n annotation,\n isSelected$,\n )\n\n this.highlights.push(spineItemHighlight)\n })\n\n return of(this.highlights)\n }),\n shareReplay(1),\n takeUntil(this.destroy$),\n )\n\n this.tap$ = itemHighlights$.pipe(\n switchMap((highlights) =>\n merge(...highlights.map((highlight) => highlight.tap$)),\n ),\n )\n\n annotations$.subscribe()\n }\n\n layout() {\n const firstLayerElement =\n this.spineItem.renderer.documentContainer ?? document.createElement(\"div\")\n\n layoutAnnotationLayer(firstLayerElement, this.layer)\n\n return forkJoin(\n this.highlights.map((highlight) => highlight.render()),\n ).pipe(defaultIfEmpty(null))\n }\n\n getHighlightsForTarget(target: EventTarget) {\n return this.highlights.filter(\n (highlight) => target instanceof Node && highlight.isWithinTarget(target),\n )\n }\n\n destroy() {\n super.destroy()\n\n this.layer.remove()\n }\n}\n","import { DestroyableClass, type Reader } from \"@prose-reader/core\"\nimport {\n BehaviorSubject,\n defaultIfEmpty,\n forkJoin,\n map,\n merge,\n type Observable,\n switchMap,\n} from \"rxjs\"\nimport { SpineItemHighlights } from \"./SpineItemHighlights\"\nimport type { RuntimeAnnotation } from \"./types\"\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: Observable<RuntimeAnnotation[]>,\n private selectedHighlight: Observable<string | undefined>,\n ) {\n super()\n\n const cleanupByItemId = new Map<string, () => void>()\n\n this.reader.hookManager.register(\n \"item.onDocumentLoad\",\n async ({ itemId }) => {\n cleanupByItemId.get(itemId)?.()\n cleanupByItemId.delete(itemId)\n\n const spineItem = reader.spineItemsManager.get(itemId)\n\n if (!spineItem) return\n\n const spineItemHighlights$ = this.highlights.pipe(\n map((highlights) =>\n highlights.filter(\n (highlight) => highlight.itemIndex === spineItem.item.index,\n ),\n ),\n )\n\n const spineItemHighlights = new SpineItemHighlights(\n spineItemHighlights$,\n spineItem,\n reader,\n this.selectedHighlight,\n )\n\n this.spineItemHighlights.next([\n ...this.spineItemHighlights.getValue(),\n spineItemHighlights,\n ])\n\n const cleanup = () => {\n this.spineItemHighlights.next(\n this.spineItemHighlights\n .getValue()\n .filter((layer) => layer !== spineItemHighlights),\n )\n\n spineItemHighlights.destroy()\n }\n\n cleanupByItemId.set(itemId, cleanup)\n },\n )\n\n this.reader.hookManager.register(\n \"item.onDocumentUnload\",\n async ({ itemId }) => {\n cleanupByItemId.get(itemId)?.()\n cleanupByItemId.delete(itemId)\n },\n )\n\n this.tap$ = this.spineItemHighlights.pipe(\n switchMap((layers) => merge(...layers.map((layer) => layer.tap$))),\n )\n }\n\n getHighlightsForTarget = (target: EventTarget) => {\n return this.spineItemHighlights\n .getValue()\n .flatMap((layer) => layer.getHighlightsForTarget(target))\n .map((annotation) => annotation.highlight)\n }\n\n isTargetWithinHighlight = (target: EventTarget) => {\n return !!this.getHighlightsForTarget(target).length\n }\n\n public layout() {\n return forkJoin(\n this.spineItemHighlights.value.map((item) => item.layout()),\n ).pipe(defaultIfEmpty(null))\n }\n}\n","//#region src/array.ts\nvar e = (e, t) => e === t || e.length === t.length && e.every((e, n) => e === t[n]), t = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction n(e) {\n\tlet t = [];\n\tif (e.length === 0) return \"\";\n\tif (typeof e[0] != \"string\") throw TypeError(`Url must be a string. Received ${e[0]}`);\n\te[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\tfor (let n = 0; n < e.length; n++) {\n\t\tlet r = e[n];\n\t\tif (typeof r != \"string\") throw TypeError(`Url must be a string. Received ${r}`);\n\t\tr !== \"\" && (n > 0 && (r = r.replace(/^[/]+/, \"\")), r = n < e.length - 1 ? r.replace(/[/]+$/, \"\") : r.replace(/[/]+$/, \"/\"), t.push(r));\n\t}\n\tlet n = t.join(\"/\");\n\tn = n.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n\tlet r = n.split(\"?\");\n\treturn n = r.shift() + (r.length > 0 ? \"?\" : \"\") + r.join(\"&\"), n;\n}\nfunction r(...e) {\n\treturn n(Array.from(Array.isArray(e[0]) ? e[0] : e));\n}\nfunction i(e) {\n\tlet t = e.split(\"/\");\n\treturn t.pop(), t.join(\"/\");\n}\n//#endregion\n//#region src/contentType.ts\nvar a = (e) => {\n\tswitch (t(e)) {\n\t\tcase \"png\": return \"image/png\";\n\t\tcase \"jpg\": return \"image/jpg\";\n\t\tcase \"jpeg\": return \"image/jpeg\";\n\t\tcase \"txt\": return \"text/plain\";\n\t\tcase \"webp\": return \"image/webp\";\n\t\tcase \"xhtml\": return \"application/xhtml+xml\";\n\t\tcase \"mp3\": return \"audio/mpeg\";\n\t\tcase \"m4a\":\n\t\tcase \"m4b\": return \"audio/mp4\";\n\t\tcase \"aac\": return \"audio/aac\";\n\t\tcase \"ogg\":\n\t\tcase \"oga\": return \"audio/ogg\";\n\t\tcase \"wav\": return \"audio/wav\";\n\t\tcase \"flac\": return \"audio/flac\";\n\t\tcase \"opus\": return \"audio/opus\";\n\t}\n}, o = ({ mimeType: e, uri: t }) => (e ?? a(t ?? \"\"))?.startsWith(\"application/xhtml+xml\"), s = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), c = (e) => {\n\tif (!e.length) return;\n\tlet t = e.indexOf(\";\");\n\treturn t >= 0 ? e.substring(0, t) : e;\n}, l = /^[A-Za-z0-9_][A-Za-z0-9_.-]*$/, u = /^[A-Za-z0-9_]/, d = /^xml/i, f = /[^A-Za-z0-9_.-]+/g, p = \"_\", m = (e) => e.replace(/^_+|_+$/g, \"\"), h = (e) => m(e.trim().replaceAll(\"/\", \"_\").replace(f, \"_\")), g = (e) => {\n\tif (l.test(e) && !d.test(e)) return e;\n\tlet t = h(e), n = t && !d.test(t) ? t : `${p}${t}`;\n\treturn u.test(n) ? n : `${p}${n}`;\n}, _ = (e, t) => {\n\tlet n = g(e);\n\tif (!t.has(n)) return t.add(n), n;\n\tlet r = 2, i = `${n}-${r}`;\n\tfor (; t.has(i);) r += 1, i = `${n}-${r}`;\n\treturn t.add(i), i;\n}, v = () => {\n\tlet e = /* @__PURE__ */ new Set();\n\treturn (t) => _(t, e);\n}, y = (e) => {\n\tlet t = e.pageSpreadLeft === !0;\n\tif (t !== (e.pageSpreadRight === !0)) return t ? \"left\" : \"right\";\n}, b = (e, t, n) => {\n\tif (Object.is(e, t)) return !0;\n\tif (typeof e != \"object\" || !e || typeof t != \"object\" || !t) return !1;\n\tlet r = Object.keys(e), i = Object.keys(t);\n\tif (r.length !== i.length) return !1;\n\tlet a = n?.customEqual ?? Object.is, o = e, s = t;\n\tfor (let e of r) if (!Object.hasOwn(s, e) || !a(o[e], s[e])) return !1;\n\treturn !0;\n}, x = (e, t) => e.reduce((e, n) => {\n\tlet r = t(n);\n\treturn e[r] || (e[r] = []), e[r].push(n), e;\n}, {});\nfunction S(e, t) {\n\tlet n = { ...e };\n\tfor (let r in t) if (Object.hasOwn(t, r)) {\n\t\tlet i = t[r];\n\t\t(i !== void 0 || !(r in e)) && (n[r] = i);\n\t}\n\treturn n;\n}\n//#endregion\n//#region src/report.ts\nfunction C() {\n\tlet e = globalThis.__PROSE_READER_DEBUG;\n\treturn e === !0 || e === \"true\";\n}\nvar w = (e, t) => typeof e == \"boolean\" ? {\n\tenabled: e,\n\toptions: t\n} : {\n\tenabled: e?.enabled,\n\toptions: e ?? t\n}, T = (e) => e.at(-1)?.color, E = (e) => {\n\tif (!e.length) return;\n\tif (!e.some((e) => e.color)) return [e.map((e) => e.label).join(\" \")];\n\tlet t = \"\", n = [];\n\tfor (let r of e) t += `%c${t ? ` ${r.label}` : r.label}`, n.push(r.color ? `color: ${r.color}` : \"\");\n\treturn [t, ...n];\n}, D = (e = [], t = C()) => {\n\tlet n = t, r = {\n\t\tenable: (e) => {\n\t\t\ta(e);\n\t\t},\n\t\tnamespace: (t, r, i) => {\n\t\t\tlet a = w(r, i), o = a.options?.color ?? T(e);\n\t\t\treturn D([...e, {\n\t\t\t\tlabel: `[${t}]`,\n\t\t\t\tcolor: o\n\t\t\t}], a.enabled ?? n);\n\t\t},\n\t\tisEnabled: () => n,\n\t\tdebug: () => {},\n\t\tinfo: () => {},\n\t\tlog: () => {},\n\t\tgroupCollapsed: () => {},\n\t\tgroupEnd: () => {},\n\t\tgetGroupArgs: (t) => {\n\t\t\tlet n = E(e);\n\t\t\tif (!n) return [t];\n\t\t\tlet [r, ...i] = n;\n\t\t\treturn [`${r} ${t}`, ...i];\n\t\t},\n\t\twarn: () => {},\n\t\terror: () => {}\n\t}, i = (t) => {\n\t\tif (!t) {\n\t\t\tr.debug = () => {}, r.info = () => {}, r.log = () => {}, r.groupCollapsed = () => {}, r.groupEnd = () => {}, r.warn = () => {}, r.error = () => {};\n\t\t\treturn;\n\t\t}\n\t\tlet n = E(e) ?? [];\n\t\tr.debug = Function.prototype.bind.call(console.debug, console, ...n), r.info = Function.prototype.bind.call(console.info, console, ...n), r.log = Function.prototype.bind.call(console.log, console, ...n), r.groupCollapsed = Function.prototype.bind.call(console.groupCollapsed, console), r.groupEnd = Function.prototype.bind.call(console.groupEnd, console), r.warn = Function.prototype.bind.call(console.warn, console, ...n), r.error = Function.prototype.bind.call(console.error, console, ...n);\n\t}, a = (e) => {\n\t\tn !== e && (n = e, i(n));\n\t};\n\treturn i(n), r;\n}, O = D(), k = \"prose-reader-resource-error\", A = (e, t) => {\n\tlet n = e.split(/(\\d+)/), r = t.split(/(\\d+)/);\n\tfor (let e = 0, t = n.length; e < t; e++) if (n[e] !== r[e]) return n[e]?.match(/\\d/) ? (n[e] || \"\") - +(r[e] || \"\") : (n[e] || \"\").localeCompare(r[e] || \"\");\n\treturn 1;\n}, j = (e) => e.endsWith(\"/\") ? e.slice(0, -1) : e, M = (e) => {\n\tlet t = j(e);\n\treturn t.substring(t.lastIndexOf(\"/\") + 1) || t;\n}, N = (e) => {\n\tlet t = e.lastIndexOf(\"/\");\n\treturn t >= 0 ? e.substring(0, t) : \"\";\n}, P = (e) => e.replaceAll(\"&\", \"&amp;\").replaceAll(\"\\\"\", \"&quot;\").replaceAll(\"'\", \"&apos;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n//#endregion\nexport { k as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME, O as Report, e as arrayEqual, _ as createUniqueXmlSafeId, g as createXmlSafeId, v as createXmlSafeIdFactory, a as detectMimeTypeFromName, P as escapeXmlAttributeValue, y as getItemSpreadPosition, i as getParentPath, N as getUriBasePath, M as getUriBasename, t as getUrlExtension, x as groupBy, s as isMediaContentMimeType, b as isShallowEqual, o as isXmlBasedMimeType, c as parseContentType, j as removeTrailingSlash, S as shallowMergeIfDefined, A as sortByTitleComparator, r as urlJoin };\n\n//# sourceMappingURL=index.js.map","{\n \"name\": \"@prose-reader/enhancer-annotations\",\n \"version\": \"1.322.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"/dist\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"scripts\": {\n \"start\": \"vite build --watch --mode development\",\n \"build\": \"tsc && vite build\"\n },\n \"peerDependencies\": {\n \"@prose-reader/core\": \"^1.117.0\"\n }\n}\n","import { Report } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nconst IS_DEBUG_ENABLED = true\n\nexport const report = Report.namespace(name, IS_DEBUG_ENABLED)\n","import { ReactiveEntity } from \"@prose-reader/core\"\nimport type { AnnotationsEnhancerOptions } from \"./types\"\n\nexport class Settings extends ReactiveEntity<AnnotationsEnhancerOptions> {\n update(settings: AnnotationsEnhancerOptions) {\n super.mergeCompare(settings)\n }\n}\n","import { isShallowEqual, type Reader } from \"@prose-reader/core\"\nimport {\n combineLatest,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n NEVER,\n of,\n shareReplay,\n switchMap,\n takeUntil,\n tap,\n} from \"rxjs\"\nimport { ReaderHighlights } from \"./annotations/ReaderHighlights\"\nimport type { RuntimeAnnotation } from \"./annotations/types\"\nimport { report } from \"./report\"\nimport { Settings } from \"./Settings\"\nimport type {\n AnnotateAbsolutePageParams,\n AnnotateParams,\n AnnotationsEnhancerAPI,\n AnnotationsEnhancerOptions,\n} from \"./types\"\n\nexport type { AnnotationsEnhancerAPI }\n\nexport const annotationsEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (\n options: InheritOptions & { annotations?: AnnotationsEnhancerOptions },\n ): InheritOutput & AnnotationsEnhancerAPI => {\n const { annotations: annotationsOptions, ...rest } = options\n const settings = new Settings({\n annotations$: annotationsOptions?.annotations$,\n })\n const reader = next(rest as InheritOptions)\n\n const annotations$ = settings\n .watch(\"annotations$\")\n .pipe(switchMap((annotations) => annotations ?? NEVER))\n\n const runtimeAnnotations$ = annotations$.pipe(\n distinctUntilChanged(isShallowEqual),\n map((annotations) => {\n const runtimeAnnotations: RuntimeAnnotation[] = annotations.map(\n (annotation) => {\n const { itemIndex = 0 } = reader.cfi.parseCfi(annotation.cfi ?? \"\")\n\n const highlight = {\n ...annotation,\n itemIndex,\n } satisfies RuntimeAnnotation\n\n return highlight\n },\n )\n\n return runtimeAnnotations\n }),\n tap((annotations) => {\n report.debug(\"annotations\", annotations)\n }),\n shareReplay({\n refCount: true,\n bufferSize: 1,\n }),\n )\n\n const selectedHighlight$ = runtimeAnnotations$.pipe(\n map(\n (annotations) =>\n annotations.find((annotation) => annotation.selected)?.id,\n ),\n distinctUntilChanged(),\n shareReplay({ refCount: true, bufferSize: 1 }),\n )\n\n const readerHighlights = new ReaderHighlights(\n reader,\n runtimeAnnotations$,\n selectedHighlight$,\n )\n\n const resolveItemInformation = (params: {\n absolutePageIndex?: number\n itemIndex?: number\n }) => {\n if (params.itemIndex !== undefined)\n return { itemIndex: params.itemIndex, pageIndex: undefined }\n\n if (params.absolutePageIndex !== undefined) {\n return reader.spine.pages.fromAbsolutePageIndex(\n params.absolutePageIndex,\n )\n }\n\n return undefined\n }\n\n const createAnnotation = ({\n selection,\n ...rest\n }: (AnnotateParams | AnnotateAbsolutePageParams) & {\n absolutePageIndex?: number\n }) => {\n const { itemIndex, pageIndex = 0 } = resolveItemInformation(rest) ?? {}\n const spineItem = reader.spineItemsManager.get(itemIndex)\n const id = window.crypto.randomUUID()\n\n if (!spineItem) return undefined\n\n const range = selection\n ? reader.selection.createOrderedRangeFromSelection({\n selection,\n spineItem,\n })\n : undefined\n\n const pageEntry = reader.spine.pages.fromSpineItemPageIndex(\n spineItem,\n pageIndex,\n )\n\n const cfiWithRangeOrFirstNodeOrRoot = range\n ? reader.cfi.generateCfiFromRange(range, spineItem.item)\n : pageEntry?.firstVisibleNode\n ? reader.cfi.generateCfiForSpineItemPage({\n spineItem: spineItem.item,\n pageNode: pageEntry.firstVisibleNode,\n })\n : reader.cfi.generateRootCfi(spineItem.item)\n\n const highlight = {\n cfi: cfiWithRangeOrFirstNodeOrRoot,\n itemIndex: spineItem.index,\n id,\n ...rest,\n } satisfies RuntimeAnnotation\n\n return highlight\n }\n\n const renderAnnotations$ = merge(runtimeAnnotations$, reader.layout$).pipe(\n debounceTime(50),\n switchMap(() => readerHighlights.layout()),\n )\n\n const candidates$ = reader.layoutInfo$.pipe(\n switchMap(({ pages }) =>\n combineLatest(\n pages.map((page) => {\n const item = reader.spineItemsManager.get(page.itemIndex)\n\n if (!item) return of(false)\n\n // pre-paginated can always be annotated on their unique page\n if (item.renditionLayout === \"pre-paginated\") return of(true)\n\n if (page.firstVisibleNode) return of(true)\n\n return of(false)\n }),\n ),\n ),\n )\n\n merge(renderAnnotations$, annotations$)\n .pipe(takeUntil(reader.$.destroy$))\n .subscribe()\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_ANNOTATIONS: true,\n destroy: () => {\n readerHighlights.destroy()\n reader.destroy()\n },\n annotations: {\n annotations$: runtimeAnnotations$,\n highlightTap$: readerHighlights.tap$,\n candidates$,\n isTargetWithinHighlight: readerHighlights.isTargetWithinHighlight,\n createAnnotation,\n update: settings.update.bind(settings),\n },\n }\n }\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/enhancer-annotations",
3
- "version": "1.322.0",
3
+ "version": "1.323.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -21,5 +21,5 @@
21
21
  "peerDependencies": {
22
22
  "@prose-reader/core": "^1.117.0"
23
23
  },
24
- "gitHead": "feb6bfbbae662045d9e4e10e45dfc129040e86ad"
24
+ "gitHead": "a4b2ecb1190781afe7cd2516a20f936fc82e93ca"
25
25
  }