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,469 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { initMathEngine } from 'postext';
3
+ import { PNG, baseConfig, layOut, layOutBook, pt } from './__tests__/vdt';
4
+ import { checkXml } from './__tests__/xml';
5
+ import { buildReflowablePublication } from '.';
6
+ import { appendLine, appendLines } from './inline';
7
+ const para = 'Body text that runs on for a while so the page fills and the paragraph wraps over several lines. ';
8
+ const resources = [
9
+ {
10
+ id: 'f1', typeId: 'figure', kind: 'bitmap', caption: 'A square.', note: 'Drawn for the test.', altText: 'A red square on white',
11
+ createdAt: 0, updatedAt: 0, bitmap: { fileId: 'f1.png', format: 'png', width: 400, height: 300 },
12
+ },
13
+ {
14
+ id: 't1', typeId: 'table', kind: 'table', caption: 'Sizes.', createdAt: 0, updatedAt: 0,
15
+ table: {
16
+ model: {
17
+ headerRowCount: 1,
18
+ rows: [
19
+ [{ content: 'Size' }, { content: 'Width' }, { content: 'Note' }],
20
+ [{ content: 'Small' }, { content: '10' }, { content: '**tight**' }],
21
+ [{ content: 'Both', colSpan: 2 }, { content: '', hiddenBy: { row: 2, col: 0 } }, { content: 'merged' }],
22
+ ],
23
+ },
24
+ },
25
+ },
26
+ ];
27
+ const options = (extra = {}) => ({
28
+ layout: 'reflowable',
29
+ metadata: { title: 'Sample book', language: 'en-US', modified: new Date(Date.UTC(2026, 9, 4)) },
30
+ resourceBytes: (fileId) => (fileId === 'f1.png' ? { bytes: PNG, mediaType: 'image/png' } : undefined),
31
+ ...extra,
32
+ });
33
+ async function render(docs, extra) {
34
+ const pub = await buildReflowablePublication(docs, options(extra));
35
+ const files = new Map();
36
+ for (const item of pub.items) {
37
+ if (item.mediaType === 'application/xhtml+xml')
38
+ files.set(item.href, item.data);
39
+ }
40
+ return { pub, files, all: [...files.values()].join('\n') };
41
+ }
42
+ /** Every content document is well formed, and every link inside the book
43
+ * lands on an id that exists. */
44
+ function expectSound(pub, files) {
45
+ const ids = new Map();
46
+ const checks = new Map([...files].map(([href, xml]) => [href, checkXml(xml)]));
47
+ for (const [href, check] of checks) {
48
+ expect(check.errors, href).toEqual([]);
49
+ ids.set(href, check.ids);
50
+ }
51
+ const resolve = (from, ref) => {
52
+ if (/^[a-z]+:/i.test(ref))
53
+ return undefined;
54
+ const [path, frag] = ref.split('#');
55
+ const dir = from.split('/').slice(0, -1);
56
+ for (const part of path ? path.split('/') : []) {
57
+ if (part === '..')
58
+ dir.pop();
59
+ else
60
+ dir.push(part);
61
+ }
62
+ const target = path ? dir.join('/') : from;
63
+ return [target, frag ?? ''];
64
+ };
65
+ for (const [href, check] of checks) {
66
+ for (const ref of check.refs) {
67
+ const r = resolve(href, ref);
68
+ if (!r || !r[1])
69
+ continue;
70
+ expect(ids.get(r[0]) ?? [], `${href} → ${ref}`).toContain(r[1]);
71
+ }
72
+ }
73
+ for (const p of [...pub.pageList, ...flatToc(pub.toc), ...pub.landmarks]) {
74
+ const [file, frag] = p.href.split('#');
75
+ expect(files.has(file), p.href).toBe(true);
76
+ if (frag)
77
+ expect(ids.get(file), p.href).toContain(frag);
78
+ }
79
+ }
80
+ function flatToc(points) {
81
+ return points.flatMap((p) => [p, ...flatToc(p.children ?? [])]);
82
+ }
83
+ const ctx = (lang = 'en') => ({ doc: 0, lang, basePx: 16, noteRef: () => true });
84
+ const seg = (text, extra = {}) => ({ kind: 'text', text, width: 0, ...extra });
85
+ const space = () => ({ kind: 'space', text: ' ', width: 0 });
86
+ const line = (segments, extra = {}) => ({
87
+ text: segments.map((s) => s.text).join(''),
88
+ bbox: { x: 0, y: 0, width: 0, height: 0 },
89
+ baseline: 0,
90
+ hyphenated: false,
91
+ segments,
92
+ ...extra,
93
+ });
94
+ const joined = (lines, lang = 'en') => {
95
+ const sink = { inl: [] };
96
+ for (const l of lines)
97
+ appendLine(sink, l, ctx(lang));
98
+ return sink.inl.map((i) => (i.t === 'text' ? i.text : '')).join('');
99
+ };
100
+ describe('joining lines', () => {
101
+ it('joins lines with a space and drops the hyphen a break added', () => {
102
+ expect(joined([
103
+ line([seg('of'), space(), seg('extraordinar-')], { hyphenated: true }),
104
+ line([seg('ily'), space(), seg('long')]),
105
+ line([seg('words.')]),
106
+ ])).toBe('of extraordinarily long words.');
107
+ });
108
+ it('keeps a hyphen the text carries and adds no space after it', () => {
109
+ expect(joined([line([seg('a'), space(), seg('meta-')], { hyphenated: true, hardHyphen: true }), line([seg('analysis')])])).toBe('a meta-analysis');
110
+ // A breaker that does not flag the hyphen: still no space.
111
+ expect(joined([line([seg('well-')]), line([seg('known')])])).toBe('well-known');
112
+ });
113
+ it('drops the hyphen a compound repeats on the next line', () => {
114
+ expect(joined([
115
+ line([seg('vencer-')], { hyphenated: true, hardHyphen: true }),
116
+ line([seg('-se'), space(), seg('así')], { repeatedHyphen: true }),
117
+ ])).toBe('vencer-se así');
118
+ });
119
+ it('gives a Catalan l·l its middle dot back', () => {
120
+ expect(joined([line([seg('una'), space(), seg('il-')], { hyphenated: true }), line([seg('lusió')])], 'ca')).toBe('una il·lusió');
121
+ expect(joined([line([seg('il-')], { hyphenated: true }), line([seg('lusion')])], 'en')).toBe('illusion');
122
+ });
123
+ it('joins Chinese lines with nothing between them', () => {
124
+ expect(joined([line([seg('天地玄黄')]), line([seg('宇宙洪荒')])])).toBe('天地玄黄宇宙洪荒');
125
+ expect(joined([line([seg('我用')]), line([seg('Python')])])).toBe('我用Python');
126
+ });
127
+ it('keeps a line break inside a paragraph (a line marked its last with more after it)', () => {
128
+ const sink = { inl: [] };
129
+ appendLines(sink, [line([seg('Roses'), space(), seg('red,')], { isLastLine: true }), line([seg('violets')], { isLastLine: true })], ctx());
130
+ expect(sink.inl.map((i) => (i.t === 'text' ? i.text : i.t === 'raw' ? i.xhtml : '')).join('')).toBe('Roses red,<br/>violets');
131
+ });
132
+ it('sets ruby without the <rp> brackets EPUB discourages', () => {
133
+ const sink = { inl: [] };
134
+ appendLine(sink, line([seg('漢', { ruby: { text: 'ㄏㄢˋ', position: 'right' } })]), ctx('zh-Hant'));
135
+ const xhtml = sink.inl.map((i) => (i.t === 'raw' ? i.xhtml : i.t === 'text' ? i.text : '')).join('');
136
+ expect(xhtml).toBe('<ruby class="pt-ruby-right">漢<rt>ㄏㄢˋ</rt></ruby>');
137
+ });
138
+ it('leaves out the kashidas justification stretched a line with', () => {
139
+ expect(joined([line([seg('كتـــاب')], { kashida: 3 })])).toBe('كتاب');
140
+ });
141
+ });
142
+ describe('buildReflowablePublication', () => {
143
+ it('writes one sound content document per chapter, with page starts and navigation', async () => {
144
+ const docs = layOutBook([
145
+ ['# Opening chapter {#intro}', '', `See :ref{id=f1} and :ref{id=t1}. ${para.repeat(40)}`, '', '### Skipped level', '', para.repeat(3)].join('\n'),
146
+ ['# Closing', '', 'Back to the [opening](#intro).'].join('\n'),
147
+ ], baseConfig, resources);
148
+ const { pub, files, all } = await render(docs);
149
+ expect([...files.keys()]).toEqual(['text/chapter-001.xhtml', 'text/chapter-002.xhtml']);
150
+ expect(pub.spine.map((s) => s.idref)).toEqual(['chapter-001', 'chapter-002']);
151
+ expectSound(pub, files);
152
+ const ch1 = files.get('text/chapter-001.xhtml');
153
+ // Headings never skip a level.
154
+ expect(ch1).toMatch(/<h1 id="a-intro">/);
155
+ expect(ch1).toMatch(/<h2 id="h-\d+">.*Skipped level<\/h2>/);
156
+ // One paragraph for the long one, its later pages starting inside it.
157
+ const long = /<p>See [\s\S]*?<\/p>/.exec(ch1)[0];
158
+ expect(long).toContain('epub:type="pagebreak"');
159
+ expect(long.match(/Body text/g)).toHaveLength(40);
160
+ // Every printed page is in the page list, in order, with its label.
161
+ const pages = docs.flatMap((d) => d.pages.map((p) => p.pageLabel));
162
+ expect(pub.pageList.map((p) => p.label)).toEqual(pages);
163
+ // The cross-reference into the other chapter.
164
+ expect(files.get('text/chapter-002.xhtml')).toContain('href="chapter-001.xhtml#a-intro"');
165
+ expect(pub.toc.map((p) => p.label)).toEqual(['Opening chapter', 'Closing']);
166
+ expect(pub.toc[0].children?.map((p) => p.label)).toEqual(['Skipped level']);
167
+ expect(pub.landmarks.find((l) => l.type === 'bodymatter')?.href).toBe('text/chapter-001.xhtml');
168
+ expect(pub.accessibility.features).toEqual(expect.arrayContaining(['structuralNavigation', 'tableOfContents', 'printPageNumbers', 'alternativeText']));
169
+ expect(all).toContain('lang="en-US" xml:lang="en-US"');
170
+ });
171
+ it('sets figures with alternative text and tables as tables', async () => {
172
+ const { pub, files, all } = await render([layOut(`See :ref{id=f1} and :ref{id=t1}.\n\n${para}`, baseConfig, resources)]);
173
+ expectSound(pub, files);
174
+ expect(all).toMatch(/<figure id="res-f1"><img src="\.\.\/images\/[\w-]+\.png" alt="A red square on white"\/>/);
175
+ // A figcaption is the first or last child: the note goes inside it, a
176
+ // space after the caption's last word.
177
+ expect(all).toMatch(/<figcaption>.*<span class="pt-label">Figure\s1\.<\/span>.*A square\. <span class="pt-note">Drawn for the test\.<\/span><\/figcaption><\/figure>/);
178
+ expect(all).toMatch(/<table id="res-t1">\n<caption[^>]*>.*Sizes\.<\/caption>/);
179
+ expect(all).toContain('<thead>\n<tr><th scope="col">Size</th><th scope="col">Width</th><th scope="col">Note</th></tr>\n</thead>');
180
+ expect(all).toContain('<td><strong>tight</strong></td>');
181
+ expect(all).toContain('<td colspan="2">Both</td><td>merged</td>');
182
+ expect(pub.items.some((i) => i.href.startsWith('images/') && i.mediaType === 'image/png')).toBe(true);
183
+ });
184
+ it('nests lists, groups quotations and boxes, links footnotes both ways', async () => {
185
+ const md = [
186
+ 'A claim.[^n] More text.',
187
+ '',
188
+ '[^n]: The *note* itself.',
189
+ '',
190
+ '- First item',
191
+ ' - Nested item',
192
+ ' 1. Deep one',
193
+ '- Second item',
194
+ '',
195
+ '> Quoted one.',
196
+ '',
197
+ '> Quoted two.',
198
+ '',
199
+ ':::callout{type="note"}',
200
+ 'Inside the box.',
201
+ '',
202
+ '- a listed point',
203
+ ':::',
204
+ ].join('\n');
205
+ const { pub, files, all } = await render([layOut(md)]);
206
+ expectSound(pub, files);
207
+ expect(all).toMatch(/<ul>\n<li><span class="pt-lbl">[^<]+<\/span> First item\n<ul>\n<li><span class="pt-lbl">[^<]+<\/span> Nested item\n<ol>\n<li><span class="pt-lbl">1\.<\/span> Deep one<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<\/li>\n<li><span class="pt-lbl">[^<]+<\/span> Second item<\/li>\n<\/ul>/);
208
+ expect(all).toMatch(/<blockquote>\n<p>Quoted one\.<\/p>\n<p>Quoted two\.<\/p>\n<\/blockquote>/);
209
+ expect(all).toMatch(/<aside class="pt-callout pt-callout-note">[\s\S]*Inside the box\.[\s\S]*a listed point[\s\S]*<\/aside>/);
210
+ expect(all).toContain('<a epub:type="noteref" role="doc-noteref" class="pt-noteref" href="#fn-n" id="fnref-n">');
211
+ expect(all).toMatch(/<aside epub:type="footnote" role="doc-footnote" id="fn-n" class="pt-footnote"><p>.*The <em>note<\/em> itself\. <a href="#fnref-n" role="doc-backlink"/);
212
+ // The note left the flow: its text is read once, in the notes.
213
+ expect(all.match(/itself/g)).toHaveLength(1);
214
+ });
215
+ it('sets formulas as labelled SVG, each with ids of its own', async () => {
216
+ await initMathEngine();
217
+ const md = ['Inline $\\vec{F}=m\\vec{a}$ and again $\\vec{F}=m\\vec{a}$.', '', '$$\\vec{F}=m\\vec{a}$$'].join('\n');
218
+ const { pub, files, all } = await render([layOut(md)]);
219
+ expectSound(pub, files);
220
+ expect(all).toMatch(/<span class="pt-math" role="math" aria-label="\\vec\{F\}=m\\vec\{a\}"><svg xmlns="http:\/\/www\.w3\.org\/2000\/svg"[^>]* width="[\d.]+em"/);
221
+ expect(all).toMatch(/<div class="pt-math-display" role="math" aria-label="\\vec\{F\}=m\\vec\{a\}"><svg /);
222
+ expect(all).not.toContain('data-mml-node');
223
+ expect(pub.accessibility.features).toContain('describedMath');
224
+ });
225
+ it('joins a paragraph of a box split across pages', async () => {
226
+ const config = { ...baseConfig, page: { ...baseConfig.page, height: pt(260) }, calloutStyles: [{ id: 'note', keepTogether: false }] };
227
+ const md = [para.repeat(3), '', ':::callout{type="note"}', para.repeat(10), '', 'Last words **in** **the** box.', ':::'].join('\n');
228
+ const doc = layOut(md, config);
229
+ expect(doc.pages.flatMap((p) => p.columns.flatMap((c) => c.blocks)).filter((b) => b.type === 'callout').length).toBeGreaterThan(1);
230
+ const { pub, files, all } = await render([doc]);
231
+ expectSound(pub, files);
232
+ const box = /<aside class="pt-callout pt-callout-note">[\s\S]*?<\/aside>/.exec(all)[0];
233
+ expect(box.match(/<p>/g)).toHaveLength(2);
234
+ expect(box).toContain('epub:type="pagebreak"');
235
+ expect(box).toContain('<strong>in the</strong>');
236
+ }, 30_000);
237
+ it('links the rows of a printed contents to their headings, without page numbers', async () => {
238
+ const md = ['# Contents', '', ':::toc', ':::', '', '# Alpha', '', para.repeat(10), '', '## Beta', '', para].join('\n');
239
+ const { pub, files, all } = await render([layOut(md)]);
240
+ expectSound(pub, files);
241
+ const nav = /<nav id="toc-\d+" class="pt-toc" role="doc-toc">[\s\S]*?<\/nav>/.exec(all)[0];
242
+ expect(nav).toMatch(/<a href="#h-\d+">Alpha<\/a>/);
243
+ // Beta is a level the contents do not list.
244
+ expect(nav).not.toContain('Beta');
245
+ expect(nav.replace(/<span class="pt-lbl">\d+<\/span>/g, '')).not.toMatch(/>\s*\d+\s*</);
246
+ expect(pub.landmarks.find((l) => l.type === 'toc')?.href).toMatch(/^text\/chapter-001\.xhtml#toc-\d+$/);
247
+ });
248
+ it('links index page numbers to the pages they name', async () => {
249
+ const md = ['The :index[heart] pumps blood.', '', para.repeat(12), '', 'The pulse:index{term="Pulse"} is taken.', '', '# Index', '', ':::index'].join('\n');
250
+ const { pub, files, all } = await render([layOut(md)]);
251
+ expectSound(pub, files);
252
+ expect(all).toMatch(/heart, <a class="pt-pageref" href="#page-\d+">\d+<\/a>/);
253
+ expect(pub.landmarks.find((l) => l.type === 'index')).toBeDefined();
254
+ expect(pub.accessibility.features).toContain('index');
255
+ });
256
+ it('sets each index entry as a paragraph classed by its depth', async () => {
257
+ const md = [
258
+ 'The :index{term="valves!mitral"}mitral and :index{term="valves!aortic"}aortic valves close. The node:index{term="AV node" see="atrioventricular node"} fires.',
259
+ '', para.repeat(6), '', '# Index', '', ':::index',
260
+ ].join('\n');
261
+ const { pub, files, all } = await render([layOut(md)]);
262
+ expectSound(pub, files);
263
+ // The head with no page of its own and its first sub-entry share a
264
+ // block in print: two paragraphs here, not one broken by <br/>.
265
+ expect(all).toMatch(/<p (?:id="b-\d+" )?class="pt-index-entry">valves<\/p>\n<p class="pt-index-entry pt-index-l1">aortic, <a class="pt-pageref"/);
266
+ expect(all).toMatch(/<p class="pt-index-entry pt-index-l1">mitral, <a class="pt-pageref"/);
267
+ // An entry with only a cross-reference is an index entry too.
268
+ expect(all).toMatch(/<p (?:id="b-\d+" )?class="pt-index-entry">AV node\. <em>See<\/em> atrioventricular node<\/p>/);
269
+ expect(all).not.toContain('<br/>');
270
+ const css = pub.items.find((i) => i.href === 'styles/book.css').data;
271
+ expect(css).toMatch(/p\.pt-index-entry \{[^}]*padding-inline-start: 2em;\n {2}text-indent: -2em;/);
272
+ expect(css).toContain('p.pt-index-l1 {\n margin-inline-start: 1em;');
273
+ });
274
+ it('gives a part its own opener document', async () => {
275
+ const docs = layOutBook([
276
+ ':::part{number="I" title="Foundations"}\n:::\n\n# One\n\nText of one.',
277
+ '# Two\n\nText of two.',
278
+ ]);
279
+ const { pub, files } = await render(docs);
280
+ expectSound(pub, files);
281
+ const names = [...files.keys()];
282
+ expect(names[0]).toBe('text/part-001.xhtml');
283
+ expect(files.get('text/part-001.xhtml')).toMatch(/<h1 id="part-\d+" class="pt-part-title">.*I<\/span> Foundations<\/h1>/);
284
+ expect(files.get('text/part-001.xhtml')).toContain('epub:type="part" role="doc-part"');
285
+ expect(pub.toc[0].label).toBe('I Foundations');
286
+ expect(pub.toc[0].children?.map((c) => c.label)).toEqual(['One', 'Two']);
287
+ });
288
+ it('reads a float in the document of the text that cites it', async () => {
289
+ const config = { ...baseConfig, parts: { page: false } };
290
+ const md = [
291
+ ':::part{number="I" title="First"}', ':::', '', `See :ref{id=f1}. ${para}`, '',
292
+ ':::part{number="II" title="Second"}', ':::', '', para.repeat(3),
293
+ ].join('\n');
294
+ const { pub, files } = await render([layOut(md, config, resources)]);
295
+ expectSound(pub, files);
296
+ expect([...files.keys()]).toEqual(['text/part-001.xhtml', 'text/chapter-001.xhtml', 'text/part-002.xhtml', 'text/chapter-001-2.xhtml']);
297
+ expect(files.get('text/chapter-001.xhtml')).toContain('<figure id="res-f1">');
298
+ });
299
+ it('writes a cover first in the spine', async () => {
300
+ const { pub, files } = await render([layOut('# Title\n\nText.')], { cover: { bytes: PNG, mediaType: 'image/png', alt: 'The cover' } });
301
+ expectSound(pub, files);
302
+ expect(pub.spine[0].idref).toBe('cover');
303
+ expect(files.get('text/cover.xhtml')).toContain('<img role="doc-cover" src="../images/cover.png" alt="The cover"/>');
304
+ expect(pub.items.find((i) => i.id === 'cover-image')?.properties).toEqual(['cover-image']);
305
+ expect(pub.landmarks[0]).toEqual({ type: 'cover', label: 'Cover', href: 'text/cover.xhtml' });
306
+ });
307
+ it('marks Arabic documents right to left', async () => {
308
+ const { files, pub } = await render([layOut('# عنوان\n\nنص عربي قصير.', { ...baseConfig, locale: 'ar' })], { metadata: { title: 'كتاب', language: 'ar' } });
309
+ expectSound(pub, files);
310
+ expect(files.get('text/chapter-001.xhtml')).toContain('lang="ar" xml:lang="ar" dir="rtl"');
311
+ });
312
+ it('sets vertical Chinese in a vertical stylesheet, pages right to left', async () => {
313
+ const config = { ...baseConfig, locale: 'zh-Hans', layout: { writingMode: 'vertical-rl' }, page: { ...baseConfig.page, binding: 'right' } };
314
+ const { pub, files } = await render([layOut('# 第一回\n\n天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。'.repeat(3), config)], { metadata: { title: '千字文', language: 'zh-Hans' } });
315
+ expectSound(pub, files);
316
+ const css = pub.items.find((i) => i.href === 'styles/book.css').data;
317
+ expect(css).toContain('writing-mode: vertical-rl');
318
+ expect(pub.pageProgression).toBe('rtl');
319
+ expect(files.get('text/chapter-001.xhtml')).toContain('天地玄黄,宇宙洪荒。');
320
+ });
321
+ it('derives the stylesheet from the configuration', async () => {
322
+ const config = {
323
+ ...baseConfig,
324
+ bodyText: { fontFamily: 'Lora', fontSize: pt(10), lineHeight: pt(14), textAlign: 'justify', firstLineIndent: { value: 1, unit: 'em' } },
325
+ };
326
+ const { pub } = await render([layOut('# Title\n\nText.', config)]);
327
+ const css = pub.items.find((i) => i.href === 'styles/book.css').data;
328
+ expect(css).toMatch(/body \{\n {2}font-family: "Lora", serif;\n {2}line-height: 1\.4;/);
329
+ expect(css).toContain('text-align: justify');
330
+ expect(css).toContain('hyphens: auto');
331
+ expect(css).toMatch(/p \{\n {2}margin: 0;\n {2}text-indent: 1em;/);
332
+ // No fixed widths: every size is relative.
333
+ // No fixed widths: every size is relative (but the 1px box of a
334
+ // heading kept for navigation alone).
335
+ expect(css).not.toMatch(/(?<![-\w])(width|font-size|margin|padding)[^;{]*:\s*(?!1px)[\d.]+(px|pt|mm|cm|in)\b/);
336
+ });
337
+ });
338
+ /** A document as an older engine wrote it: no paragraph style ids,
339
+ * no index levels. */
340
+ function withoutHints(doc) {
341
+ const strip = (b) => ({
342
+ ...b,
343
+ paragraphStyleId: undefined,
344
+ indexLevel: undefined,
345
+ lines: b.lines.map((l) => ({ ...l, indexLevel: undefined })),
346
+ });
347
+ return {
348
+ ...doc,
349
+ blocks: doc.blocks.map(strip),
350
+ pages: doc.pages.map((p) => ({
351
+ ...p,
352
+ columns: p.columns.map((c) => ({ ...c, blocks: c.blocks.map(strip) })),
353
+ ...(p.floats ? { floats: p.floats.map(strip) } : {}),
354
+ })),
355
+ };
356
+ }
357
+ describe('reflowable rendition: the engine names styles and index levels', () => {
358
+ // Two styles in the body face and size: the face alone cannot tell them.
359
+ const config = {
360
+ ...baseConfig,
361
+ paragraphStyles: [
362
+ { id: 'lead', marginTop: pt(6) },
363
+ { id: 'coda', marginBottom: pt(6) },
364
+ { id: 'poem', fontSize: pt(11) },
365
+ ],
366
+ };
367
+ const md = [
368
+ ':::paragraphs{style="lead"}', 'A lead paragraph.', ':::', '',
369
+ ':::paragraphs{style="coda"}', 'A closing paragraph.', ':::', '',
370
+ ':::callout{type="note"}', ':::paragraphs{style="lead"}', 'A lead inside a box.', ':::', ':::', '',
371
+ ':::verse{style="poem"}', 'One line of verse', ':::',
372
+ ].join('\n');
373
+ it('classes paragraphs, boxed ones and poems by the style they were set in', async () => {
374
+ const { pub, files, all } = await render([layOut(md, config)]);
375
+ expectSound(pub, files);
376
+ expect(all).toMatch(/<p class="ps-lead">(?:<span epub:type="pagebreak"[^>]*><\/span>)?A lead paragraph\.<\/p>/);
377
+ expect(all).toContain('<p class="ps-coda">A closing paragraph.</p>');
378
+ expect(all).toMatch(/<aside class="pt-callout pt-callout-note">\n<p class="ps-lead">A lead inside a box\.<\/p>/);
379
+ expect(all).toMatch(/<div class="pt-verse ps-poem">/);
380
+ const css = pub.items.find((i) => i.href === 'styles/book.css').data;
381
+ expect(css).toContain('p.ps-poem, div.pt-verse.ps-poem {');
382
+ });
383
+ it('tells an older document\'s styles from their faces', async () => {
384
+ const { all } = await render([withoutHints(layOut(md, config))]);
385
+ // Same face: no class to give.
386
+ expect(all).toMatch(/<p>(?:<span epub:type="pagebreak"[^>]*><\/span>)?A lead paragraph\.<\/p>/);
387
+ expect(all).toMatch(/<div class="pt-verse">/);
388
+ });
389
+ it('nests index entries by the level the engine gives, not by their indent', async () => {
390
+ const index = [
391
+ 'The :index{term="valves!mitral"}mitral and :index{term="valves!aortic"}aortic valves close.',
392
+ '', para.repeat(6), '', '# Index', '', ':::index',
393
+ ].join('\n');
394
+ // Sub-entries set flush: their indent says nothing.
395
+ const flush = { ...baseConfig, index: { indent: pt(0) } };
396
+ const { pub, files, all } = await render([layOut(index, flush)]);
397
+ expectSound(pub, files);
398
+ expect(all).toMatch(/class="pt-index-entry">valves<\/p>\n<p class="pt-index-entry pt-index-l1">aortic, <a class="pt-pageref"/);
399
+ expect(all).toMatch(/<p class="pt-index-entry pt-index-l1">mitral, /);
400
+ const old = await render([withoutHints(layOut(index, flush))]);
401
+ expect(old.all).toMatch(/<p class="pt-index-entry">mitral, /);
402
+ });
403
+ });
404
+ describe('reflowable rendition: pull quotes', () => {
405
+ const config = { ...baseConfig, calloutStyles: [{ id: 'pullquote', title: '“' }, { id: 'note' }] };
406
+ it('hides a pull quote that repeats the text from assistive technology', async () => {
407
+ const md = [
408
+ 'She put it plainly. “A person stood on the same jetty and looked at the same water,” she says.',
409
+ '', ':::callout{type="pullquote"}', '*A person stood on the same jetty … the same water.*', ':::', '',
410
+ ':::callout{type="pullquote"}', 'Words of its own, printed nowhere else.', ':::', '',
411
+ ':::callout{type="note"}', 'She put it plainly.', ':::',
412
+ ].join('\n');
413
+ const { pub, files, all } = await render([layOut(md, config)]);
414
+ expectSound(pub, files);
415
+ expect(all).toMatch(/<aside class="pt-callout pt-callout-pullquote pt-pullquote" epub:type="pullquote" role="doc-pullquote" aria-hidden="true">\n(?:<p class="pt-callout-title">“<\/p>\n)<p><em>A person stood/);
416
+ // A pull quote with words of its own is read.
417
+ expect(all).toMatch(/<aside class="pt-callout pt-callout-pullquote pt-pullquote" epub:type="pullquote">\n(?:<p class="pt-callout-title">“<\/p>\n)<p>Words of its own/);
418
+ // Too short to be told from a coincidence: a box like any other.
419
+ expect(all).toMatch(/<aside class="pt-callout pt-callout-note">\n<p>She put it plainly\.<\/p>/);
420
+ });
421
+ });
422
+ describe('reflowable rendition: stylesheets per chapter and part', () => {
423
+ const band = { hex: '#9bcdbf', model: 'hex', paletteId: 'band' };
424
+ const config = {
425
+ ...baseConfig,
426
+ colorPalette: [{ id: 'band', name: 'Band', value: { hex: '#9bcdbf', model: 'hex' } }],
427
+ bodyText: { boldColor: band },
428
+ headings: { levels: [{ level: 2, color: band }] },
429
+ };
430
+ const sheetOf = (pub, href) => pub.items.find((i) => i.href === href)?.data;
431
+ it('recolours the documents of a part with the palette it sets, in a stylesheet of their own', async () => {
432
+ const docs = layOutBook([
433
+ '# Zero\n\nSome **bold** words.\n\n## Before\n\nText.',
434
+ ':::part{number="II" title="Two" palette="band=#f6c297"}\n:::\n\n# One\n\nMore **bold** words.\n\n## After\n\nText.',
435
+ '# Two\n\nStill in part two.',
436
+ ], config);
437
+ const { pub, files } = await render(docs);
438
+ expectSound(pub, files);
439
+ expect(sheetOf(pub, 'styles/book.css')).toMatch(/strong, b \{[^}]*color: #9bcdbf;/);
440
+ const own = sheetOf(pub, 'styles/book-2.css');
441
+ expect(own).toMatch(/^@charset "UTF-8";\n/);
442
+ expect(own).toContain('strong, b {\n color: #f6c297;\n}');
443
+ expect(own).toContain('h2 {\n color: #f6c297;\n}');
444
+ // Only what the palette changes.
445
+ expect(own).not.toContain('font-size');
446
+ const links = (href) => [...files.get(href).matchAll(/<link rel="stylesheet" type="text\/css" href="([^"]+)"\/>/g)].map((m) => m[1]);
447
+ expect(links('text/chapter-001.xhtml')).toEqual(['../styles/book.css']);
448
+ // The part opener, the chapter after it and the next chapter of the part.
449
+ const recoloured = [...files.keys()].filter((href) => links(href).includes('../styles/book-2.css'));
450
+ expect(recoloured).toEqual(['text/part-001.xhtml', 'text/chapter-002.xhtml', 'text/chapter-003.xhtml']);
451
+ expect(pub.items.filter((i) => i.mediaType === 'text/css')).toHaveLength(2);
452
+ });
453
+ it('writes what a chapter configured otherwise changes, and drops what it leaves out', async () => {
454
+ const first = { ...baseConfig, headingStyles: [{ id: 'plate', fontSize: pt(20), italic: true }] };
455
+ const second = { ...baseConfig, headingStyles: [{ id: 'plate', fontSize: pt(14) }] };
456
+ const docs = [
457
+ layOut('# One {style="plate"}\n\nText.', first),
458
+ layOut('# Two {style="plate"}\n\nText.', second),
459
+ layOut('# Three {style="plate"}\n\nText.', first),
460
+ ];
461
+ const { pub, files } = await render(docs);
462
+ expectSound(pub, files);
463
+ const own = sheetOf(pub, 'styles/book-2.css');
464
+ expect(own).toMatch(/\.hs-plate \{\n {2}font-size: [\d.]+em;\n {2}font-style: unset;\n\}/);
465
+ expect(files.get('text/chapter-002.xhtml')).toContain('href="../styles/book-2.css"');
466
+ expect(files.get('text/chapter-003.xhtml')).not.toContain('book-2.css');
467
+ });
468
+ });
469
+ //# sourceMappingURL=reflowable.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflowable.test.js","sourceRoot":"","sources":["../../src/reflowable/reflowable.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rtl.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtl.test.d.ts","sourceRoot":"","sources":["../../src/reflowable/rtl.test.ts"],"names":[],"mappings":""}