@prose-reader/enhancer-koreader 20.0.1 → 21.0.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.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -40
- package/dist/index.js.map +1 -1
- package/dist/koreaderEnhancer.d.ts +3 -2
- package/package.json +5 -6
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@prose-reader/koreader")
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@prose-reader/koreader");var t=require("@prose-reader/shared").Report.namespace(`@prose-reader/enhancer-koreader`),n=e=>e.type===`xpointer`,r=r=>i=>{let a=r(i),o=t=>{let n=(0,e.parseXPointer)(t);if(n&&a.spineItemsManager.get(n.spineItemIndex))return{type:`selector`,value:{spineItem:n.spineItemIndex,find:t=>{let r=(0,e.resolveXPointer)(n,t);return r&&(0,e.toCfiPosition)(r)}}}},s=e=>{let{target:r}=e;if(!n(r))return a.navigation.navigate({...e,target:r});let i=o(r.value);if(!i){t.warn(`Ignore navigation to ${r.value}, not in the book`);return}a.navigation.navigate({...e,target:i})},c=e=>{let t=a.spineItemsManager.get(e),n=t?.value.isLoaded?t.renderer.getDocumentFrame()?.contentDocument:void 0;return t&&n?{document:n,id:t.item.id}:void 0};return{...a,navigation:{...a.navigation,navigate:s,goToXPointer:e=>s({target:{type:`xpointer`,value:e},animation:!1})},koreader:{cfiToXPointer:t=>(0,e.cfiToXPointer)(t,c)}}};exports.koreaderEnhancer=r;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/koreaderEnhancer.ts"],"sourcesContent":["import type {\n EnhancerOutput,\n NavigationTarget,\n RootEnhancer,\n UserNavigationEntry,\n} from \"@prose-reader/core\"\nimport {\n cfiToXPointer,\n parseXPointer,\n resolveXPointer,\n toCfiPosition,\n} from \"@prose-reader/koreader\"\nimport { Report } from \"@prose-reader/shared\"\
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/koreaderEnhancer.ts"],"sourcesContent":["import type {\n EnhancerOutput,\n NavigationTarget,\n RootEnhancer,\n UserNavigationEntry,\n} from \"@prose-reader/core\"\nimport {\n cfiToXPointer,\n parseXPointer,\n resolveXPointer,\n toCfiPosition,\n} from \"@prose-reader/koreader\"\nimport { Report } from \"@prose-reader/shared\"\n\nconst report = Report.namespace(`@prose-reader/enhancer-koreader`)\n\n/** A KOReader (crengine) xpointer, such as `/body/DocFragment[14]/body/div/p[3]/text().42`. */\nexport type XPointerNavigationTarget = { type: \"xpointer\"; value: string }\n\nexport type KoreaderEnhancerOutput<InheritTarget> = {\n navigation: {\n navigate: (\n to: UserNavigationEntry<InheritTarget | XPointerNavigationTarget>,\n ) => void\n /** Goes to the place an xpointer names. Never animates. */\n goToXPointer: (xpointer: string) => void\n }\n koreader: {\n /**\n * The xpointer of a cfi, such as the reading position's, for a KOReader\n * sync client to push. A cfi naming a spine item converts at once; one\n * naming a place in its text needs the item's document loaded, and is\n * `undefined` otherwise, as for a cfi that names nothing in the book.\n */\n cfiToXPointer: (cfi: string) => string | undefined\n }\n}\n\nconst isXPointerTarget = (target: {\n type: string\n}): target is XPointerNavigationTarget => target.type === \"xpointer\"\n\n/**\n * Lets a reader navigate to KOReader xpointers, and convert a cfi, such as its\n * reading position, to one.\n */\nexport const koreaderEnhancer =\n <\n InheritOptions,\n InheritTarget extends { type: string },\n InheritOutput extends EnhancerOutput<RootEnhancer>,\n >(\n next: (options: InheritOptions) => InheritOutput & {\n navigation: {\n navigate: (to: UserNavigationEntry<InheritTarget>) => void\n }\n },\n ) =>\n (\n options: InheritOptions,\n ): InheritOutput & KoreaderEnhancerOutput<InheritTarget> => {\n const reader = next(options)\n\n /**\n * The pointer names its spine item, which is known at once, and a place\n * in its document, found once the document is loaded.\n */\n const xpointerToNavigationTarget = (\n xpointer: string,\n ): NavigationTarget<\"selector\"> | undefined => {\n const parsed = parseXPointer(xpointer)\n\n if (!parsed || !reader.spineItemsManager.get(parsed.spineItemIndex))\n return undefined\n\n return {\n type: \"selector\",\n value: {\n spineItem: parsed.spineItemIndex,\n find: (document) => {\n const position = resolveXPointer(parsed, document)\n\n return position && toCfiPosition(position)\n },\n },\n }\n }\n\n const navigate = (\n to: UserNavigationEntry<InheritTarget | XPointerNavigationTarget>,\n ) => {\n const { target } = to\n\n if (!isXPointerTarget(target))\n return reader.navigation.navigate({ ...to, target })\n\n const selector = xpointerToNavigationTarget(target.value)\n\n if (!selector) {\n report.warn(`Ignore navigation to ${target.value}, not in the book`)\n\n return\n }\n\n reader.navigation.navigate({ ...to, target: selector })\n }\n\n const getLoadedSpineItemDocument = (spineItemIndex: number) => {\n const spineItem = reader.spineItemsManager.get(spineItemIndex)\n const document = spineItem?.value.isLoaded\n ? spineItem.renderer.getDocumentFrame()?.contentDocument\n : undefined\n\n return spineItem && document\n ? { document, id: spineItem.item.id }\n : undefined\n }\n\n return {\n ...reader,\n navigation: {\n ...reader.navigation,\n navigate,\n goToXPointer: (xpointer) =>\n navigate({\n target: { type: \"xpointer\", value: xpointer },\n animation: false,\n }),\n },\n koreader: {\n cfiToXPointer: (cfi) => cfiToXPointer(cfi, getLoadedSpineItemDocument),\n },\n }\n }\n"],"mappings":"2GAcA,IAAM,gCAAS,CAAA,CAAA,OAAO,UAAU,iCAAiC,EAwB3D,EAAoB,GAEgB,EAAO,OAAS,WAM7C,EAMT,GAOA,GAC0D,CAC1D,IAAM,EAAS,EAAK,CAAO,EAMrB,EACJ,GAC6C,CAC7C,IAAM,GAAA,EAAS,EAAA,cAAA,CAAc,CAAQ,EAEjC,GAAC,GAAW,EAAO,kBAAkB,IAAI,EAAO,cAAc,EAGlE,MAAO,CACL,KAAM,WACN,MAAO,CACL,UAAW,EAAO,eAClB,KAAO,GAAa,CAClB,IAAM,GAAA,EAAW,EAAA,gBAAA,CAAgB,EAAQ,CAAQ,EAEjD,OAAO,IAAA,EAAY,EAAA,cAAA,CAAc,CAAQ,CAC3C,CACF,CACF,CACF,EAEM,EACJ,GACG,CACH,GAAM,CAAE,UAAW,EAEnB,GAAI,CAAC,EAAiB,CAAM,EAC1B,OAAO,EAAO,WAAW,SAAS,CAAE,GAAG,EAAI,QAAO,CAAC,EAErD,IAAM,EAAW,EAA2B,EAAO,KAAK,EAExD,GAAI,CAAC,EAAU,CACb,EAAO,KAAK,wBAAwB,EAAO,MAAM,kBAAkB,EAEnE,MACF,CAEA,EAAO,WAAW,SAAS,CAAE,GAAG,EAAI,OAAQ,CAAS,CAAC,CACxD,EAEM,EAA8B,GAA2B,CAC7D,IAAM,EAAY,EAAO,kBAAkB,IAAI,CAAc,EACvD,EAAW,GAAW,MAAM,SAC9B,EAAU,SAAS,iBAAiB,CAAC,EAAE,gBACvC,IAAA,GAEJ,OAAO,GAAa,EAChB,CAAE,WAAU,GAAI,EAAU,KAAK,EAAG,EAClC,IAAA,EACN,EAEA,MAAO,CACL,GAAG,EACH,WAAY,CACV,GAAG,EAAO,WACV,WACA,aAAe,GACb,EAAS,CACP,OAAQ,CAAE,KAAM,WAAY,MAAO,CAAS,EAC5C,UAAW,EACb,CAAC,CACL,EACA,SAAU,CACR,cAAgB,IAAA,EAAQ,EAAA,cAAA,CAAc,EAAK,CAA0B,CACvE,CACF,CACF"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { cfiToXPointer as e, parseXPointer as t, resolveXPointer as n, toCfiPosition as r } from "@prose-reader/koreader";
|
|
2
2
|
import { Report as i } from "@prose-reader/shared";
|
|
3
|
-
import { BehaviorSubject as a, EMPTY as o, combineLatest as s, distinctUntilChanged as c, filter as l, first as u, map as d, of as f, shareReplay as p, switchMap as m, takeUntil as h } from "rxjs";
|
|
4
3
|
//#region src/koreaderEnhancer.ts
|
|
5
|
-
var
|
|
6
|
-
let
|
|
4
|
+
var a = i.namespace("@prose-reader/enhancer-koreader"), o = (e) => e.type === "xpointer", s = (i) => (s) => {
|
|
5
|
+
let c = i(s), l = (e) => {
|
|
7
6
|
let i = t(e);
|
|
8
|
-
if (i &&
|
|
7
|
+
if (i && c.spineItemsManager.get(i.spineItemIndex)) return {
|
|
9
8
|
type: "selector",
|
|
10
9
|
value: {
|
|
11
10
|
spineItem: i.spineItemIndex,
|
|
@@ -15,65 +14,45 @@ var g = i.namespace("@prose-reader/enhancer-koreader"), _ = (e) => e.type === "x
|
|
|
15
14
|
}
|
|
16
15
|
}
|
|
17
16
|
};
|
|
18
|
-
},
|
|
17
|
+
}, u = (e) => {
|
|
19
18
|
let { target: t } = e;
|
|
20
|
-
if (!
|
|
19
|
+
if (!o(t)) return c.navigation.navigate({
|
|
21
20
|
...e,
|
|
22
21
|
target: t
|
|
23
22
|
});
|
|
24
|
-
let n =
|
|
23
|
+
let n = l(t.value);
|
|
25
24
|
if (!n) {
|
|
26
|
-
|
|
25
|
+
a.warn(`Ignore navigation to ${t.value}, not in the book`);
|
|
27
26
|
return;
|
|
28
27
|
}
|
|
29
|
-
|
|
30
|
-
xpointer: t.value,
|
|
31
|
-
target: n
|
|
32
|
-
}), y.navigation.navigate({
|
|
28
|
+
c.navigation.navigate({
|
|
33
29
|
...e,
|
|
34
30
|
target: n
|
|
35
31
|
});
|
|
36
|
-
},
|
|
37
|
-
let t =
|
|
32
|
+
}, d = (e) => {
|
|
33
|
+
let t = c.spineItemsManager.get(e), n = t?.value.isLoaded ? t.renderer.getDocumentFrame()?.contentDocument : void 0;
|
|
38
34
|
return t && n ? {
|
|
39
35
|
document: n,
|
|
40
36
|
id: t.item.id
|
|
41
37
|
} : void 0;
|
|
42
|
-
}
|
|
43
|
-
if (y.cfi.isRootCfi(t)) {
|
|
44
|
-
let n = e(t, C);
|
|
45
|
-
return n === void 0 ? o : f(n);
|
|
46
|
-
}
|
|
47
|
-
let n = y.cfi.getSpineItemFromCfi(t);
|
|
48
|
-
return n ? n.watch("isLoaded").pipe(l(Boolean), u(), d(() => e(t, C)), l((e) => e !== void 0)) : o;
|
|
49
|
-
}, T = s([
|
|
50
|
-
y.navigation.readingPosition$,
|
|
51
|
-
b,
|
|
52
|
-
y.navigation.navigation$
|
|
53
|
-
]).pipe(m(([e, t]) => {
|
|
54
|
-
let { target: n } = y.navigation.getNavigation(), r = e.state === "standIn";
|
|
55
|
-
return t !== void 0 && n === t.target && r ? f(t.xpointer) : r && n.type === "cfi" && !y.cfi.isRootCfi(n.value) ? o : w(e.cfi);
|
|
56
|
-
}), c(), h(y.$.destroy$), p({
|
|
57
|
-
bufferSize: 1,
|
|
58
|
-
refCount: !0
|
|
59
|
-
}));
|
|
38
|
+
};
|
|
60
39
|
return {
|
|
61
|
-
...
|
|
40
|
+
...c,
|
|
62
41
|
navigation: {
|
|
63
|
-
...
|
|
64
|
-
navigate:
|
|
65
|
-
goToXPointer: (e) =>
|
|
42
|
+
...c.navigation,
|
|
43
|
+
navigate: u,
|
|
44
|
+
goToXPointer: (e) => u({
|
|
66
45
|
target: {
|
|
67
46
|
type: "xpointer",
|
|
68
47
|
value: e
|
|
69
48
|
},
|
|
70
49
|
animation: !1
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
}
|
|
50
|
+
})
|
|
51
|
+
},
|
|
52
|
+
koreader: { cfiToXPointer: (t) => e(t, d) }
|
|
74
53
|
};
|
|
75
54
|
};
|
|
76
55
|
//#endregion
|
|
77
|
-
export {
|
|
56
|
+
export { s as koreaderEnhancer };
|
|
78
57
|
|
|
79
58
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/koreaderEnhancer.ts"],"sourcesContent":["import type {\n EnhancerOutput,\n NavigationTarget,\n RootEnhancer,\n UserNavigationEntry,\n} from \"@prose-reader/core\"\nimport {\n cfiToXPointer,\n parseXPointer,\n resolveXPointer,\n toCfiPosition,\n} from \"@prose-reader/koreader\"\nimport { Report } from \"@prose-reader/shared\"\
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/koreaderEnhancer.ts"],"sourcesContent":["import type {\n EnhancerOutput,\n NavigationTarget,\n RootEnhancer,\n UserNavigationEntry,\n} from \"@prose-reader/core\"\nimport {\n cfiToXPointer,\n parseXPointer,\n resolveXPointer,\n toCfiPosition,\n} from \"@prose-reader/koreader\"\nimport { Report } from \"@prose-reader/shared\"\n\nconst report = Report.namespace(`@prose-reader/enhancer-koreader`)\n\n/** A KOReader (crengine) xpointer, such as `/body/DocFragment[14]/body/div/p[3]/text().42`. */\nexport type XPointerNavigationTarget = { type: \"xpointer\"; value: string }\n\nexport type KoreaderEnhancerOutput<InheritTarget> = {\n navigation: {\n navigate: (\n to: UserNavigationEntry<InheritTarget | XPointerNavigationTarget>,\n ) => void\n /** Goes to the place an xpointer names. Never animates. */\n goToXPointer: (xpointer: string) => void\n }\n koreader: {\n /**\n * The xpointer of a cfi, such as the reading position's, for a KOReader\n * sync client to push. A cfi naming a spine item converts at once; one\n * naming a place in its text needs the item's document loaded, and is\n * `undefined` otherwise, as for a cfi that names nothing in the book.\n */\n cfiToXPointer: (cfi: string) => string | undefined\n }\n}\n\nconst isXPointerTarget = (target: {\n type: string\n}): target is XPointerNavigationTarget => target.type === \"xpointer\"\n\n/**\n * Lets a reader navigate to KOReader xpointers, and convert a cfi, such as its\n * reading position, to one.\n */\nexport const koreaderEnhancer =\n <\n InheritOptions,\n InheritTarget extends { type: string },\n InheritOutput extends EnhancerOutput<RootEnhancer>,\n >(\n next: (options: InheritOptions) => InheritOutput & {\n navigation: {\n navigate: (to: UserNavigationEntry<InheritTarget>) => void\n }\n },\n ) =>\n (\n options: InheritOptions,\n ): InheritOutput & KoreaderEnhancerOutput<InheritTarget> => {\n const reader = next(options)\n\n /**\n * The pointer names its spine item, which is known at once, and a place\n * in its document, found once the document is loaded.\n */\n const xpointerToNavigationTarget = (\n xpointer: string,\n ): NavigationTarget<\"selector\"> | undefined => {\n const parsed = parseXPointer(xpointer)\n\n if (!parsed || !reader.spineItemsManager.get(parsed.spineItemIndex))\n return undefined\n\n return {\n type: \"selector\",\n value: {\n spineItem: parsed.spineItemIndex,\n find: (document) => {\n const position = resolveXPointer(parsed, document)\n\n return position && toCfiPosition(position)\n },\n },\n }\n }\n\n const navigate = (\n to: UserNavigationEntry<InheritTarget | XPointerNavigationTarget>,\n ) => {\n const { target } = to\n\n if (!isXPointerTarget(target))\n return reader.navigation.navigate({ ...to, target })\n\n const selector = xpointerToNavigationTarget(target.value)\n\n if (!selector) {\n report.warn(`Ignore navigation to ${target.value}, not in the book`)\n\n return\n }\n\n reader.navigation.navigate({ ...to, target: selector })\n }\n\n const getLoadedSpineItemDocument = (spineItemIndex: number) => {\n const spineItem = reader.spineItemsManager.get(spineItemIndex)\n const document = spineItem?.value.isLoaded\n ? spineItem.renderer.getDocumentFrame()?.contentDocument\n : undefined\n\n return spineItem && document\n ? { document, id: spineItem.item.id }\n : undefined\n }\n\n return {\n ...reader,\n navigation: {\n ...reader.navigation,\n navigate,\n goToXPointer: (xpointer) =>\n navigate({\n target: { type: \"xpointer\", value: xpointer },\n animation: false,\n }),\n },\n koreader: {\n cfiToXPointer: (cfi) => cfiToXPointer(cfi, getLoadedSpineItemDocument),\n },\n }\n }\n"],"mappings":";;;AAcA,IAAM,IAAS,EAAO,UAAU,iCAAiC,GAwB3D,KAAoB,MAEgB,EAAO,SAAS,YAM7C,KAMT,OAOA,MAC0D;CAC1D,IAAM,IAAS,EAAK,CAAO,GAMrB,KACJ,MAC6C;EAC7C,IAAM,IAAS,EAAc,CAAQ;EAEjC,IAAC,KAAW,EAAO,kBAAkB,IAAI,EAAO,cAAc,GAGlE,OAAO;GACL,MAAM;GACN,OAAO;IACL,WAAW,EAAO;IAClB,OAAO,MAAa;KAClB,IAAM,IAAW,EAAgB,GAAQ,CAAQ;KAEjD,OAAO,KAAY,EAAc,CAAQ;IAC3C;GACF;EACF;CACF,GAEM,KACJ,MACG;EACH,IAAM,EAAE,cAAW;EAEnB,IAAI,CAAC,EAAiB,CAAM,GAC1B,OAAO,EAAO,WAAW,SAAS;GAAE,GAAG;GAAI;EAAO,CAAC;EAErD,IAAM,IAAW,EAA2B,EAAO,KAAK;EAExD,IAAI,CAAC,GAAU;GACb,EAAO,KAAK,wBAAwB,EAAO,MAAM,kBAAkB;GAEnE;EACF;EAEA,EAAO,WAAW,SAAS;GAAE,GAAG;GAAI,QAAQ;EAAS,CAAC;CACxD,GAEM,KAA8B,MAA2B;EAC7D,IAAM,IAAY,EAAO,kBAAkB,IAAI,CAAc,GACvD,IAAW,GAAW,MAAM,WAC9B,EAAU,SAAS,iBAAiB,CAAC,EAAE,kBACvC,KAAA;EAEJ,OAAO,KAAa,IAChB;GAAE;GAAU,IAAI,EAAU,KAAK;EAAG,IAClC,KAAA;CACN;CAEA,OAAO;EACL,GAAG;EACH,YAAY;GACV,GAAG,EAAO;GACV;GACA,eAAe,MACb,EAAS;IACP,QAAQ;KAAE,MAAM;KAAY,OAAO;IAAS;IAC5C,WAAW;GACb,CAAC;EACL;EACA,UAAU,EACR,gBAAgB,MAAQ,EAAc,GAAK,CAA0B,EACvE;CACF;AACF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { EnhancerOutput, RootEnhancer, UserNavigationEntry } from '@prose-reader/core';
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
2
|
export type XPointerNavigationTarget = {
|
|
4
3
|
type: "xpointer";
|
|
5
4
|
value: string;
|
|
@@ -8,7 +7,9 @@ export type KoreaderEnhancerOutput<InheritTarget> = {
|
|
|
8
7
|
navigation: {
|
|
9
8
|
navigate: (to: UserNavigationEntry<InheritTarget | XPointerNavigationTarget>) => void;
|
|
10
9
|
goToXPointer: (xpointer: string) => void;
|
|
11
|
-
|
|
10
|
+
};
|
|
11
|
+
koreader: {
|
|
12
|
+
cfiToXPointer: (cfi: string) => string | undefined;
|
|
12
13
|
};
|
|
13
14
|
};
|
|
14
15
|
export declare const koreaderEnhancer: <InheritOptions, InheritTarget extends {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prose-reader/enhancer-koreader",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "21.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -26,12 +26,11 @@
|
|
|
26
26
|
"tsc": "tsc"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@prose-reader/koreader": "^
|
|
30
|
-
"@prose-reader/shared": "^
|
|
29
|
+
"@prose-reader/koreader": "^21.0.0",
|
|
30
|
+
"@prose-reader/shared": "^21.0.0"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@prose-reader/core": "^
|
|
34
|
-
"rxjs": "^7.2.0"
|
|
33
|
+
"@prose-reader/core": "^21.0.0"
|
|
35
34
|
},
|
|
36
|
-
"gitHead": "
|
|
35
|
+
"gitHead": "7072072675d0eda6b343575afa08e34ca1f70be2"
|
|
37
36
|
}
|