@nowline/export 0.0.0-dev.20260603150914.g70caedb → 0.0.0-dev.20260605221925.gc26b7c6
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -12
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
- package/src/index.ts +53 -13
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { ResolvedFontPair } from '@nowline/export-core';
|
|
|
2
2
|
import { type ThemeName } from '@nowline/layout';
|
|
3
3
|
export type { PdfOrientation, ResolvedFontPair } from '@nowline/export-core';
|
|
4
4
|
export type { ThemeName } from '@nowline/layout';
|
|
5
|
+
export { civilDateInZone, type NormalizedZone, normalizeZone, type ResolveTodayOptions, resolveToday, TimezoneError, } from '@nowline/layout';
|
|
5
6
|
/** The eight canonical export formats. Every surface produces exactly these. */
|
|
6
7
|
export type ExportFormat = 'svg' | 'png' | 'pdf' | 'html' | 'mermaid' | 'xlsx' | 'msproj' | 'json';
|
|
7
8
|
/**
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAKhE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAKhE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACH,eAAe,EACf,KAAK,cAAc,EACnB,aAAa,EACb,KAAK,mBAAmB,EACxB,YAAY,EACZ,aAAa,GAChB,MAAM,iBAAiB,CAAC;AAEzB,gFAAgF;AAChF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEnG;;;;;;GAMG;AACH,MAAM,WAAW,OAAO;IACpB,uFAAuF;IACvF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,oEAAoE;IACpE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7C,gEAAgE;IAChE,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;CACpC;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IACzB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,yGAAyG;IACzG,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,KAAK,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAGzB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,WAAW,CAAC,EAAE,OAAO,sBAAsB,EAAE,cAAc,CAAC;IAC5D,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AA2OD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAChC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,OAAO,GACd,OAAO,CAAC,UAAU,CAAC,CA2FrB"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ import { collectDocumentDiagnostics, createNowlineServices, resolveIncludes, } f
|
|
|
16
16
|
import { layoutRoadmap } from '@nowline/layout';
|
|
17
17
|
import { renderSvg } from '@nowline/renderer';
|
|
18
18
|
import { URI } from 'langium';
|
|
19
|
+
export { civilDateInZone, normalizeZone, resolveToday, TimezoneError, } from '@nowline/layout';
|
|
19
20
|
let cachedServices;
|
|
20
21
|
let docCounter = 0;
|
|
21
22
|
function getExportServices() {
|
|
@@ -101,6 +102,16 @@ function guessMime(ref) {
|
|
|
101
102
|
return 'image/webp';
|
|
102
103
|
return 'application/octet-stream';
|
|
103
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Pin the renderer's per-role families to the resolved fonts' real family
|
|
107
|
+
* names so raster/preview SVG names exactly the bundled face. `serif` maps to
|
|
108
|
+
* the sans family: the resolver has no serif role and raster already falls
|
|
109
|
+
* back serif->sans (resvg has no serif face loaded), so this is behavior-
|
|
110
|
+
* preserving while making the SVG explicit.
|
|
111
|
+
*/
|
|
112
|
+
function pinnedFamilies(fonts) {
|
|
113
|
+
return { sans: fonts.sans.name, serif: fonts.sans.name, mono: fonts.mono.name };
|
|
114
|
+
}
|
|
104
115
|
async function stageDocument(source, inputs, host) {
|
|
105
116
|
const services = getExportServices();
|
|
106
117
|
const uri = freshUri();
|
|
@@ -141,18 +152,25 @@ async function stageDocument(source, inputs, host) {
|
|
|
141
152
|
const bytes = await host.readAsset(ref);
|
|
142
153
|
return { bytes, mime: guessMime(ref) };
|
|
143
154
|
};
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
155
|
+
const renderWith = async (fontFamilies) => {
|
|
156
|
+
const warnings = [];
|
|
157
|
+
const svg = await renderSvg(model, {
|
|
158
|
+
assetResolver,
|
|
159
|
+
noLinks: inputs.noLinks ?? false,
|
|
160
|
+
strict: inputs.strict ?? false,
|
|
161
|
+
warn: (msg) => warnings.push(msg),
|
|
162
|
+
fontFamilies,
|
|
163
|
+
});
|
|
164
|
+
if (inputs.strict && warnings.length > 0) {
|
|
165
|
+
throw new Error(`@nowline/export: render warnings (--strict): ${warnings.join('; ')}`);
|
|
166
|
+
}
|
|
167
|
+
return svg;
|
|
168
|
+
};
|
|
169
|
+
// Portable render (FONT_STACK) for the svg/html file exports.
|
|
170
|
+
const svg = await renderWith();
|
|
154
171
|
return {
|
|
155
172
|
svg,
|
|
173
|
+
renderWith: (fontFamilies) => renderWith(fontFamilies),
|
|
156
174
|
exportInputs: {
|
|
157
175
|
model,
|
|
158
176
|
ast,
|
|
@@ -234,7 +252,10 @@ export async function exportDocument(source, format, inputs, host) {
|
|
|
234
252
|
const wasmBytes = await host.loadWasm();
|
|
235
253
|
const pngMod = await import('@nowline/export-png');
|
|
236
254
|
await pngMod.initPngWasm(wasmBytes);
|
|
237
|
-
|
|
255
|
+
// Raster with the pinned bundled family so the SVG resvg rasterizes
|
|
256
|
+
// names exactly the embedded font (matches the live preview).
|
|
257
|
+
const rasterSvg = await stage.renderWith(pinnedFamilies(inputs.fonts));
|
|
258
|
+
const bytes = await pngMod.exportPng(stage.exportInputs, rasterSvg, {
|
|
238
259
|
scale: inputs.pngScale ?? 2,
|
|
239
260
|
fonts: inputs.fonts,
|
|
240
261
|
});
|
|
@@ -245,7 +266,10 @@ export async function exportDocument(source, format, inputs, host) {
|
|
|
245
266
|
throw new TypeError('@nowline/export: inputs.fonts is required for pdf format.');
|
|
246
267
|
}
|
|
247
268
|
const mod = await import('@nowline/export-pdf');
|
|
248
|
-
|
|
269
|
+
// Same pinned-family raster SVG as PNG so PDF text names the embedded
|
|
270
|
+
// font explicitly and stays consistent with preview + PNG.
|
|
271
|
+
const rasterSvg = await stage.renderWith(pinnedFamilies(inputs.fonts));
|
|
272
|
+
const bytes = await mod.exportPdf(stage.exportInputs, rasterSvg, {
|
|
249
273
|
pageSize: inputs.pageSize,
|
|
250
274
|
orientation: inputs.orientation,
|
|
251
275
|
marginPt: inputs.marginPt,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,yEAAyE;AACzE,8EAA8E;AAC9E,6EAA6E;AAC7E,2EAA2E;AAC3E,8EAA8E;AAC9E,iCAAiC;AACjC,EAAE;AACF,yEAAyE;AACzE,4DAA4D;AAC5D,EAAE;AACF,sEAAsE;AACtE,mEAAmE;AAEnE,OAAO,EACH,0BAA0B,EAC1B,qBAAqB,EAGrB,eAAe,GAClB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,aAAa,EAAkB,MAAM,iBAAiB,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nowline/export",
|
|
3
|
-
"version": "0.0.0-dev.
|
|
3
|
+
"version": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
4
4
|
"description": "Nowline export kernel — the single parse→resolve→layout→renderSvg→format code path shared by every surface for byte-identical export output",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"engines": {
|
|
@@ -21,16 +21,16 @@
|
|
|
21
21
|
"src/"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@nowline/core": "0.0.0-dev.
|
|
25
|
-
"@nowline/export-core": "0.0.0-dev.
|
|
26
|
-
"@nowline/export-mermaid": "0.0.0-dev.
|
|
27
|
-
"@nowline/export-html": "0.0.0-dev.
|
|
28
|
-
"@nowline/export-
|
|
29
|
-
"@nowline/export-
|
|
30
|
-
"@nowline/export-png": "0.0.0-dev.
|
|
31
|
-
"@nowline/
|
|
32
|
-
"@nowline/renderer": "0.0.0-dev.
|
|
33
|
-
"@nowline/
|
|
24
|
+
"@nowline/core": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
25
|
+
"@nowline/export-core": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
26
|
+
"@nowline/export-mermaid": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
27
|
+
"@nowline/export-html": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
28
|
+
"@nowline/export-pdf": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
29
|
+
"@nowline/export-msproj": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
30
|
+
"@nowline/export-png": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
31
|
+
"@nowline/layout": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
32
|
+
"@nowline/renderer": "0.0.0-dev.20260605221925.gc26b7c6",
|
|
33
|
+
"@nowline/export-xlsx": "0.0.0-dev.20260605221925.gc26b7c6"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"langium": "~4.2.4"
|
package/src/index.ts
CHANGED
|
@@ -22,12 +22,20 @@ import {
|
|
|
22
22
|
} from '@nowline/core';
|
|
23
23
|
import type { ExportInputs, ResolvedFontPair } from '@nowline/export-core';
|
|
24
24
|
import { layoutRoadmap, type ThemeName } from '@nowline/layout';
|
|
25
|
-
import { type AssetResolver, renderSvg } from '@nowline/renderer';
|
|
25
|
+
import { type AssetResolver, type FontFamilies, renderSvg } from '@nowline/renderer';
|
|
26
26
|
import type { AstNode, LangiumDocument } from 'langium';
|
|
27
27
|
import { URI } from 'langium';
|
|
28
28
|
|
|
29
29
|
export type { PdfOrientation, ResolvedFontPair } from '@nowline/export-core';
|
|
30
30
|
export type { ThemeName } from '@nowline/layout';
|
|
31
|
+
export {
|
|
32
|
+
civilDateInZone,
|
|
33
|
+
type NormalizedZone,
|
|
34
|
+
normalizeZone,
|
|
35
|
+
type ResolveTodayOptions,
|
|
36
|
+
resolveToday,
|
|
37
|
+
TimezoneError,
|
|
38
|
+
} from '@nowline/layout';
|
|
31
39
|
|
|
32
40
|
/** The eight canonical export formats. Every surface produces exactly these. */
|
|
33
41
|
export type ExportFormat = 'svg' | 'png' | 'pdf' | 'html' | 'mermaid' | 'xlsx' | 'msproj' | 'json';
|
|
@@ -205,12 +213,31 @@ function guessMime(ref: string): string {
|
|
|
205
213
|
// ---- Staged pipeline ---------------------------------------------------------
|
|
206
214
|
|
|
207
215
|
interface StageResult {
|
|
216
|
+
/** SVG rendered with the portable FONT_STACK (for `svg` / `html` exports). */
|
|
208
217
|
svg: string;
|
|
218
|
+
/**
|
|
219
|
+
* Re-render the already-laid-out model with a pinned `font-family` map.
|
|
220
|
+
* Used by the raster paths (png/pdf) so the exported pixels name exactly
|
|
221
|
+
* the bundled font and match the live preview (WYSIWYG). Reuses the same
|
|
222
|
+
* asset resolver and strict/warn handling as the portable render.
|
|
223
|
+
*/
|
|
224
|
+
renderWith: (fontFamilies: FontFamilies) => Promise<string>;
|
|
209
225
|
exportInputs: ExportInputs;
|
|
210
226
|
document: LangiumDocument<NowlineFile>;
|
|
211
227
|
source: string;
|
|
212
228
|
}
|
|
213
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Pin the renderer's per-role families to the resolved fonts' real family
|
|
232
|
+
* names so raster/preview SVG names exactly the bundled face. `serif` maps to
|
|
233
|
+
* the sans family: the resolver has no serif role and raster already falls
|
|
234
|
+
* back serif->sans (resvg has no serif face loaded), so this is behavior-
|
|
235
|
+
* preserving while making the SVG explicit.
|
|
236
|
+
*/
|
|
237
|
+
function pinnedFamilies(fonts: ResolvedFontPair): FontFamilies {
|
|
238
|
+
return { sans: fonts.sans.name, serif: fonts.sans.name, mono: fonts.mono.name };
|
|
239
|
+
}
|
|
240
|
+
|
|
214
241
|
async function stageDocument(
|
|
215
242
|
source: string,
|
|
216
243
|
inputs: RenderInputs,
|
|
@@ -267,20 +294,27 @@ async function stageDocument(
|
|
|
267
294
|
return { bytes, mime: guessMime(ref) };
|
|
268
295
|
};
|
|
269
296
|
|
|
270
|
-
const
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
297
|
+
const renderWith = async (fontFamilies?: FontFamilies): Promise<string> => {
|
|
298
|
+
const warnings: string[] = [];
|
|
299
|
+
const svg = await renderSvg(model, {
|
|
300
|
+
assetResolver,
|
|
301
|
+
noLinks: inputs.noLinks ?? false,
|
|
302
|
+
strict: inputs.strict ?? false,
|
|
303
|
+
warn: (msg) => warnings.push(msg),
|
|
304
|
+
fontFamilies,
|
|
305
|
+
});
|
|
306
|
+
if (inputs.strict && warnings.length > 0) {
|
|
307
|
+
throw new Error(`@nowline/export: render warnings (--strict): ${warnings.join('; ')}`);
|
|
308
|
+
}
|
|
309
|
+
return svg;
|
|
310
|
+
};
|
|
277
311
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}
|
|
312
|
+
// Portable render (FONT_STACK) for the svg/html file exports.
|
|
313
|
+
const svg = await renderWith();
|
|
281
314
|
|
|
282
315
|
return {
|
|
283
316
|
svg,
|
|
317
|
+
renderWith: (fontFamilies: FontFamilies) => renderWith(fontFamilies),
|
|
284
318
|
exportInputs: {
|
|
285
319
|
model,
|
|
286
320
|
ast,
|
|
@@ -384,7 +418,10 @@ export async function exportDocument(
|
|
|
384
418
|
const wasmBytes = await host.loadWasm();
|
|
385
419
|
const pngMod = await import('@nowline/export-png');
|
|
386
420
|
await pngMod.initPngWasm(wasmBytes);
|
|
387
|
-
|
|
421
|
+
// Raster with the pinned bundled family so the SVG resvg rasterizes
|
|
422
|
+
// names exactly the embedded font (matches the live preview).
|
|
423
|
+
const rasterSvg = await stage.renderWith(pinnedFamilies(inputs.fonts));
|
|
424
|
+
const bytes = await pngMod.exportPng(stage.exportInputs, rasterSvg, {
|
|
388
425
|
scale: inputs.pngScale ?? 2,
|
|
389
426
|
fonts: inputs.fonts,
|
|
390
427
|
});
|
|
@@ -396,7 +433,10 @@ export async function exportDocument(
|
|
|
396
433
|
throw new TypeError('@nowline/export: inputs.fonts is required for pdf format.');
|
|
397
434
|
}
|
|
398
435
|
const mod = await import('@nowline/export-pdf');
|
|
399
|
-
|
|
436
|
+
// Same pinned-family raster SVG as PNG so PDF text names the embedded
|
|
437
|
+
// font explicitly and stays consistent with preview + PNG.
|
|
438
|
+
const rasterSvg = await stage.renderWith(pinnedFamilies(inputs.fonts));
|
|
439
|
+
const bytes = await mod.exportPdf(stage.exportInputs, rasterSvg, {
|
|
400
440
|
pageSize: inputs.pageSize,
|
|
401
441
|
orientation: inputs.orientation,
|
|
402
442
|
marginPt: inputs.marginPt,
|