postext-epub 0.1.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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +194 -0
  3. package/dist/__tests__/sampleBook.d.ts +17 -0
  4. package/dist/__tests__/sampleBook.d.ts.map +1 -0
  5. package/dist/__tests__/sampleBook.js +103 -0
  6. package/dist/__tests__/sampleBook.js.map +1 -0
  7. package/dist/epubcheck.test.d.ts +2 -0
  8. package/dist/epubcheck.test.d.ts.map +1 -0
  9. package/dist/epubcheck.test.js +69 -0
  10. package/dist/epubcheck.test.js.map +1 -0
  11. package/dist/fixed/fixed.test.d.ts +2 -0
  12. package/dist/fixed/fixed.test.d.ts.map +1 -0
  13. package/dist/fixed/fixed.test.js +225 -0
  14. package/dist/fixed/fixed.test.js.map +1 -0
  15. package/dist/fixed/fontUse.d.ts +21 -0
  16. package/dist/fixed/fontUse.d.ts.map +1 -0
  17. package/dist/fixed/fontUse.js +82 -0
  18. package/dist/fixed/fontUse.js.map +1 -0
  19. package/dist/fixed/index.d.ts +3 -0
  20. package/dist/fixed/index.d.ts.map +1 -0
  21. package/dist/fixed/index.js +254 -0
  22. package/dist/fixed/index.js.map +1 -0
  23. package/dist/fixed/outline.d.ts +40 -0
  24. package/dist/fixed/outline.d.ts.map +1 -0
  25. package/dist/fixed/outline.js +88 -0
  26. package/dist/fixed/outline.js.map +1 -0
  27. package/dist/index.d.ts +17 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +29 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/package/pack.d.ts +25 -0
  32. package/dist/package/pack.d.ts.map +1 -0
  33. package/dist/package/pack.js +253 -0
  34. package/dist/package/pack.js.map +1 -0
  35. package/dist/package/pack.test.d.ts +2 -0
  36. package/dist/package/pack.test.d.ts.map +1 -0
  37. package/dist/package/pack.test.js +164 -0
  38. package/dist/package/pack.test.js.map +1 -0
  39. package/dist/package/read.d.ts +15 -0
  40. package/dist/package/read.d.ts.map +1 -0
  41. package/dist/package/read.js +198 -0
  42. package/dist/package/read.js.map +1 -0
  43. package/dist/package/strings.d.ts +17 -0
  44. package/dist/package/strings.d.ts.map +1 -0
  45. package/dist/package/strings.js +24 -0
  46. package/dist/package/strings.js.map +1 -0
  47. package/dist/reflowable/__tests__/vdt.d.ts +13 -0
  48. package/dist/reflowable/__tests__/vdt.d.ts.map +1 -0
  49. package/dist/reflowable/__tests__/vdt.js +55 -0
  50. package/dist/reflowable/__tests__/vdt.js.map +1 -0
  51. package/dist/reflowable/__tests__/xml.d.ts +8 -0
  52. package/dist/reflowable/__tests__/xml.d.ts.map +1 -0
  53. package/dist/reflowable/__tests__/xml.js +107 -0
  54. package/dist/reflowable/__tests__/xml.js.map +1 -0
  55. package/dist/reflowable/css.d.ts +45 -0
  56. package/dist/reflowable/css.d.ts.map +1 -0
  57. package/dist/reflowable/css.js +491 -0
  58. package/dist/reflowable/css.js.map +1 -0
  59. package/dist/reflowable/index.d.ts +4 -0
  60. package/dist/reflowable/index.d.ts.map +1 -0
  61. package/dist/reflowable/index.js +257 -0
  62. package/dist/reflowable/index.js.map +1 -0
  63. package/dist/reflowable/inline.d.ts +56 -0
  64. package/dist/reflowable/inline.d.ts.map +1 -0
  65. package/dist/reflowable/inline.js +334 -0
  66. package/dist/reflowable/inline.js.map +1 -0
  67. package/dist/reflowable/model.d.ts +261 -0
  68. package/dist/reflowable/model.d.ts.map +1 -0
  69. package/dist/reflowable/model.js +6 -0
  70. package/dist/reflowable/model.js.map +1 -0
  71. package/dist/reflowable/reflowable.test.d.ts +2 -0
  72. package/dist/reflowable/reflowable.test.d.ts.map +1 -0
  73. package/dist/reflowable/reflowable.test.js +469 -0
  74. package/dist/reflowable/reflowable.test.js.map +1 -0
  75. package/dist/reflowable/rtl.test.d.ts +2 -0
  76. package/dist/reflowable/rtl.test.d.ts.map +1 -0
  77. package/dist/reflowable/rtl.test.js +217 -0
  78. package/dist/reflowable/rtl.test.js.map +1 -0
  79. package/dist/reflowable/walk.d.ts +42 -0
  80. package/dist/reflowable/walk.d.ts.map +1 -0
  81. package/dist/reflowable/walk.js +1096 -0
  82. package/dist/reflowable/walk.js.map +1 -0
  83. package/dist/reflowable/xhtml.d.ts +33 -0
  84. package/dist/reflowable/xhtml.d.ts.map +1 -0
  85. package/dist/reflowable/xhtml.js +472 -0
  86. package/dist/reflowable/xhtml.js.map +1 -0
  87. package/dist/shared/accessibility.d.ts +20 -0
  88. package/dist/shared/accessibility.d.ts.map +1 -0
  89. package/dist/shared/accessibility.js +30 -0
  90. package/dist/shared/accessibility.js.map +1 -0
  91. package/dist/shared/assets.d.ts +46 -0
  92. package/dist/shared/assets.d.ts.map +1 -0
  93. package/dist/shared/assets.js +143 -0
  94. package/dist/shared/assets.js.map +1 -0
  95. package/dist/shared/assets.test.d.ts +2 -0
  96. package/dist/shared/assets.test.d.ts.map +1 -0
  97. package/dist/shared/assets.test.js +106 -0
  98. package/dist/shared/assets.test.js.map +1 -0
  99. package/dist/shared/media.d.ts +11 -0
  100. package/dist/shared/media.d.ts.map +1 -0
  101. package/dist/shared/media.js +52 -0
  102. package/dist/shared/media.js.map +1 -0
  103. package/dist/shared/uuid.d.ts +7 -0
  104. package/dist/shared/uuid.d.ts.map +1 -0
  105. package/dist/shared/uuid.js +63 -0
  106. package/dist/shared/uuid.js.map +1 -0
  107. package/dist/shared/xml.d.ts +54 -0
  108. package/dist/shared/xml.d.ts.map +1 -0
  109. package/dist/shared/xml.js +214 -0
  110. package/dist/shared/xml.js.map +1 -0
  111. package/dist/shared/xml.test.d.ts +2 -0
  112. package/dist/shared/xml.test.d.ts.map +1 -0
  113. package/dist/shared/xml.test.js +71 -0
  114. package/dist/shared/xml.test.js.map +1 -0
  115. package/dist/shared/xmlRead.d.ts +19 -0
  116. package/dist/shared/xmlRead.d.ts.map +1 -0
  117. package/dist/shared/xmlRead.js +85 -0
  118. package/dist/shared/xmlRead.js.map +1 -0
  119. package/dist/types.d.ts +205 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +15 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/worker/client.d.ts +39 -0
  124. package/dist/worker/client.d.ts.map +1 -0
  125. package/dist/worker/client.js +184 -0
  126. package/dist/worker/client.js.map +1 -0
  127. package/dist/worker/epub.worker.d.ts +2 -0
  128. package/dist/worker/epub.worker.d.ts.map +1 -0
  129. package/dist/worker/epub.worker.js +7 -0
  130. package/dist/worker/epub.worker.js.map +1 -0
  131. package/dist/worker/protocol.d.ts +44 -0
  132. package/dist/worker/protocol.d.ts.map +1 -0
  133. package/dist/worker/protocol.js +6 -0
  134. package/dist/worker/protocol.js.map +1 -0
  135. package/dist/worker/serve.d.ts +11 -0
  136. package/dist/worker/serve.d.ts.map +1 -0
  137. package/dist/worker/serve.js +53 -0
  138. package/dist/worker/serve.js.map +1 -0
  139. package/dist/worker/worker.test.d.ts +2 -0
  140. package/dist/worker/worker.test.d.ts.map +1 -0
  141. package/dist/worker/worker.test.js +168 -0
  142. package/dist/worker/worker.test.js.map +1 -0
  143. package/package.json +68 -0
@@ -0,0 +1,54 @@
1
+ /** Escape text for an XML text node. */
2
+ export declare function escapeXml(text: string): string;
3
+ /** Escape text for a double-quoted XML attribute value. */
4
+ export declare function escapeAttr(text: string): string;
5
+ /** Drop characters XML 1.0 forbids (C0 controls but tab, LF, CR; lone
6
+ * surrogates; U+FFFE/U+FFFF). */
7
+ export declare function stripInvalidXmlChars(text: string): string;
8
+ /** Decode HTML character references (named ones from the table above,
9
+ * decimal and hexadecimal). An unknown or malformed one stays as text. */
10
+ export declare function decodeEntities(text: string): string;
11
+ /** Whether `name` is an XML NCName (what an `id` must be). */
12
+ export declare function isNcName(name: string): boolean;
13
+ /** `id` as an XML NCName: unchanged when it is one, else its invalid
14
+ * characters replaced by `_` (and `_` put before a leading digit, dot or
15
+ * dash). Deterministic, so a link's fragment maps the same way. */
16
+ export declare function xmlId(id: string): string;
17
+ export interface XhtmlOptions {
18
+ /** Map of a same-document or cross-document link: given the `href` of an
19
+ * `<a>` (after entity decoding), returns the href to write, or undefined
20
+ * to drop the attribute (a link to nowhere). Fragments are made NCNames
21
+ * ({@link xmlId}) before it is called. */
22
+ rewriteHref?: (href: string) => string | undefined;
23
+ /** Map of an `<img src>` (after entity decoding). */
24
+ rewriteSrc?: (src: string) => string;
25
+ /** Ids already used in the document the fragment goes into; the converter
26
+ * adds the ones it writes and drops a repeated one. */
27
+ ids?: Set<string>;
28
+ /** Called with the text of each `<style>` element, which is then left
29
+ * out of the fragment (XHTML allows `<style>` only in the head). Without
30
+ * it, style elements stay where they are. */
31
+ hoistStyle?: (css: string) => void;
32
+ }
33
+ /**
34
+ * Turn HTML markup (what `renderToHtml` and friends emit, or any fragment of
35
+ * ordinary HTML) into well-formed XHTML: void elements self-closed, end tags
36
+ * balanced, named character references made characters, bare boolean
37
+ * attributes given values, attribute and element names valid, `xmlns` on
38
+ * inline `<svg>` and `<math>`, `id`s made NCNames and unique, characters XML
39
+ * forbids dropped. Comments and doctypes are dropped. It does not repair
40
+ * HTML's implied structure (`<p>` closed by a block): the input is expected
41
+ * to close its elements.
42
+ */
43
+ export declare function htmlToXhtml(html: string, options?: XhtmlOptions): string;
44
+ /** An XHTML content document. `head` and `body` are XHTML already. */
45
+ export declare function xhtmlDocument(parts: {
46
+ lang: string;
47
+ dir?: 'ltr' | 'rtl';
48
+ title: string;
49
+ head?: string;
50
+ body: string;
51
+ /** Attributes of `<body>`, each with its leading space. */
52
+ bodyAttrs?: string;
53
+ }): string;
54
+ //# sourceMappingURL=xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/shared/xml.ts"],"names":[],"mappings":"AAGA,wCAAwC;AACxC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,2DAA2D;AAC3D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;kCACkC;AAClC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAuBD;2EAC2E;AAC3E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASnD;AAWD,8DAA8D;AAC9D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED;;oEAEoE;AACpE,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKxC;AAYD,MAAM,WAAW,YAAY;IAC3B;;;+CAG2C;IAC3C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACnD,qDAAqD;IACrD,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC;4DACwD;IACxD,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB;;kDAE8C;IAC9C,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAsBD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CA0F5E;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAST"}
@@ -0,0 +1,214 @@
1
+ // XML text helpers shared by every document the package writes, and the
2
+ // converter that turns the HTML renderers' markup into well-formed XHTML.
3
+ /** Escape text for an XML text node. */
4
+ export function escapeXml(text) {
5
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
6
+ }
7
+ /** Escape text for a double-quoted XML attribute value. */
8
+ export function escapeAttr(text) {
9
+ return escapeXml(text).replace(/"/g, '&quot;');
10
+ }
11
+ /** Drop characters XML 1.0 forbids (C0 controls but tab, LF, CR; lone
12
+ * surrogates; U+FFFE/U+FFFF). */
13
+ export function stripInvalidXmlChars(text) {
14
+ return text.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F￾￿]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, '');
15
+ }
16
+ // ---------------------------------------------------------------------------
17
+ // Entities
18
+ // ---------------------------------------------------------------------------
19
+ /** The HTML named character references markup is likely to carry. XHTML
20
+ * knows only the five XML ones, so the converter decodes these to their
21
+ * characters; any other name is kept as text (its `&` escaped). */
22
+ const NAMED_ENTITIES = {
23
+ amp: '&', lt: '<', gt: '>', quot: '"', apos: "'",
24
+ nbsp: ' ', shy: '­', ensp: ' ', emsp: ' ', thinsp: ' ', hairsp: ' ',
25
+ zwnj: '‌', zwj: '‍', lrm: '‎', rlm: '‏', NoBreak: '⁠',
26
+ ndash: '–', mdash: '—', minus: '−', hellip: '…', middot: '·', bull: '•',
27
+ lsquo: '‘', rsquo: '’', sbquo: '‚', ldquo: '“', rdquo: '”', bdquo: '„',
28
+ laquo: '«', raquo: '»', lsaquo: '‹', rsaquo: '›',
29
+ copy: '©', reg: '®', trade: '™', sect: '§', para: '¶', deg: '°',
30
+ times: '×', divide: '÷', plusmn: '±', frac12: '½', frac14: '¼', frac34: '¾',
31
+ dagger: '†', Dagger: '‡', prime: '′', Prime: '″', permil: '‰',
32
+ iexcl: '¡', iquest: '¿', ordf: 'ª', ordm: 'º', euro: '€', pound: '£', yen: '¥', cent: '¢',
33
+ larr: '←', rarr: '→', uarr: '↑', darr: '↓', harr: '↔',
34
+ };
35
+ /** Decode HTML character references (named ones from the table above,
36
+ * decimal and hexadecimal). An unknown or malformed one stays as text. */
37
+ export function decodeEntities(text) {
38
+ if (!text.includes('&'))
39
+ return text;
40
+ return text.replace(/&(#[0-9]+|#[xX][0-9a-fA-F]+|[A-Za-z][A-Za-z0-9]*);/g, (whole, ref) => {
41
+ if (ref[0] === '#') {
42
+ const code = ref[1] === 'x' || ref[1] === 'X' ? parseInt(ref.slice(2), 16) : parseInt(ref.slice(1), 10);
43
+ return code > 0 && code <= 0x10ffff && !(code >= 0xd800 && code <= 0xdfff) ? String.fromCodePoint(code) : '';
44
+ }
45
+ return NAMED_ENTITIES[ref] ?? whole;
46
+ });
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // Names
50
+ // ---------------------------------------------------------------------------
51
+ const NAME_START = 'A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD';
52
+ const NAME_CHAR = `${NAME_START}\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040`;
53
+ const NCNAME = new RegExp(`^[${NAME_START}][${NAME_CHAR}]*$`);
54
+ const ATTR_NAME = new RegExp(`^[${NAME_START}][${NAME_CHAR}]*(?::[${NAME_START}][${NAME_CHAR}]*)?$`);
55
+ /** Whether `name` is an XML NCName (what an `id` must be). */
56
+ export function isNcName(name) {
57
+ return NCNAME.test(name);
58
+ }
59
+ /** `id` as an XML NCName: unchanged when it is one, else its invalid
60
+ * characters replaced by `_` (and `_` put before a leading digit, dot or
61
+ * dash). Deterministic, so a link's fragment maps the same way. */
62
+ export function xmlId(id) {
63
+ if (isNcName(id))
64
+ return id;
65
+ const chars = new RegExp(`[^${NAME_CHAR}]`, 'g');
66
+ const fixed = id.replace(chars, '_');
67
+ return new RegExp(`^[${NAME_START}]`).test(fixed) ? fixed : `_${fixed}`;
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // HTML → XHTML
71
+ // ---------------------------------------------------------------------------
72
+ const VOID_ELEMENTS = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'source', 'track', 'wbr']);
73
+ const SVG_NS = 'http://www.w3.org/2000/svg';
74
+ const MATHML_NS = 'http://www.w3.org/1998/Math/MathML';
75
+ const XLINK_NS = 'http://www.w3.org/1999/xlink';
76
+ /** Attributes of a start tag, in order (`value` undefined for a bare
77
+ * boolean attribute). */
78
+ function parseAttributes(source) {
79
+ const out = [];
80
+ const re = /([^\s"'<>/=]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+)))?/g;
81
+ let m;
82
+ while ((m = re.exec(source))) {
83
+ out.push({ name: m[1], value: m[2] ?? m[3] ?? m[4] });
84
+ }
85
+ return out;
86
+ }
87
+ /**
88
+ * Turn HTML markup (what `renderToHtml` and friends emit, or any fragment of
89
+ * ordinary HTML) into well-formed XHTML: void elements self-closed, end tags
90
+ * balanced, named character references made characters, bare boolean
91
+ * attributes given values, attribute and element names valid, `xmlns` on
92
+ * inline `<svg>` and `<math>`, `id`s made NCNames and unique, characters XML
93
+ * forbids dropped. Comments and doctypes are dropped. It does not repair
94
+ * HTML's implied structure (`<p>` closed by a block): the input is expected
95
+ * to close its elements.
96
+ */
97
+ export function htmlToXhtml(html, options = {}) {
98
+ const out = [];
99
+ const stack = [];
100
+ const ids = options.ids ?? new Set();
101
+ const re = /<!--[\s\S]*?(?:-->|$)|<!\[CDATA\[([\s\S]*?)(?:\]\]>|$)|<![^>]*>|<\?[\s\S]*?(?:\?>|$)|<\/([A-Za-z][^\s/>]*)\s*>|<([A-Za-z][^\s/>]*)((?:\s+[^\s"'<>/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s"'=<>`]+))?)*)\s*(\/?)>/g;
102
+ let last = 0;
103
+ let m;
104
+ const text = (s) => {
105
+ if (s)
106
+ out.push(escapeXml(stripInvalidXmlChars(decodeEntities(s))));
107
+ };
108
+ while ((m = re.exec(html))) {
109
+ text(html.slice(last, m.index));
110
+ last = re.lastIndex;
111
+ const [, cdata, endName, startName, attrSource, selfClose] = m;
112
+ if (cdata !== undefined) {
113
+ text(cdata.replace(/&/g, '&amp;'));
114
+ continue;
115
+ }
116
+ if (endName !== undefined) {
117
+ const key = endName.toLowerCase();
118
+ if (VOID_ELEMENTS.has(key) && !stack.some((t) => t.foreign))
119
+ continue;
120
+ const at = stack.map((t) => t.key).lastIndexOf(key);
121
+ if (at < 0)
122
+ continue; // a stray end tag
123
+ while (stack.length > at)
124
+ out.push(`</${stack.pop().name}>`);
125
+ continue;
126
+ }
127
+ if (startName === undefined)
128
+ continue; // comment, doctype, processing instruction
129
+ const parent = stack[stack.length - 1];
130
+ const lower = startName.toLowerCase();
131
+ const foreign = parent?.foreign === true || lower === 'svg' || lower === 'math';
132
+ // SVG and MathML names are case-sensitive (`foreignObject`, `viewBox`).
133
+ const name = foreign ? startName : lower;
134
+ if (lower === 'style' && !foreign && options.hoistStyle) {
135
+ const close = html.toLowerCase().indexOf('</style', last);
136
+ const end = close < 0 ? html.length : close;
137
+ options.hoistStyle(html.slice(last, end));
138
+ re.lastIndex = last = close < 0 ? html.length : html.indexOf('>', close) + 1 || html.length;
139
+ continue;
140
+ }
141
+ if (lower === 'script') {
142
+ // Never in an EPUB the package declares unscripted.
143
+ const close = html.toLowerCase().indexOf('</script', last);
144
+ re.lastIndex = last = close < 0 ? html.length : html.indexOf('>', close) + 1 || html.length;
145
+ continue;
146
+ }
147
+ const attrs = [];
148
+ const seen = new Set();
149
+ let hasXmlns = false;
150
+ let usesXlink = false;
151
+ for (const a of parseAttributes(attrSource ?? '')) {
152
+ const attrName = foreign ? a.name : a.name.toLowerCase();
153
+ if (!ATTR_NAME.test(attrName) || seen.has(attrName))
154
+ continue;
155
+ seen.add(attrName);
156
+ let value = a.value === undefined ? attrName : stripInvalidXmlChars(decodeEntities(a.value));
157
+ if (attrName === 'xmlns')
158
+ hasXmlns = true;
159
+ if (attrName.startsWith('xlink:'))
160
+ usesXlink = true;
161
+ if (attrName === 'xmlns:xlink')
162
+ usesXlink = false;
163
+ if (attrName === 'id') {
164
+ value = xmlId(value);
165
+ if (ids.has(value))
166
+ continue;
167
+ ids.add(value);
168
+ }
169
+ else if (attrName === 'href' && !foreign && name === 'a') {
170
+ const hash = value.indexOf('#');
171
+ if (hash >= 0)
172
+ value = value.slice(0, hash + 1) + xmlId(value.slice(hash + 1));
173
+ if (options.rewriteHref) {
174
+ const mapped = options.rewriteHref(value);
175
+ if (mapped === undefined)
176
+ continue;
177
+ value = mapped;
178
+ }
179
+ }
180
+ else if (attrName === 'src' && name === 'img' && options.rewriteSrc) {
181
+ value = options.rewriteSrc(value);
182
+ }
183
+ attrs.push(` ${attrName}="${escapeAttr(value)}"`);
184
+ }
185
+ if (!hasXmlns && (lower === 'svg' || lower === 'math') && parent?.foreign !== true) {
186
+ attrs.unshift(` xmlns="${lower === 'svg' ? SVG_NS : MATHML_NS}"`);
187
+ }
188
+ if (usesXlink)
189
+ attrs.push(` xmlns:xlink="${XLINK_NS}"`);
190
+ const isVoid = !foreign && VOID_ELEMENTS.has(lower);
191
+ if (isVoid || (selfClose && foreign)) {
192
+ out.push(`<${name}${attrs.join('')}/>`);
193
+ }
194
+ else {
195
+ out.push(`<${name}${attrs.join('')}>`);
196
+ // `<div/>` in HTML opens the element; it is closed by its end tag.
197
+ stack.push({ name, key: lower, foreign });
198
+ }
199
+ }
200
+ text(html.slice(last));
201
+ while (stack.length > 0)
202
+ out.push(`</${stack.pop().name}>`);
203
+ return out.join('');
204
+ }
205
+ /** An XHTML content document. `head` and `body` are XHTML already. */
206
+ export function xhtmlDocument(parts) {
207
+ const dir = parts.dir ? ` dir="${parts.dir}"` : '';
208
+ return (`<?xml version="1.0" encoding="UTF-8"?>\n` +
209
+ `<!DOCTYPE html>\n` +
210
+ `<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" lang="${escapeAttr(parts.lang)}" xml:lang="${escapeAttr(parts.lang)}"${dir}>\n` +
211
+ `<head>\n<meta charset="UTF-8"/>\n<title>${escapeXml(parts.title)}</title>\n${parts.head ?? ''}</head>\n` +
212
+ `<body${parts.bodyAttrs ?? ''}>\n${parts.body}\n</body>\n</html>\n`);
213
+ }
214
+ //# sourceMappingURL=xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.js","sourceRoot":"","sources":["../../src/shared/xml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=xml.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.test.d.ts","sourceRoot":"","sources":["../../src/shared/xml.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { decodeEntities, escapeAttr, htmlToXhtml, isNcName, stripInvalidXmlChars, xhtmlDocument, xmlId } from './xml';
3
+ import { childElements, descendants, parseXml, textOf } from './xmlRead';
4
+ describe('escaping', () => {
5
+ it('escapes text and attributes', () => {
6
+ expect(escapeAttr(`a<b>&"c"`)).toBe('a&lt;b&gt;&amp;&quot;c&quot;');
7
+ });
8
+ it('drops characters XML forbids', () => {
9
+ expect(stripInvalidXmlChars('a\u0001b\u000Bc￾d\tE\uD800')).toBe('abcd\tE');
10
+ expect(stripInvalidXmlChars('😀')).toBe('😀');
11
+ });
12
+ it('decodes named and numeric references, keeps unknown ones', () => {
13
+ expect(decodeEntities('a&nbsp;b&#233;&#x4E2D;&mdash;&bogus;&amp;')).toBe('a bé中—&bogus;&');
14
+ });
15
+ });
16
+ describe('xmlId', () => {
17
+ it('keeps NCNames and repairs the rest deterministically', () => {
18
+ expect(isNcName('pt-a-résumé')).toBe(true);
19
+ expect(xmlId('pt-a-résumé')).toBe('pt-a-résumé');
20
+ expect(xmlId('1st')).toBe('_1st');
21
+ expect(xmlId('a b:c')).toBe('a_b_c');
22
+ });
23
+ });
24
+ describe('htmlToXhtml', () => {
25
+ it('self-closes void elements and gives boolean attributes values', () => {
26
+ expect(htmlToXhtml('<img src="a.png" alt=""><br><input disabled>')).toBe('<img src="a.png" alt=""/><br/><input disabled="disabled"/>');
27
+ });
28
+ it('turns named entities into characters and escapes bare ampersands', () => {
29
+ expect(htmlToXhtml('<p title="x&nbsp;y">A &amp; B&nbsp;&copy; R&D</p>')).toBe('<p title="x y">A &amp; B © R&amp;D</p>');
30
+ });
31
+ it('balances end tags and drops stray ones', () => {
32
+ expect(htmlToXhtml('<div><span>a</div></b><p>b')).toBe('<div><span>a</span></div><p>b</p>');
33
+ });
34
+ it('declares the SVG namespace and keeps SVG name case', () => {
35
+ expect(htmlToXhtml('<svg viewBox="0 0 1 1"><clipPath id="c"><rect/></clipPath><use xlink:href="#c"/></svg>'))
36
+ .toBe('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1 1"><clipPath id="c"><rect/></clipPath>' +
37
+ '<use xlink:href="#c" xmlns:xlink="http://www.w3.org/1999/xlink"/></svg>');
38
+ expect(htmlToXhtml('<svg xmlns="http://www.w3.org/2000/svg"></svg>')).toBe('<svg xmlns="http://www.w3.org/2000/svg"></svg>');
39
+ });
40
+ it('repairs ids, drops duplicates and maps link fragments the same way', () => {
41
+ const ids = new Set();
42
+ const out = htmlToXhtml('<span id="1a"></span><span id="1a"></span><a href="#1a">x</a><a href="p.xhtml#a b">y</a>', {
43
+ ids,
44
+ rewriteHref: (h) => h.startsWith('#') ? `page-0001.xhtml${h}` : h,
45
+ });
46
+ expect(out).toBe('<span id="_1a"></span><span></span><a href="page-0001.xhtml#_1a">x</a><a href="p.xhtml#a_b">y</a>');
47
+ expect([...ids]).toEqual(['_1a']);
48
+ });
49
+ it('drops a link the rewrite has no target for', () => {
50
+ expect(htmlToXhtml('<a href="#gone" class="x">t</a>', { rewriteHref: () => undefined })).toBe('<a class="x">t</a>');
51
+ });
52
+ it('hoists style elements and drops scripts and comments', () => {
53
+ const styles = [];
54
+ const out = htmlToXhtml('<div><style>.a>b{x:1}</style><!-- c --><script>alert(1)</script>t</div>', { hoistStyle: (c) => styles.push(c) });
55
+ expect(out).toBe('<div>t</div>');
56
+ expect(styles).toEqual(['.a>b{x:1}']);
57
+ });
58
+ it('rewrites image sources', () => {
59
+ expect(htmlToXhtml('<img src="blob:x" alt="">', { rewriteSrc: () => 'images/x.png' })).toBe('<img src="images/x.png" alt=""/>');
60
+ });
61
+ it('round-trips through the XML reader', () => {
62
+ const doc = xhtmlDocument({ lang: 'es', title: 'T & U', body: htmlToXhtml('<p class="x">Hola&nbsp;<b>mundo</b><br></p>') });
63
+ const html = parseXml(doc);
64
+ expect(html.attrs['xml:lang']).toBe('es');
65
+ const p = descendants(html, 'p')[0];
66
+ expect(textOf(p)).toBe('Hola mundo');
67
+ expect(childElements(p).map((e) => e.name)).toEqual(['b', 'br']);
68
+ expect(textOf(descendants(html, 'title')[0])).toBe('T & U');
69
+ });
70
+ });
71
+ //# sourceMappingURL=xml.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.test.js","sourceRoot":"","sources":["../../src/shared/xml.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface XmlElement {
2
+ /** Qualified name as written (`dc:title`, `opf:meta`, `nav`). */
3
+ name: string;
4
+ attrs: Record<string, string>;
5
+ children: XmlNode[];
6
+ }
7
+ export type XmlNode = XmlElement | string;
8
+ /** The local part of a qualified name. */
9
+ export declare const localName: (name: string) => string;
10
+ /** Parse an XML document; returns its root element. */
11
+ export declare function parseXml(source: string): XmlElement;
12
+ /** Child elements of `el` (by local name when given). */
13
+ export declare function childElements(el: XmlElement, local?: string): XmlElement[];
14
+ /** Every descendant element with the local name, in document order. */
15
+ export declare function descendants(el: XmlElement, local: string): XmlElement[];
16
+ /** The text content of `el`, XML whitespace collapsed (a no-break space
17
+ * is kept). */
18
+ export declare function textOf(el: XmlElement): string;
19
+ //# sourceMappingURL=xmlRead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmlRead.d.ts","sourceRoot":"","sources":["../../src/shared/xmlRead.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAE1C,0CAA0C;AAC1C,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAA2C,CAAC;AAErF,uDAAuD;AACvD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAiCnD;AAED,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAE1E;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAWvE;AAED;gBACgB;AAChB,wBAAgB,MAAM,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,CAU7C"}
@@ -0,0 +1,85 @@
1
+ // A small XML reader for the package files a viewer needs (container.xml,
2
+ // the OPF, the navigation document): elements, attributes and text, with
3
+ // namespace prefixes kept in the names. No DOMParser, so it runs in Node
4
+ // tests and in workers alike. Not a validating parser: it reads what this
5
+ // package and ordinary EPUB writers produce.
6
+ import { decodeEntities } from './xml';
7
+ /** The local part of a qualified name. */
8
+ export const localName = (name) => name.slice(name.indexOf(':') + 1);
9
+ /** Parse an XML document; returns its root element. */
10
+ export function parseXml(source) {
11
+ const root = { name: '#document', attrs: {}, children: [] };
12
+ const stack = [root];
13
+ const re = /<!--[\s\S]*?-->|<!\[CDATA\[([\s\S]*?)\]\]>|<![^>]*>|<\?[\s\S]*?\?>|<\/([^\s>]+)\s*>|<([^\s/>!?]+)((?:\s+[^\s=/>]+\s*=\s*(?:"[^"]*"|'[^']*'))*)\s*(\/?)>/g;
14
+ let last = 0;
15
+ let m;
16
+ const top = () => stack[stack.length - 1];
17
+ const text = (s) => {
18
+ if (s)
19
+ top().children.push(decodeEntities(s));
20
+ };
21
+ while ((m = re.exec(source))) {
22
+ text(source.slice(last, m.index));
23
+ last = re.lastIndex;
24
+ const [, cdata, endName, startName, attrSource, selfClose] = m;
25
+ if (cdata !== undefined) {
26
+ top().children.push(cdata);
27
+ }
28
+ else if (endName !== undefined) {
29
+ const at = stack.map((e) => e.name).lastIndexOf(endName);
30
+ if (at > 0)
31
+ stack.length = at;
32
+ }
33
+ else if (startName !== undefined) {
34
+ const attrs = {};
35
+ const ar = /([^\s=/>]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
36
+ let a;
37
+ while ((a = ar.exec(attrSource ?? '')))
38
+ attrs[a[1]] = decodeEntities(a[2] ?? a[3] ?? '');
39
+ const el = { name: startName, attrs, children: [] };
40
+ top().children.push(el);
41
+ if (!selfClose)
42
+ stack.push(el);
43
+ }
44
+ }
45
+ text(source.slice(last));
46
+ const first = root.children.find((c) => typeof c !== 'string');
47
+ if (!first)
48
+ throw new Error('parseXml: no root element');
49
+ return first;
50
+ }
51
+ /** Child elements of `el` (by local name when given). */
52
+ export function childElements(el, local) {
53
+ return el.children.filter((c) => typeof c !== 'string' && (local === undefined || localName(c.name) === local));
54
+ }
55
+ /** Every descendant element with the local name, in document order. */
56
+ export function descendants(el, local) {
57
+ const out = [];
58
+ const walk = (e) => {
59
+ for (const c of e.children) {
60
+ if (typeof c === 'string')
61
+ continue;
62
+ if (localName(c.name) === local)
63
+ out.push(c);
64
+ walk(c);
65
+ }
66
+ };
67
+ walk(el);
68
+ return out;
69
+ }
70
+ /** The text content of `el`, XML whitespace collapsed (a no-break space
71
+ * is kept). */
72
+ export function textOf(el) {
73
+ const parts = [];
74
+ const walk = (e) => {
75
+ for (const c of e.children) {
76
+ if (typeof c === 'string')
77
+ parts.push(c);
78
+ else
79
+ walk(c);
80
+ }
81
+ };
82
+ walk(el);
83
+ return parts.join('').replace(/[ \t\r\n]+/g, ' ').replace(/^ | $/g, '');
84
+ }
85
+ //# sourceMappingURL=xmlRead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmlRead.js","sourceRoot":"","sources":["../../src/shared/xmlRead.ts"],"names":[],"mappings":"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"}