postext 1.2.2 → 1.3.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/README.md +18 -0
- package/dist/__tests__/bundle.test.d.ts +2 -0
- package/dist/__tests__/bundle.test.d.ts.map +1 -0
- package/dist/__tests__/bundle.test.js +210 -0
- package/dist/__tests__/bundle.test.js.map +1 -0
- package/dist/__tests__/columnBalancing.test.js +23 -0
- package/dist/__tests__/columnBalancing.test.js.map +1 -1
- package/dist/__tests__/exports.test.js +15 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/parts.test.js +14 -0
- package/dist/__tests__/parts.test.js.map +1 -1
- package/dist/__tests__/pipeline/scratchDeepSky.test.d.ts +3 -0
- package/dist/__tests__/pipeline/scratchDeepSky.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/scratchDeepSky.test.js +137 -0
- package/dist/__tests__/pipeline/scratchDeepSky.test.js.map +1 -0
- package/dist/__tests__/pipeline/spanBands.test.js +18 -0
- package/dist/__tests__/pipeline/spanBands.test.js.map +1 -1
- package/dist/bundle/adapters.d.ts +38 -0
- package/dist/bundle/adapters.d.ts.map +1 -0
- package/dist/bundle/adapters.js +142 -0
- package/dist/bundle/adapters.js.map +1 -0
- package/dist/bundle/api.d.ts +94 -0
- package/dist/bundle/api.d.ts.map +1 -0
- package/dist/bundle/api.js +91 -0
- package/dist/bundle/api.js.map +1 -0
- package/dist/bundle/book.d.ts +24 -0
- package/dist/bundle/book.d.ts.map +1 -0
- package/dist/bundle/book.js +55 -0
- package/dist/bundle/book.js.map +1 -0
- package/dist/bundle/codec.d.ts +105 -0
- package/dist/bundle/codec.d.ts.map +1 -0
- package/dist/bundle/codec.js +245 -0
- package/dist/bundle/codec.js.map +1 -0
- package/dist/bundle/index.d.ts +14 -0
- package/dist/bundle/index.d.ts.map +1 -0
- package/dist/bundle/index.js +10 -0
- package/dist/bundle/index.js.map +1 -0
- package/dist/bundle/manifest.d.ts +76 -0
- package/dist/bundle/manifest.d.ts.map +1 -0
- package/dist/bundle/manifest.js +444 -0
- package/dist/bundle/manifest.js.map +1 -0
- package/dist/bundle/types.d.ts +141 -0
- package/dist/bundle/types.d.ts.map +1 -0
- package/dist/bundle/types.js +6 -0
- package/dist/bundle/types.js.map +1 -0
- package/dist/bundle/zip.d.ts +23 -0
- package/dist/bundle/zip.d.ts.map +1 -0
- package/dist/bundle/zip.js +87 -0
- package/dist/bundle/zip.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +24 -1
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +6 -5
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/columnBalancing.d.ts.map +1 -1
- package/dist/pipeline/columnBalancing.js +14 -2
- package/dist/pipeline/columnBalancing.js.map +1 -1
- package/dist/pipeline/placeholders.d.ts +2 -1
- package/dist/pipeline/placeholders.d.ts.map +1 -1
- package/dist/pipeline/placeholders.js +11 -1
- package/dist/pipeline/placeholders.js.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// Bundle codec shared by every transport: a bundle is a directory-shaped set
|
|
2
|
+
// of files whether it is served over HTTP, read from a `.postext` zip or
|
|
3
|
+
// written out. `readBundle` turns manifest + files into chapters, config,
|
|
4
|
+
// resources and file payloads; `planBundle` / `resolveBundleFiles` do the
|
|
5
|
+
// reverse. Nothing here touches storage.
|
|
6
|
+
import { cloneDefaultColorPalette, defaultResourceTypes, stripConfigDefaults } from '../defaults';
|
|
7
|
+
import { bitmapSize, chapterFileName, extensionForImageMime, extensionForResource, fontsToCustomFonts, isBitmapFile, isBundleManifest, isPdfFile, isSvgFile, mimeForFile, pickChapterSpecs, pickLocaleOverrides, resolveBundleLocale, resourceFromSpec, slugify, svgSize, uniqueSlug, } from './manifest';
|
|
8
|
+
/** The configuration a bundle's own `config` is laid over: the default
|
|
9
|
+
* colour palette plus the built-in resource types localised to `locale`
|
|
10
|
+
* (what the Sandbox starts every document from). */
|
|
11
|
+
export function bundleBaseConfig(locale = 'en') {
|
|
12
|
+
return { colorPalette: cloneDefaultColorPalette(), resourceTypes: defaultResourceTypes(locale) };
|
|
13
|
+
}
|
|
14
|
+
const identityIds = { blob: (f) => f, font: (f) => f };
|
|
15
|
+
/** Read a manifest plus its files. Throws on an invalid manifest or a
|
|
16
|
+
* missing chapter, picture or font file. */
|
|
17
|
+
export async function readBundle(manifest, readFile, options = {}) {
|
|
18
|
+
if (!isBundleManifest(manifest))
|
|
19
|
+
throw new Error('Invalid bundle manifest (preset.json)');
|
|
20
|
+
const locale = options.locale ?? manifest.locale ?? 'en';
|
|
21
|
+
const ids = options.ids ?? identityIds;
|
|
22
|
+
const onWarning = options.onWarning;
|
|
23
|
+
const measureSvg = options.measureSvg ?? svgSize;
|
|
24
|
+
const measureBitmap = options.measureBitmap ?? ((bytes) => bitmapSize(bytes));
|
|
25
|
+
const decoder = new TextDecoder();
|
|
26
|
+
const chapters = [];
|
|
27
|
+
for (const spec of pickChapterSpecs(manifest, locale)) {
|
|
28
|
+
chapters.push({ title: spec.title, file: spec.file, markdown: decoder.decode(await readFile(spec.file)) });
|
|
29
|
+
}
|
|
30
|
+
// A bilingual bundle's per-locale wording: resource captions, notes and
|
|
31
|
+
// alt texts merged by id, config keys replaced wholesale.
|
|
32
|
+
const overrides = pickLocaleOverrides(manifest, locale);
|
|
33
|
+
const wordingById = new Map((overrides?.resources ?? []).map((r) => [r.id, r]));
|
|
34
|
+
const localizedSpecs = (manifest.resources ?? []).map((spec) => {
|
|
35
|
+
const wording = wordingById.get(spec.id);
|
|
36
|
+
if (!wording)
|
|
37
|
+
return spec;
|
|
38
|
+
const merged = { ...spec, ...wording, id: spec.id };
|
|
39
|
+
// Artwork swapped for this locale: the shared spec's intrinsic size
|
|
40
|
+
// describes the other file, so it is read from the bytes instead.
|
|
41
|
+
if (wording.file && wording.file !== spec.file) {
|
|
42
|
+
if (wording.width === undefined)
|
|
43
|
+
delete merged.width;
|
|
44
|
+
if (wording.height === undefined)
|
|
45
|
+
delete merged.height;
|
|
46
|
+
if (wording.pdfFile === undefined)
|
|
47
|
+
delete merged.pdfFile;
|
|
48
|
+
}
|
|
49
|
+
return merged;
|
|
50
|
+
});
|
|
51
|
+
const blobs = [];
|
|
52
|
+
const resources = await Promise.all(localizedSpecs.map(async (spec) => {
|
|
53
|
+
const file = spec.file;
|
|
54
|
+
if (!file)
|
|
55
|
+
return resourceFromSpec(spec, undefined, ids.blob);
|
|
56
|
+
const mime = mimeForFile(file);
|
|
57
|
+
const bytes = await readFile(file);
|
|
58
|
+
blobs.push({ fileId: ids.blob(file), file, bytes, mime });
|
|
59
|
+
// Optional vector print master next to an SVG: a missing or non-PDF
|
|
60
|
+
// file only costs the master, never the figure.
|
|
61
|
+
let resolved = spec;
|
|
62
|
+
const pdfFile = spec.pdfFile;
|
|
63
|
+
if (pdfFile && isSvgFile(file)) {
|
|
64
|
+
const master = isPdfFile(pdfFile) ? await readFile(pdfFile).catch(() => null) : null;
|
|
65
|
+
if (master) {
|
|
66
|
+
blobs.push({ fileId: ids.blob(pdfFile), file: pdfFile, bytes: master, mime: mimeForFile(pdfFile) });
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
onWarning?.(`${spec.id}: print master "${pdfFile}" ${isPdfFile(pdfFile) ? 'not found' : 'is not a .pdf'}, ignored`);
|
|
70
|
+
resolved = { ...spec, pdfFile: undefined };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
let size;
|
|
74
|
+
if (spec.width === undefined || spec.height === undefined) {
|
|
75
|
+
if (isSvgFile(file))
|
|
76
|
+
size = measureSvg(decoder.decode(bytes));
|
|
77
|
+
else if (isBitmapFile(file))
|
|
78
|
+
size = await measureBitmap(bytes, mime);
|
|
79
|
+
}
|
|
80
|
+
return resourceFromSpec(resolved, size, ids.blob);
|
|
81
|
+
}));
|
|
82
|
+
const fontSet = fontsToCustomFonts(manifest.fonts ?? [], ids.font);
|
|
83
|
+
for (const w of fontSet.warnings)
|
|
84
|
+
onWarning?.(w);
|
|
85
|
+
const fonts = await Promise.all(fontSet.files.map(async (f) => ({ ...f, bytes: await readFile(f.file) })));
|
|
86
|
+
const baseConfig = { ...(options.baseConfig ?? bundleBaseConfig(locale)), ...(manifest.config ?? {}), ...(overrides?.config ?? {}) };
|
|
87
|
+
const customFonts = [...(manifest.config?.customFonts ?? []), ...fontSet.families];
|
|
88
|
+
const config = customFonts.length > 0 ? { ...baseConfig, customFonts } : baseConfig;
|
|
89
|
+
return { manifest, locale: resolveBundleLocale(manifest, locale), chapters, config, resources, blobs, fonts };
|
|
90
|
+
}
|
|
91
|
+
/** A resource minus the fields that only make sense in storage. */
|
|
92
|
+
function omitStorageFields(r) {
|
|
93
|
+
const copy = { ...r };
|
|
94
|
+
delete copy.createdAt;
|
|
95
|
+
delete copy.updatedAt;
|
|
96
|
+
delete copy.bitmap;
|
|
97
|
+
delete copy.svg;
|
|
98
|
+
return copy;
|
|
99
|
+
}
|
|
100
|
+
/** Font formats a bundle may carry (`.woff` is rejected by the PDF backend
|
|
101
|
+
* and by `fontsToCustomFonts`). */
|
|
102
|
+
export const EXPORTABLE_FONT_FORMATS = ['ttf', 'otf', 'woff2'];
|
|
103
|
+
/** Decide file names and the manifest for a bundle. Pure; the bytes are
|
|
104
|
+
* resolved by `resolveBundleFiles`. Fonts are declared in `fonts[]`,
|
|
105
|
+
* never inside `config.customFonts` (their ids are local to the writer). */
|
|
106
|
+
export function planBundle(meta, content) {
|
|
107
|
+
const warnings = [];
|
|
108
|
+
const files = [];
|
|
109
|
+
const takenResourceNames = new Set();
|
|
110
|
+
const takenFontNames = new Set();
|
|
111
|
+
const resources = [];
|
|
112
|
+
for (const r of content.resources) {
|
|
113
|
+
const { bitmap, svg } = r;
|
|
114
|
+
const rest = omitStorageFields(r);
|
|
115
|
+
const ext = extensionForResource(r);
|
|
116
|
+
const fileId = bitmap?.fileId ?? svg?.fileId;
|
|
117
|
+
if (!ext || !fileId) {
|
|
118
|
+
resources.push(rest);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const name = uniqueSlug(slugify(r.id), takenResourceNames, 'resource');
|
|
122
|
+
takenResourceNames.add(name);
|
|
123
|
+
const path = `resources/${name}.${ext}`;
|
|
124
|
+
files.push({ path, fileId, kind: 'blob', owner: r.id });
|
|
125
|
+
let pdfFile;
|
|
126
|
+
if (svg?.pdfFileId) {
|
|
127
|
+
pdfFile = `resources/${name}.pdf`;
|
|
128
|
+
files.push({ path: pdfFile, fileId: svg.pdfFileId, kind: 'blob', owner: r.id });
|
|
129
|
+
}
|
|
130
|
+
const width = bitmap?.width ?? svg?.width;
|
|
131
|
+
const height = bitmap?.height ?? svg?.height;
|
|
132
|
+
resources.push({
|
|
133
|
+
...rest,
|
|
134
|
+
file: path,
|
|
135
|
+
...(pdfFile ? { pdfFile } : {}),
|
|
136
|
+
...(width ? { width } : {}),
|
|
137
|
+
...(height ? { height } : {}),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
const fonts = [];
|
|
141
|
+
for (const family of content.config.customFonts ?? []) {
|
|
142
|
+
// A family the document may set but not pass on: its files stay behind
|
|
143
|
+
// and no `fonts[]` entry names it, so the bundle opens with the
|
|
144
|
+
// reader's own fallback for that family.
|
|
145
|
+
if (family.redistributable === false) {
|
|
146
|
+
warnings.push(`${family.name}: font files left out of the export (the family is not redistributable)`);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const variants = [];
|
|
150
|
+
for (const v of family.variants) {
|
|
151
|
+
if (!EXPORTABLE_FONT_FORMATS.includes(v.format)) {
|
|
152
|
+
warnings.push(`${family.name}: variant ${v.weight} ${v.style} skipped (.${v.format} is not supported)`);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const base = v.fileName ? slugify(v.fileName.replace(/\.[^.]+$/, '')) : '';
|
|
156
|
+
const name = uniqueSlug(base || slugify(`${family.name}-${v.weight}-${v.style}`), takenFontNames, 'font');
|
|
157
|
+
takenFontNames.add(name);
|
|
158
|
+
const path = `fonts/${name}.${v.format}`;
|
|
159
|
+
files.push({ path, fileId: v.fileId, kind: 'font', owner: family.name });
|
|
160
|
+
variants.push({ weight: v.weight, style: v.style, file: path });
|
|
161
|
+
}
|
|
162
|
+
if (variants.length > 0)
|
|
163
|
+
fonts.push({ name: family.name, variants });
|
|
164
|
+
}
|
|
165
|
+
const thumbExt = content.thumbnail ? extensionForImageMime(content.thumbnail.mime) : null;
|
|
166
|
+
const thumbnailPath = content.thumbnail && thumbExt ? `thumbnail.${thumbExt}` : undefined;
|
|
167
|
+
if (content.thumbnail && thumbnailPath) {
|
|
168
|
+
files.push({ path: thumbnailPath, fileId: content.thumbnail.fileId, kind: 'blob', owner: 'thumbnail' });
|
|
169
|
+
}
|
|
170
|
+
const configWithoutFonts = { ...stripConfigDefaults(content.config) };
|
|
171
|
+
delete configWithoutFonts.customFonts;
|
|
172
|
+
const takenChapterNames = new Set();
|
|
173
|
+
const chapterSpecs = [];
|
|
174
|
+
const chapterFiles = [];
|
|
175
|
+
content.chapters.forEach((c, i) => {
|
|
176
|
+
const path = chapterFileName(i, c.title, takenChapterNames, content.chapters.length);
|
|
177
|
+
chapterSpecs.push({ title: c.title, file: path });
|
|
178
|
+
chapterFiles.push({ path, markdown: c.markdown });
|
|
179
|
+
});
|
|
180
|
+
const manifest = {
|
|
181
|
+
version: 2,
|
|
182
|
+
id: meta.id,
|
|
183
|
+
name: meta.name,
|
|
184
|
+
...(meta.description ? { description: meta.description } : {}),
|
|
185
|
+
...(meta.locale ? { locale: meta.locale } : {}),
|
|
186
|
+
...(thumbnailPath ? { thumbnail: thumbnailPath } : {}),
|
|
187
|
+
...(content.canvasScope === 'book' ? { view: { canvasScope: 'book' } } : {}),
|
|
188
|
+
chapters: chapterSpecs,
|
|
189
|
+
config: configWithoutFonts,
|
|
190
|
+
...(resources.length > 0 ? { resources } : {}),
|
|
191
|
+
...(fonts.length > 0 ? { fonts } : {}),
|
|
192
|
+
};
|
|
193
|
+
return { manifest, files, chapterFiles, warnings };
|
|
194
|
+
}
|
|
195
|
+
function toBytes(data) {
|
|
196
|
+
return data instanceof Uint8Array ? data : new Uint8Array(data);
|
|
197
|
+
}
|
|
198
|
+
/** Resolve a plan's bytes. A resource whose payload is gone is dropped from
|
|
199
|
+
* the manifest (a spec without a file would come back as a broken
|
|
200
|
+
* figure); a font variant whose file is gone is dropped likewise, and its
|
|
201
|
+
* family with it when nothing remains. */
|
|
202
|
+
export async function resolveBundleFiles(plan, sources) {
|
|
203
|
+
const warnings = [...plan.warnings];
|
|
204
|
+
const files = {};
|
|
205
|
+
const missingPaths = new Set();
|
|
206
|
+
await Promise.all(plan.files.map(async (f) => {
|
|
207
|
+
const bytes = f.kind === 'blob'
|
|
208
|
+
? await Promise.resolve(sources.readBlob(f.fileId)).catch(() => null)
|
|
209
|
+
: await Promise.resolve(sources.readFont(f.fileId)).catch(() => null);
|
|
210
|
+
if (!bytes) {
|
|
211
|
+
missingPaths.add(f.path);
|
|
212
|
+
warnings.push(`${f.owner}: missing file, skipped`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
files[f.path] = toBytes(bytes);
|
|
216
|
+
}));
|
|
217
|
+
let manifest = plan.manifest;
|
|
218
|
+
if (manifest.thumbnail && missingPaths.has(manifest.thumbnail)) {
|
|
219
|
+
manifest = { ...manifest };
|
|
220
|
+
delete manifest.thumbnail;
|
|
221
|
+
}
|
|
222
|
+
if (missingPaths.size > 0) {
|
|
223
|
+
const resources = manifest.resources
|
|
224
|
+
?.filter((r) => !r.file || !missingPaths.has(r.file))
|
|
225
|
+
.map((r) => (r.pdfFile && missingPaths.has(r.pdfFile) ? { ...r, pdfFile: undefined } : r));
|
|
226
|
+
const fonts = manifest.fonts
|
|
227
|
+
?.map((fam) => ({ ...fam, variants: fam.variants.filter((v) => !missingPaths.has(v.file)) }))
|
|
228
|
+
.filter((fam) => fam.variants.length > 0);
|
|
229
|
+
manifest = {
|
|
230
|
+
...manifest,
|
|
231
|
+
...(resources && resources.length > 0 ? { resources } : {}),
|
|
232
|
+
...(fonts && fonts.length > 0 ? { fonts } : {}),
|
|
233
|
+
};
|
|
234
|
+
if (!resources || resources.length === 0)
|
|
235
|
+
delete manifest.resources;
|
|
236
|
+
if (!fonts || fonts.length === 0)
|
|
237
|
+
delete manifest.fonts;
|
|
238
|
+
}
|
|
239
|
+
const enc = new TextEncoder();
|
|
240
|
+
files['preset.json'] = enc.encode(JSON.stringify(manifest, null, 2));
|
|
241
|
+
for (const c of plan.chapterFiles)
|
|
242
|
+
files[c.path] = enc.encode(c.markdown);
|
|
243
|
+
return { files, manifest, warnings, missing: [...missingPaths] };
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/bundle/codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { openBundle, createBundle, bundleFileMime } from './api';
|
|
2
|
+
export type { PostextBundle, OpenBundleOptions, CreateBundleInput, CreatedBundle, BundleFileData } from './api';
|
|
3
|
+
export { buildBundle } from './book';
|
|
4
|
+
export type { BuildBundleOptions } from './book';
|
|
5
|
+
export { loadBundleFonts, registerBundleImages, bundleImageUrl, bundleResourceBytes, bundleFontProvider, diagramInkHex } from './adapters';
|
|
6
|
+
export type { BundleSource, BundleFontProviderOptions } from './adapters';
|
|
7
|
+
export { readBundle, planBundle, resolveBundleFiles, bundleBaseConfig, EXPORTABLE_FONT_FORMATS } from './codec';
|
|
8
|
+
export type { ReadBundleOptions, ReadBundleResult, BundleMeta, BundleContent, PlannedFile, BundlePlan, BundleByteSources, ResolvedBundleFiles } from './codec';
|
|
9
|
+
export { openBundleZip, zipBundle, POSTEXT_EXTENSION, POSTEXT_MIME, MANIFEST_FILE } from './zip';
|
|
10
|
+
export type { OpenedBundleZip } from './zip';
|
|
11
|
+
export { isBundleManifest, hasValidShowcaseMeta, pickMarkdownFile, pickLocaleOverrides, resolveBundleLocale, pickChapterSpecs, chapterFileName, slugify, uniqueSlug, fileExtension, fileBasename, mimeForFile, isBitmapFile, isSvgFile, isPdfFile, fontFormatFromFile, extensionForImageMime, extensionForResource, fontsToCustomFonts, resourceFromSpec, svgSize, bitmapSize, } from './manifest';
|
|
12
|
+
export type { BundleFontFiles } from './manifest';
|
|
13
|
+
export type { BundleShowcaseMeta, BundleResourceSpec, BundleFontVariantSpec, BundleFontFamilySpec, BundleChapterSpec, BundleLocaleOverrides, BundleCanvasScope, BundleViewSpec, BundleManifestV1, BundleManifestV2, BundleManifest, BundleFileReader, BundleIdScheme, BundleImageSize, BundleChapter, BundleBlob, BundleFontFile, } from './types';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bundle/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAChH,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,YAAY,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3I,YAAY,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAG1E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAChH,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAC/J,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACjG,YAAY,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,OAAO,EACP,UAAU,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// `postext/bundle`: create and open `.postext` files — the zipped book
|
|
2
|
+
// bundles the Sandbox exports and imports — and feed them to the backends.
|
|
3
|
+
export { openBundle, createBundle, bundleFileMime } from './api';
|
|
4
|
+
export { buildBundle } from './book';
|
|
5
|
+
export { loadBundleFonts, registerBundleImages, bundleImageUrl, bundleResourceBytes, bundleFontProvider, diagramInkHex } from './adapters';
|
|
6
|
+
// Low-level codec, for hosts that store or serve bundles their own way.
|
|
7
|
+
export { readBundle, planBundle, resolveBundleFiles, bundleBaseConfig, EXPORTABLE_FONT_FORMATS } from './codec';
|
|
8
|
+
export { openBundleZip, zipBundle, POSTEXT_EXTENSION, POSTEXT_MIME, MANIFEST_FILE } from './zip';
|
|
9
|
+
export { isBundleManifest, hasValidShowcaseMeta, pickMarkdownFile, pickLocaleOverrides, resolveBundleLocale, pickChapterSpecs, chapterFileName, slugify, uniqueSlug, fileExtension, fileBasename, mimeForFile, isBitmapFile, isSvgFile, isPdfFile, fontFormatFromFile, extensionForImageMime, extensionForResource, fontsToCustomFonts, resourceFromSpec, svgSize, bitmapSize, } from './manifest';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bundle/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,2EAA2E;AAE3E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3I,wEAAwE;AACxE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEhH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEjG,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,OAAO,EACP,UAAU,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,UAAU,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { CustomFontFamily, CustomFontFormat, Resource } from '../types';
|
|
2
|
+
import type { BundleChapterSpec, BundleFontFamilySpec, BundleImageSize, BundleLocaleOverrides, BundleManifest, BundleManifestV1, BundleResourceSpec } from './types';
|
|
3
|
+
/** The optional showcase fields: wrong types reject the manifest rather
|
|
4
|
+
* than being silently dropped. */
|
|
5
|
+
export declare function hasValidShowcaseMeta(v: Record<string, unknown>): boolean;
|
|
6
|
+
/** True when `data` is a valid `preset.json`, version 1 (`markdown`) or 2
|
|
7
|
+
* (`chapters`). */
|
|
8
|
+
export declare function isBundleManifest(data: unknown): data is BundleManifest;
|
|
9
|
+
/** Which markdown file a version 1 manifest serves for `locale`. */
|
|
10
|
+
export declare function pickMarkdownFile(manifest: BundleManifestV1, locale: string): string;
|
|
11
|
+
/** The per-locale overrides that apply to `locale`, or null when the
|
|
12
|
+
* manifest has none. A bundle whose chapters are a locale map applies the
|
|
13
|
+
* overrides of the locale its chapters were picked from, so text and
|
|
14
|
+
* wording never disagree. */
|
|
15
|
+
export declare function pickLocaleOverrides(manifest: BundleManifest, locale: string): BundleLocaleOverrides | null;
|
|
16
|
+
/** The locale a bundle actually serves for `locale`: the key of its
|
|
17
|
+
* chapter map when the content is a locale map, else the manifest's own
|
|
18
|
+
* locale, else `locale` itself. */
|
|
19
|
+
export declare function resolveBundleLocale(manifest: BundleManifest, locale: string): string;
|
|
20
|
+
/** The chapter files to read for `locale`: a version 1 manifest yields a
|
|
21
|
+
* single untitled chapter. */
|
|
22
|
+
export declare function pickChapterSpecs(manifest: BundleManifest, locale: string): BundleChapterSpec[];
|
|
23
|
+
/** Lowercase, hyphen-separated slug: diacritics stripped, runs of anything
|
|
24
|
+
* else collapsed to one hyphen. '' for symbol-only input. */
|
|
25
|
+
export declare function slugify(input: string): string;
|
|
26
|
+
/** `candidate`, or `candidate-2`, `-3`, … when `taken` has it; a blank
|
|
27
|
+
* candidate falls back to `fallback`. */
|
|
28
|
+
export declare function uniqueSlug(candidate: string, taken: Set<string>, fallback?: string): string;
|
|
29
|
+
/** `chapters/01-intro.md`: zero-padded ordinal (at least two digits) plus a
|
|
30
|
+
* slug of the title, unique against `taken` (which it extends). */
|
|
31
|
+
export declare function chapterFileName(index: number, title: string, taken: Set<string>, count?: number): string;
|
|
32
|
+
export declare function fileExtension(file: string): string;
|
|
33
|
+
export declare function fileBasename(file: string): string;
|
|
34
|
+
/** Media type of a bundle file, from its extension. */
|
|
35
|
+
export declare function mimeForFile(file: string): string;
|
|
36
|
+
/** True when `file` is a bitmap the engine can place. */
|
|
37
|
+
export declare function isBitmapFile(file: string): boolean;
|
|
38
|
+
export declare function isSvgFile(file: string): boolean;
|
|
39
|
+
export declare function isPdfFile(file: string): boolean;
|
|
40
|
+
/** Font format of a file name, or null when it is not a font. */
|
|
41
|
+
export declare function fontFormatFromFile(file: string): CustomFontFormat | null;
|
|
42
|
+
/** File extension to write an image of this media type under, or null when
|
|
43
|
+
* it is not a picture a bundle takes (a cover thumbnail). */
|
|
44
|
+
export declare function extensionForImageMime(mime: string): string | null;
|
|
45
|
+
/** File extension to write a resource's bytes under, or null for resources
|
|
46
|
+
* without a file (tables). */
|
|
47
|
+
export declare function extensionForResource(r: Resource): string | null;
|
|
48
|
+
export interface BundleFontFiles {
|
|
49
|
+
families: CustomFontFamily[];
|
|
50
|
+
files: {
|
|
51
|
+
fileId: string;
|
|
52
|
+
fileName: string;
|
|
53
|
+
format: CustomFontFormat;
|
|
54
|
+
file: string;
|
|
55
|
+
family: string;
|
|
56
|
+
weight: number;
|
|
57
|
+
style: 'normal' | 'italic';
|
|
58
|
+
}[];
|
|
59
|
+
warnings: string[];
|
|
60
|
+
}
|
|
61
|
+
/** Turn manifest font families into `config.customFonts` entries plus the
|
|
62
|
+
* list of files to read. `.woff` is not supported by the PDF backend and
|
|
63
|
+
* is skipped with a warning, as is any unrecognised extension. */
|
|
64
|
+
export declare function fontsToCustomFonts(fonts: BundleFontFamilySpec[], fileIdFor?: (file: string) => string): BundleFontFiles;
|
|
65
|
+
/** Build an engine `Resource` from a manifest entry. `size` supplies the
|
|
66
|
+
* intrinsic dimensions when the spec omits them. Bitmap/SVG kind is
|
|
67
|
+
* derived from the file extension. */
|
|
68
|
+
export declare function resourceFromSpec(spec: BundleResourceSpec, size?: BundleImageSize, fileIdFor?: (file: string) => string): Resource;
|
|
69
|
+
/** An SVG's intrinsic pixel size from its root element: explicit
|
|
70
|
+
* `width`/`height`, else the `viewBox` extent; undefined when neither
|
|
71
|
+
* gives one. Reads the markup textually, so it runs anywhere. */
|
|
72
|
+
export declare function svgSize(markup: string): BundleImageSize | undefined;
|
|
73
|
+
/** A bitmap's pixel size read from its header (PNG, JPEG, GIF, WebP), or
|
|
74
|
+
* undefined when the header is not recognised. */
|
|
75
|
+
export declare function bitmapSize(bytes: ArrayBuffer | Uint8Array): BundleImageSize | undefined;
|
|
76
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/bundle/manifest.ts"],"names":[],"mappings":"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"}
|