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,225 @@
1
+ import { describe, it, expect, beforeAll } from 'vitest';
2
+ import { renderToEpub, readEpub } from '../index';
3
+ import { buildFixedPublication } from './index';
4
+ import { fontUses, missingFaces, stackFamilies } from './fontUse';
5
+ import { nestOutline } from './outline';
6
+ import { LORA, PNG, sampleBook, layOutBook } from '../__tests__/sampleBook';
7
+ const MODIFIED = new Date(Date.UTC(2026, 9, 4));
8
+ describe('fontUse', () => {
9
+ it('reads families, weights and styles from style attributes', () => {
10
+ const html = '<div style="font:italic 700 12px &quot;Lora&quot;, &quot;Noto Serif SC&quot;, serif;color:red"></div><span style="font-family:Inter, sans-serif"></span>';
11
+ expect(fontUses(html)).toEqual([
12
+ { family: 'Lora', weight: 700, style: 'italic' },
13
+ { family: 'Noto Serif SC', weight: 700, style: 'italic' },
14
+ { family: 'Inter', weight: 400, style: 'normal' },
15
+ ]);
16
+ expect(stackFamilies(`"A, B", 'C', D E, monospace`)).toEqual(['A, B', 'C', 'D E']);
17
+ });
18
+ it('reports missing families once and missing faces of a present family', () => {
19
+ const fonts = [{ family: 'Lora', weight: '400 700', style: 'normal', bytes: LORA, format: 'ttf' }];
20
+ expect(missingFaces([
21
+ { family: 'Lora', weight: 700, style: 'normal' },
22
+ { family: 'Lora', weight: 400, style: 'italic' },
23
+ { family: 'Inter', weight: 400, style: 'normal' },
24
+ { family: 'Inter', weight: 700, style: 'normal' },
25
+ ], fonts)).toEqual([{ family: 'Lora', weight: 400, style: 'italic' }, { family: 'Inter' }]);
26
+ });
27
+ });
28
+ describe('nestOutline', () => {
29
+ it('nests by level without skipping', () => {
30
+ expect(nestOutline([
31
+ { title: 'Part I', level: 0, file: 'p1.xhtml' },
32
+ { title: 'One', level: 1, file: 'p2.xhtml', anchorId: 'h' },
33
+ { title: 'One.a', level: 3, file: 'p2.xhtml' },
34
+ { title: 'Two', level: 1, file: 'p3.xhtml' },
35
+ ], 'pages/')).toEqual([{
36
+ label: 'Part I', href: 'pages/p1.xhtml', children: [
37
+ { label: 'One', href: 'pages/p2.xhtml#h', children: [{ label: 'One.a', href: 'pages/p2.xhtml' }] },
38
+ { label: 'Two', href: 'pages/p3.xhtml' },
39
+ ],
40
+ }]);
41
+ });
42
+ });
43
+ describe('fixed layout from a real two-chapter book', () => {
44
+ let docs;
45
+ let book;
46
+ let bytes;
47
+ const warnings = [];
48
+ const progress = [];
49
+ const page = (i) => new TextDecoder().decode(book.files.get(book.spine[i].path));
50
+ beforeAll(async () => {
51
+ docs = sampleBook();
52
+ bytes = await renderToEpub(docs, {
53
+ layout: 'fixed',
54
+ metadata: { title: 'Sample book', creators: ['Ada Lovelace'], language: 'en-US', modified: MODIFIED },
55
+ fonts: [{ family: 'Lora', weight: 400, style: 'normal', bytes: LORA, format: 'ttf' }],
56
+ resourceBytes: (fileId) => fileId === 'f1.png' ? { bytes: PNG, mediaType: 'image/png' } : undefined,
57
+ onWarning: (w) => warnings.push(w),
58
+ onProgress: (p) => progress.push(p),
59
+ });
60
+ book = readEpub(bytes);
61
+ });
62
+ it('writes one pre-paginated page per printed page', () => {
63
+ const pages = docs.reduce((n, d) => n + d.pages.length, 0);
64
+ expect(docs.length).toBe(2);
65
+ expect(book.layout).toBe('fixed');
66
+ expect(book.spine.length).toBe(pages);
67
+ expect(book.spine[0].path).toBe('OEBPS/pages/page-0001.xhtml');
68
+ // 360×480 pt is 480×640 CSS px.
69
+ expect(book.viewport).toEqual({ width: 480, height: 640 });
70
+ expect(page(0)).toContain('<meta name="viewport" content="width=480, height=640"/>');
71
+ });
72
+ it('alternates spreads from a right-hand first page', () => {
73
+ expect(book.spine.slice(0, 3).map((s) => s.properties)).toEqual([['page-spread-right'], ['page-spread-left'], ['page-spread-right']]);
74
+ expect(book.pageProgression).toBe('ltr');
75
+ });
76
+ it('sets language, the page box and the shared stylesheet', () => {
77
+ const p = page(0);
78
+ expect(p).toContain('lang="en-US" xml:lang="en-US" dir="ltr"');
79
+ expect(p).toContain('<link rel="stylesheet" type="text/css" href="../styles/fixed.css"/>');
80
+ expect(p).toMatch(/<div class="pt-page" id="pt-p-0" dir="ltr" style="width:1500px;height:2000px;[^"]*transform:scale\(0\.32\);"/);
81
+ const css = new TextDecoder().decode(book.files.get('OEBPS/styles/fixed.css'));
82
+ expect(css).toContain('src: url("../fonts/lora-400-normal.ttf") format("truetype");');
83
+ expect(css).not.toMatch(/(^|[;\s])direction:/);
84
+ });
85
+ it('writes the picture as a file and links to it', () => {
86
+ expect(book.manifest.get('img-f1')).toEqual({ path: 'OEBPS/images/f1.png', mediaType: 'image/png', properties: [] });
87
+ const all = book.spine.map((_, i) => page(i)).join('');
88
+ expect(all).toContain('src="../images/f1.png" alt="A red square on white"');
89
+ expect(all).not.toContain('data:image');
90
+ });
91
+ it('rewrites cross-chapter links to the page files that hold their targets', () => {
92
+ const files = book.spine.map((s) => s.path.replace('OEBPS/pages/', ''));
93
+ const holder = (id) => files.find((_, i) => page(i).includes(`id="${id}"`));
94
+ const closing = holder('pt-a-closing');
95
+ const opening = holder('pt-a-opening');
96
+ expect(closing).toBeDefined();
97
+ expect(opening).toBe('page-0001.xhtml');
98
+ expect(page(0)).toContain(`href="${closing}#pt-a-closing"`);
99
+ const second = files.findIndex((f) => page(files.indexOf(f)).includes('#pt-a-opening"'));
100
+ expect(second).toBeGreaterThan(0);
101
+ // No link points at a fragment no page holds.
102
+ for (const [i] of files.entries()) {
103
+ for (const m of page(i).matchAll(/href="([^"#]*)#([^"]+)"/g)) {
104
+ const target = m[1] ? files.indexOf(m[1]) : i;
105
+ expect(page(target)).toContain(`id="${m[2]}"`);
106
+ }
107
+ }
108
+ });
109
+ it('builds the TOC from the headings and the page list from the labels', () => {
110
+ expect(book.toc.map((t) => t.label)).toEqual(['Opening chapter', 'Second chapter']);
111
+ expect(book.toc[0].children?.map((t) => t.label)).toEqual(['A section']);
112
+ expect(book.toc[0].href).toMatch(/^OEBPS\/pages\/page-0001\.xhtml#h-1-1$/);
113
+ expect(page(0)).toContain('id="h-1-1"');
114
+ expect(book.pageList.length).toBe(book.spine.length);
115
+ expect(book.pageList.slice(0, 2).map((p) => p.label)).toEqual(['1', '2']);
116
+ });
117
+ it('lists landmarks: the first page as cover and the body', () => {
118
+ const nav = new TextDecoder().decode(book.files.get('OEBPS/nav.xhtml'));
119
+ expect(nav).toContain('<a epub:type="cover" href="pages/page-0001.xhtml">Cover</a>');
120
+ expect(nav).toContain('<a epub:type="bodymatter" href="pages/page-0001.xhtml#h-1-1">');
121
+ });
122
+ it('declares fixed layout, spreads and accessibility in the OPF', () => {
123
+ const opf = new TextDecoder().decode(book.files.get('OEBPS/content.opf'));
124
+ expect(opf).toContain('<meta property="rendition:layout">pre-paginated</meta>');
125
+ expect(opf).toContain('<meta property="rendition:spread">landscape</meta>');
126
+ expect(opf).toContain('<meta property="schema:accessibilityFeature">printPageNumbers</meta>');
127
+ expect(opf).toContain('<meta property="schema:accessibilityFeature">alternativeText</meta>');
128
+ });
129
+ it('reports progress and fonts it could not embed', () => {
130
+ expect(progress.at(-1)).toEqual({ phase: 'package', done: 1, total: 1 });
131
+ expect(progress.some((p) => p.phase === 'documents' && p.done === p.total)).toBe(true);
132
+ const families = warnings.filter((w) => w.kind === 'missingFont').map((w) => w.family);
133
+ expect(families).not.toContain('Lora');
134
+ });
135
+ it('is deterministic', async () => {
136
+ const again = await renderToEpub(docs, {
137
+ layout: 'fixed',
138
+ metadata: { title: 'Sample book', creators: ['Ada Lovelace'], language: 'en-US', modified: MODIFIED },
139
+ fonts: [{ family: 'Lora', weight: 400, style: 'normal', bytes: LORA, format: 'ttf' }],
140
+ resourceBytes: (fileId) => fileId === 'f1.png' ? { bytes: PNG, mediaType: 'image/png' } : undefined,
141
+ });
142
+ expect(again).toEqual(bytes);
143
+ });
144
+ it('puts a given cover picture first, on a page of its own', async () => {
145
+ const pub = await buildFixedPublication(docs, {
146
+ layout: 'fixed',
147
+ metadata: { title: 'Sample book', language: 'en' },
148
+ cover: { bytes: PNG, mediaType: 'image/png' },
149
+ });
150
+ expect(pub.spine[0]).toEqual({ idref: 'cover', properties: ['rendition:page-spread-center'] });
151
+ expect(pub.items.find((i) => i.id === 'cover-image')?.properties).toEqual(['cover-image']);
152
+ expect(pub.landmarks[0]).toEqual({ type: 'cover', label: 'Cover', href: 'pages/cover.xhtml' });
153
+ expect(String(pub.items.find((i) => i.id === 'cover').data)).toContain('<img class="pt-cover" src="../images/cover.png" alt="Sample book"/>');
154
+ });
155
+ it('keeps a picture of the first page as the cover image only, the page itself the cover', async () => {
156
+ const pub = await buildFixedPublication(docs, {
157
+ layout: 'fixed',
158
+ metadata: { title: 'Sample book', language: 'en' },
159
+ cover: { bytes: PNG, mediaType: 'image/png', showsFirstPage: true },
160
+ });
161
+ expect(pub.spine[0].idref).not.toBe('cover');
162
+ expect(pub.items.some((i) => i.id === 'cover')).toBe(false);
163
+ expect(pub.items.find((i) => i.id === 'cover-image')?.properties).toEqual(['cover-image']);
164
+ expect(pub.landmarks[0]).toEqual({ type: 'cover', label: 'Cover', href: 'pages/page-0001.xhtml' });
165
+ });
166
+ it('links the rows of the printed contents to the pages they list', async () => {
167
+ const chapters = ['# Contents {toc="false"}\n\n:::toc\n:::', '# One\n\nText of the first chapter.', '# Two\n\nText of the second chapter.'];
168
+ const pub = await buildFixedPublication(layOutBook(chapters), { layout: 'fixed', metadata: { title: 'T', language: 'en' } });
169
+ const first = String(pub.items.find((i) => i.href === 'pages/page-0001.xhtml').data);
170
+ const links = [...first.matchAll(/<a class="pt-toc-link" href="([^"]*)" aria-label="([^"]*)"/g)].map((m) => [m[1], m[2]]);
171
+ expect(links.length).toBe(2);
172
+ expect(links[0][1]).toContain('One');
173
+ expect(links[1][1]).toContain('Two');
174
+ // Each goes to the page file its chapter opens on.
175
+ for (const [href] of links) {
176
+ const [file, id] = href.split('#');
177
+ const target = String(pub.items.find((i) => i.href === `pages/${file}`).data);
178
+ expect(target).toContain(`id="${id}"`);
179
+ }
180
+ });
181
+ it('runs right to left for a right-bound book', async () => {
182
+ const rtl = docs.map((d) => ({ ...d, binding: 'right' }));
183
+ const pub = await buildFixedPublication(rtl, { layout: 'fixed', metadata: { title: 'T', language: 'en' } });
184
+ expect(pub.pageProgression).toBe('rtl');
185
+ expect(pub.spine.slice(0, 2).map((s) => s.properties)).toEqual([['page-spread-left'], ['page-spread-right']]);
186
+ });
187
+ it('stops when aborted', async () => {
188
+ const ctrl = new AbortController();
189
+ ctrl.abort();
190
+ await expect(renderToEpub(docs, { layout: 'fixed', metadata: { title: 'T', language: 'en' }, signal: ctrl.signal })).rejects.toThrow();
191
+ });
192
+ });
193
+ describe('fixed layout of a right-to-left book', () => {
194
+ it('reads right to left, mirrored pages turned back by a head style', async () => {
195
+ const docs = layOutBook(['# الفصل الأول\n\n' + 'هذا نص عربي يملأ السطر ويستمر في الفقرة. '.repeat(20)], { locale: 'ar' });
196
+ expect(docs[0].binding).toBe('right');
197
+ const pub = await buildFixedPublication(docs, { layout: 'fixed', metadata: { title: 'كتاب', language: 'ar' } });
198
+ expect(pub.pageProgression).toBe('rtl');
199
+ expect(pub.spine[0].properties).toEqual(['page-spread-left']);
200
+ const first = String(pub.items.find((i) => i.id === 'page-0001').data);
201
+ expect(first).toContain('lang="ar" xml:lang="ar" dir="rtl"');
202
+ // The page box runs right to left, as the renderer's root does: a word
203
+ // box's comma or full stop stays at its left end.
204
+ expect(first).toMatch(/<div class="pt-page" id="pt-p-0" dir="rtl"/);
205
+ expect(first).toMatch(/<head>[\s\S]*<style>\.pt-flow-mirrored[\s\S]*<\/head>/);
206
+ expect(first).not.toMatch(/<body[\s\S]*<style>/);
207
+ expect(pub.toc[0].label).toBe('الفصل الأول');
208
+ });
209
+ it('paints the tatweels of justification but keeps them out of copied text (#402)', async () => {
210
+ const docs = layOutBook(['قال AAA إن الملك شهريار كان يحكم بلاد الهند والصين، وكتب المؤلف جمـيل. '.repeat(12)], {
211
+ locale: 'ar',
212
+ bodyText: { textAlign: 'justify' },
213
+ });
214
+ const segments = docs[0].pages[0].columns[0].blocks.flatMap((b) => b.lines.flatMap((l) => l.segments ?? []));
215
+ expect(segments.some((s) => s.kashida && s.kashida.length > 0)).toBe(true);
216
+ const pub = await buildFixedPublication(docs, { layout: 'fixed', metadata: { title: 'كتاب', language: 'ar' } });
217
+ const first = String(pub.items.find((i) => i.id === 'page-0001').data);
218
+ // Inserted tatweels sit in spans no selection reaches; the one the
219
+ // author typed (جمـيل) is plain text.
220
+ expect(first).toMatch(/<span style="-webkit-user-select:none;user-select:none;">ـ+<\/span>/);
221
+ expect(first).toContain('جمـيل.');
222
+ expect(first).toMatch(/<span dir="ltr" style="[^"]*">AAA<\/span>/);
223
+ });
224
+ });
225
+ //# sourceMappingURL=fixed.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixed.test.js","sourceRoot":"","sources":["../../src/fixed/fixed.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { EpubFontFile } from '../types';
2
+ /** A face as CSS names it. */
3
+ export interface FontUse {
4
+ family: string;
5
+ weight: number;
6
+ style: 'normal' | 'italic';
7
+ }
8
+ /** The families of a CSS font stack, unquoted, generic families left out. */
9
+ export declare function stackFamilies(stack: string): string[];
10
+ /** Every face the markup's `style` attributes ask for (`font:` shorthands
11
+ * give the weight and style; `font-family:` alone counts as regular). */
12
+ export declare function fontUses(html: string): FontUse[];
13
+ /** The faces among `uses` the embedded fonts do not cover, once each:
14
+ * a whole family missing is reported once by name; a family with faces
15
+ * but not this weight or style, by face (readers synthesise it). */
16
+ export declare function missingFaces(uses: Iterable<FontUse>, fonts: readonly EpubFontFile[]): {
17
+ family: string;
18
+ weight?: number;
19
+ style?: string;
20
+ }[];
21
+ //# sourceMappingURL=fontUse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontUse.d.ts","sourceRoot":"","sources":["../../src/fixed/fontUse.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,8BAA8B;AAC9B,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC5B;AASD,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUrD;AAED;0EAC0E;AAC1E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAwBhD;AAUD;;qEAEqE;AACrE,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,YAAY,EAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAY3I"}
@@ -0,0 +1,82 @@
1
+ // The faces a page's markup asks for, read from its CSS `font` shorthands
2
+ // and `font-family` declarations, so a family with no embedded face is
3
+ // reported instead of silently falling back in the reader.
4
+ import { decodeEntities } from '../shared/xml';
5
+ const GENERIC = new Set([
6
+ 'serif', 'sans-serif', 'monospace', 'cursive', 'fantasy', 'system-ui', 'math', 'emoji', 'fangsong',
7
+ 'ui-serif', 'ui-sans-serif', 'ui-monospace', 'ui-rounded', 'inherit', 'initial', 'unset', 'revert',
8
+ ]);
9
+ const WEIGHT_WORDS = { normal: 400, bold: 700, lighter: 300, bolder: 700 };
10
+ /** The families of a CSS font stack, unquoted, generic families left out. */
11
+ export function stackFamilies(stack) {
12
+ const out = [];
13
+ const re = /\s*(?:"((?:[^"\\]|\\.)*)"|'((?:[^'\\]|\\.)*)'|([^,]+))\s*(?:,|$)/g;
14
+ let m;
15
+ while ((m = re.exec(stack)) && m[0] !== '') {
16
+ const quoted = m[1] ?? m[2];
17
+ const family = (quoted ?? m[3] ?? '').replace(/\\(.)/g, '$1').trim();
18
+ if (family && (quoted !== undefined || !GENERIC.has(family.toLowerCase())))
19
+ out.push(family);
20
+ }
21
+ return out;
22
+ }
23
+ /** Every face the markup's `style` attributes ask for (`font:` shorthands
24
+ * give the weight and style; `font-family:` alone counts as regular). */
25
+ export function fontUses(html) {
26
+ const out = [];
27
+ for (const attr of html.matchAll(/\sstyle="([^"]*)"/g)) {
28
+ for (const decl of decodeEntities(attr[1]).split(';')) {
29
+ const colon = decl.indexOf(':');
30
+ if (colon < 0)
31
+ continue;
32
+ const prop = decl.slice(0, colon).trim().toLowerCase();
33
+ const value = decl.slice(colon + 1).trim();
34
+ if (prop === 'font-family') {
35
+ for (const family of stackFamilies(value))
36
+ out.push({ family, weight: 400, style: 'normal' });
37
+ continue;
38
+ }
39
+ if (prop !== 'font')
40
+ continue;
41
+ // [style] [variant] [weight] [stretch] size[/line-height] family-stack
42
+ const size = /(?:^|\s)[\d.]+(?:px|pt|em|rem|%)(?:\/\S+)?\s+/.exec(value);
43
+ if (!size)
44
+ continue;
45
+ const head = value.slice(0, size.index).toLowerCase().split(/\s+/).filter(Boolean);
46
+ const style = head.includes('italic') || head.includes('oblique') ? 'italic' : 'normal';
47
+ const weightToken = head.find((t) => /^\d{3}$/.test(t) || t in WEIGHT_WORDS);
48
+ const weight = weightToken === undefined ? 400 : WEIGHT_WORDS[weightToken] ?? Number(weightToken);
49
+ for (const family of stackFamilies(value.slice(size.index + size[0].length)))
50
+ out.push({ family, weight, style });
51
+ }
52
+ }
53
+ return out;
54
+ }
55
+ /** Whether a face list covers `use`: same family (case-insensitive), same
56
+ * style, and the weight in the face's range. */
57
+ function covers(face, use) {
58
+ if (face.family.toLowerCase() !== use.family.toLowerCase() || face.style !== use.style)
59
+ return false;
60
+ const [lo, hi] = String(face.weight).trim().split(/\s+/).map(Number);
61
+ return hi === undefined || Number.isNaN(hi) ? lo === use.weight : use.weight >= lo && use.weight <= hi;
62
+ }
63
+ /** The faces among `uses` the embedded fonts do not cover, once each:
64
+ * a whole family missing is reported once by name; a family with faces
65
+ * but not this weight or style, by face (readers synthesise it). */
66
+ export function missingFaces(uses, fonts) {
67
+ const out = [];
68
+ const seen = new Set();
69
+ for (const use of uses) {
70
+ const hasFamily = fonts.some((f) => f.family.toLowerCase() === use.family.toLowerCase());
71
+ const key = hasFamily ? `${use.family}\u0000${use.weight}\u0000${use.style}` : use.family.toLowerCase();
72
+ if (seen.has(key))
73
+ continue;
74
+ seen.add(key);
75
+ if (!hasFamily)
76
+ out.push({ family: use.family });
77
+ else if (!fonts.some((f) => covers(f, use)))
78
+ out.push({ family: use.family, weight: use.weight, style: use.style });
79
+ }
80
+ return out;
81
+ }
82
+ //# sourceMappingURL=fontUse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontUse.js","sourceRoot":"","sources":["../../src/fixed/fontUse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { EpubPublication, EpubSource, RenderToEpubOptions } from '../types';
2
+ export declare function buildFixedPublication(docs: EpubSource, options: RenderToEpubOptions): Promise<EpubPublication>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fixed/index.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAIV,eAAe,EACf,UAAU,EAEV,mBAAmB,EACpB,MAAM,UAAU,CAAC;AAiFlB,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6LpH"}