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.
- package/LICENSE +21 -0
- package/README.md +194 -0
- package/dist/__tests__/sampleBook.d.ts +17 -0
- package/dist/__tests__/sampleBook.d.ts.map +1 -0
- package/dist/__tests__/sampleBook.js +103 -0
- package/dist/__tests__/sampleBook.js.map +1 -0
- package/dist/epubcheck.test.d.ts +2 -0
- package/dist/epubcheck.test.d.ts.map +1 -0
- package/dist/epubcheck.test.js +69 -0
- package/dist/epubcheck.test.js.map +1 -0
- package/dist/fixed/fixed.test.d.ts +2 -0
- package/dist/fixed/fixed.test.d.ts.map +1 -0
- package/dist/fixed/fixed.test.js +225 -0
- package/dist/fixed/fixed.test.js.map +1 -0
- package/dist/fixed/fontUse.d.ts +21 -0
- package/dist/fixed/fontUse.d.ts.map +1 -0
- package/dist/fixed/fontUse.js +82 -0
- package/dist/fixed/fontUse.js.map +1 -0
- package/dist/fixed/index.d.ts +3 -0
- package/dist/fixed/index.d.ts.map +1 -0
- package/dist/fixed/index.js +254 -0
- package/dist/fixed/index.js.map +1 -0
- package/dist/fixed/outline.d.ts +40 -0
- package/dist/fixed/outline.d.ts.map +1 -0
- package/dist/fixed/outline.js +88 -0
- package/dist/fixed/outline.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/package/pack.d.ts +25 -0
- package/dist/package/pack.d.ts.map +1 -0
- package/dist/package/pack.js +253 -0
- package/dist/package/pack.js.map +1 -0
- package/dist/package/pack.test.d.ts +2 -0
- package/dist/package/pack.test.d.ts.map +1 -0
- package/dist/package/pack.test.js +164 -0
- package/dist/package/pack.test.js.map +1 -0
- package/dist/package/read.d.ts +15 -0
- package/dist/package/read.d.ts.map +1 -0
- package/dist/package/read.js +198 -0
- package/dist/package/read.js.map +1 -0
- package/dist/package/strings.d.ts +17 -0
- package/dist/package/strings.d.ts.map +1 -0
- package/dist/package/strings.js +24 -0
- package/dist/package/strings.js.map +1 -0
- package/dist/reflowable/__tests__/vdt.d.ts +13 -0
- package/dist/reflowable/__tests__/vdt.d.ts.map +1 -0
- package/dist/reflowable/__tests__/vdt.js +55 -0
- package/dist/reflowable/__tests__/vdt.js.map +1 -0
- package/dist/reflowable/__tests__/xml.d.ts +8 -0
- package/dist/reflowable/__tests__/xml.d.ts.map +1 -0
- package/dist/reflowable/__tests__/xml.js +107 -0
- package/dist/reflowable/__tests__/xml.js.map +1 -0
- package/dist/reflowable/css.d.ts +45 -0
- package/dist/reflowable/css.d.ts.map +1 -0
- package/dist/reflowable/css.js +491 -0
- package/dist/reflowable/css.js.map +1 -0
- package/dist/reflowable/index.d.ts +4 -0
- package/dist/reflowable/index.d.ts.map +1 -0
- package/dist/reflowable/index.js +257 -0
- package/dist/reflowable/index.js.map +1 -0
- package/dist/reflowable/inline.d.ts +56 -0
- package/dist/reflowable/inline.d.ts.map +1 -0
- package/dist/reflowable/inline.js +334 -0
- package/dist/reflowable/inline.js.map +1 -0
- package/dist/reflowable/model.d.ts +261 -0
- package/dist/reflowable/model.d.ts.map +1 -0
- package/dist/reflowable/model.js +6 -0
- package/dist/reflowable/model.js.map +1 -0
- package/dist/reflowable/reflowable.test.d.ts +2 -0
- package/dist/reflowable/reflowable.test.d.ts.map +1 -0
- package/dist/reflowable/reflowable.test.js +469 -0
- package/dist/reflowable/reflowable.test.js.map +1 -0
- package/dist/reflowable/rtl.test.d.ts +2 -0
- package/dist/reflowable/rtl.test.d.ts.map +1 -0
- package/dist/reflowable/rtl.test.js +217 -0
- package/dist/reflowable/rtl.test.js.map +1 -0
- package/dist/reflowable/walk.d.ts +42 -0
- package/dist/reflowable/walk.d.ts.map +1 -0
- package/dist/reflowable/walk.js +1096 -0
- package/dist/reflowable/walk.js.map +1 -0
- package/dist/reflowable/xhtml.d.ts +33 -0
- package/dist/reflowable/xhtml.d.ts.map +1 -0
- package/dist/reflowable/xhtml.js +472 -0
- package/dist/reflowable/xhtml.js.map +1 -0
- package/dist/shared/accessibility.d.ts +20 -0
- package/dist/shared/accessibility.d.ts.map +1 -0
- package/dist/shared/accessibility.js +30 -0
- package/dist/shared/accessibility.js.map +1 -0
- package/dist/shared/assets.d.ts +46 -0
- package/dist/shared/assets.d.ts.map +1 -0
- package/dist/shared/assets.js +143 -0
- package/dist/shared/assets.js.map +1 -0
- package/dist/shared/assets.test.d.ts +2 -0
- package/dist/shared/assets.test.d.ts.map +1 -0
- package/dist/shared/assets.test.js +106 -0
- package/dist/shared/assets.test.js.map +1 -0
- package/dist/shared/media.d.ts +11 -0
- package/dist/shared/media.d.ts.map +1 -0
- package/dist/shared/media.js +52 -0
- package/dist/shared/media.js.map +1 -0
- package/dist/shared/uuid.d.ts +7 -0
- package/dist/shared/uuid.d.ts.map +1 -0
- package/dist/shared/uuid.js +63 -0
- package/dist/shared/uuid.js.map +1 -0
- package/dist/shared/xml.d.ts +54 -0
- package/dist/shared/xml.d.ts.map +1 -0
- package/dist/shared/xml.js +214 -0
- package/dist/shared/xml.js.map +1 -0
- package/dist/shared/xml.test.d.ts +2 -0
- package/dist/shared/xml.test.d.ts.map +1 -0
- package/dist/shared/xml.test.js +71 -0
- package/dist/shared/xml.test.js.map +1 -0
- package/dist/shared/xmlRead.d.ts +19 -0
- package/dist/shared/xmlRead.d.ts.map +1 -0
- package/dist/shared/xmlRead.js +85 -0
- package/dist/shared/xmlRead.js.map +1 -0
- package/dist/types.d.ts +205 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +15 -0
- package/dist/types.js.map +1 -0
- package/dist/worker/client.d.ts +39 -0
- package/dist/worker/client.d.ts.map +1 -0
- package/dist/worker/client.js +184 -0
- package/dist/worker/client.js.map +1 -0
- package/dist/worker/epub.worker.d.ts +2 -0
- package/dist/worker/epub.worker.d.ts.map +1 -0
- package/dist/worker/epub.worker.js +7 -0
- package/dist/worker/epub.worker.js.map +1 -0
- package/dist/worker/protocol.d.ts +44 -0
- package/dist/worker/protocol.d.ts.map +1 -0
- package/dist/worker/protocol.js +6 -0
- package/dist/worker/protocol.js.map +1 -0
- package/dist/worker/serve.d.ts +11 -0
- package/dist/worker/serve.d.ts.map +1 -0
- package/dist/worker/serve.js +53 -0
- package/dist/worker/serve.js.map +1 -0
- package/dist/worker/worker.test.d.ts +2 -0
- package/dist/worker/worker.test.d.ts.map +1 -0
- package/dist/worker/worker.test.js +168 -0
- package/dist/worker/worker.test.js.map +1 -0
- 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 "Lora", "Noto Serif SC", 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 @@
|
|
|
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"}
|