@prose-reader/enhancer-annotations 1.310.0 → 1.311.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs.map +1 -1
- package/package.json +2 -2
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 ? !0 : e.length === t.length ? e.every((e, n) => e === t[n]) : !1, 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 = (e) => {\n\tlet t = e.pageSpreadLeft === !0;\n\tif (t !== (e.pageSpreadRight === !0)) return t ? \"left\" : \"right\";\n}, u = (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}, d = (e, t) => e.reduce((e, n) => {\n\tlet r = t(n);\n\treturn e[r] || (e[r] = []), e[r].push(n), e;\n}, {});\nfunction f(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\nvar p = () => {\n\tif (!(typeof window > \"u\")) return window;\n};\nfunction m() {\n\tlet e = p()?.__PROSE_READER_DEBUG;\n\treturn e === !0 || e === \"true\";\n}\nvar h = (e, t) => typeof e == \"boolean\" ? {\n\tenabled: e,\n\toptions: t\n} : {\n\tenabled: e?.enabled,\n\toptions: e ?? t\n}, g = (e) => e.at(-1)?.color, _ = (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}, v = (e = [], t = m()) => {\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 = h(r, i), o = a.options?.color ?? g(e);\n\t\t\treturn v([...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);\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) ?? [];\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}, y = v(), b = \"prose-reader-resource-error\", x = (e) => e.replaceAll(\"&\", \"&\").replaceAll(\"\\\"\", \""\").replaceAll(\"'\", \"'\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n//#endregion\nexport { b as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME, y as Report, e as arrayEqual, a as detectMimeTypeFromName, x as escapeXmlAttributeValue, l as getItemSpreadPosition, i as getParentPath, t as getUrlExtension, d as groupBy, s as isMediaContentMimeType, u as isShallowEqual, o as isXmlBasedMimeType, c as parseContentType, f as shallowMergeIfDefined, r as urlJoin };\n\n//# sourceMappingURL=index.js.map","{\n \"name\": \"@prose-reader/enhancer-annotations\",\n \"version\": \"1.309.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.umd.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.umd.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 ? !0 : e.length === t.length ? e.every((e, n) => e === t[n]) : !1, 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 = (e) => {\n\tlet t = e.pageSpreadLeft === !0;\n\tif (t !== (e.pageSpreadRight === !0)) return t ? \"left\" : \"right\";\n}, u = (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}, d = (e, t) => e.reduce((e, n) => {\n\tlet r = t(n);\n\treturn e[r] || (e[r] = []), e[r].push(n), e;\n}, {});\nfunction f(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\nvar p = () => {\n\tif (!(typeof window > \"u\")) return window;\n};\nfunction m() {\n\tlet e = p()?.__PROSE_READER_DEBUG;\n\treturn e === !0 || e === \"true\";\n}\nvar h = (e, t) => typeof e == \"boolean\" ? {\n\tenabled: e,\n\toptions: t\n} : {\n\tenabled: e?.enabled,\n\toptions: e ?? t\n}, g = (e) => e.at(-1)?.color, _ = (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}, v = (e = [], t = m()) => {\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 = h(r, i), o = a.options?.color ?? g(e);\n\t\t\treturn v([...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);\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) ?? [];\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}, y = v(), b = \"prose-reader-resource-error\", x = (e) => e.replaceAll(\"&\", \"&\").replaceAll(\"\\\"\", \""\").replaceAll(\"'\", \"'\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n//#endregion\nexport { b as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME, y as Report, e as arrayEqual, a as detectMimeTypeFromName, x as escapeXmlAttributeValue, l as getItemSpreadPosition, i as getParentPath, t as getUrlExtension, d as groupBy, s as isMediaContentMimeType, u as isShallowEqual, o as isXmlBasedMimeType, c as parseContentType, f as shallowMergeIfDefined, r as urlJoin };\n\n//# sourceMappingURL=index.js.map","{\n \"name\": \"@prose-reader/enhancer-annotations\",\n \"version\": \"1.310.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.umd.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.umd.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.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.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 ? !0 : e.length === t.length ? e.every((e, n) => e === t[n]) : !1, 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 = (e) => {\n\tlet t = e.pageSpreadLeft === !0;\n\tif (t !== (e.pageSpreadRight === !0)) return t ? \"left\" : \"right\";\n}, u = (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}, d = (e, t) => e.reduce((e, n) => {\n\tlet r = t(n);\n\treturn e[r] || (e[r] = []), e[r].push(n), e;\n}, {});\nfunction f(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\nvar p = () => {\n\tif (!(typeof window > \"u\")) return window;\n};\nfunction m() {\n\tlet e = p()?.__PROSE_READER_DEBUG;\n\treturn e === !0 || e === \"true\";\n}\nvar h = (e, t) => typeof e == \"boolean\" ? {\n\tenabled: e,\n\toptions: t\n} : {\n\tenabled: e?.enabled,\n\toptions: e ?? t\n}, g = (e) => e.at(-1)?.color, _ = (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}, v = (e = [], t = m()) => {\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 = h(r, i), o = a.options?.color ?? g(e);\n\t\t\treturn v([...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);\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) ?? [];\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}, y = v(), b = \"prose-reader-resource-error\", x = (e) => e.replaceAll(\"&\", \"&\").replaceAll(\"\\\"\", \""\").replaceAll(\"'\", \"'\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n//#endregion\nexport { b as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME, y as Report, e as arrayEqual, a as detectMimeTypeFromName, x as escapeXmlAttributeValue, l as getItemSpreadPosition, i as getParentPath, t as getUrlExtension, d as groupBy, s as isMediaContentMimeType, u as isShallowEqual, o as isXmlBasedMimeType, c as parseContentType, f as shallowMergeIfDefined, r as urlJoin };\n\n//# sourceMappingURL=index.js.map","{\n \"name\": \"@prose-reader/enhancer-annotations\",\n \"version\": \"1.309.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.umd.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.umd.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.umd.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 ? !0 : e.length === t.length ? e.every((e, n) => e === t[n]) : !1, 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 = (e) => {\n\tlet t = e.pageSpreadLeft === !0;\n\tif (t !== (e.pageSpreadRight === !0)) return t ? \"left\" : \"right\";\n}, u = (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}, d = (e, t) => e.reduce((e, n) => {\n\tlet r = t(n);\n\treturn e[r] || (e[r] = []), e[r].push(n), e;\n}, {});\nfunction f(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\nvar p = () => {\n\tif (!(typeof window > \"u\")) return window;\n};\nfunction m() {\n\tlet e = p()?.__PROSE_READER_DEBUG;\n\treturn e === !0 || e === \"true\";\n}\nvar h = (e, t) => typeof e == \"boolean\" ? {\n\tenabled: e,\n\toptions: t\n} : {\n\tenabled: e?.enabled,\n\toptions: e ?? t\n}, g = (e) => e.at(-1)?.color, _ = (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}, v = (e = [], t = m()) => {\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 = h(r, i), o = a.options?.color ?? g(e);\n\t\t\treturn v([...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);\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) ?? [];\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}, y = v(), b = \"prose-reader-resource-error\", x = (e) => e.replaceAll(\"&\", \"&\").replaceAll(\"\\\"\", \""\").replaceAll(\"'\", \"'\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n//#endregion\nexport { b as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME, y as Report, e as arrayEqual, a as detectMimeTypeFromName, x as escapeXmlAttributeValue, l as getItemSpreadPosition, i as getParentPath, t as getUrlExtension, d as groupBy, s as isMediaContentMimeType, u as isShallowEqual, o as isXmlBasedMimeType, c as parseContentType, f as shallowMergeIfDefined, r as urlJoin };\n\n//# sourceMappingURL=index.js.map","{\n \"name\": \"@prose-reader/enhancer-annotations\",\n \"version\": \"1.310.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.umd.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.umd.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.
|
|
3
|
+
"version": "1.311.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.umd.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": "
|
|
24
|
+
"gitHead": "d38e9af3b37e0db536b91479706faed9c1ded065"
|
|
25
25
|
}
|