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,254 @@
|
|
|
1
|
+
// Fixed-layout (pre-paginated) rendition: every printed page of the book
|
|
2
|
+
// becomes one XHTML content document that reproduces it with real text,
|
|
3
|
+
// from the same markup the HTML renderer gives the Sandbox.
|
|
4
|
+
//
|
|
5
|
+
// OEBPS/pages/page-0001.xhtml … one per page, viewport = page size
|
|
6
|
+
// OEBPS/pages/cover.xhtml when a cover picture is given
|
|
7
|
+
// OEBPS/styles/fixed.css @font-face + the text reset
|
|
8
|
+
// OEBPS/fonts/…, OEBPS/images/… shared assets (shared/assets.ts)
|
|
9
|
+
import { anchoredResourceIds, canonicalLocaleTag, directionOf, HTML_TEXT_RESET, renderToHtmlIndexed, } from 'postext';
|
|
10
|
+
import { defaultAccessibility } from '../shared/accessibility';
|
|
11
|
+
import { fontAssets, imageAssets, pageProgressionOf } from '../shared/assets';
|
|
12
|
+
import { decodeEntities, escapeAttr, escapeXml, htmlToXhtml, xhtmlDocument, xmlId } from '../shared/xml';
|
|
13
|
+
import { navStrings } from '../package/strings';
|
|
14
|
+
import { fontUses, missingFaces } from './fontUse';
|
|
15
|
+
import { contentsRows, headingTitle, nestOutline, pageHeadings, partTitle } from './outline';
|
|
16
|
+
/** Directory of the page documents, relative to the package document. */
|
|
17
|
+
const PAGES_DIR = 'pages/';
|
|
18
|
+
const STYLESHEET_HREF = 'styles/fixed.css';
|
|
19
|
+
/** CSS px per inch: the viewport is the page at its CSS size. */
|
|
20
|
+
const CSS_DPI = 96;
|
|
21
|
+
/** The engine's text reset without `direction`, which EPUB style sheets
|
|
22
|
+
* must not set: the page box takes a `dir` attribute instead, the
|
|
23
|
+
* document's direction (`pageDir`). */
|
|
24
|
+
const TEXT_RESET = HTML_TEXT_RESET.replace(/(?:^|;)direction:[^;]*;?/, ';').replace(/^;/, '');
|
|
25
|
+
/** The book language of a document: its configured locale, else the
|
|
26
|
+
* hyphenation one, else the book's. */
|
|
27
|
+
function docLanguage(doc, fallback) {
|
|
28
|
+
const c = doc.config;
|
|
29
|
+
return canonicalLocaleTag(c.locale) ?? canonicalLocaleTag(c.bodyText?.hyphenation?.tag) ?? fallback;
|
|
30
|
+
}
|
|
31
|
+
/** Whether any line of the documents sets a formula. */
|
|
32
|
+
function hasMath(docs) {
|
|
33
|
+
return docs.some((d) => d.pages.some((p) => [...p.columns.flatMap((c) => c.blocks), ...(p.floats ?? [])]
|
|
34
|
+
.some((b) => b.lines.some((l) => l.segments?.some((s) => s.mathRender !== undefined)))));
|
|
35
|
+
}
|
|
36
|
+
/** The trimmed page in CSS px: the viewport, and the scale and offset that
|
|
37
|
+
* map the renderer's page (VDT px at the page dpi, with the cut-line
|
|
38
|
+
* margin when the layout has one) onto it. */
|
|
39
|
+
function pageGeometry(doc, page) {
|
|
40
|
+
const offset = doc.trimOffset > 0 ? doc.trimOffset : 0;
|
|
41
|
+
const trimW = page.width - 2 * offset;
|
|
42
|
+
const trimH = page.height - 2 * offset;
|
|
43
|
+
const dpi = doc.config.page.dpi || CSS_DPI;
|
|
44
|
+
const width = Math.max(1, Math.round((trimW * CSS_DPI) / dpi));
|
|
45
|
+
const scale = width / trimW;
|
|
46
|
+
const height = Math.max(1, Math.round(trimH * scale));
|
|
47
|
+
return { width, height, scale, offset };
|
|
48
|
+
}
|
|
49
|
+
/** The direction of a page box: the one the renderer's root declares
|
|
50
|
+
* (#379). The word boxes of a right-to-left line resolve their neutrals —
|
|
51
|
+
* a comma, a bracket, a full stop — in it, so the page must not run left
|
|
52
|
+
* to right whatever its language. */
|
|
53
|
+
const pageDir = (doc) => (doc.config.direction === 'rtl' ? 'rtl' : 'ltr');
|
|
54
|
+
const num = (v) => String(Math.round(v * 10000) / 10000);
|
|
55
|
+
/** A link over a row of the printed contents to the page it lists (the
|
|
56
|
+
* row's text stays as the page prints it; the link is named after it). */
|
|
57
|
+
const rowLink = (href, label, b) => `<a class="pt-toc-link" href="${escapeAttr(href)}" aria-label="${escapeAttr(label)}" ` +
|
|
58
|
+
`style="position:absolute;left:${num(b.x)}px;top:${num(b.y)}px;width:${num(b.width)}px;height:${num(b.height)}px;z-index:1;"></a>`;
|
|
59
|
+
/** A zero-size anchor at a point of the page (an outline target). */
|
|
60
|
+
const anchorAt = (id, x, y) => `<span id="${escapeAttr(id)}" style="position:absolute;left:${num(x)}px;top:${num(y)}px;width:0;height:0;"></span>`;
|
|
61
|
+
export async function buildFixedPublication(docs, options) {
|
|
62
|
+
const { metadata, onWarning, onProgress, signal } = options;
|
|
63
|
+
const strings = navStrings(metadata.language);
|
|
64
|
+
const progression = pageProgressionOf(docs);
|
|
65
|
+
// Fonts and pictures first: the pages link to their files.
|
|
66
|
+
const fonts = fontAssets(options.fonts ?? []);
|
|
67
|
+
const images = await imageAssets(docs, options.resourceBytes, onWarning);
|
|
68
|
+
signal?.throwIfAborted();
|
|
69
|
+
const imageItems = images.items;
|
|
70
|
+
onProgress?.({ phase: 'resources', done: fonts.items.length + imageItems.length, total: fonts.items.length + imageItems.length });
|
|
71
|
+
// Pass 1: render every page and learn where each id lives, so a link can
|
|
72
|
+
// go to the page file that holds its target.
|
|
73
|
+
const totalPages = docs.reduce((n, d) => n + d.pages.length, 0);
|
|
74
|
+
const pad = Math.max(4, String(totalPages).length);
|
|
75
|
+
const refTargets = new Set(docs.flatMap((d) => [...anchoredResourceIds(d)]));
|
|
76
|
+
const imageUrl = Object.assign((fileId) => {
|
|
77
|
+
const href = images.hrefOf(fileId);
|
|
78
|
+
return href ? `../${href}` : undefined;
|
|
79
|
+
}, { singleInk: false });
|
|
80
|
+
const plans = [];
|
|
81
|
+
const fileOfId = new Map();
|
|
82
|
+
let bookIndex = 0;
|
|
83
|
+
for (const doc of docs) {
|
|
84
|
+
const lang = docLanguage(doc, metadata.language);
|
|
85
|
+
const rendered = renderToHtmlIndexed(doc, { resourceImageUrl: imageUrl, singleInk: false, refTargets: [...refTargets] });
|
|
86
|
+
for (const [i, page] of doc.pages.entries()) {
|
|
87
|
+
const file = `page-${String(bookIndex + 1).padStart(pad, '0')}.xhtml`;
|
|
88
|
+
let html = rendered.pages[i]?.innerHtml ?? '';
|
|
89
|
+
const outline = [];
|
|
90
|
+
const part = partTitle(page);
|
|
91
|
+
if (part)
|
|
92
|
+
outline.push({ title: part, level: 0, file });
|
|
93
|
+
// An anchor at each listed heading, the target of its TOC entry.
|
|
94
|
+
for (const [h, block] of pageHeadings(doc, page).entries()) {
|
|
95
|
+
const title = headingTitle(block);
|
|
96
|
+
if (!title)
|
|
97
|
+
continue;
|
|
98
|
+
const anchorId = `h-${bookIndex + 1}-${h + 1}`;
|
|
99
|
+
const wrapper = `<div class="pt-block" data-block-id="${escapeAttr(block.id)}"`;
|
|
100
|
+
const at = html.indexOf(wrapper);
|
|
101
|
+
if (at >= 0)
|
|
102
|
+
html = html.slice(0, at) + anchorAt(anchorId, block.bbox.x, block.bbox.y) + html.slice(at);
|
|
103
|
+
outline.push({ title, level: block.headingLevel ?? 1, file, ...(at >= 0 ? { anchorId } : {}) });
|
|
104
|
+
}
|
|
105
|
+
// The rows of the printed contents link to their pages, as in the PDF.
|
|
106
|
+
for (const row of contentsRows(page)) {
|
|
107
|
+
const wrapper = `<div class="pt-block" data-block-id="${escapeAttr(row.block.id)}" style="display:contents;">`;
|
|
108
|
+
const at = html.indexOf(wrapper);
|
|
109
|
+
if (at < 0 || !row.label)
|
|
110
|
+
continue;
|
|
111
|
+
const end = at + wrapper.length;
|
|
112
|
+
html = html.slice(0, end) + rowLink(`#pt-p-${row.pageIndex}`, row.label, row.block.bbox) + html.slice(end);
|
|
113
|
+
}
|
|
114
|
+
const pageId = `pt-p-${(doc.pageIndexOffset ?? 0) + page.index}`;
|
|
115
|
+
const ids = [pageId, ...[...html.matchAll(/\sid="([^"]*)"/g)].map((m) => xmlId(decodeEntities(m[1])))];
|
|
116
|
+
for (const id of ids)
|
|
117
|
+
if (!fileOfId.has(id))
|
|
118
|
+
fileOfId.set(id, file);
|
|
119
|
+
plans.push({ doc, page, bookIndex, file, html, ids, outline, lang });
|
|
120
|
+
bookIndex++;
|
|
121
|
+
}
|
|
122
|
+
signal?.throwIfAborted();
|
|
123
|
+
}
|
|
124
|
+
// Pass 2: the content documents.
|
|
125
|
+
const css = `@charset "UTF-8";\n` +
|
|
126
|
+
fonts.css +
|
|
127
|
+
`html, body { margin: 0; padding: 0; }\n` +
|
|
128
|
+
`body { position: relative; overflow: hidden; }\n` +
|
|
129
|
+
`.pt-page { position: absolute; left: 0; top: 0; overflow: hidden; transform-origin: 0 0; ${TEXT_RESET} }\n` +
|
|
130
|
+
`.pt-cover { display: block; width: 100%; height: 100%; object-fit: contain; }\n`;
|
|
131
|
+
const pageItems = [];
|
|
132
|
+
const spine = [];
|
|
133
|
+
const pageList = [];
|
|
134
|
+
const uses = [];
|
|
135
|
+
let describedImages = true;
|
|
136
|
+
for (const [n, plan] of plans.entries()) {
|
|
137
|
+
const { doc, page, file } = plan;
|
|
138
|
+
const geo = pageGeometry(doc, page);
|
|
139
|
+
const styles = [];
|
|
140
|
+
const ids = new Set([plan.ids[0]]);
|
|
141
|
+
const body = htmlToXhtml(plan.html, {
|
|
142
|
+
ids,
|
|
143
|
+
hoistStyle: (s) => styles.push(s),
|
|
144
|
+
rewriteHref: (href) => {
|
|
145
|
+
if (!href.startsWith('#'))
|
|
146
|
+
return href;
|
|
147
|
+
const target = fileOfId.get(href.slice(1));
|
|
148
|
+
if (!target)
|
|
149
|
+
return undefined;
|
|
150
|
+
return target === file ? href : `${target}${href}`;
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
for (const img of body.matchAll(/<img\s[^>]*>/g)) {
|
|
154
|
+
if (!/\srole="presentation"/.test(img[0]) && /\salt=""/.test(img[0]))
|
|
155
|
+
describedImages = false;
|
|
156
|
+
}
|
|
157
|
+
uses.push(...fontUses(plan.html));
|
|
158
|
+
const background = doc.config.page.backgroundColor?.hex;
|
|
159
|
+
const bg = background && background !== 'transparent' ? `background:${background};` : '';
|
|
160
|
+
const pageStyle = `width:${num(page.width)}px;height:${num(page.height)}px;${bg}` +
|
|
161
|
+
`transform:scale(${num(geo.scale)})${geo.offset ? ` translate(-${num(geo.offset)}px,-${num(geo.offset)}px)` : ''};`;
|
|
162
|
+
const label = page.pageLabel || String(plan.bookIndex + 1);
|
|
163
|
+
const xhtml = xhtmlDocument({
|
|
164
|
+
lang: plan.lang,
|
|
165
|
+
dir: directionOf(plan.lang),
|
|
166
|
+
title: `${metadata.title} (${label})`,
|
|
167
|
+
head: `<meta name="viewport" content="width=${geo.width}, height=${geo.height}"/>\n` +
|
|
168
|
+
`<link rel="stylesheet" type="text/css" href="../${STYLESHEET_HREF}"/>\n` +
|
|
169
|
+
(styles.length ? `<style>${escapeXml(styles.join('\n'))}</style>\n` : ''),
|
|
170
|
+
bodyAttrs: ` style="width:${geo.width}px;height:${geo.height}px;${bg}"`,
|
|
171
|
+
body: `<div class="pt-page" id="${escapeAttr(plan.ids[0])}" dir="${pageDir(doc)}" style="${pageStyle}">${body}</div>`,
|
|
172
|
+
});
|
|
173
|
+
const id = file.replace(/\.xhtml$/, '');
|
|
174
|
+
pageItems.push({ id, href: `${PAGES_DIR}${file}`, mediaType: 'application/xhtml+xml', data: xhtml });
|
|
175
|
+
// A left-bound book's first page is a recto on the right; a right-bound
|
|
176
|
+
// book's, on the left.
|
|
177
|
+
const recto = plan.bookIndex % 2 === 0;
|
|
178
|
+
const right = progression === 'rtl' ? !recto : recto;
|
|
179
|
+
spine.push({ idref: id, properties: [right ? 'page-spread-right' : 'page-spread-left'] });
|
|
180
|
+
pageList.push({ label, href: `${PAGES_DIR}${file}` });
|
|
181
|
+
onProgress?.({ phase: 'documents', done: n + 1, total: plans.length });
|
|
182
|
+
if (n % 16 === 15)
|
|
183
|
+
signal?.throwIfAborted();
|
|
184
|
+
}
|
|
185
|
+
for (const miss of missingFaces(uses, options.fonts ?? [])) {
|
|
186
|
+
onWarning?.({ kind: 'missingFont', ...miss });
|
|
187
|
+
}
|
|
188
|
+
// The cover: the given picture on a page of its own, else the first page
|
|
189
|
+
// (a picture of that page is kept as the cover image only).
|
|
190
|
+
const items = [];
|
|
191
|
+
const landmarks = [];
|
|
192
|
+
const first = plans[0];
|
|
193
|
+
const firstGeo = first ? pageGeometry(first.doc, first.page) : { width: 600, height: 800 };
|
|
194
|
+
const coverExt = options.cover && { 'image/jpeg': 'jpg', 'image/png': 'png', 'image/webp': 'webp', 'image/svg+xml': 'svg' }[options.cover.mediaType];
|
|
195
|
+
if (options.cover) {
|
|
196
|
+
items.push({ id: 'cover-image', href: `images/cover.${coverExt}`, mediaType: options.cover.mediaType, data: options.cover.bytes, properties: ['cover-image'] });
|
|
197
|
+
}
|
|
198
|
+
if (options.cover && !options.cover.showsFirstPage) {
|
|
199
|
+
const alt = options.cover.alt ?? metadata.title;
|
|
200
|
+
items.push({
|
|
201
|
+
id: 'cover',
|
|
202
|
+
href: `${PAGES_DIR}cover.xhtml`,
|
|
203
|
+
mediaType: 'application/xhtml+xml',
|
|
204
|
+
data: xhtmlDocument({
|
|
205
|
+
lang: metadata.language,
|
|
206
|
+
dir: directionOf(metadata.language),
|
|
207
|
+
title: metadata.title,
|
|
208
|
+
head: `<meta name="viewport" content="width=${firstGeo.width}, height=${firstGeo.height}"/>\n` +
|
|
209
|
+
`<link rel="stylesheet" type="text/css" href="../${STYLESHEET_HREF}"/>\n`,
|
|
210
|
+
bodyAttrs: ` epub:type="cover" style="width:${firstGeo.width}px;height:${firstGeo.height}px;"`,
|
|
211
|
+
body: `<img class="pt-cover" src="../images/cover.${coverExt}" alt="${escapeAttr(alt)}"/>`,
|
|
212
|
+
}),
|
|
213
|
+
});
|
|
214
|
+
spine.unshift({ idref: 'cover', properties: ['rendition:page-spread-center'] });
|
|
215
|
+
landmarks.push({ type: 'cover', label: strings.cover, href: `${PAGES_DIR}cover.xhtml` });
|
|
216
|
+
}
|
|
217
|
+
else if (first) {
|
|
218
|
+
landmarks.push({ type: 'cover', label: strings.cover, href: `${PAGES_DIR}${first.file}` });
|
|
219
|
+
}
|
|
220
|
+
const tocPage = plans.find((p) => [...p.page.columns.flatMap((c) => c.blocks)].some((b) => b.tocEntry !== undefined || b.tocPart !== undefined));
|
|
221
|
+
if (tocPage)
|
|
222
|
+
landmarks.push({ type: 'toc', label: strings.contents, href: `${PAGES_DIR}${tocPage.file}` });
|
|
223
|
+
const outline = plans.flatMap((p) => p.outline);
|
|
224
|
+
const bodyStart = outline.find((e) => e.level >= 1);
|
|
225
|
+
if (bodyStart || first) {
|
|
226
|
+
const target = bodyStart ? `${PAGES_DIR}${bodyStart.file}${bodyStart.anchorId ? `#${bodyStart.anchorId}` : ''}` : `${PAGES_DIR}${first.file}`;
|
|
227
|
+
landmarks.push({ type: 'bodymatter', label: strings.bodymatter, href: target });
|
|
228
|
+
}
|
|
229
|
+
items.push({ id: 'style', href: STYLESHEET_HREF, mediaType: 'text/css', data: css });
|
|
230
|
+
items.push(...fonts.items, ...imageItems, ...pageItems);
|
|
231
|
+
const toc = nestOutline(outline, PAGES_DIR);
|
|
232
|
+
const hasImages = imageItems.length > 0 || options.cover !== undefined;
|
|
233
|
+
return {
|
|
234
|
+
layout: 'fixed',
|
|
235
|
+
metadata,
|
|
236
|
+
items,
|
|
237
|
+
spine,
|
|
238
|
+
toc,
|
|
239
|
+
pageList,
|
|
240
|
+
landmarks,
|
|
241
|
+
pageProgression: progression,
|
|
242
|
+
fixed: { spread: 'landscape', orientation: 'auto', viewport: { width: firstGeo.width, height: firstGeo.height } },
|
|
243
|
+
accessibility: defaultAccessibility({
|
|
244
|
+
layout: 'fixed',
|
|
245
|
+
hasImages,
|
|
246
|
+
hasMath: hasMath(docs),
|
|
247
|
+
imagesDescribed: describedImages,
|
|
248
|
+
hasPageList: pageList.length > 0,
|
|
249
|
+
hasToc: toc.length > 0,
|
|
250
|
+
hasTables: docs.some((d) => d.blocks.some((b) => b.resourceBlock?.kind === 'table')),
|
|
251
|
+
}),
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fixed/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { VDTBlock, VDTDocument, VDTPage } from 'postext';
|
|
2
|
+
import type { EpubNavPoint } from '../types';
|
|
3
|
+
/** A heading's name: its number and its title as written in the source
|
|
4
|
+
* (a letter-case transform is how the page prints it, not its name), else
|
|
5
|
+
* as its printed lines read back. */
|
|
6
|
+
export declare function headingTitle(block: VDTBlock): string;
|
|
7
|
+
/** One entry of the outline before nesting. `level` 0 is a part. */
|
|
8
|
+
export interface OutlineEntry {
|
|
9
|
+
title: string;
|
|
10
|
+
level: number;
|
|
11
|
+
/** Where the entry points: a page file and, for a heading, the id of the
|
|
12
|
+
* anchor set at it. */
|
|
13
|
+
file: string;
|
|
14
|
+
anchorId?: string;
|
|
15
|
+
}
|
|
16
|
+
/** The headings of a page that go in the outline, in reading order. A
|
|
17
|
+
* level-1 heading whose style keeps it out of the running chapter and out
|
|
18
|
+
* of the contents (a plate set as a heading) is left out, as the PDF
|
|
19
|
+
* bookmarks leave it out. A heading continued from the previous column
|
|
20
|
+
* (`-cont-` id) is listed once, where it starts. */
|
|
21
|
+
export declare function pageHeadings(doc: VDTDocument, page: VDTPage): VDTBlock[];
|
|
22
|
+
/** The part a divider page opens, as an outline entry title. */
|
|
23
|
+
export declare function partTitle(page: VDTPage): string | undefined;
|
|
24
|
+
/** Nest flat entries by level, as navigation points with hrefs relative to
|
|
25
|
+
* the package document (`dir` is the pages' directory, `pages/`). Levels
|
|
26
|
+
* never skip in the result: a level-3 heading right under a level-1 one
|
|
27
|
+
* nests one step down. */
|
|
28
|
+
export declare function nestOutline(entries: readonly OutlineEntry[], dir: string): EpubNavPoint[];
|
|
29
|
+
/** A row of the printed contents and the book page it lists. */
|
|
30
|
+
export interface ContentsRow {
|
|
31
|
+
block: VDTBlock;
|
|
32
|
+
/** Book page index the row points at (`pt-p-<index>`). */
|
|
33
|
+
pageIndex: number;
|
|
34
|
+
/** What the row reads: a part's number and title, an entry's lines. */
|
|
35
|
+
label: string;
|
|
36
|
+
}
|
|
37
|
+
/** The rows of a page's printed contents that know their target page, as
|
|
38
|
+
* the PDF backend links them (blockRender.ts). */
|
|
39
|
+
export declare function contentsRows(page: VDTPage): ContentsRow[];
|
|
40
|
+
//# sourceMappingURL=outline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outline.d.ts","sourceRoot":"","sources":["../../src/fixed/outline.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAM7C;;sCAEsC;AACtC,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAOpD;AAED,oEAAoE;AACpE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd;4BACwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;qDAIqD;AACrD,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,CAWxE;AAED,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI3D;AAED;;;2BAG2B;AAC3B,wBAAgB,WAAW,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAYzF;AAED,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,QAAQ,CAAC;IAChB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;CACf;AAKD;mDACmD;AACnD,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,EAAE,CAczD"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// The book outline of a fixed layout: the headings of every page (and the
|
|
2
|
+
// part divider pages) as a nested table of contents, as the PDF backend
|
|
3
|
+
// derives its bookmarks (postext-pdf/src/pdf-backend/outlines.ts).
|
|
4
|
+
import { blockLinesText, plainTitleText } from 'postext';
|
|
5
|
+
/** Runs of white space as one space; the ideographic space (U+3000) of a
|
|
6
|
+
* Chinese title stays. */
|
|
7
|
+
const SPACES = /[^\S ]+/g;
|
|
8
|
+
/** A heading's name: its number and its title as written in the source
|
|
9
|
+
* (a letter-case transform is how the page prints it, not its name), else
|
|
10
|
+
* as its printed lines read back. */
|
|
11
|
+
export function headingTitle(block) {
|
|
12
|
+
const number = block.numberPrefix?.replace(SPACES, ' ').trim() ?? '';
|
|
13
|
+
const written = block.sourceTitle?.replace(SPACES, ' ').trim();
|
|
14
|
+
if (written)
|
|
15
|
+
return number ? `${number}${block.numberSeparator ?? ' '}${written}` : written;
|
|
16
|
+
const raw = blockLinesText(block, { plainTitleBreaks: true }).replace(SPACES, ' ').trim();
|
|
17
|
+
if (!raw)
|
|
18
|
+
return '';
|
|
19
|
+
return number && !raw.startsWith(number) ? `${number}${block.numberSeparator ?? ' '}${raw}` : raw;
|
|
20
|
+
}
|
|
21
|
+
/** The headings of a page that go in the outline, in reading order. A
|
|
22
|
+
* level-1 heading whose style keeps it out of the running chapter and out
|
|
23
|
+
* of the contents (a plate set as a heading) is left out, as the PDF
|
|
24
|
+
* bookmarks leave it out. A heading continued from the previous column
|
|
25
|
+
* (`-cont-` id) is listed once, where it starts. */
|
|
26
|
+
export function pageHeadings(doc, page) {
|
|
27
|
+
const unlisted = new Set((doc.config.headingStyles ?? []).filter((s) => !s.runningChapter && !s.toc).map((s) => s.id));
|
|
28
|
+
const out = [];
|
|
29
|
+
for (const col of page.columns) {
|
|
30
|
+
for (const block of col.blocks) {
|
|
31
|
+
if (block.type !== 'heading' || block.hidden || /-cont-\d+$/.test(block.id))
|
|
32
|
+
continue;
|
|
33
|
+
if (block.notRunningChapter && block.headingStyleId && unlisted.has(block.headingStyleId))
|
|
34
|
+
continue;
|
|
35
|
+
out.push(block);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
/** The part a divider page opens, as an outline entry title. */
|
|
41
|
+
export function partTitle(page) {
|
|
42
|
+
if (!page.partInfo)
|
|
43
|
+
return undefined;
|
|
44
|
+
const title = `${page.partInfo.number} ${plainTitleText(page.partInfo.title)}`.trim();
|
|
45
|
+
return title || undefined;
|
|
46
|
+
}
|
|
47
|
+
/** Nest flat entries by level, as navigation points with hrefs relative to
|
|
48
|
+
* the package document (`dir` is the pages' directory, `pages/`). Levels
|
|
49
|
+
* never skip in the result: a level-3 heading right under a level-1 one
|
|
50
|
+
* nests one step down. */
|
|
51
|
+
export function nestOutline(entries, dir) {
|
|
52
|
+
const roots = [];
|
|
53
|
+
const stack = [];
|
|
54
|
+
for (const e of entries) {
|
|
55
|
+
const point = { label: e.title, href: `${dir}${e.file}${e.anchorId ? `#${e.anchorId}` : ''}` };
|
|
56
|
+
while (stack.length > 0 && stack[stack.length - 1].level >= e.level)
|
|
57
|
+
stack.pop();
|
|
58
|
+
const parent = stack[stack.length - 1]?.point;
|
|
59
|
+
if (parent)
|
|
60
|
+
(parent.children ??= []).push(point);
|
|
61
|
+
else
|
|
62
|
+
roots.push(point);
|
|
63
|
+
stack.push({ level: e.level, point });
|
|
64
|
+
}
|
|
65
|
+
return roots;
|
|
66
|
+
}
|
|
67
|
+
/** Leader dots and runs of them between a title and its page number. */
|
|
68
|
+
const LEADERS = /(?:\s*[.·…․‥⋯]){3,}\s*/gu;
|
|
69
|
+
/** The rows of a page's printed contents that know their target page, as
|
|
70
|
+
* the PDF backend links them (blockRender.ts). */
|
|
71
|
+
export function contentsRows(page) {
|
|
72
|
+
const out = [];
|
|
73
|
+
for (const col of page.columns) {
|
|
74
|
+
for (const block of col.blocks) {
|
|
75
|
+
if (block.hidden)
|
|
76
|
+
continue;
|
|
77
|
+
const pageIndex = block.tocEntry?.pageIndex ?? block.tocPart?.pageIndex;
|
|
78
|
+
if (pageIndex === undefined)
|
|
79
|
+
continue;
|
|
80
|
+
const label = block.tocPart
|
|
81
|
+
? `${block.tocPart.number} ${plainTitleText(block.tocPart.title)}`
|
|
82
|
+
: `${block.numberPrefix ?? ''} ${block.lines.map((l) => l.text).join(' ')}`;
|
|
83
|
+
out.push({ block, pageIndex, label: label.replace(LEADERS, ' ').replace(SPACES, ' ').trim() });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return out;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=outline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outline.js","sourceRoot":"","sources":["../../src/fixed/outline.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EpubSource, RenderToEpubOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Write a laid-out book as an EPUB 3 file, entirely in memory (browser or
|
|
4
|
+
* Node). `docs` are the book's print documents, one per chapter in order —
|
|
5
|
+
* the chain `renderToPdf` takes. `layout: 'fixed'` reproduces every printed
|
|
6
|
+
* page (pre-paginated); `'reflowable'` writes semantic XHTML whose text
|
|
7
|
+
* reflows to the reader's screen.
|
|
8
|
+
*/
|
|
9
|
+
export declare function renderToEpub(docs: EpubSource, options: RenderToEpubOptions): Promise<Uint8Array>;
|
|
10
|
+
export { packEpub } from './package/pack';
|
|
11
|
+
export { readEpub, resolveHref, dirOf } from './package/read';
|
|
12
|
+
export { bookIdentifier } from './shared/assets';
|
|
13
|
+
export { uuidV5 } from './shared/uuid';
|
|
14
|
+
export { buildFixedPublication } from './fixed';
|
|
15
|
+
export { buildReflowablePublication } from './reflowable';
|
|
16
|
+
export type { EpubLayout, EpubMetadata, EpubFontFile, EpubResourceBytes, EpubCover, EpubProgress, EpubWarning, RenderToEpubOptions, EpubSource, EpubItem, EpubSpineEntry, EpubNavPoint, EpubPageTarget, EpubLandmark, EpubAccessibility, EpubPublication, ReadEpubResult, } from './types';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CAUtG;AAED,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,UAAU,EACV,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,cAAc,GACf,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { buildFixedPublication } from './fixed';
|
|
2
|
+
import { buildReflowablePublication } from './reflowable';
|
|
3
|
+
import { packEpub } from './package/pack';
|
|
4
|
+
/**
|
|
5
|
+
* Write a laid-out book as an EPUB 3 file, entirely in memory (browser or
|
|
6
|
+
* Node). `docs` are the book's print documents, one per chapter in order —
|
|
7
|
+
* the chain `renderToPdf` takes. `layout: 'fixed'` reproduces every printed
|
|
8
|
+
* page (pre-paginated); `'reflowable'` writes semantic XHTML whose text
|
|
9
|
+
* reflows to the reader's screen.
|
|
10
|
+
*/
|
|
11
|
+
export async function renderToEpub(docs, options) {
|
|
12
|
+
if (docs.length === 0)
|
|
13
|
+
throw new Error('renderToEpub: no documents');
|
|
14
|
+
const publication = options.layout === 'fixed'
|
|
15
|
+
? await buildFixedPublication(docs, options)
|
|
16
|
+
: await buildReflowablePublication(docs, options);
|
|
17
|
+
options.signal?.throwIfAborted();
|
|
18
|
+
options.onProgress?.({ phase: 'package', done: 0, total: 1 });
|
|
19
|
+
const bytes = packEpub(publication);
|
|
20
|
+
options.onProgress?.({ phase: 'package', done: 1, total: 1 });
|
|
21
|
+
return bytes;
|
|
22
|
+
}
|
|
23
|
+
export { packEpub } from './package/pack';
|
|
24
|
+
export { readEpub, resolveHref, dirOf } from './package/read';
|
|
25
|
+
export { bookIdentifier } from './shared/assets';
|
|
26
|
+
export { uuidV5 } from './shared/uuid';
|
|
27
|
+
export { buildFixedPublication } from './fixed';
|
|
28
|
+
export { buildReflowablePublication } from './reflowable';
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAgB,EAAE,OAA4B;IAC/E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,KAAK,OAAO;QAC5C,CAAC,CAAC,MAAM,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC;QAC5C,CAAC,CAAC,MAAM,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;IACjC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpC,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EpubPublication } from '../types';
|
|
2
|
+
/** Where the package document lives; every item href is relative to it. */
|
|
3
|
+
export declare const PACKAGE_DIR = "OEBPS/";
|
|
4
|
+
export declare const OPF_PATH = "OEBPS/content.opf";
|
|
5
|
+
export declare const NAV_HREF = "nav.xhtml";
|
|
6
|
+
export declare const NCX_HREF = "toc.ncx";
|
|
7
|
+
/** `dcterms:modified` form: `CCYY-MM-DDThh:mm:ssZ`. */
|
|
8
|
+
export declare function modifiedStamp(date: Date): string;
|
|
9
|
+
/** A `dc:date` in W3C date-time form, or undefined when it cannot be
|
|
10
|
+
* read as one (EPUBCheck warns on any other form). */
|
|
11
|
+
export declare function w3cDate(value: string | undefined): string | undefined;
|
|
12
|
+
/** The package document. */
|
|
13
|
+
export declare function buildOpf(pub: EpubPublication, identifier?: string): string;
|
|
14
|
+
/** The navigation document: `toc`, `landmarks` and `page-list` (the last
|
|
15
|
+
* two hidden, as reading systems present them in their own UI). */
|
|
16
|
+
export declare function buildNav(pub: EpubPublication): string;
|
|
17
|
+
/** The legacy NCX (EPUB 2 reading systems): the TOC as a nav map and the
|
|
18
|
+
* page list. */
|
|
19
|
+
export declare function buildNcx(pub: EpubPublication, identifier?: string): string;
|
|
20
|
+
/** Write a publication as an EPUB 3 file: `mimetype` first and stored,
|
|
21
|
+
* `META-INF/container.xml`, `OEBPS/content.opf`, `OEBPS/nav.xhtml`,
|
|
22
|
+
* `OEBPS/toc.ncx` and every item. Deterministic for a given input (pass
|
|
23
|
+
* `metadata.modified` for identical bytes across runs). */
|
|
24
|
+
export declare function packEpub(publication: EpubPublication): Uint8Array;
|
|
25
|
+
//# sourceMappingURL=pack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/package/pack.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAA0B,eAAe,EAAE,MAAM,UAAU,CAAC;AAKxE,2EAA2E;AAC3E,eAAO,MAAM,WAAW,WAAW,CAAC;AACpC,eAAO,MAAM,QAAQ,sBAA8B,CAAC;AACpD,eAAO,MAAM,QAAQ,cAAc,CAAC;AACpC,eAAO,MAAM,QAAQ,YAAY,CAAC;AAoBlC,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEhD;AAED;uDACuD;AACvD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAMrE;AAiBD,4BAA4B;AAC5B,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,UAAU,SAA+B,GAAG,MAAM,CAmEhG;AAsBD;oEACoE;AACpE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAsBrD;AAED;iBACiB;AACjB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,UAAU,SAA+B,GAAG,MAAM,CAgDhG;AAED;;;4DAG4D;AAC5D,wBAAgB,QAAQ,CAAC,WAAW,EAAE,eAAe,GAAG,UAAU,CA0BjE"}
|