@prose-reader/enhancer-search 1.290.0 → 1.291.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,22 +2,55 @@ import { deferIdle } from '@prose-reader/core';
2
2
  import { of, defer, forkJoin } from 'rxjs';
3
3
  import { map, switchMap, finalize, catchError } from 'rxjs/operators';
4
4
 
5
- const f = () => {
5
+ const E = () => {
6
6
  if (!(typeof window > "u"))
7
7
  return window;
8
8
  };
9
- function h() {
10
- const e = f()?.__PROSE_READER_DEBUG;
9
+ function b() {
10
+ const e = E()?.__PROSE_READER_DEBUG;
11
11
  return e === true || e === "true";
12
12
  }
13
- const s = (e, o = h(), t) => {
14
- let l = o;
15
- const r = t?.color ? `color: ${t.color}` : void 0, n = {
16
- enable: (i) => {
17
- u(i);
13
+ const m = (e, o) => typeof e == "boolean" ? {
14
+ enabled: e,
15
+ options: o
16
+ } : {
17
+ enabled: e?.enabled,
18
+ options: e ?? o
19
+ }, w = (e) => e.at(-1)?.color, u = (e) => {
20
+ if (!e.length)
21
+ return;
22
+ if (!e.some((n) => n.color))
23
+ return [e.map((n) => n.label).join(" ")];
24
+ let o = "";
25
+ const t = [];
26
+ for (const n of e)
27
+ o += `%c${o ? ` ${n.label}` : n.label}`, t.push(
28
+ n.color ? `color: ${n.color}` : ""
29
+ );
30
+ return [o, ...t];
31
+ }, p = (e = [], o = b()) => {
32
+ let t = o;
33
+ const n = {
34
+ enable: (c) => {
35
+ l(c);
36
+ },
37
+ namespace: (c, s, i) => {
38
+ const a = m(
39
+ s,
40
+ i
41
+ ), g = a.options?.color ?? w(e);
42
+ return p(
43
+ [
44
+ ...e,
45
+ {
46
+ label: `[${c}]`,
47
+ color: g
48
+ }
49
+ ],
50
+ a.enabled ?? t
51
+ );
18
52
  },
19
- namespace: (i, p) => s(`${e} [${i}]`, p, t),
20
- isEnabled: () => l,
53
+ isEnabled: () => t,
21
54
  debug: () => {
22
55
  },
23
56
  info: () => {
@@ -28,13 +61,19 @@ const s = (e, o = h(), t) => {
28
61
  },
29
62
  groupEnd: () => {
30
63
  },
31
- getGroupArgs: (i) => r ? [`%c${e ? `${e} ${i}` : i}`, r] : [e ? `${e} ${i}` : i],
64
+ getGroupArgs: (c) => {
65
+ const s = u(e);
66
+ if (!s)
67
+ return [c];
68
+ const [i, ...a] = s;
69
+ return [`${i} ${c}`, ...a];
70
+ },
32
71
  warn: () => {
33
72
  },
34
73
  error: () => {
35
74
  }
36
- }, c = (i) => {
37
- if (!i) {
75
+ }, r = (c) => {
76
+ if (!c) {
38
77
  n.debug = () => {
39
78
  }, n.info = () => {
40
79
  }, n.log = () => {
@@ -45,54 +84,41 @@ const s = (e, o = h(), t) => {
45
84
  };
46
85
  return;
47
86
  }
48
- n.debug = e ? Function.prototype.bind.call(
87
+ const s = u(e) ?? [];
88
+ n.debug = Function.prototype.bind.call(
49
89
  console.debug,
50
90
  console,
51
- e,
52
- `%c${e}`,
53
- r
54
- ) : Function.prototype.bind.call(
55
- console.debug,
56
- console,
57
- `%c${e}`,
58
- r
91
+ ...s
59
92
  ), n.info = Function.prototype.bind.call(
60
93
  console.info,
61
94
  console,
62
- `%c${e}`,
63
- r
64
- ), n.log = e ? Function.prototype.bind.call(
95
+ ...s
96
+ ), n.log = Function.prototype.bind.call(
65
97
  console.log,
66
98
  console,
67
- `%c${e}`,
68
- r
69
- ) : Function.prototype.bind.call(console.log, console), n.groupCollapsed = Function.prototype.bind.call(
99
+ ...s
100
+ ), n.groupCollapsed = Function.prototype.bind.call(
70
101
  console.groupCollapsed,
71
102
  console
72
103
  ), n.groupEnd = Function.prototype.bind.call(console.groupEnd, console), n.warn = Function.prototype.bind.call(
73
104
  console.warn,
74
105
  console,
75
- `%c${e}`,
76
- r
106
+ ...s
77
107
  ), n.error = Function.prototype.bind.call(
78
108
  console.error,
79
109
  console,
80
- `%c${e}`,
81
- r
110
+ ...s
82
111
  );
83
- }, u = (i) => {
84
- l !== i && (l = i, c(l));
112
+ }, l = (c) => {
113
+ t !== c && (t = c, r(t));
85
114
  };
86
- return c(l), n;
87
- }, _ = {
88
- ...s(),
89
- namespace: (e, o, t) => s(`[${e}]`, o, t)
90
- };
115
+ return r(t), n;
116
+ }, M = p();
91
117
 
92
118
  const name = "@prose-reader/enhancer-search";
93
119
 
94
120
  const IS_DEBUG_ENABLED = true;
95
- const report = _.namespace(name, IS_DEBUG_ENABLED);
121
+ const report = M.namespace(name, IS_DEBUG_ENABLED);
96
122
 
97
123
  const searchNodeContainingText = (node, text) => {
98
124
  const nodeList = node.childNodes;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../shared/dist/index.js","../src/report.ts","../src/search.ts","../src/index.ts"],"sourcesContent":["const E = (e, o) => e === o ? !0 : e.length !== o.length ? !1 : e.every((t, l) => t === o[l]), a = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction g(e) {\n const o = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let n = e[r];\n if (typeof n != \"string\")\n throw new TypeError(`Url must be a string. Received ${n}`);\n n !== \"\" && (r > 0 && (n = n.replace(/^[/]+/, \"\")), r < e.length - 1 ? n = n.replace(/[/]+$/, \"\") : n = n.replace(/[/]+$/, \"/\"), o.push(n));\n }\n let t = o.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const l = t.split(\"?\");\n return t = l.shift() + (l.length > 0 ? \"?\" : \"\") + l.join(\"&\"), t;\n}\nfunction b(...e) {\n const o = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return g(o);\n}\nfunction $(e) {\n const o = e.split(\"/\");\n return o.pop(), o.join(\"/\");\n}\nconst d = (e) => {\n switch (a(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n case \"mp3\":\n return \"audio/mpeg\";\n case \"m4a\":\n case \"m4b\":\n return \"audio/mp4\";\n case \"aac\":\n return \"audio/aac\";\n case \"ogg\":\n case \"oga\":\n return \"audio/ogg\";\n case \"wav\":\n return \"audio/wav\";\n case \"flac\":\n return \"audio/flac\";\n case \"opus\":\n return \"audio/opus\";\n }\n}, w = ({\n mimeType: e,\n uri: o\n}) => (e ?? d(o ?? \"\"))?.startsWith(\"application/xhtml+xml\"), y = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), m = (e) => {\n if (!e.length) return;\n const o = e.indexOf(\";\");\n return o >= 0 ? e.substring(0, o) : e;\n}, R = (e, o, t) => {\n if (Object.is(e, o))\n return !0;\n if (typeof e != \"object\" || e === null || typeof o != \"object\" || o === null)\n return !1;\n const l = Object.keys(e), r = Object.keys(o);\n if (l.length !== r.length)\n return !1;\n const n = t?.customEqual ?? Object.is, c = e, u = o;\n for (const i of l)\n if (!Object.hasOwn(u, i) || !n(c[i], u[i]))\n return !1;\n return !0;\n}, O = (e, o) => e.reduce(\n (t, l) => {\n const r = o(l);\n return t[r] || (t[r] = []), t[r].push(l), t;\n },\n {}\n);\nfunction x(e, o) {\n const t = { ...e };\n for (const l in o)\n if (Object.hasOwn(o, l)) {\n const r = o[l];\n (r !== void 0 || !(l in e)) && (t[l] = r);\n }\n return t;\n}\nconst f = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction h() {\n const e = f()?.__PROSE_READER_DEBUG;\n return e === !0 || e === \"true\";\n}\nconst s = (e, o = h(), t) => {\n let l = o;\n const r = t?.color ? `color: ${t.color}` : void 0, n = {\n enable: (i) => {\n u(i);\n },\n namespace: (i, p) => s(`${e} [${i}]`, p, t),\n isEnabled: () => l,\n debug: () => {\n },\n info: () => {\n },\n log: () => {\n },\n groupCollapsed: () => {\n },\n groupEnd: () => {\n },\n getGroupArgs: (i) => r ? [`%c${e ? `${e} ${i}` : i}`, r] : [e ? `${e} ${i}` : i],\n warn: () => {\n },\n error: () => {\n }\n }, c = (i) => {\n if (!i) {\n n.debug = () => {\n }, n.info = () => {\n }, n.log = () => {\n }, n.groupCollapsed = () => {\n }, n.groupEnd = () => {\n }, n.warn = () => {\n }, n.error = () => {\n };\n return;\n }\n n.debug = e ? Function.prototype.bind.call(\n console.debug,\n console,\n e,\n `%c${e}`,\n r\n ) : Function.prototype.bind.call(\n console.debug,\n console,\n `%c${e}`,\n r\n ), n.info = Function.prototype.bind.call(\n console.info,\n console,\n `%c${e}`,\n r\n ), n.log = e ? Function.prototype.bind.call(\n console.log,\n console,\n `%c${e}`,\n r\n ) : Function.prototype.bind.call(console.log, console), n.groupCollapsed = Function.prototype.bind.call(\n console.groupCollapsed,\n console\n ), n.groupEnd = Function.prototype.bind.call(console.groupEnd, console), n.warn = Function.prototype.bind.call(\n console.warn,\n console,\n `%c${e}`,\n r\n ), n.error = Function.prototype.bind.call(\n console.error,\n console,\n `%c${e}`,\n r\n );\n }, u = (i) => {\n l !== i && (l = i, c(l));\n };\n return c(l), n;\n}, _ = {\n ...s(),\n namespace: (e, o, t) => s(`[${e}]`, o, t)\n}, F = \"prose-reader-resource-error\";\nexport {\n F as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n _ as Report,\n E as arrayEqual,\n d as detectMimeTypeFromName,\n $ as getParentPath,\n a as getUrlExtension,\n O as groupBy,\n y as isMediaContentMimeType,\n R as isShallowEqual,\n w as isXmlBasedMimeType,\n m as parseContentType,\n x as shallowMergeIfDefined,\n b as urlJoin\n};\n//# sourceMappingURL=index.js.map\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 type { Reader, SpineItem } from \"@prose-reader/core\"\nimport { type Observable, of } from \"rxjs\"\nimport type { ResultItem } from \"./types\"\n\nexport type SearchResult = ResultItem[]\n\nconst searchNodeContainingText = (node: Node, text: string) => {\n const nodeList = node.childNodes\n\n if (node.nodeName === `head`) return []\n\n const rangeList: Range[] = []\n\n for (let i = 0; i < nodeList.length; i++) {\n const subNode = nodeList[i]\n\n if (!subNode) {\n continue\n }\n\n if (subNode?.hasChildNodes()) {\n rangeList.push(...searchNodeContainingText(subNode, text))\n }\n\n if (subNode.nodeType === 3) {\n const content = (subNode as Text).data.toLowerCase()\n if (content) {\n let match: RegExpExecArray | null = null\n const regexp = RegExp(`(${text})`, `gi`)\n\n // biome-ignore lint/suspicious/noAssignInExpressions: TODO\n while ((match = regexp.exec(content)) !== null) {\n if (match.index >= 0 && subNode.ownerDocument) {\n const range = subNode.ownerDocument.createRange()\n range.setStart(subNode, match.index)\n range.setEnd(subNode, match.index + text.length)\n\n rangeList.push(range)\n }\n }\n }\n }\n }\n\n return rangeList\n}\n\nexport const searchInDocument = (\n reader: Reader,\n item: SpineItem,\n doc: Document,\n text: string,\n): Observable<SearchResult> => {\n const ranges = searchNodeContainingText(doc, text)\n\n const newResults = ranges.map((range) => {\n const cfi = reader.cfi.generateCfiFromRange(range, item.item)\n\n return {\n cfi,\n } satisfies ResultItem\n })\n\n return of(newResults)\n}\n","import { deferIdle, type Reader } from \"@prose-reader/core\"\nimport { defer, forkJoin, of } from \"rxjs\"\nimport { catchError, finalize, map, switchMap } from \"rxjs/operators\"\nimport { report } from \"./report\"\nimport type { SearchResult } from \"./search\"\nimport { searchInDocument } from \"./search\"\nimport type { ResultItem, SearchEnhancerAPI } from \"./types\"\n\nexport type { SearchEnhancerAPI, ResultItem, SearchResult }\n\n/**\n * Contract of search enhancer.\n *\n * - At best a result match should be navigable. It means the search needs to\n * be done on a rendered document. This is because rendering can differ from the original\n * item resource. A resource can be something non digestible and very specific (.pdf). The search\n * enhancer is agnostic and can only search into documents.\n */\nexport const searchEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & SearchEnhancerAPI => {\n const reader = next(options)\n\n const searchForItem = (index: number, text: string) => {\n const item = reader.spineItemsManager.get(index)\n\n if (!item) {\n return of([])\n }\n\n return deferIdle(() => reader.renderHeadless(index)).pipe(\n switchMap((result) => {\n const { doc, release } = result || {}\n\n if (!doc) return of([])\n\n return deferIdle(() =>\n searchInDocument(reader, item, doc, text),\n ).pipe(\n finalize(() => {\n release?.()\n }),\n catchError((e) => {\n report.error(e)\n\n return of([])\n }),\n )\n }),\n )\n }\n\n const search = (text: string) =>\n defer(() => {\n if (text === ``) {\n return of([])\n }\n\n const searches$ =\n reader.context.manifest?.spineItems.map((_, index) =>\n searchForItem(index, text),\n ) || []\n\n return forkJoin([...searches$, of([])])\n }).pipe(\n map((results) => {\n const flattenedResults = results.flat()\n\n report.debug(\"results\", flattenedResults)\n\n return flattenedResults\n }),\n )\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_SEARCH: true,\n search: {\n search,\n },\n }\n }\n"],"names":["Report"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../shared/dist/index.js","../src/report.ts","../src/search.ts","../src/index.ts"],"sourcesContent":["const y = (e, o) => e === o ? !0 : e.length !== o.length ? !1 : e.every((t, n) => t === o[n]), f = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction d(e) {\n const o = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(`Url must be a string. Received ${l}`);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), o.push(l));\n }\n let t = o.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const n = t.split(\"?\");\n return t = n.shift() + (n.length > 0 ? \"?\" : \"\") + n.join(\"&\"), t;\n}\nfunction R(...e) {\n const o = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return d(o);\n}\nfunction $(e) {\n const o = e.split(\"/\");\n return o.pop(), o.join(\"/\");\n}\nconst h = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n case \"mp3\":\n return \"audio/mpeg\";\n case \"m4a\":\n case \"m4b\":\n return \"audio/mp4\";\n case \"aac\":\n return \"audio/aac\";\n case \"ogg\":\n case \"oga\":\n return \"audio/ogg\";\n case \"wav\":\n return \"audio/wav\";\n case \"flac\":\n return \"audio/flac\";\n case \"opus\":\n return \"audio/opus\";\n }\n}, x = ({\n mimeType: e,\n uri: o\n}) => (e ?? h(o ?? \"\"))?.startsWith(\"application/xhtml+xml\"), _ = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), C = (e) => {\n if (!e.length) return;\n const o = e.indexOf(\";\");\n return o >= 0 ? e.substring(0, o) : e;\n}, v = (e, o, t) => {\n if (Object.is(e, o))\n return !0;\n if (typeof e != \"object\" || e === null || typeof o != \"object\" || o === null)\n return !1;\n const n = Object.keys(e), r = Object.keys(o);\n if (n.length !== r.length)\n return !1;\n const l = t?.customEqual ?? Object.is, c = e, s = o;\n for (const i of n)\n if (!Object.hasOwn(s, i) || !l(c[i], s[i]))\n return !1;\n return !0;\n}, F = (e, o) => e.reduce(\n (t, n) => {\n const r = o(n);\n return t[r] || (t[r] = []), t[r].push(n), t;\n },\n {}\n);\nfunction T(e, o) {\n const t = { ...e };\n for (const n in o)\n if (Object.hasOwn(o, n)) {\n const r = o[n];\n (r !== void 0 || !(n in e)) && (t[n] = r);\n }\n return t;\n}\nconst E = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction b() {\n const e = E()?.__PROSE_READER_DEBUG;\n return e === !0 || e === \"true\";\n}\nconst m = (e, o) => typeof e == \"boolean\" ? {\n enabled: e,\n options: o\n} : {\n enabled: e?.enabled,\n options: e ?? o\n}, w = (e) => e.at(-1)?.color, u = (e) => {\n if (!e.length)\n return;\n if (!e.some((n) => n.color))\n return [e.map((n) => n.label).join(\" \")];\n let o = \"\";\n const t = [];\n for (const n of e)\n o += `%c${o ? ` ${n.label}` : n.label}`, t.push(\n n.color ? `color: ${n.color}` : \"\"\n );\n return [o, ...t];\n}, p = (e = [], o = b()) => {\n let t = o;\n const n = {\n enable: (c) => {\n l(c);\n },\n namespace: (c, s, i) => {\n const a = m(\n s,\n i\n ), g = a.options?.color ?? w(e);\n return p(\n [\n ...e,\n {\n label: `[${c}]`,\n color: g\n }\n ],\n a.enabled ?? t\n );\n },\n isEnabled: () => t,\n debug: () => {\n },\n info: () => {\n },\n log: () => {\n },\n groupCollapsed: () => {\n },\n groupEnd: () => {\n },\n getGroupArgs: (c) => {\n const s = u(e);\n if (!s)\n return [c];\n const [i, ...a] = s;\n return [`${i} ${c}`, ...a];\n },\n warn: () => {\n },\n error: () => {\n }\n }, r = (c) => {\n if (!c) {\n n.debug = () => {\n }, n.info = () => {\n }, n.log = () => {\n }, n.groupCollapsed = () => {\n }, n.groupEnd = () => {\n }, n.warn = () => {\n }, n.error = () => {\n };\n return;\n }\n const s = u(e) ?? [];\n n.debug = Function.prototype.bind.call(\n console.debug,\n console,\n ...s\n ), n.info = Function.prototype.bind.call(\n console.info,\n console,\n ...s\n ), n.log = Function.prototype.bind.call(\n console.log,\n console,\n ...s\n ), n.groupCollapsed = Function.prototype.bind.call(\n console.groupCollapsed,\n console\n ), n.groupEnd = Function.prototype.bind.call(console.groupEnd, console), n.warn = Function.prototype.bind.call(\n console.warn,\n console,\n ...s\n ), n.error = Function.prototype.bind.call(\n console.error,\n console,\n ...s\n );\n }, l = (c) => {\n t !== c && (t = c, r(t));\n };\n return r(t), n;\n}, M = p(), O = \"prose-reader-resource-error\";\nexport {\n O as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n M as Report,\n y as arrayEqual,\n h as detectMimeTypeFromName,\n $ as getParentPath,\n f as getUrlExtension,\n F as groupBy,\n _ as isMediaContentMimeType,\n v as isShallowEqual,\n x as isXmlBasedMimeType,\n C as parseContentType,\n T as shallowMergeIfDefined,\n R as urlJoin\n};\n//# sourceMappingURL=index.js.map\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 type { Reader, SpineItem } from \"@prose-reader/core\"\nimport { type Observable, of } from \"rxjs\"\nimport type { ResultItem } from \"./types\"\n\nexport type SearchResult = ResultItem[]\n\nconst searchNodeContainingText = (node: Node, text: string) => {\n const nodeList = node.childNodes\n\n if (node.nodeName === `head`) return []\n\n const rangeList: Range[] = []\n\n for (let i = 0; i < nodeList.length; i++) {\n const subNode = nodeList[i]\n\n if (!subNode) {\n continue\n }\n\n if (subNode?.hasChildNodes()) {\n rangeList.push(...searchNodeContainingText(subNode, text))\n }\n\n if (subNode.nodeType === 3) {\n const content = (subNode as Text).data.toLowerCase()\n if (content) {\n let match: RegExpExecArray | null = null\n const regexp = RegExp(`(${text})`, `gi`)\n\n // biome-ignore lint/suspicious/noAssignInExpressions: TODO\n while ((match = regexp.exec(content)) !== null) {\n if (match.index >= 0 && subNode.ownerDocument) {\n const range = subNode.ownerDocument.createRange()\n range.setStart(subNode, match.index)\n range.setEnd(subNode, match.index + text.length)\n\n rangeList.push(range)\n }\n }\n }\n }\n }\n\n return rangeList\n}\n\nexport const searchInDocument = (\n reader: Reader,\n item: SpineItem,\n doc: Document,\n text: string,\n): Observable<SearchResult> => {\n const ranges = searchNodeContainingText(doc, text)\n\n const newResults = ranges.map((range) => {\n const cfi = reader.cfi.generateCfiFromRange(range, item.item)\n\n return {\n cfi,\n } satisfies ResultItem\n })\n\n return of(newResults)\n}\n","import { deferIdle, type Reader } from \"@prose-reader/core\"\nimport { defer, forkJoin, of } from \"rxjs\"\nimport { catchError, finalize, map, switchMap } from \"rxjs/operators\"\nimport { report } from \"./report\"\nimport type { SearchResult } from \"./search\"\nimport { searchInDocument } from \"./search\"\nimport type { ResultItem, SearchEnhancerAPI } from \"./types\"\n\nexport type { SearchEnhancerAPI, ResultItem, SearchResult }\n\n/**\n * Contract of search enhancer.\n *\n * - At best a result match should be navigable. It means the search needs to\n * be done on a rendered document. This is because rendering can differ from the original\n * item resource. A resource can be something non digestible and very specific (.pdf). The search\n * enhancer is agnostic and can only search into documents.\n */\nexport const searchEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & SearchEnhancerAPI => {\n const reader = next(options)\n\n const searchForItem = (index: number, text: string) => {\n const item = reader.spineItemsManager.get(index)\n\n if (!item) {\n return of([])\n }\n\n return deferIdle(() => reader.renderHeadless(index)).pipe(\n switchMap((result) => {\n const { doc, release } = result || {}\n\n if (!doc) return of([])\n\n return deferIdle(() =>\n searchInDocument(reader, item, doc, text),\n ).pipe(\n finalize(() => {\n release?.()\n }),\n catchError((e) => {\n report.error(e)\n\n return of([])\n }),\n )\n }),\n )\n }\n\n const search = (text: string) =>\n defer(() => {\n if (text === ``) {\n return of([])\n }\n\n const searches$ =\n reader.context.manifest?.spineItems.map((_, index) =>\n searchForItem(index, text),\n ) || []\n\n return forkJoin([...searches$, of([])])\n }).pipe(\n map((results) => {\n const flattenedResults = results.flat()\n\n report.debug(\"results\", flattenedResults)\n\n return flattenedResults\n }),\n )\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_SEARCH: true,\n search: {\n search,\n },\n }\n }\n"],"names":["Report"],"mappings":"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"}
@@ -4,22 +4,55 @@
4
4
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["prose-reader-enhancer-search"] = {}, global.core, global.rxjs, global.operators));
5
5
  })(this, (function (exports, core, rxjs, operators) { 'use strict';
6
6
 
7
- const f = () => {
7
+ const E = () => {
8
8
  if (!(typeof window > "u"))
9
9
  return window;
10
10
  };
11
- function h() {
12
- const e = f()?.__PROSE_READER_DEBUG;
11
+ function b() {
12
+ const e = E()?.__PROSE_READER_DEBUG;
13
13
  return e === true || e === "true";
14
14
  }
15
- const s = (e, o = h(), t) => {
16
- let l = o;
17
- const r = t?.color ? `color: ${t.color}` : void 0, n = {
18
- enable: (i) => {
19
- u(i);
15
+ const m = (e, o) => typeof e == "boolean" ? {
16
+ enabled: e,
17
+ options: o
18
+ } : {
19
+ enabled: e?.enabled,
20
+ options: e ?? o
21
+ }, w = (e) => e.at(-1)?.color, u = (e) => {
22
+ if (!e.length)
23
+ return;
24
+ if (!e.some((n) => n.color))
25
+ return [e.map((n) => n.label).join(" ")];
26
+ let o = "";
27
+ const t = [];
28
+ for (const n of e)
29
+ o += `%c${o ? ` ${n.label}` : n.label}`, t.push(
30
+ n.color ? `color: ${n.color}` : ""
31
+ );
32
+ return [o, ...t];
33
+ }, p = (e = [], o = b()) => {
34
+ let t = o;
35
+ const n = {
36
+ enable: (c) => {
37
+ l(c);
38
+ },
39
+ namespace: (c, s, i) => {
40
+ const a = m(
41
+ s,
42
+ i
43
+ ), g = a.options?.color ?? w(e);
44
+ return p(
45
+ [
46
+ ...e,
47
+ {
48
+ label: `[${c}]`,
49
+ color: g
50
+ }
51
+ ],
52
+ a.enabled ?? t
53
+ );
20
54
  },
21
- namespace: (i, p) => s(`${e} [${i}]`, p, t),
22
- isEnabled: () => l,
55
+ isEnabled: () => t,
23
56
  debug: () => {
24
57
  },
25
58
  info: () => {
@@ -30,13 +63,19 @@
30
63
  },
31
64
  groupEnd: () => {
32
65
  },
33
- getGroupArgs: (i) => r ? [`%c${e ? `${e} ${i}` : i}`, r] : [e ? `${e} ${i}` : i],
66
+ getGroupArgs: (c) => {
67
+ const s = u(e);
68
+ if (!s)
69
+ return [c];
70
+ const [i, ...a] = s;
71
+ return [`${i} ${c}`, ...a];
72
+ },
34
73
  warn: () => {
35
74
  },
36
75
  error: () => {
37
76
  }
38
- }, c = (i) => {
39
- if (!i) {
77
+ }, r = (c) => {
78
+ if (!c) {
40
79
  n.debug = () => {
41
80
  }, n.info = () => {
42
81
  }, n.log = () => {
@@ -47,54 +86,41 @@
47
86
  };
48
87
  return;
49
88
  }
50
- n.debug = e ? Function.prototype.bind.call(
89
+ const s = u(e) ?? [];
90
+ n.debug = Function.prototype.bind.call(
51
91
  console.debug,
52
92
  console,
53
- e,
54
- `%c${e}`,
55
- r
56
- ) : Function.prototype.bind.call(
57
- console.debug,
58
- console,
59
- `%c${e}`,
60
- r
93
+ ...s
61
94
  ), n.info = Function.prototype.bind.call(
62
95
  console.info,
63
96
  console,
64
- `%c${e}`,
65
- r
66
- ), n.log = e ? Function.prototype.bind.call(
97
+ ...s
98
+ ), n.log = Function.prototype.bind.call(
67
99
  console.log,
68
100
  console,
69
- `%c${e}`,
70
- r
71
- ) : Function.prototype.bind.call(console.log, console), n.groupCollapsed = Function.prototype.bind.call(
101
+ ...s
102
+ ), n.groupCollapsed = Function.prototype.bind.call(
72
103
  console.groupCollapsed,
73
104
  console
74
105
  ), n.groupEnd = Function.prototype.bind.call(console.groupEnd, console), n.warn = Function.prototype.bind.call(
75
106
  console.warn,
76
107
  console,
77
- `%c${e}`,
78
- r
108
+ ...s
79
109
  ), n.error = Function.prototype.bind.call(
80
110
  console.error,
81
111
  console,
82
- `%c${e}`,
83
- r
112
+ ...s
84
113
  );
85
- }, u = (i) => {
86
- l !== i && (l = i, c(l));
114
+ }, l = (c) => {
115
+ t !== c && (t = c, r(t));
87
116
  };
88
- return c(l), n;
89
- }, _ = {
90
- ...s(),
91
- namespace: (e, o, t) => s(`[${e}]`, o, t)
92
- };
117
+ return r(t), n;
118
+ }, M = p();
93
119
 
94
120
  const name = "@prose-reader/enhancer-search";
95
121
 
96
122
  const IS_DEBUG_ENABLED = true;
97
- const report = _.namespace(name, IS_DEBUG_ENABLED);
123
+ const report = M.namespace(name, IS_DEBUG_ENABLED);
98
124
 
99
125
  const searchNodeContainingText = (node, text) => {
100
126
  const nodeList = node.childNodes;
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../../shared/dist/index.js","../src/report.ts","../src/search.ts","../src/index.ts"],"sourcesContent":["const E = (e, o) => e === o ? !0 : e.length !== o.length ? !1 : e.every((t, l) => t === o[l]), a = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction g(e) {\n const o = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let n = e[r];\n if (typeof n != \"string\")\n throw new TypeError(`Url must be a string. Received ${n}`);\n n !== \"\" && (r > 0 && (n = n.replace(/^[/]+/, \"\")), r < e.length - 1 ? n = n.replace(/[/]+$/, \"\") : n = n.replace(/[/]+$/, \"/\"), o.push(n));\n }\n let t = o.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const l = t.split(\"?\");\n return t = l.shift() + (l.length > 0 ? \"?\" : \"\") + l.join(\"&\"), t;\n}\nfunction b(...e) {\n const o = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return g(o);\n}\nfunction $(e) {\n const o = e.split(\"/\");\n return o.pop(), o.join(\"/\");\n}\nconst d = (e) => {\n switch (a(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n case \"mp3\":\n return \"audio/mpeg\";\n case \"m4a\":\n case \"m4b\":\n return \"audio/mp4\";\n case \"aac\":\n return \"audio/aac\";\n case \"ogg\":\n case \"oga\":\n return \"audio/ogg\";\n case \"wav\":\n return \"audio/wav\";\n case \"flac\":\n return \"audio/flac\";\n case \"opus\":\n return \"audio/opus\";\n }\n}, w = ({\n mimeType: e,\n uri: o\n}) => (e ?? d(o ?? \"\"))?.startsWith(\"application/xhtml+xml\"), y = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), m = (e) => {\n if (!e.length) return;\n const o = e.indexOf(\";\");\n return o >= 0 ? e.substring(0, o) : e;\n}, R = (e, o, t) => {\n if (Object.is(e, o))\n return !0;\n if (typeof e != \"object\" || e === null || typeof o != \"object\" || o === null)\n return !1;\n const l = Object.keys(e), r = Object.keys(o);\n if (l.length !== r.length)\n return !1;\n const n = t?.customEqual ?? Object.is, c = e, u = o;\n for (const i of l)\n if (!Object.hasOwn(u, i) || !n(c[i], u[i]))\n return !1;\n return !0;\n}, O = (e, o) => e.reduce(\n (t, l) => {\n const r = o(l);\n return t[r] || (t[r] = []), t[r].push(l), t;\n },\n {}\n);\nfunction x(e, o) {\n const t = { ...e };\n for (const l in o)\n if (Object.hasOwn(o, l)) {\n const r = o[l];\n (r !== void 0 || !(l in e)) && (t[l] = r);\n }\n return t;\n}\nconst f = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction h() {\n const e = f()?.__PROSE_READER_DEBUG;\n return e === !0 || e === \"true\";\n}\nconst s = (e, o = h(), t) => {\n let l = o;\n const r = t?.color ? `color: ${t.color}` : void 0, n = {\n enable: (i) => {\n u(i);\n },\n namespace: (i, p) => s(`${e} [${i}]`, p, t),\n isEnabled: () => l,\n debug: () => {\n },\n info: () => {\n },\n log: () => {\n },\n groupCollapsed: () => {\n },\n groupEnd: () => {\n },\n getGroupArgs: (i) => r ? [`%c${e ? `${e} ${i}` : i}`, r] : [e ? `${e} ${i}` : i],\n warn: () => {\n },\n error: () => {\n }\n }, c = (i) => {\n if (!i) {\n n.debug = () => {\n }, n.info = () => {\n }, n.log = () => {\n }, n.groupCollapsed = () => {\n }, n.groupEnd = () => {\n }, n.warn = () => {\n }, n.error = () => {\n };\n return;\n }\n n.debug = e ? Function.prototype.bind.call(\n console.debug,\n console,\n e,\n `%c${e}`,\n r\n ) : Function.prototype.bind.call(\n console.debug,\n console,\n `%c${e}`,\n r\n ), n.info = Function.prototype.bind.call(\n console.info,\n console,\n `%c${e}`,\n r\n ), n.log = e ? Function.prototype.bind.call(\n console.log,\n console,\n `%c${e}`,\n r\n ) : Function.prototype.bind.call(console.log, console), n.groupCollapsed = Function.prototype.bind.call(\n console.groupCollapsed,\n console\n ), n.groupEnd = Function.prototype.bind.call(console.groupEnd, console), n.warn = Function.prototype.bind.call(\n console.warn,\n console,\n `%c${e}`,\n r\n ), n.error = Function.prototype.bind.call(\n console.error,\n console,\n `%c${e}`,\n r\n );\n }, u = (i) => {\n l !== i && (l = i, c(l));\n };\n return c(l), n;\n}, _ = {\n ...s(),\n namespace: (e, o, t) => s(`[${e}]`, o, t)\n}, F = \"prose-reader-resource-error\";\nexport {\n F as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n _ as Report,\n E as arrayEqual,\n d as detectMimeTypeFromName,\n $ as getParentPath,\n a as getUrlExtension,\n O as groupBy,\n y as isMediaContentMimeType,\n R as isShallowEqual,\n w as isXmlBasedMimeType,\n m as parseContentType,\n x as shallowMergeIfDefined,\n b as urlJoin\n};\n//# sourceMappingURL=index.js.map\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 type { Reader, SpineItem } from \"@prose-reader/core\"\nimport { type Observable, of } from \"rxjs\"\nimport type { ResultItem } from \"./types\"\n\nexport type SearchResult = ResultItem[]\n\nconst searchNodeContainingText = (node: Node, text: string) => {\n const nodeList = node.childNodes\n\n if (node.nodeName === `head`) return []\n\n const rangeList: Range[] = []\n\n for (let i = 0; i < nodeList.length; i++) {\n const subNode = nodeList[i]\n\n if (!subNode) {\n continue\n }\n\n if (subNode?.hasChildNodes()) {\n rangeList.push(...searchNodeContainingText(subNode, text))\n }\n\n if (subNode.nodeType === 3) {\n const content = (subNode as Text).data.toLowerCase()\n if (content) {\n let match: RegExpExecArray | null = null\n const regexp = RegExp(`(${text})`, `gi`)\n\n // biome-ignore lint/suspicious/noAssignInExpressions: TODO\n while ((match = regexp.exec(content)) !== null) {\n if (match.index >= 0 && subNode.ownerDocument) {\n const range = subNode.ownerDocument.createRange()\n range.setStart(subNode, match.index)\n range.setEnd(subNode, match.index + text.length)\n\n rangeList.push(range)\n }\n }\n }\n }\n }\n\n return rangeList\n}\n\nexport const searchInDocument = (\n reader: Reader,\n item: SpineItem,\n doc: Document,\n text: string,\n): Observable<SearchResult> => {\n const ranges = searchNodeContainingText(doc, text)\n\n const newResults = ranges.map((range) => {\n const cfi = reader.cfi.generateCfiFromRange(range, item.item)\n\n return {\n cfi,\n } satisfies ResultItem\n })\n\n return of(newResults)\n}\n","import { deferIdle, type Reader } from \"@prose-reader/core\"\nimport { defer, forkJoin, of } from \"rxjs\"\nimport { catchError, finalize, map, switchMap } from \"rxjs/operators\"\nimport { report } from \"./report\"\nimport type { SearchResult } from \"./search\"\nimport { searchInDocument } from \"./search\"\nimport type { ResultItem, SearchEnhancerAPI } from \"./types\"\n\nexport type { SearchEnhancerAPI, ResultItem, SearchResult }\n\n/**\n * Contract of search enhancer.\n *\n * - At best a result match should be navigable. It means the search needs to\n * be done on a rendered document. This is because rendering can differ from the original\n * item resource. A resource can be something non digestible and very specific (.pdf). The search\n * enhancer is agnostic and can only search into documents.\n */\nexport const searchEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & SearchEnhancerAPI => {\n const reader = next(options)\n\n const searchForItem = (index: number, text: string) => {\n const item = reader.spineItemsManager.get(index)\n\n if (!item) {\n return of([])\n }\n\n return deferIdle(() => reader.renderHeadless(index)).pipe(\n switchMap((result) => {\n const { doc, release } = result || {}\n\n if (!doc) return of([])\n\n return deferIdle(() =>\n searchInDocument(reader, item, doc, text),\n ).pipe(\n finalize(() => {\n release?.()\n }),\n catchError((e) => {\n report.error(e)\n\n return of([])\n }),\n )\n }),\n )\n }\n\n const search = (text: string) =>\n defer(() => {\n if (text === ``) {\n return of([])\n }\n\n const searches$ =\n reader.context.manifest?.spineItems.map((_, index) =>\n searchForItem(index, text),\n ) || []\n\n return forkJoin([...searches$, of([])])\n }).pipe(\n map((results) => {\n const flattenedResults = results.flat()\n\n report.debug(\"results\", flattenedResults)\n\n return flattenedResults\n }),\n )\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_SEARCH: true,\n search: {\n search,\n },\n }\n }\n"],"names":["Report","of","deferIdle","switchMap","finalize","catchError","defer","forkJoin","map"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../../shared/dist/index.js","../src/report.ts","../src/search.ts","../src/index.ts"],"sourcesContent":["const y = (e, o) => e === o ? !0 : e.length !== o.length ? !1 : e.every((t, n) => t === o[n]), f = (e) => e.split(/[#?]/)[0]?.split(\".\").pop()?.trim() || \"\";\nfunction d(e) {\n const o = [];\n if (e.length === 0)\n return \"\";\n if (typeof e[0] != \"string\")\n throw new TypeError(`Url must be a string. Received ${e[0]}`);\n e[0].match(/^[^/:]+:\\/*$/) && e.length > 1 && (e[0] = e.shift() + e[0]), e[0].match(/^file:\\/\\/\\//) ? e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1:///\") : e[0] = e[0].replace(/^([^/:]+):\\/*/, \"$1://\");\n for (let r = 0; r < e.length; r++) {\n let l = e[r];\n if (typeof l != \"string\")\n throw new TypeError(`Url must be a string. Received ${l}`);\n l !== \"\" && (r > 0 && (l = l.replace(/^[/]+/, \"\")), r < e.length - 1 ? l = l.replace(/[/]+$/, \"\") : l = l.replace(/[/]+$/, \"/\"), o.push(l));\n }\n let t = o.join(\"/\");\n t = t.replace(/\\/(\\?|&|#[^!])/g, \"$1\");\n const n = t.split(\"?\");\n return t = n.shift() + (n.length > 0 ? \"?\" : \"\") + n.join(\"&\"), t;\n}\nfunction R(...e) {\n const o = Array.from(Array.isArray(e[0]) ? e[0] : e);\n return d(o);\n}\nfunction $(e) {\n const o = e.split(\"/\");\n return o.pop(), o.join(\"/\");\n}\nconst h = (e) => {\n switch (f(e)) {\n case \"png\":\n return \"image/png\";\n case \"jpg\":\n return \"image/jpg\";\n case \"jpeg\":\n return \"image/jpeg\";\n case \"txt\":\n return \"text/plain\";\n case \"webp\":\n return \"image/webp\";\n case \"xhtml\":\n return \"application/xhtml+xml\";\n case \"mp3\":\n return \"audio/mpeg\";\n case \"m4a\":\n case \"m4b\":\n return \"audio/mp4\";\n case \"aac\":\n return \"audio/aac\";\n case \"ogg\":\n case \"oga\":\n return \"audio/ogg\";\n case \"wav\":\n return \"audio/wav\";\n case \"flac\":\n return \"audio/flac\";\n case \"opus\":\n return \"audio/opus\";\n }\n}, x = ({\n mimeType: e,\n uri: o\n}) => (e ?? h(o ?? \"\"))?.startsWith(\"application/xhtml+xml\"), _ = (e) => e.startsWith(\"image/\") || e.startsWith(\"audio/\") || e.startsWith(\"video/\"), C = (e) => {\n if (!e.length) return;\n const o = e.indexOf(\";\");\n return o >= 0 ? e.substring(0, o) : e;\n}, v = (e, o, t) => {\n if (Object.is(e, o))\n return !0;\n if (typeof e != \"object\" || e === null || typeof o != \"object\" || o === null)\n return !1;\n const n = Object.keys(e), r = Object.keys(o);\n if (n.length !== r.length)\n return !1;\n const l = t?.customEqual ?? Object.is, c = e, s = o;\n for (const i of n)\n if (!Object.hasOwn(s, i) || !l(c[i], s[i]))\n return !1;\n return !0;\n}, F = (e, o) => e.reduce(\n (t, n) => {\n const r = o(n);\n return t[r] || (t[r] = []), t[r].push(n), t;\n },\n {}\n);\nfunction T(e, o) {\n const t = { ...e };\n for (const n in o)\n if (Object.hasOwn(o, n)) {\n const r = o[n];\n (r !== void 0 || !(n in e)) && (t[n] = r);\n }\n return t;\n}\nconst E = () => {\n if (!(typeof window > \"u\"))\n return window;\n};\nfunction b() {\n const e = E()?.__PROSE_READER_DEBUG;\n return e === !0 || e === \"true\";\n}\nconst m = (e, o) => typeof e == \"boolean\" ? {\n enabled: e,\n options: o\n} : {\n enabled: e?.enabled,\n options: e ?? o\n}, w = (e) => e.at(-1)?.color, u = (e) => {\n if (!e.length)\n return;\n if (!e.some((n) => n.color))\n return [e.map((n) => n.label).join(\" \")];\n let o = \"\";\n const t = [];\n for (const n of e)\n o += `%c${o ? ` ${n.label}` : n.label}`, t.push(\n n.color ? `color: ${n.color}` : \"\"\n );\n return [o, ...t];\n}, p = (e = [], o = b()) => {\n let t = o;\n const n = {\n enable: (c) => {\n l(c);\n },\n namespace: (c, s, i) => {\n const a = m(\n s,\n i\n ), g = a.options?.color ?? w(e);\n return p(\n [\n ...e,\n {\n label: `[${c}]`,\n color: g\n }\n ],\n a.enabled ?? t\n );\n },\n isEnabled: () => t,\n debug: () => {\n },\n info: () => {\n },\n log: () => {\n },\n groupCollapsed: () => {\n },\n groupEnd: () => {\n },\n getGroupArgs: (c) => {\n const s = u(e);\n if (!s)\n return [c];\n const [i, ...a] = s;\n return [`${i} ${c}`, ...a];\n },\n warn: () => {\n },\n error: () => {\n }\n }, r = (c) => {\n if (!c) {\n n.debug = () => {\n }, n.info = () => {\n }, n.log = () => {\n }, n.groupCollapsed = () => {\n }, n.groupEnd = () => {\n }, n.warn = () => {\n }, n.error = () => {\n };\n return;\n }\n const s = u(e) ?? [];\n n.debug = Function.prototype.bind.call(\n console.debug,\n console,\n ...s\n ), n.info = Function.prototype.bind.call(\n console.info,\n console,\n ...s\n ), n.log = Function.prototype.bind.call(\n console.log,\n console,\n ...s\n ), n.groupCollapsed = Function.prototype.bind.call(\n console.groupCollapsed,\n console\n ), n.groupEnd = Function.prototype.bind.call(console.groupEnd, console), n.warn = Function.prototype.bind.call(\n console.warn,\n console,\n ...s\n ), n.error = Function.prototype.bind.call(\n console.error,\n console,\n ...s\n );\n }, l = (c) => {\n t !== c && (t = c, r(t));\n };\n return r(t), n;\n}, M = p(), O = \"prose-reader-resource-error\";\nexport {\n O as PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME,\n M as Report,\n y as arrayEqual,\n h as detectMimeTypeFromName,\n $ as getParentPath,\n f as getUrlExtension,\n F as groupBy,\n _ as isMediaContentMimeType,\n v as isShallowEqual,\n x as isXmlBasedMimeType,\n C as parseContentType,\n T as shallowMergeIfDefined,\n R as urlJoin\n};\n//# sourceMappingURL=index.js.map\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 type { Reader, SpineItem } from \"@prose-reader/core\"\nimport { type Observable, of } from \"rxjs\"\nimport type { ResultItem } from \"./types\"\n\nexport type SearchResult = ResultItem[]\n\nconst searchNodeContainingText = (node: Node, text: string) => {\n const nodeList = node.childNodes\n\n if (node.nodeName === `head`) return []\n\n const rangeList: Range[] = []\n\n for (let i = 0; i < nodeList.length; i++) {\n const subNode = nodeList[i]\n\n if (!subNode) {\n continue\n }\n\n if (subNode?.hasChildNodes()) {\n rangeList.push(...searchNodeContainingText(subNode, text))\n }\n\n if (subNode.nodeType === 3) {\n const content = (subNode as Text).data.toLowerCase()\n if (content) {\n let match: RegExpExecArray | null = null\n const regexp = RegExp(`(${text})`, `gi`)\n\n // biome-ignore lint/suspicious/noAssignInExpressions: TODO\n while ((match = regexp.exec(content)) !== null) {\n if (match.index >= 0 && subNode.ownerDocument) {\n const range = subNode.ownerDocument.createRange()\n range.setStart(subNode, match.index)\n range.setEnd(subNode, match.index + text.length)\n\n rangeList.push(range)\n }\n }\n }\n }\n }\n\n return rangeList\n}\n\nexport const searchInDocument = (\n reader: Reader,\n item: SpineItem,\n doc: Document,\n text: string,\n): Observable<SearchResult> => {\n const ranges = searchNodeContainingText(doc, text)\n\n const newResults = ranges.map((range) => {\n const cfi = reader.cfi.generateCfiFromRange(range, item.item)\n\n return {\n cfi,\n } satisfies ResultItem\n })\n\n return of(newResults)\n}\n","import { deferIdle, type Reader } from \"@prose-reader/core\"\nimport { defer, forkJoin, of } from \"rxjs\"\nimport { catchError, finalize, map, switchMap } from \"rxjs/operators\"\nimport { report } from \"./report\"\nimport type { SearchResult } from \"./search\"\nimport { searchInDocument } from \"./search\"\nimport type { ResultItem, SearchEnhancerAPI } from \"./types\"\n\nexport type { SearchEnhancerAPI, ResultItem, SearchResult }\n\n/**\n * Contract of search enhancer.\n *\n * - At best a result match should be navigable. It means the search needs to\n * be done on a rendered document. This is because rendering can differ from the original\n * item resource. A resource can be something non digestible and very specific (.pdf). The search\n * enhancer is agnostic and can only search into documents.\n */\nexport const searchEnhancer =\n <InheritOptions, InheritOutput extends Reader>(\n next: (options: InheritOptions) => InheritOutput,\n ) =>\n (options: InheritOptions): InheritOutput & SearchEnhancerAPI => {\n const reader = next(options)\n\n const searchForItem = (index: number, text: string) => {\n const item = reader.spineItemsManager.get(index)\n\n if (!item) {\n return of([])\n }\n\n return deferIdle(() => reader.renderHeadless(index)).pipe(\n switchMap((result) => {\n const { doc, release } = result || {}\n\n if (!doc) return of([])\n\n return deferIdle(() =>\n searchInDocument(reader, item, doc, text),\n ).pipe(\n finalize(() => {\n release?.()\n }),\n catchError((e) => {\n report.error(e)\n\n return of([])\n }),\n )\n }),\n )\n }\n\n const search = (text: string) =>\n defer(() => {\n if (text === ``) {\n return of([])\n }\n\n const searches$ =\n reader.context.manifest?.spineItems.map((_, index) =>\n searchForItem(index, text),\n ) || []\n\n return forkJoin([...searches$, of([])])\n }).pipe(\n map((results) => {\n const flattenedResults = results.flat()\n\n report.debug(\"results\", flattenedResults)\n\n return flattenedResults\n }),\n )\n\n return {\n ...reader,\n __PROSE_READER_ENHANCER_SEARCH: true,\n search: {\n search,\n },\n }\n }\n"],"names":["Report","of","deferIdle","switchMap","finalize","catchError","defer","forkJoin","map"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/enhancer-search",
3
- "version": "1.290.0",
3
+ "version": "1.291.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.umd.cjs",
6
6
  "module": "./dist/index.js",
@@ -20,10 +20,10 @@
20
20
  "test": "vitest run --coverage"
21
21
  },
22
22
  "dependencies": {
23
- "@prose-reader/core": "^1.290.0"
23
+ "@prose-reader/core": "^1.291.0"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "rxjs": "*"
27
27
  },
28
- "gitHead": "6badb447dc35000fac2bed1f7a03fcd8830e0503"
28
+ "gitHead": "95d3d207700bd99e75fdc6a169c7102f90cc7781"
29
29
  }