epub-codec 0.0.0 → 1.0.1

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.
Files changed (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +184 -0
  3. package/dist/codec.cjs +28 -0
  4. package/dist/codec.d.cts +2344 -0
  5. package/dist/codec.d.ts +2344 -0
  6. package/dist/codec.js +25 -0
  7. package/dist/diagnostics-Ee4kG7mw.d.cts +60 -0
  8. package/dist/diagnostics-Ee4kG7mw.d.ts +60 -0
  9. package/dist/diagnostics.cjs +96 -0
  10. package/dist/diagnostics.d.cts +2 -0
  11. package/dist/diagnostics.d.ts +2 -0
  12. package/dist/diagnostics.js +85 -0
  13. package/dist/format.cjs +9 -0
  14. package/dist/format.d.cts +6 -0
  15. package/dist/format.d.ts +6 -0
  16. package/dist/format.js +6 -0
  17. package/dist/image/dimensions.cjs +82 -0
  18. package/dist/image/dimensions.d.cts +11 -0
  19. package/dist/image/dimensions.d.ts +11 -0
  20. package/dist/image/dimensions.js +79 -0
  21. package/dist/index.cjs +105 -0
  22. package/dist/index.d.cts +32 -0
  23. package/dist/index.d.ts +32 -0
  24. package/dist/index.js +32 -0
  25. package/dist/nav/nav3.cjs +19 -0
  26. package/dist/nav/nav3.d.cts +4 -0
  27. package/dist/nav/nav3.d.ts +4 -0
  28. package/dist/nav/nav3.js +18 -0
  29. package/dist/nav/ncx.cjs +17 -0
  30. package/dist/nav/ncx.d.cts +4 -0
  31. package/dist/nav/ncx.d.ts +4 -0
  32. package/dist/nav/ncx.js +16 -0
  33. package/dist/nav/reconcile.cjs +8 -0
  34. package/dist/nav/reconcile.d.cts +4 -0
  35. package/dist/nav/reconcile.d.ts +4 -0
  36. package/dist/nav/reconcile.js +7 -0
  37. package/dist/nav/write.cjs +39 -0
  38. package/dist/nav/write.d.cts +10 -0
  39. package/dist/nav/write.d.ts +10 -0
  40. package/dist/nav/write.js +37 -0
  41. package/dist/ocf/container.cjs +20 -0
  42. package/dist/ocf/container.d.cts +4 -0
  43. package/dist/ocf/container.d.ts +4 -0
  44. package/dist/ocf/container.js +19 -0
  45. package/dist/ocf/write.cjs +13 -0
  46. package/dist/ocf/write.d.cts +4 -0
  47. package/dist/ocf/write.d.ts +4 -0
  48. package/dist/ocf/write.js +12 -0
  49. package/dist/opf/metadata.cjs +51 -0
  50. package/dist/opf/metadata.d.cts +7 -0
  51. package/dist/opf/metadata.d.ts +7 -0
  52. package/dist/opf/metadata.js +50 -0
  53. package/dist/opf/parse.cjs +47 -0
  54. package/dist/opf/parse.d.cts +6 -0
  55. package/dist/opf/parse.d.ts +6 -0
  56. package/dist/opf/parse.js +46 -0
  57. package/dist/opf/types.cjs +0 -0
  58. package/dist/opf/types.d.cts +20 -0
  59. package/dist/opf/types.d.ts +20 -0
  60. package/dist/opf/types.js +0 -0
  61. package/dist/opf/write.cjs +55 -0
  62. package/dist/opf/write.d.cts +12 -0
  63. package/dist/opf/write.d.ts +12 -0
  64. package/dist/opf/write.js +54 -0
  65. package/dist/path.cjs +22 -0
  66. package/dist/path.d.cts +5 -0
  67. package/dist/path.d.ts +5 -0
  68. package/dist/path.js +20 -0
  69. package/dist/read.cjs +166 -0
  70. package/dist/read.d.cts +10 -0
  71. package/dist/read.d.ts +10 -0
  72. package/dist/read.js +164 -0
  73. package/dist/util/base64.cjs +51 -0
  74. package/dist/util/base64.d.cts +5 -0
  75. package/dist/util/base64.d.ts +5 -0
  76. package/dist/util/base64.js +49 -0
  77. package/dist/write.cjs +136 -0
  78. package/dist/write.d.cts +10 -0
  79. package/dist/write.d.ts +10 -0
  80. package/dist/write.js +134 -0
  81. package/dist/xhtml/context.cjs +0 -0
  82. package/dist/xhtml/context.d.cts +20 -0
  83. package/dist/xhtml/context.d.ts +20 -0
  84. package/dist/xhtml/context.js +0 -0
  85. package/dist/xhtml/footnote.cjs +32 -0
  86. package/dist/xhtml/footnote.d.cts +7 -0
  87. package/dist/xhtml/footnote.d.ts +7 -0
  88. package/dist/xhtml/footnote.js +29 -0
  89. package/dist/xhtml/inline.cjs +128 -0
  90. package/dist/xhtml/inline.d.cts +11 -0
  91. package/dist/xhtml/inline.d.ts +11 -0
  92. package/dist/xhtml/inline.js +127 -0
  93. package/dist/xhtml/list-id.cjs +22 -0
  94. package/dist/xhtml/list-id.d.cts +13 -0
  95. package/dist/xhtml/list-id.d.ts +13 -0
  96. package/dist/xhtml/list-id.js +20 -0
  97. package/dist/xhtml/read.cjs +423 -0
  98. package/dist/xhtml/read.d.cts +20 -0
  99. package/dist/xhtml/read.d.ts +20 -0
  100. package/dist/xhtml/read.js +422 -0
  101. package/dist/xhtml/style-constants.cjs +13 -0
  102. package/dist/xhtml/style-constants.d.cts +8 -0
  103. package/dist/xhtml/style-constants.d.ts +8 -0
  104. package/dist/xhtml/style-constants.js +8 -0
  105. package/dist/xhtml/write.cjs +183 -0
  106. package/dist/xhtml/write.d.cts +12 -0
  107. package/dist/xhtml/write.d.ts +12 -0
  108. package/dist/xhtml/write.js +182 -0
  109. package/dist/xml/build.cjs +46 -0
  110. package/dist/xml/build.d.cts +5 -0
  111. package/dist/xml/build.d.ts +5 -0
  112. package/dist/xml/build.js +46 -0
  113. package/dist/xml/entities.cjs +20 -0
  114. package/dist/xml/entities.d.cts +5 -0
  115. package/dist/xml/entities.d.ts +5 -0
  116. package/dist/xml/entities.js +18 -0
  117. package/dist/xml/node.cjs +67 -0
  118. package/dist/xml/node.d.cts +83 -0
  119. package/dist/xml/node.d.ts +83 -0
  120. package/dist/xml/node.js +58 -0
  121. package/dist/xml/parse.cjs +88 -0
  122. package/dist/xml/parse.d.cts +5 -0
  123. package/dist/xml/parse.d.ts +5 -0
  124. package/dist/xml/parse.js +88 -0
  125. package/dist/xml/query.cjs +44 -0
  126. package/dist/xml/query.d.cts +11 -0
  127. package/dist/xml/query.d.ts +11 -0
  128. package/dist/xml/query.js +37 -0
  129. package/dist/zip.cjs +19 -0
  130. package/dist/zip.d.cts +9 -0
  131. package/dist/zip.d.ts +9 -0
  132. package/dist/zip.js +17 -0
  133. package/package.json +95 -2
package/dist/codec.js ADDED
@@ -0,0 +1,25 @@
1
+ import { readEpub, readEpubContent } from "./read.js";
2
+ import { writeEpub, writeEpubContent } from "./write.js";
3
+ import { z } from "zod";
4
+ import { ContentDocumentSchema, DocumentTreeSchema } from "document-schema.js";
5
+ //#region src/codec.ts
6
+ const ZIP_LOCAL_FILE_HEADER = [
7
+ 80,
8
+ 75,
9
+ 3,
10
+ 4
11
+ ];
12
+ function hasZipHeader(bytes) {
13
+ return ZIP_LOCAL_FILE_HEADER.every((byte, index) => bytes[index] === byte);
14
+ }
15
+ const EpubBytesSchema = z.instanceof(Uint8Array).refine(hasZipHeader, { message: "not a zip archive (no PK\\x03\\x04 header)" });
16
+ const epubCodec = z.codec(EpubBytesSchema, DocumentTreeSchema, {
17
+ decode: (bytes) => readEpub(bytes),
18
+ encode: (tree) => writeEpub(tree)
19
+ });
20
+ const epubContentCodec = z.codec(EpubBytesSchema, ContentDocumentSchema, {
21
+ decode: (bytes) => readEpubContent(bytes),
22
+ encode: (document) => writeEpubContent(document)
23
+ });
24
+ //#endregion
25
+ export { EpubBytesSchema, epubCodec, epubContentCodec };
@@ -0,0 +1,60 @@
1
+ //#region src/diagnostics.d.ts
2
+ type EpubDiagnosticSeverity = "info" | "warning";
3
+ interface EpubDiagnostic {
4
+ readonly code: string;
5
+ readonly severity: EpubDiagnosticSeverity;
6
+ readonly message: string;
7
+ readonly href?: string;
8
+ }
9
+ type EpubDiagnosticSink = (diagnostic: EpubDiagnostic) => void;
10
+ declare const NOOP_EPUB_DIAGNOSTIC_SINK: EpubDiagnosticSink;
11
+ declare const EpubDiagnosticCodes: {
12
+ readonly NAV_SPINE_ORDER_MISMATCH: "epub/nav-spine-order-mismatch";
13
+ readonly NCX_MISSING: "epub/ncx-missing";
14
+ readonly NAV_DOCUMENT_MISSING: "epub/nav-document-missing";
15
+ readonly MANIFEST_ITEM_MISSING: "epub/manifest-item-missing";
16
+ readonly SPINE_ITEMREF_UNRESOLVED: "epub/spine-itemref-unresolved";
17
+ readonly METADATA_FIELD_UNMAPPED: "epub/metadata-field-unmapped";
18
+ readonly IMAGE_FORMAT_UNSUPPORTED: "epub/image-format-unsupported";
19
+ readonly IMAGE_UNRESOLVED: "epub/image-unresolved";
20
+ readonly ELEMENT_UNMAPPED: "epub/element-unmapped";
21
+ readonly STYLE_RESIDUE: "epub/style-residue";
22
+ readonly FOOTNOTE_TARGET_UNRESOLVED: "epub/footnote-target-unresolved";
23
+ readonly LINK_TARGET_EXTERNAL_ONLY: "epub/link-target-external-only";
24
+ readonly CONSTRUCT_UNREPRESENTED: "epub/construct-unrepresented";
25
+ readonly INVENTED_PAGE_GEOMETRY: "epub/invented-page-geometry";
26
+ };
27
+ declare class EpubParseError extends Error {
28
+ readonly code: string;
29
+ constructor(code: string, message: string);
30
+ }
31
+ declare class EpubInvalidMimetypeError extends EpubParseError {
32
+ constructor(message?: string);
33
+ }
34
+ declare class EpubInvalidContainerError extends EpubParseError {
35
+ constructor(message?: string);
36
+ }
37
+ declare class EpubInvalidOpfError extends EpubParseError {
38
+ constructor(message: string);
39
+ }
40
+ declare class EpubEmptySpineError extends EpubParseError {
41
+ constructor(message?: string);
42
+ }
43
+ declare class EpubWriteError extends Error {
44
+ readonly code: string;
45
+ constructor(code: string, message: string);
46
+ }
47
+ declare class EpubUnsupportedDocumentKindError extends EpubWriteError {
48
+ readonly kind: string;
49
+ constructor(kind: string);
50
+ }
51
+ declare class EpubUnbalancedConstructMarkersError extends EpubWriteError {
52
+ readonly imbalanceKind: "unmatchedEnd" | "unclosedStart";
53
+ readonly blockIndex: number;
54
+ constructor(imbalanceKind: "unmatchedEnd" | "unclosedStart", blockIndex: number);
55
+ }
56
+ declare class EpubPackageFlattenError extends EpubWriteError {
57
+ constructor(cause: unknown);
58
+ }
59
+ //#endregion
60
+ export { EpubEmptySpineError as a, EpubInvalidOpfError as c, EpubUnbalancedConstructMarkersError as d, EpubUnsupportedDocumentKindError as f, EpubDiagnosticSink as i, EpubPackageFlattenError as l, NOOP_EPUB_DIAGNOSTIC_SINK as m, EpubDiagnosticCodes as n, EpubInvalidContainerError as o, EpubWriteError as p, EpubDiagnosticSeverity as r, EpubInvalidMimetypeError as s, EpubDiagnostic as t, EpubParseError as u };
@@ -0,0 +1,60 @@
1
+ //#region src/diagnostics.d.ts
2
+ type EpubDiagnosticSeverity = "info" | "warning";
3
+ interface EpubDiagnostic {
4
+ readonly code: string;
5
+ readonly severity: EpubDiagnosticSeverity;
6
+ readonly message: string;
7
+ readonly href?: string;
8
+ }
9
+ type EpubDiagnosticSink = (diagnostic: EpubDiagnostic) => void;
10
+ declare const NOOP_EPUB_DIAGNOSTIC_SINK: EpubDiagnosticSink;
11
+ declare const EpubDiagnosticCodes: {
12
+ readonly NAV_SPINE_ORDER_MISMATCH: "epub/nav-spine-order-mismatch";
13
+ readonly NCX_MISSING: "epub/ncx-missing";
14
+ readonly NAV_DOCUMENT_MISSING: "epub/nav-document-missing";
15
+ readonly MANIFEST_ITEM_MISSING: "epub/manifest-item-missing";
16
+ readonly SPINE_ITEMREF_UNRESOLVED: "epub/spine-itemref-unresolved";
17
+ readonly METADATA_FIELD_UNMAPPED: "epub/metadata-field-unmapped";
18
+ readonly IMAGE_FORMAT_UNSUPPORTED: "epub/image-format-unsupported";
19
+ readonly IMAGE_UNRESOLVED: "epub/image-unresolved";
20
+ readonly ELEMENT_UNMAPPED: "epub/element-unmapped";
21
+ readonly STYLE_RESIDUE: "epub/style-residue";
22
+ readonly FOOTNOTE_TARGET_UNRESOLVED: "epub/footnote-target-unresolved";
23
+ readonly LINK_TARGET_EXTERNAL_ONLY: "epub/link-target-external-only";
24
+ readonly CONSTRUCT_UNREPRESENTED: "epub/construct-unrepresented";
25
+ readonly INVENTED_PAGE_GEOMETRY: "epub/invented-page-geometry";
26
+ };
27
+ declare class EpubParseError extends Error {
28
+ readonly code: string;
29
+ constructor(code: string, message: string);
30
+ }
31
+ declare class EpubInvalidMimetypeError extends EpubParseError {
32
+ constructor(message?: string);
33
+ }
34
+ declare class EpubInvalidContainerError extends EpubParseError {
35
+ constructor(message?: string);
36
+ }
37
+ declare class EpubInvalidOpfError extends EpubParseError {
38
+ constructor(message: string);
39
+ }
40
+ declare class EpubEmptySpineError extends EpubParseError {
41
+ constructor(message?: string);
42
+ }
43
+ declare class EpubWriteError extends Error {
44
+ readonly code: string;
45
+ constructor(code: string, message: string);
46
+ }
47
+ declare class EpubUnsupportedDocumentKindError extends EpubWriteError {
48
+ readonly kind: string;
49
+ constructor(kind: string);
50
+ }
51
+ declare class EpubUnbalancedConstructMarkersError extends EpubWriteError {
52
+ readonly imbalanceKind: "unmatchedEnd" | "unclosedStart";
53
+ readonly blockIndex: number;
54
+ constructor(imbalanceKind: "unmatchedEnd" | "unclosedStart", blockIndex: number);
55
+ }
56
+ declare class EpubPackageFlattenError extends EpubWriteError {
57
+ constructor(cause: unknown);
58
+ }
59
+ //#endregion
60
+ export { EpubEmptySpineError as a, EpubInvalidOpfError as c, EpubUnbalancedConstructMarkersError as d, EpubUnsupportedDocumentKindError as f, EpubDiagnosticSink as i, EpubPackageFlattenError as l, NOOP_EPUB_DIAGNOSTIC_SINK as m, EpubDiagnosticCodes as n, EpubInvalidContainerError as o, EpubWriteError as p, EpubDiagnosticSeverity as r, EpubInvalidMimetypeError as s, EpubDiagnostic as t, EpubParseError as u };
@@ -0,0 +1,96 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/diagnostics.ts
3
+ const NOOP_EPUB_DIAGNOSTIC_SINK = () => {};
4
+ const EpubDiagnosticCodes = {
5
+ NAV_SPINE_ORDER_MISMATCH: "epub/nav-spine-order-mismatch",
6
+ NCX_MISSING: "epub/ncx-missing",
7
+ NAV_DOCUMENT_MISSING: "epub/nav-document-missing",
8
+ MANIFEST_ITEM_MISSING: "epub/manifest-item-missing",
9
+ SPINE_ITEMREF_UNRESOLVED: "epub/spine-itemref-unresolved",
10
+ METADATA_FIELD_UNMAPPED: "epub/metadata-field-unmapped",
11
+ IMAGE_FORMAT_UNSUPPORTED: "epub/image-format-unsupported",
12
+ IMAGE_UNRESOLVED: "epub/image-unresolved",
13
+ ELEMENT_UNMAPPED: "epub/element-unmapped",
14
+ STYLE_RESIDUE: "epub/style-residue",
15
+ FOOTNOTE_TARGET_UNRESOLVED: "epub/footnote-target-unresolved",
16
+ LINK_TARGET_EXTERNAL_ONLY: "epub/link-target-external-only",
17
+ CONSTRUCT_UNREPRESENTED: "epub/construct-unrepresented",
18
+ INVENTED_PAGE_GEOMETRY: "epub/invented-page-geometry"
19
+ };
20
+ var EpubParseError = class extends Error {
21
+ code;
22
+ constructor(code, message) {
23
+ super(message);
24
+ this.name = "EpubParseError";
25
+ this.code = code;
26
+ }
27
+ };
28
+ var EpubInvalidMimetypeError = class extends EpubParseError {
29
+ constructor(message = "the zip's first entry is not a stored \"mimetype\" entry containing exactly \"application/epub+zip\"") {
30
+ super("epub/invalid-mimetype", message);
31
+ this.name = "EpubInvalidMimetypeError";
32
+ }
33
+ };
34
+ var EpubInvalidContainerError = class extends EpubParseError {
35
+ constructor(message = "META-INF/container.xml is missing or names no OPF rootfile") {
36
+ super("epub/invalid-container", message);
37
+ this.name = "EpubInvalidContainerError";
38
+ }
39
+ };
40
+ var EpubInvalidOpfError = class extends EpubParseError {
41
+ constructor(message) {
42
+ super("epub/invalid-opf", message);
43
+ this.name = "EpubInvalidOpfError";
44
+ }
45
+ };
46
+ var EpubEmptySpineError = class extends EpubParseError {
47
+ constructor(message = "the spine names no resolvable, readable content") {
48
+ super("epub/empty-spine", message);
49
+ this.name = "EpubEmptySpineError";
50
+ }
51
+ };
52
+ var EpubWriteError = class extends Error {
53
+ code;
54
+ constructor(code, message) {
55
+ super(message);
56
+ this.name = "EpubWriteError";
57
+ this.code = code;
58
+ }
59
+ };
60
+ var EpubUnsupportedDocumentKindError = class extends EpubWriteError {
61
+ kind;
62
+ constructor(kind) {
63
+ super("epub/write-side-not-wordprocessing", `writeEpubContent only supports a 'wordprocessing' ContentDocument, got '${kind}'`);
64
+ this.name = "EpubUnsupportedDocumentKindError";
65
+ this.kind = kind;
66
+ }
67
+ };
68
+ var EpubUnbalancedConstructMarkersError = class extends EpubWriteError {
69
+ imbalanceKind;
70
+ blockIndex;
71
+ constructor(imbalanceKind, blockIndex) {
72
+ super("epub/unbalanced-construct-markers", `${imbalanceKind === "unmatchedEnd" ? "a constructEnd marker closes no open construct" : "a constructStart marker is never closed"} at block index ${String(blockIndex)}; a block list's construct boundary markers must pair as balanced brackets`);
73
+ this.name = "EpubUnbalancedConstructMarkersError";
74
+ this.imbalanceKind = imbalanceKind;
75
+ this.blockIndex = blockIndex;
76
+ }
77
+ };
78
+ var EpubPackageFlattenError = class extends EpubWriteError {
79
+ constructor(cause) {
80
+ const detail = cause instanceof Error ? cause.message : String(cause);
81
+ super("epub/package-flatten-failed", `flattening the package for write failed: ${detail}`);
82
+ this.name = "EpubPackageFlattenError";
83
+ }
84
+ };
85
+ //#endregion
86
+ exports.EpubDiagnosticCodes = EpubDiagnosticCodes;
87
+ exports.EpubEmptySpineError = EpubEmptySpineError;
88
+ exports.EpubInvalidContainerError = EpubInvalidContainerError;
89
+ exports.EpubInvalidMimetypeError = EpubInvalidMimetypeError;
90
+ exports.EpubInvalidOpfError = EpubInvalidOpfError;
91
+ exports.EpubPackageFlattenError = EpubPackageFlattenError;
92
+ exports.EpubParseError = EpubParseError;
93
+ exports.EpubUnbalancedConstructMarkersError = EpubUnbalancedConstructMarkersError;
94
+ exports.EpubUnsupportedDocumentKindError = EpubUnsupportedDocumentKindError;
95
+ exports.EpubWriteError = EpubWriteError;
96
+ exports.NOOP_EPUB_DIAGNOSTIC_SINK = NOOP_EPUB_DIAGNOSTIC_SINK;
@@ -0,0 +1,2 @@
1
+ import { a as EpubEmptySpineError, c as EpubInvalidOpfError, d as EpubUnbalancedConstructMarkersError, f as EpubUnsupportedDocumentKindError, i as EpubDiagnosticSink, l as EpubPackageFlattenError, m as NOOP_EPUB_DIAGNOSTIC_SINK, n as EpubDiagnosticCodes, o as EpubInvalidContainerError, p as EpubWriteError, r as EpubDiagnosticSeverity, s as EpubInvalidMimetypeError, t as EpubDiagnostic, u as EpubParseError } from "./diagnostics-Ee4kG7mw.cjs";
2
+ export { EpubDiagnostic, EpubDiagnosticCodes, EpubDiagnosticSeverity, EpubDiagnosticSink, EpubEmptySpineError, EpubInvalidContainerError, EpubInvalidMimetypeError, EpubInvalidOpfError, EpubPackageFlattenError, EpubParseError, EpubUnbalancedConstructMarkersError, EpubUnsupportedDocumentKindError, EpubWriteError, NOOP_EPUB_DIAGNOSTIC_SINK };
@@ -0,0 +1,2 @@
1
+ import { a as EpubEmptySpineError, c as EpubInvalidOpfError, d as EpubUnbalancedConstructMarkersError, f as EpubUnsupportedDocumentKindError, i as EpubDiagnosticSink, l as EpubPackageFlattenError, m as NOOP_EPUB_DIAGNOSTIC_SINK, n as EpubDiagnosticCodes, o as EpubInvalidContainerError, p as EpubWriteError, r as EpubDiagnosticSeverity, s as EpubInvalidMimetypeError, t as EpubDiagnostic, u as EpubParseError } from "./diagnostics-Ee4kG7mw.js";
2
+ export { EpubDiagnostic, EpubDiagnosticCodes, EpubDiagnosticSeverity, EpubDiagnosticSink, EpubEmptySpineError, EpubInvalidContainerError, EpubInvalidMimetypeError, EpubInvalidOpfError, EpubPackageFlattenError, EpubParseError, EpubUnbalancedConstructMarkersError, EpubUnsupportedDocumentKindError, EpubWriteError, NOOP_EPUB_DIAGNOSTIC_SINK };
@@ -0,0 +1,85 @@
1
+ //#region src/diagnostics.ts
2
+ const NOOP_EPUB_DIAGNOSTIC_SINK = () => {};
3
+ const EpubDiagnosticCodes = {
4
+ NAV_SPINE_ORDER_MISMATCH: "epub/nav-spine-order-mismatch",
5
+ NCX_MISSING: "epub/ncx-missing",
6
+ NAV_DOCUMENT_MISSING: "epub/nav-document-missing",
7
+ MANIFEST_ITEM_MISSING: "epub/manifest-item-missing",
8
+ SPINE_ITEMREF_UNRESOLVED: "epub/spine-itemref-unresolved",
9
+ METADATA_FIELD_UNMAPPED: "epub/metadata-field-unmapped",
10
+ IMAGE_FORMAT_UNSUPPORTED: "epub/image-format-unsupported",
11
+ IMAGE_UNRESOLVED: "epub/image-unresolved",
12
+ ELEMENT_UNMAPPED: "epub/element-unmapped",
13
+ STYLE_RESIDUE: "epub/style-residue",
14
+ FOOTNOTE_TARGET_UNRESOLVED: "epub/footnote-target-unresolved",
15
+ LINK_TARGET_EXTERNAL_ONLY: "epub/link-target-external-only",
16
+ CONSTRUCT_UNREPRESENTED: "epub/construct-unrepresented",
17
+ INVENTED_PAGE_GEOMETRY: "epub/invented-page-geometry"
18
+ };
19
+ var EpubParseError = class extends Error {
20
+ code;
21
+ constructor(code, message) {
22
+ super(message);
23
+ this.name = "EpubParseError";
24
+ this.code = code;
25
+ }
26
+ };
27
+ var EpubInvalidMimetypeError = class extends EpubParseError {
28
+ constructor(message = "the zip's first entry is not a stored \"mimetype\" entry containing exactly \"application/epub+zip\"") {
29
+ super("epub/invalid-mimetype", message);
30
+ this.name = "EpubInvalidMimetypeError";
31
+ }
32
+ };
33
+ var EpubInvalidContainerError = class extends EpubParseError {
34
+ constructor(message = "META-INF/container.xml is missing or names no OPF rootfile") {
35
+ super("epub/invalid-container", message);
36
+ this.name = "EpubInvalidContainerError";
37
+ }
38
+ };
39
+ var EpubInvalidOpfError = class extends EpubParseError {
40
+ constructor(message) {
41
+ super("epub/invalid-opf", message);
42
+ this.name = "EpubInvalidOpfError";
43
+ }
44
+ };
45
+ var EpubEmptySpineError = class extends EpubParseError {
46
+ constructor(message = "the spine names no resolvable, readable content") {
47
+ super("epub/empty-spine", message);
48
+ this.name = "EpubEmptySpineError";
49
+ }
50
+ };
51
+ var EpubWriteError = class extends Error {
52
+ code;
53
+ constructor(code, message) {
54
+ super(message);
55
+ this.name = "EpubWriteError";
56
+ this.code = code;
57
+ }
58
+ };
59
+ var EpubUnsupportedDocumentKindError = class extends EpubWriteError {
60
+ kind;
61
+ constructor(kind) {
62
+ super("epub/write-side-not-wordprocessing", `writeEpubContent only supports a 'wordprocessing' ContentDocument, got '${kind}'`);
63
+ this.name = "EpubUnsupportedDocumentKindError";
64
+ this.kind = kind;
65
+ }
66
+ };
67
+ var EpubUnbalancedConstructMarkersError = class extends EpubWriteError {
68
+ imbalanceKind;
69
+ blockIndex;
70
+ constructor(imbalanceKind, blockIndex) {
71
+ super("epub/unbalanced-construct-markers", `${imbalanceKind === "unmatchedEnd" ? "a constructEnd marker closes no open construct" : "a constructStart marker is never closed"} at block index ${String(blockIndex)}; a block list's construct boundary markers must pair as balanced brackets`);
72
+ this.name = "EpubUnbalancedConstructMarkersError";
73
+ this.imbalanceKind = imbalanceKind;
74
+ this.blockIndex = blockIndex;
75
+ }
76
+ };
77
+ var EpubPackageFlattenError = class extends EpubWriteError {
78
+ constructor(cause) {
79
+ const detail = cause instanceof Error ? cause.message : String(cause);
80
+ super("epub/package-flatten-failed", `flattening the package for write failed: ${detail}`);
81
+ this.name = "EpubPackageFlattenError";
82
+ }
83
+ };
84
+ //#endregion
85
+ export { EpubDiagnosticCodes, EpubEmptySpineError, EpubInvalidContainerError, EpubInvalidMimetypeError, EpubInvalidOpfError, EpubPackageFlattenError, EpubParseError, EpubUnbalancedConstructMarkersError, EpubUnsupportedDocumentKindError, EpubWriteError, NOOP_EPUB_DIAGNOSTIC_SINK };
@@ -0,0 +1,9 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/format.ts
3
+ const EPUB_MIME_TYPE = "application/epub+zip";
4
+ const OCF_CONTAINER_PATH = "META-INF/container.xml";
5
+ const OCF_MIMETYPE_PATH = "mimetype";
6
+ //#endregion
7
+ exports.EPUB_MIME_TYPE = EPUB_MIME_TYPE;
8
+ exports.OCF_CONTAINER_PATH = OCF_CONTAINER_PATH;
9
+ exports.OCF_MIMETYPE_PATH = OCF_MIMETYPE_PATH;
@@ -0,0 +1,6 @@
1
+ //#region src/format.d.ts
2
+ declare const EPUB_MIME_TYPE = "application/epub+zip";
3
+ declare const OCF_CONTAINER_PATH = "META-INF/container.xml";
4
+ declare const OCF_MIMETYPE_PATH = "mimetype";
5
+ //#endregion
6
+ export { EPUB_MIME_TYPE, OCF_CONTAINER_PATH, OCF_MIMETYPE_PATH };
@@ -0,0 +1,6 @@
1
+ //#region src/format.d.ts
2
+ declare const EPUB_MIME_TYPE = "application/epub+zip";
3
+ declare const OCF_CONTAINER_PATH = "META-INF/container.xml";
4
+ declare const OCF_MIMETYPE_PATH = "mimetype";
5
+ //#endregion
6
+ export { EPUB_MIME_TYPE, OCF_CONTAINER_PATH, OCF_MIMETYPE_PATH };
package/dist/format.js ADDED
@@ -0,0 +1,6 @@
1
+ //#region src/format.ts
2
+ const EPUB_MIME_TYPE = "application/epub+zip";
3
+ const OCF_CONTAINER_PATH = "META-INF/container.xml";
4
+ const OCF_MIMETYPE_PATH = "mimetype";
5
+ //#endregion
6
+ export { EPUB_MIME_TYPE, OCF_CONTAINER_PATH, OCF_MIMETYPE_PATH };
@@ -0,0 +1,82 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/image/dimensions.ts
3
+ function readUint16BE(bytes, offset) {
4
+ return ((bytes[offset] ?? 0) << 8 | (bytes[offset + 1] ?? 0)) & 65535;
5
+ }
6
+ function readUint32BE(bytes, offset) {
7
+ return ((bytes[offset] ?? 0) << 24 | (bytes[offset + 1] ?? 0) << 16 | (bytes[offset + 2] ?? 0) << 8 | (bytes[offset + 3] ?? 0)) >>> 0;
8
+ }
9
+ const PNG_SIGNATURE = [
10
+ 137,
11
+ 80,
12
+ 78,
13
+ 71,
14
+ 13,
15
+ 10,
16
+ 26,
17
+ 10
18
+ ];
19
+ const PNG_HEADER_BYTES = 24;
20
+ function isPng(bytes) {
21
+ if (bytes.length < PNG_SIGNATURE.length) return false;
22
+ return PNG_SIGNATURE.every((byte, index) => bytes[index] === byte);
23
+ }
24
+ function readPngDimensions(bytes) {
25
+ if (bytes.length < PNG_HEADER_BYTES) return;
26
+ if (bytes[12] !== 73 || bytes[13] !== 72 || bytes[14] !== 68 || bytes[15] !== 82) return;
27
+ return {
28
+ widthPx: readUint32BE(bytes, 16),
29
+ heightPx: readUint32BE(bytes, 20)
30
+ };
31
+ }
32
+ function isStartOfFrameMarker(marker) {
33
+ if (marker < 192 || marker > 207) return false;
34
+ return marker !== 196 && marker !== 200 && marker !== 204;
35
+ }
36
+ function hasNoLengthField(marker) {
37
+ return marker === 216 || marker === 217 || marker === 1 || marker >= 208 && marker <= 215;
38
+ }
39
+ function readJpegDimensions(bytes) {
40
+ if (bytes.length < 4 || bytes[0] !== 255 || bytes[1] !== 216) return;
41
+ let offset = 2;
42
+ while (offset < bytes.length) {
43
+ if (bytes[offset] !== 255) {
44
+ offset += 1;
45
+ continue;
46
+ }
47
+ let markerOffset = offset + 1;
48
+ while (bytes[markerOffset] === 255) markerOffset += 1;
49
+ const marker = bytes[markerOffset];
50
+ if (marker === void 0) return;
51
+ offset = markerOffset + 1;
52
+ if (hasNoLengthField(marker)) continue;
53
+ if (offset + 2 > bytes.length) return;
54
+ const length = readUint16BE(bytes, offset);
55
+ if (isStartOfFrameMarker(marker)) {
56
+ if (offset + 7 > bytes.length) return;
57
+ const heightPx = readUint16BE(bytes, offset + 3);
58
+ return {
59
+ widthPx: readUint16BE(bytes, offset + 5),
60
+ heightPx
61
+ };
62
+ }
63
+ if (marker === 218) return;
64
+ offset += length;
65
+ }
66
+ }
67
+ function isJpeg(bytes) {
68
+ return bytes.length >= 2 && bytes[0] === 255 && bytes[1] === 216;
69
+ }
70
+ function detectImageFormat(bytes) {
71
+ if (isPng(bytes)) return "png";
72
+ return isJpeg(bytes) ? "jpeg" : void 0;
73
+ }
74
+ function readImageDimensions(bytes) {
75
+ if (isPng(bytes)) return readPngDimensions(bytes);
76
+ return readJpegDimensions(bytes);
77
+ }
78
+ const POINTS_PER_PIXEL = 72 / 96;
79
+ //#endregion
80
+ exports.POINTS_PER_PIXEL = POINTS_PER_PIXEL;
81
+ exports.detectImageFormat = detectImageFormat;
82
+ exports.readImageDimensions = readImageDimensions;
@@ -0,0 +1,11 @@
1
+ //#region src/image/dimensions.d.ts
2
+ interface ImageDimensions {
3
+ readonly widthPx: number;
4
+ readonly heightPx: number;
5
+ }
6
+ type EpubImageFormat = "png" | "jpeg";
7
+ declare function detectImageFormat(bytes: Uint8Array): EpubImageFormat | undefined;
8
+ declare function readImageDimensions(bytes: Uint8Array): ImageDimensions | undefined;
9
+ declare const POINTS_PER_PIXEL: number;
10
+ //#endregion
11
+ export { EpubImageFormat, ImageDimensions, POINTS_PER_PIXEL, detectImageFormat, readImageDimensions };
@@ -0,0 +1,11 @@
1
+ //#region src/image/dimensions.d.ts
2
+ interface ImageDimensions {
3
+ readonly widthPx: number;
4
+ readonly heightPx: number;
5
+ }
6
+ type EpubImageFormat = "png" | "jpeg";
7
+ declare function detectImageFormat(bytes: Uint8Array): EpubImageFormat | undefined;
8
+ declare function readImageDimensions(bytes: Uint8Array): ImageDimensions | undefined;
9
+ declare const POINTS_PER_PIXEL: number;
10
+ //#endregion
11
+ export { EpubImageFormat, ImageDimensions, POINTS_PER_PIXEL, detectImageFormat, readImageDimensions };
@@ -0,0 +1,79 @@
1
+ //#region src/image/dimensions.ts
2
+ function readUint16BE(bytes, offset) {
3
+ return ((bytes[offset] ?? 0) << 8 | (bytes[offset + 1] ?? 0)) & 65535;
4
+ }
5
+ function readUint32BE(bytes, offset) {
6
+ return ((bytes[offset] ?? 0) << 24 | (bytes[offset + 1] ?? 0) << 16 | (bytes[offset + 2] ?? 0) << 8 | (bytes[offset + 3] ?? 0)) >>> 0;
7
+ }
8
+ const PNG_SIGNATURE = [
9
+ 137,
10
+ 80,
11
+ 78,
12
+ 71,
13
+ 13,
14
+ 10,
15
+ 26,
16
+ 10
17
+ ];
18
+ const PNG_HEADER_BYTES = 24;
19
+ function isPng(bytes) {
20
+ if (bytes.length < PNG_SIGNATURE.length) return false;
21
+ return PNG_SIGNATURE.every((byte, index) => bytes[index] === byte);
22
+ }
23
+ function readPngDimensions(bytes) {
24
+ if (bytes.length < PNG_HEADER_BYTES) return;
25
+ if (bytes[12] !== 73 || bytes[13] !== 72 || bytes[14] !== 68 || bytes[15] !== 82) return;
26
+ return {
27
+ widthPx: readUint32BE(bytes, 16),
28
+ heightPx: readUint32BE(bytes, 20)
29
+ };
30
+ }
31
+ function isStartOfFrameMarker(marker) {
32
+ if (marker < 192 || marker > 207) return false;
33
+ return marker !== 196 && marker !== 200 && marker !== 204;
34
+ }
35
+ function hasNoLengthField(marker) {
36
+ return marker === 216 || marker === 217 || marker === 1 || marker >= 208 && marker <= 215;
37
+ }
38
+ function readJpegDimensions(bytes) {
39
+ if (bytes.length < 4 || bytes[0] !== 255 || bytes[1] !== 216) return;
40
+ let offset = 2;
41
+ while (offset < bytes.length) {
42
+ if (bytes[offset] !== 255) {
43
+ offset += 1;
44
+ continue;
45
+ }
46
+ let markerOffset = offset + 1;
47
+ while (bytes[markerOffset] === 255) markerOffset += 1;
48
+ const marker = bytes[markerOffset];
49
+ if (marker === void 0) return;
50
+ offset = markerOffset + 1;
51
+ if (hasNoLengthField(marker)) continue;
52
+ if (offset + 2 > bytes.length) return;
53
+ const length = readUint16BE(bytes, offset);
54
+ if (isStartOfFrameMarker(marker)) {
55
+ if (offset + 7 > bytes.length) return;
56
+ const heightPx = readUint16BE(bytes, offset + 3);
57
+ return {
58
+ widthPx: readUint16BE(bytes, offset + 5),
59
+ heightPx
60
+ };
61
+ }
62
+ if (marker === 218) return;
63
+ offset += length;
64
+ }
65
+ }
66
+ function isJpeg(bytes) {
67
+ return bytes.length >= 2 && bytes[0] === 255 && bytes[1] === 216;
68
+ }
69
+ function detectImageFormat(bytes) {
70
+ if (isPng(bytes)) return "png";
71
+ return isJpeg(bytes) ? "jpeg" : void 0;
72
+ }
73
+ function readImageDimensions(bytes) {
74
+ if (isPng(bytes)) return readPngDimensions(bytes);
75
+ return readJpegDimensions(bytes);
76
+ }
77
+ const POINTS_PER_PIXEL = 72 / 96;
78
+ //#endregion
79
+ export { POINTS_PER_PIXEL, detectImageFormat, readImageDimensions };
package/dist/index.cjs ADDED
@@ -0,0 +1,105 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_diagnostics = require("./diagnostics.cjs");
3
+ const require_xml_query = require("./xml/query.cjs");
4
+ const require_xml_parse = require("./xml/parse.cjs");
5
+ const require_ocf_container = require("./ocf/container.cjs");
6
+ const require_format = require("./format.cjs");
7
+ const require_nav_nav3 = require("./nav/nav3.cjs");
8
+ const require_nav_ncx = require("./nav/ncx.cjs");
9
+ const require_nav_reconcile = require("./nav/reconcile.cjs");
10
+ const require_xml_entities = require("./xml/entities.cjs");
11
+ const require_opf_metadata = require("./opf/metadata.cjs");
12
+ const require_opf_parse = require("./opf/parse.cjs");
13
+ const require_image_dimensions = require("./image/dimensions.cjs");
14
+ const require_util_base64 = require("./util/base64.cjs");
15
+ const require_xml_build = require("./xml/build.cjs");
16
+ const require_xhtml_footnote = require("./xhtml/footnote.cjs");
17
+ const require_xhtml_style_constants = require("./xhtml/style-constants.cjs");
18
+ const require_xhtml_inline = require("./xhtml/inline.cjs");
19
+ const require_xhtml_list_id = require("./xhtml/list-id.cjs");
20
+ const require_xhtml_read = require("./xhtml/read.cjs");
21
+ const require_path = require("./path.cjs");
22
+ const require_zip = require("./zip.cjs");
23
+ const require_read = require("./read.cjs");
24
+ const require_ocf_write = require("./ocf/write.cjs");
25
+ const require_nav_write = require("./nav/write.cjs");
26
+ const require_opf_write = require("./opf/write.cjs");
27
+ const require_xhtml_write = require("./xhtml/write.cjs");
28
+ const require_write = require("./write.cjs");
29
+ const require_codec = require("./codec.cjs");
30
+ require("./opf/types.cjs");
31
+ require("./xhtml/context.cjs");
32
+ const require_xml_node = require("./xml/node.cjs");
33
+ exports.AttributeSchema = require_xml_node.AttributeSchema;
34
+ exports.DEFINITION_BODY_INDENT_PT = require_xhtml_style_constants.DEFINITION_BODY_INDENT_PT;
35
+ exports.EPUB_MIME_TYPE = require_format.EPUB_MIME_TYPE;
36
+ exports.EpubBytesSchema = require_codec.EpubBytesSchema;
37
+ exports.EpubDiagnosticCodes = require_diagnostics.EpubDiagnosticCodes;
38
+ exports.EpubEmptySpineError = require_diagnostics.EpubEmptySpineError;
39
+ exports.EpubInvalidContainerError = require_diagnostics.EpubInvalidContainerError;
40
+ exports.EpubInvalidMimetypeError = require_diagnostics.EpubInvalidMimetypeError;
41
+ exports.EpubInvalidOpfError = require_diagnostics.EpubInvalidOpfError;
42
+ exports.EpubPackageFlattenError = require_diagnostics.EpubPackageFlattenError;
43
+ exports.EpubParseError = require_diagnostics.EpubParseError;
44
+ exports.EpubUnbalancedConstructMarkersError = require_diagnostics.EpubUnbalancedConstructMarkersError;
45
+ exports.EpubUnsupportedDocumentKindError = require_diagnostics.EpubUnsupportedDocumentKindError;
46
+ exports.EpubWriteError = require_diagnostics.EpubWriteError;
47
+ exports.HORIZONTAL_RULE_STYLE_ID = require_xhtml_style_constants.HORIZONTAL_RULE_STYLE_ID;
48
+ exports.MONOSPACE_FONT_FAMILY = require_xhtml_style_constants.MONOSPACE_FONT_FAMILY;
49
+ exports.NOOP_EPUB_DIAGNOSTIC_SINK = require_diagnostics.NOOP_EPUB_DIAGNOSTIC_SINK;
50
+ exports.OCF_CONTAINER_PATH = require_format.OCF_CONTAINER_PATH;
51
+ exports.OCF_MIMETYPE_PATH = require_format.OCF_MIMETYPE_PATH;
52
+ exports.POINTS_PER_PIXEL = require_image_dimensions.POINTS_PER_PIXEL;
53
+ exports.QUOTE_INDENT_PT = require_xhtml_style_constants.QUOTE_INDENT_PT;
54
+ exports.QUOTE_STYLE_ID = require_xhtml_style_constants.QUOTE_STYLE_ID;
55
+ exports.XmlCdataSchema = require_xml_node.XmlCdataSchema;
56
+ exports.XmlCommentSchema = require_xml_node.XmlCommentSchema;
57
+ exports.XmlDeclarationSchema = require_xml_node.XmlDeclarationSchema;
58
+ exports.XmlElementSchema = require_xml_node.XmlElementSchema;
59
+ exports.XmlNodeSchema = require_xml_node.XmlNodeSchema;
60
+ exports.XmlPiSchema = require_xml_node.XmlPiSchema;
61
+ exports.XmlTextSchema = require_xml_node.XmlTextSchema;
62
+ exports.attrValue = require_xml_query.attrValue;
63
+ exports.base64ToBytes = require_util_base64.base64ToBytes;
64
+ exports.buildInlineRuns = require_xhtml_inline.buildInlineRuns;
65
+ exports.buildXml = require_xml_build.buildXml;
66
+ exports.bytesToBase64 = require_util_base64.bytesToBase64;
67
+ exports.childrenWithTag = require_xml_query.childrenWithTag;
68
+ exports.decodeEntities = require_xml_entities.decodeEntities;
69
+ exports.detectImageFormat = require_image_dimensions.detectImageFormat;
70
+ exports.dirname = require_path.dirname;
71
+ exports.elementsWithTag = require_xml_query.elementsWithTag;
72
+ exports.encodeEntities = require_xml_entities.encodeEntities;
73
+ exports.epubCodec = require_codec.epubCodec;
74
+ exports.epubContentCodec = require_codec.epubContentCodec;
75
+ exports.findChildElement = require_xml_query.findChildElement;
76
+ exports.findElement = require_xml_query.findElement;
77
+ exports.isFootnoteAside = require_xhtml_footnote.isFootnoteAside;
78
+ exports.isFootnoteReferenceAnchor = require_xhtml_footnote.isFootnoteReferenceAnchor;
79
+ exports.isXmlNode = require_xml_node.isXmlNode;
80
+ exports.mintListNumId = require_xhtml_list_id.mintListNumId;
81
+ exports.navMatchesSpine = require_nav_reconcile.navMatchesSpine;
82
+ exports.parseListNumId = require_xhtml_list_id.parseListNumId;
83
+ exports.parseOpf = require_opf_parse.parseOpf;
84
+ exports.parseXml = require_xml_parse.parseXml;
85
+ exports.readEpub = require_read.readEpub;
86
+ exports.readEpubContent = require_read.readEpubContent;
87
+ exports.readImageDimensions = require_image_dimensions.readImageDimensions;
88
+ exports.readNav3TocHrefs = require_nav_nav3.readNav3TocHrefs;
89
+ exports.readNcxHrefs = require_nav_ncx.readNcxHrefs;
90
+ exports.readOpfMetadata = require_opf_metadata.readOpfMetadata;
91
+ exports.readXhtmlBody = require_xhtml_read.readXhtmlBody;
92
+ exports.resolveOpfPath = require_ocf_container.resolveOpfPath;
93
+ exports.resolvePackagePath = require_path.resolvePackagePath;
94
+ exports.rootElement = require_xml_query.rootElement;
95
+ exports.sameDocumentFragment = require_xhtml_footnote.sameDocumentFragment;
96
+ exports.sectionTitle = require_nav_write.sectionTitle;
97
+ exports.textContent = require_xml_query.textContent;
98
+ exports.unzipPackage = require_zip.unzipPackage;
99
+ exports.writeContainerXml = require_ocf_write.writeContainerXml;
100
+ exports.writeEpub = require_write.writeEpub;
101
+ exports.writeEpubContent = require_write.writeEpubContent;
102
+ exports.writeNav3Document = require_nav_write.writeNav3Document;
103
+ exports.writeOpf = require_opf_write.writeOpf;
104
+ exports.writeXhtmlBody = require_xhtml_write.writeXhtmlBody;
105
+ exports.zipPackage = require_zip.zipPackage;