postext 1.2.3 → 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__/exports.test.js +15 -0
- package/dist/__tests__/exports.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/package.json +6 -1
|
@@ -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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"}
|
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
// Pure helpers for bundle manifests: validation, locale resolution, file
|
|
2
|
+
// naming, and conversion of manifest entries into engine resources and
|
|
3
|
+
// custom fonts. No DOM or storage access.
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Validation
|
|
6
|
+
function isRecord(v) {
|
|
7
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
8
|
+
}
|
|
9
|
+
function isNonEmptyString(v) {
|
|
10
|
+
return typeof v === 'string' && v.length > 0;
|
|
11
|
+
}
|
|
12
|
+
function isOptionalString(v) {
|
|
13
|
+
return v === undefined || typeof v === 'string';
|
|
14
|
+
}
|
|
15
|
+
function isOptionalStringList(v) {
|
|
16
|
+
return v === undefined || (Array.isArray(v) && v.every(isNonEmptyString));
|
|
17
|
+
}
|
|
18
|
+
/** The optional showcase fields: wrong types reject the manifest rather
|
|
19
|
+
* than being silently dropped. */
|
|
20
|
+
export function hasValidShowcaseMeta(v) {
|
|
21
|
+
return isOptionalStringList(v.locales)
|
|
22
|
+
&& isOptionalString(v.thumbnail)
|
|
23
|
+
&& isOptionalString(v.license)
|
|
24
|
+
&& isOptionalString(v.credits)
|
|
25
|
+
&& isOptionalStringList(v.tags);
|
|
26
|
+
}
|
|
27
|
+
function isMarkdownField(v) {
|
|
28
|
+
if (isNonEmptyString(v))
|
|
29
|
+
return true;
|
|
30
|
+
if (!isRecord(v))
|
|
31
|
+
return false;
|
|
32
|
+
const values = Object.values(v);
|
|
33
|
+
return values.length > 0 && values.every(isNonEmptyString);
|
|
34
|
+
}
|
|
35
|
+
function isChapterSpec(v) {
|
|
36
|
+
return isRecord(v) && typeof v.title === 'string' && isNonEmptyString(v.file);
|
|
37
|
+
}
|
|
38
|
+
function isChapterList(v) {
|
|
39
|
+
return Array.isArray(v) && v.length > 0 && v.every(isChapterSpec);
|
|
40
|
+
}
|
|
41
|
+
function isChaptersField(v) {
|
|
42
|
+
if (isChapterList(v))
|
|
43
|
+
return true;
|
|
44
|
+
if (!isRecord(v))
|
|
45
|
+
return false;
|
|
46
|
+
const values = Object.values(v);
|
|
47
|
+
return values.length > 0 && values.every(isChapterList);
|
|
48
|
+
}
|
|
49
|
+
function isLocaleOverrides(v) {
|
|
50
|
+
if (!isRecord(v))
|
|
51
|
+
return false;
|
|
52
|
+
if (v.config !== undefined && !isRecord(v.config))
|
|
53
|
+
return false;
|
|
54
|
+
if (v.resources !== undefined) {
|
|
55
|
+
if (!Array.isArray(v.resources))
|
|
56
|
+
return false;
|
|
57
|
+
if (!v.resources.every((r) => isRecord(r) && isNonEmptyString(r.id)))
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
function isViewField(v) {
|
|
63
|
+
if (!isRecord(v))
|
|
64
|
+
return false;
|
|
65
|
+
return v.canvasScope === undefined || v.canvasScope === 'book' || v.canvasScope === 'chapter';
|
|
66
|
+
}
|
|
67
|
+
function isLocalizedField(v) {
|
|
68
|
+
return isRecord(v) && Object.values(v).every(isLocaleOverrides);
|
|
69
|
+
}
|
|
70
|
+
/** True when `data` is a valid `preset.json`, version 1 (`markdown`) or 2
|
|
71
|
+
* (`chapters`). */
|
|
72
|
+
export function isBundleManifest(data) {
|
|
73
|
+
if (!isRecord(data))
|
|
74
|
+
return false;
|
|
75
|
+
if (data.version !== 1 && data.version !== 2)
|
|
76
|
+
return false;
|
|
77
|
+
if (!isNonEmptyString(data.id) || !isNonEmptyString(data.name))
|
|
78
|
+
return false;
|
|
79
|
+
if (data.version === 1 && !isMarkdownField(data.markdown))
|
|
80
|
+
return false;
|
|
81
|
+
if (data.version === 2 && !isChaptersField(data.chapters))
|
|
82
|
+
return false;
|
|
83
|
+
if (!hasValidShowcaseMeta(data))
|
|
84
|
+
return false;
|
|
85
|
+
if (data.view !== undefined && !isViewField(data.view))
|
|
86
|
+
return false;
|
|
87
|
+
if (data.localized !== undefined && !isLocalizedField(data.localized))
|
|
88
|
+
return false;
|
|
89
|
+
if (data.config !== undefined && !isRecord(data.config))
|
|
90
|
+
return false;
|
|
91
|
+
if (data.resources !== undefined) {
|
|
92
|
+
if (!Array.isArray(data.resources))
|
|
93
|
+
return false;
|
|
94
|
+
if (!data.resources.every((r) => isRecord(r) && isNonEmptyString(r.id) && isNonEmptyString(r.typeId)))
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
if (data.fonts !== undefined) {
|
|
98
|
+
if (!Array.isArray(data.fonts))
|
|
99
|
+
return false;
|
|
100
|
+
const ok = data.fonts.every((f) => isRecord(f) && isNonEmptyString(f.name) && Array.isArray(f.variants)
|
|
101
|
+
&& f.variants.every((v) => isRecord(v) && typeof v.weight === 'number' && isNonEmptyString(v.file)));
|
|
102
|
+
if (!ok)
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
// Locale resolution
|
|
109
|
+
/** The key of a locale → value map that serves `locale`: exact tag, base
|
|
110
|
+
* language, the manifest's own locale, then the first key. */
|
|
111
|
+
function pickLocaleKey(keys, locale, manifestLocale) {
|
|
112
|
+
const wanted = locale.toLowerCase();
|
|
113
|
+
const byLower = new Map(keys.map((k) => [k.toLowerCase(), k]));
|
|
114
|
+
const exact = byLower.get(wanted);
|
|
115
|
+
if (exact)
|
|
116
|
+
return exact;
|
|
117
|
+
const base = wanted.split(/[-_]/)[0];
|
|
118
|
+
const baseKey = byLower.get(base);
|
|
119
|
+
if (baseKey)
|
|
120
|
+
return baseKey;
|
|
121
|
+
if (manifestLocale) {
|
|
122
|
+
const own = byLower.get(manifestLocale.toLowerCase())
|
|
123
|
+
?? byLower.get(manifestLocale.toLowerCase().split(/[-_]/)[0]);
|
|
124
|
+
if (own)
|
|
125
|
+
return own;
|
|
126
|
+
}
|
|
127
|
+
return keys[0];
|
|
128
|
+
}
|
|
129
|
+
function pickByLocale(map, locale, manifestLocale) {
|
|
130
|
+
return map[pickLocaleKey(Object.keys(map), locale, manifestLocale)];
|
|
131
|
+
}
|
|
132
|
+
/** Which markdown file a version 1 manifest serves for `locale`. */
|
|
133
|
+
export function pickMarkdownFile(manifest, locale) {
|
|
134
|
+
const md = manifest.markdown;
|
|
135
|
+
if (typeof md === 'string')
|
|
136
|
+
return md;
|
|
137
|
+
return pickByLocale(md, locale, manifest.locale);
|
|
138
|
+
}
|
|
139
|
+
/** The per-locale overrides that apply to `locale`, or null when the
|
|
140
|
+
* manifest has none. A bundle whose chapters are a locale map applies the
|
|
141
|
+
* overrides of the locale its chapters were picked from, so text and
|
|
142
|
+
* wording never disagree. */
|
|
143
|
+
export function pickLocaleOverrides(manifest, locale) {
|
|
144
|
+
const localized = manifest.localized;
|
|
145
|
+
if (!localized || Object.keys(localized).length === 0)
|
|
146
|
+
return null;
|
|
147
|
+
const chapterMap = manifest.version === 2 && !Array.isArray(manifest.chapters) ? manifest.chapters
|
|
148
|
+
: manifest.version === 1 && typeof manifest.markdown !== 'string' ? manifest.markdown
|
|
149
|
+
: null;
|
|
150
|
+
const key = chapterMap
|
|
151
|
+
? pickLocaleKey(Object.keys(chapterMap), locale, manifest.locale)
|
|
152
|
+
: pickLocaleKey(Object.keys(localized), locale, manifest.locale);
|
|
153
|
+
// Only that locale's own overrides (exact tag or base language) apply: a
|
|
154
|
+
// locale without any keeps the shared wording.
|
|
155
|
+
const wanted = key.toLowerCase();
|
|
156
|
+
const base = wanted.split(/[-_]/)[0];
|
|
157
|
+
const keys = Object.keys(localized);
|
|
158
|
+
const found = keys.find((k) => k.toLowerCase() === wanted)
|
|
159
|
+
?? keys.find((k) => k.toLowerCase().split(/[-_]/)[0] === base);
|
|
160
|
+
return found ? localized[found] : null;
|
|
161
|
+
}
|
|
162
|
+
/** The locale a bundle actually serves for `locale`: the key of its
|
|
163
|
+
* chapter map when the content is a locale map, else the manifest's own
|
|
164
|
+
* locale, else `locale` itself. */
|
|
165
|
+
export function resolveBundleLocale(manifest, locale) {
|
|
166
|
+
const map = manifest.version === 2
|
|
167
|
+
? (Array.isArray(manifest.chapters) ? null : manifest.chapters)
|
|
168
|
+
: (typeof manifest.markdown === 'string' ? null : manifest.markdown);
|
|
169
|
+
if (map)
|
|
170
|
+
return pickLocaleKey(Object.keys(map), locale, manifest.locale);
|
|
171
|
+
return manifest.locale ?? locale;
|
|
172
|
+
}
|
|
173
|
+
/** The chapter files to read for `locale`: a version 1 manifest yields a
|
|
174
|
+
* single untitled chapter. */
|
|
175
|
+
export function pickChapterSpecs(manifest, locale) {
|
|
176
|
+
if (manifest.version === 1)
|
|
177
|
+
return [{ title: '', file: pickMarkdownFile(manifest, locale) }];
|
|
178
|
+
const ch = manifest.chapters;
|
|
179
|
+
return Array.isArray(ch) ? ch : pickByLocale(ch, locale, manifest.locale);
|
|
180
|
+
}
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// File names
|
|
183
|
+
/** Lowercase, hyphen-separated slug: diacritics stripped, runs of anything
|
|
184
|
+
* else collapsed to one hyphen. '' for symbol-only input. */
|
|
185
|
+
export function slugify(input) {
|
|
186
|
+
return input
|
|
187
|
+
.normalize('NFKD')
|
|
188
|
+
.replace(/[̀-ͯ]/g, '')
|
|
189
|
+
.toLowerCase()
|
|
190
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
191
|
+
.replace(/^-+|-+$/g, '');
|
|
192
|
+
}
|
|
193
|
+
/** `candidate`, or `candidate-2`, `-3`, … when `taken` has it; a blank
|
|
194
|
+
* candidate falls back to `fallback`. */
|
|
195
|
+
export function uniqueSlug(candidate, taken, fallback = 'resource') {
|
|
196
|
+
const base = candidate || fallback;
|
|
197
|
+
if (!taken.has(base))
|
|
198
|
+
return base;
|
|
199
|
+
let n = 2;
|
|
200
|
+
while (taken.has(`${base}-${n}`))
|
|
201
|
+
n++;
|
|
202
|
+
return `${base}-${n}`;
|
|
203
|
+
}
|
|
204
|
+
/** `chapters/01-intro.md`: zero-padded ordinal (at least two digits) plus a
|
|
205
|
+
* slug of the title, unique against `taken` (which it extends). */
|
|
206
|
+
export function chapterFileName(index, title, taken, count = 1) {
|
|
207
|
+
const digits = Math.max(2, String(count).length);
|
|
208
|
+
const ordinal = String(index + 1).padStart(digits, '0');
|
|
209
|
+
const name = uniqueSlug(`${ordinal}-${slugify(title) || 'chapter'}`, taken, 'chapter');
|
|
210
|
+
taken.add(name);
|
|
211
|
+
return `chapters/${name}.md`;
|
|
212
|
+
}
|
|
213
|
+
export function fileExtension(file) {
|
|
214
|
+
const base = file.split('/').pop() ?? file;
|
|
215
|
+
const dot = base.lastIndexOf('.');
|
|
216
|
+
return dot === -1 ? '' : base.slice(dot + 1).toLowerCase();
|
|
217
|
+
}
|
|
218
|
+
export function fileBasename(file) {
|
|
219
|
+
return file.split('/').pop() ?? file;
|
|
220
|
+
}
|
|
221
|
+
const MIME_BY_EXT = {
|
|
222
|
+
svg: 'image/svg+xml',
|
|
223
|
+
png: 'image/png',
|
|
224
|
+
jpg: 'image/jpeg',
|
|
225
|
+
jpeg: 'image/jpeg',
|
|
226
|
+
webp: 'image/webp',
|
|
227
|
+
gif: 'image/gif',
|
|
228
|
+
pdf: 'application/pdf',
|
|
229
|
+
ttf: 'font/ttf',
|
|
230
|
+
otf: 'font/otf',
|
|
231
|
+
woff2: 'font/woff2',
|
|
232
|
+
md: 'text/markdown',
|
|
233
|
+
json: 'application/json',
|
|
234
|
+
};
|
|
235
|
+
/** Media type of a bundle file, from its extension. */
|
|
236
|
+
export function mimeForFile(file) {
|
|
237
|
+
return MIME_BY_EXT[fileExtension(file)] ?? 'application/octet-stream';
|
|
238
|
+
}
|
|
239
|
+
const BITMAP_FORMAT_BY_EXT = {
|
|
240
|
+
png: 'png',
|
|
241
|
+
jpg: 'jpeg',
|
|
242
|
+
jpeg: 'jpeg',
|
|
243
|
+
webp: 'webp',
|
|
244
|
+
gif: 'gif',
|
|
245
|
+
};
|
|
246
|
+
/** True when `file` is a bitmap the engine can place. */
|
|
247
|
+
export function isBitmapFile(file) {
|
|
248
|
+
return fileExtension(file) in BITMAP_FORMAT_BY_EXT;
|
|
249
|
+
}
|
|
250
|
+
export function isSvgFile(file) {
|
|
251
|
+
return fileExtension(file) === 'svg';
|
|
252
|
+
}
|
|
253
|
+
export function isPdfFile(file) {
|
|
254
|
+
return fileExtension(file) === 'pdf';
|
|
255
|
+
}
|
|
256
|
+
/** Font format of a file name, or null when it is not a font. */
|
|
257
|
+
export function fontFormatFromFile(file) {
|
|
258
|
+
switch (fileExtension(file)) {
|
|
259
|
+
case 'woff2': return 'woff2';
|
|
260
|
+
case 'woff': return 'woff';
|
|
261
|
+
case 'ttf': return 'ttf';
|
|
262
|
+
case 'otf': return 'otf';
|
|
263
|
+
default: return null;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
const EXT_BY_BITMAP_FORMAT = {
|
|
267
|
+
png: 'png',
|
|
268
|
+
jpeg: 'jpg',
|
|
269
|
+
webp: 'webp',
|
|
270
|
+
gif: 'gif',
|
|
271
|
+
};
|
|
272
|
+
const EXT_BY_IMAGE_MIME = {
|
|
273
|
+
'image/png': 'png',
|
|
274
|
+
'image/jpeg': 'jpg',
|
|
275
|
+
'image/webp': 'webp',
|
|
276
|
+
'image/gif': 'gif',
|
|
277
|
+
'image/svg+xml': 'svg',
|
|
278
|
+
};
|
|
279
|
+
/** File extension to write an image of this media type under, or null when
|
|
280
|
+
* it is not a picture a bundle takes (a cover thumbnail). */
|
|
281
|
+
export function extensionForImageMime(mime) {
|
|
282
|
+
return EXT_BY_IMAGE_MIME[mime.toLowerCase()] ?? null;
|
|
283
|
+
}
|
|
284
|
+
/** File extension to write a resource's bytes under, or null for resources
|
|
285
|
+
* without a file (tables). */
|
|
286
|
+
export function extensionForResource(r) {
|
|
287
|
+
if (r.kind === 'svg' && r.svg)
|
|
288
|
+
return 'svg';
|
|
289
|
+
if (r.kind === 'bitmap' && r.bitmap)
|
|
290
|
+
return EXT_BY_BITMAP_FORMAT[r.bitmap.format] ?? r.bitmap.format;
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
const identity = (file) => file;
|
|
294
|
+
/** Turn manifest font families into `config.customFonts` entries plus the
|
|
295
|
+
* list of files to read. `.woff` is not supported by the PDF backend and
|
|
296
|
+
* is skipped with a warning, as is any unrecognised extension. */
|
|
297
|
+
export function fontsToCustomFonts(fonts, fileIdFor = identity) {
|
|
298
|
+
const families = [];
|
|
299
|
+
const files = [];
|
|
300
|
+
const warnings = [];
|
|
301
|
+
for (const family of fonts) {
|
|
302
|
+
const variants = [];
|
|
303
|
+
for (const v of family.variants) {
|
|
304
|
+
const format = fontFormatFromFile(v.file);
|
|
305
|
+
if (!format || format === 'woff') {
|
|
306
|
+
warnings.push(`${family.name}: unsupported font file "${v.file}"`);
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
const fileId = fileIdFor(v.file);
|
|
310
|
+
const fileName = fileBasename(v.file);
|
|
311
|
+
const style = v.style === 'italic' ? 'italic' : 'normal';
|
|
312
|
+
variants.push({ weight: v.weight, style, fileId, format, fileName });
|
|
313
|
+
files.push({ fileId, fileName, format, file: v.file, family: family.name, weight: v.weight, style });
|
|
314
|
+
}
|
|
315
|
+
if (variants.length > 0) {
|
|
316
|
+
families.push({ name: family.name, variants, ...(family.redistributable === false ? { redistributable: false } : {}) });
|
|
317
|
+
}
|
|
318
|
+
else
|
|
319
|
+
warnings.push(`${family.name}: no usable variants`);
|
|
320
|
+
}
|
|
321
|
+
return { families, files, warnings };
|
|
322
|
+
}
|
|
323
|
+
/** Build an engine `Resource` from a manifest entry. `size` supplies the
|
|
324
|
+
* intrinsic dimensions when the spec omits them. Bitmap/SVG kind is
|
|
325
|
+
* derived from the file extension. */
|
|
326
|
+
export function resourceFromSpec(spec, size, fileIdFor = identity) {
|
|
327
|
+
const now = Date.now();
|
|
328
|
+
const { file, pdfFile, width, height, ...rest } = spec;
|
|
329
|
+
const base = { ...rest, createdAt: now, updatedAt: now };
|
|
330
|
+
if (!file)
|
|
331
|
+
return base;
|
|
332
|
+
const fileId = fileIdFor(file);
|
|
333
|
+
const w = width ?? size?.width;
|
|
334
|
+
const h = height ?? size?.height;
|
|
335
|
+
if (isSvgFile(file)) {
|
|
336
|
+
const master = pdfFile && isPdfFile(pdfFile) ? { pdfFileId: fileIdFor(pdfFile) } : {};
|
|
337
|
+
return {
|
|
338
|
+
...base,
|
|
339
|
+
kind: 'svg',
|
|
340
|
+
svg: w && h ? { fileId, width: w, height: h, ...master } : { fileId, ...master },
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
const format = BITMAP_FORMAT_BY_EXT[fileExtension(file)];
|
|
344
|
+
if (format) {
|
|
345
|
+
return {
|
|
346
|
+
...base,
|
|
347
|
+
kind: 'bitmap',
|
|
348
|
+
bitmap: { fileId, format, width: w ?? 0, height: h ?? 0 },
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
return base;
|
|
352
|
+
}
|
|
353
|
+
// ---------------------------------------------------------------------------
|
|
354
|
+
// Intrinsic sizes, without a DOM
|
|
355
|
+
function parseSvgLength(value) {
|
|
356
|
+
if (!value)
|
|
357
|
+
return null;
|
|
358
|
+
const trimmed = value.trim();
|
|
359
|
+
if (trimmed.endsWith('%'))
|
|
360
|
+
return null;
|
|
361
|
+
const num = parseFloat(trimmed);
|
|
362
|
+
if (!Number.isFinite(num) || num <= 0)
|
|
363
|
+
return null;
|
|
364
|
+
const unit = trimmed.replace(/^[\d.+-]+/, '').toLowerCase();
|
|
365
|
+
const factor = unit === 'pt' ? 96 / 72 : unit === 'pc' ? 16 : unit === 'in' ? 96 : unit === 'cm' ? 96 / 2.54 : unit === 'mm' ? 96 / 25.4 : 1;
|
|
366
|
+
return num * factor;
|
|
367
|
+
}
|
|
368
|
+
/** An SVG's intrinsic pixel size from its root element: explicit
|
|
369
|
+
* `width`/`height`, else the `viewBox` extent; undefined when neither
|
|
370
|
+
* gives one. Reads the markup textually, so it runs anywhere. */
|
|
371
|
+
export function svgSize(markup) {
|
|
372
|
+
const tag = /<svg\b([^>]*)>/i.exec(markup.replace(/<!--[\s\S]*?-->/g, ''));
|
|
373
|
+
if (!tag)
|
|
374
|
+
return undefined;
|
|
375
|
+
const attrs = {};
|
|
376
|
+
for (const m of tag[1].matchAll(/([\w:-]+)\s*=\s*("([^"]*)"|'([^']*)')/g)) {
|
|
377
|
+
attrs[m[1]] = m[3] ?? m[4] ?? '';
|
|
378
|
+
}
|
|
379
|
+
const w = parseSvgLength(attrs.width);
|
|
380
|
+
const h = parseSvgLength(attrs.height);
|
|
381
|
+
if (w && h)
|
|
382
|
+
return { width: w, height: h };
|
|
383
|
+
const viewBox = attrs.viewBox;
|
|
384
|
+
if (viewBox) {
|
|
385
|
+
const parts = viewBox.trim().split(/[\s,]+/).map(Number);
|
|
386
|
+
if (parts.length === 4 && parts.every(Number.isFinite) && parts[2] > 0 && parts[3] > 0) {
|
|
387
|
+
return { width: parts[2], height: parts[3] };
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return undefined;
|
|
391
|
+
}
|
|
392
|
+
/** A bitmap's pixel size read from its header (PNG, JPEG, GIF, WebP), or
|
|
393
|
+
* undefined when the header is not recognised. */
|
|
394
|
+
export function bitmapSize(bytes) {
|
|
395
|
+
const b = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
|
|
396
|
+
const view = new DataView(b.buffer, b.byteOffset, b.byteLength);
|
|
397
|
+
const ascii = (at, len) => String.fromCharCode(...b.subarray(at, at + len));
|
|
398
|
+
if (b.length >= 24 && b[0] === 0x89 && ascii(1, 3) === 'PNG') {
|
|
399
|
+
return { width: view.getUint32(16), height: view.getUint32(20) };
|
|
400
|
+
}
|
|
401
|
+
if (b.length >= 10 && ascii(0, 3) === 'GIF') {
|
|
402
|
+
return { width: view.getUint16(6, true), height: view.getUint16(8, true) };
|
|
403
|
+
}
|
|
404
|
+
if (b.length >= 30 && ascii(0, 4) === 'RIFF' && ascii(8, 4) === 'WEBP') {
|
|
405
|
+
const chunk = ascii(12, 4);
|
|
406
|
+
if (chunk === 'VP8X') {
|
|
407
|
+
const w = 1 + (b[24] | (b[25] << 8) | (b[26] << 16));
|
|
408
|
+
const h = 1 + (b[27] | (b[28] << 8) | (b[29] << 16));
|
|
409
|
+
return { width: w, height: h };
|
|
410
|
+
}
|
|
411
|
+
if (chunk === 'VP8 ')
|
|
412
|
+
return { width: view.getUint16(26, true) & 0x3fff, height: view.getUint16(28, true) & 0x3fff };
|
|
413
|
+
if (chunk === 'VP8L') {
|
|
414
|
+
const bits = view.getUint32(21, true);
|
|
415
|
+
return { width: (bits & 0x3fff) + 1, height: ((bits >> 14) & 0x3fff) + 1 };
|
|
416
|
+
}
|
|
417
|
+
return undefined;
|
|
418
|
+
}
|
|
419
|
+
if (b.length >= 4 && b[0] === 0xff && b[1] === 0xd8) {
|
|
420
|
+
let i = 2;
|
|
421
|
+
while (i + 9 < b.length) {
|
|
422
|
+
if (b[i] !== 0xff) {
|
|
423
|
+
i++;
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
const marker = b[i + 1];
|
|
427
|
+
if (marker === 0xff) {
|
|
428
|
+
i++;
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
// Start-of-frame markers carry the size (not DHT, JPG, DAC).
|
|
432
|
+
if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
|
|
433
|
+
return { width: view.getUint16(i + 7), height: view.getUint16(i + 5) };
|
|
434
|
+
}
|
|
435
|
+
if (marker === 0xd8 || (marker >= 0xd0 && marker <= 0xd7) || marker === 0x01) {
|
|
436
|
+
i += 2;
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
i += 2 + view.getUint16(i + 2);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return undefined;
|
|
443
|
+
}
|
|
444
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/bundle/manifest.ts"],"names":[],"mappings":"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"}
|