@json-to-office/core-docx 1.10.0 → 1.11.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/dist/core/generateFromIr.d.ts +8 -0
- package/dist/core/generateFromIr.d.ts.map +1 -1
- package/dist/core/generator.d.ts +8 -0
- package/dist/core/generator.d.ts.map +1 -1
- package/dist/index.js +134 -43
- package/dist/index.js.map +1 -1
- package/dist/ir/inline.d.ts.map +1 -1
- package/dist/plugin/createDocumentGenerator.d.ts +8 -0
- package/dist/plugin/createDocumentGenerator.d.ts.map +1 -1
- package/dist/plugin/example/index.js +133 -43
- package/dist/plugin/example/index.js.map +1 -1
- package/dist/renderers/docxjs/emit.d.ts.map +1 -1
- package/dist/renderers/docxjs/index.d.ts.map +1 -1
- package/dist/renderers/office-open/index.d.ts +1 -1
- package/dist/renderers/office-open/index.d.ts.map +1 -1
- package/dist/renderers/types.d.ts +9 -0
- package/dist/renderers/types.d.ts.map +1 -1
- package/dist/templates/documents/proposal.docx.json +7521 -1039
- package/dist/templates/documents/technical-guide.docx.json +9328 -1148
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/imageUtils.d.ts +19 -0
- package/dist/utils/imageUtils.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/ir/inline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline.d.ts","sourceRoot":"","sources":["../../src/ir/inline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAMjE;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAY7E;
|
|
1
|
+
{"version":3,"file":"inline.d.ts","sourceRoot":"","sources":["../../src/ir/inline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAMjE;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAY7E;AA8HD,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK1E;AAED,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,IAAI,EAAE,mBAAmB,CAAC;IAC1B;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,SAAS,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,qBAAqB,GAAG,SAAS,CAAC;IACzE;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CACZ,EAAE,EAAE,MAAM,KACP;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IAClE;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,CACtB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,MAAM,KACV,YAAY,GAAG,SAAS,CAAC;CAC/B;AAED,kEAAkE;AAClE,MAAM,MAAM,oBAAoB,GAC5B,UAAU,GACV,YAAY,GACZ,cAAc,GACd,MAAM,CAAC;AAEX;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kBAAkB,GAC1B,YAAY,EAAE,CAehB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA8FnC;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kBAAkB,GAC1B,YAAY,EAAE,CAShB"}
|
|
@@ -40,6 +40,14 @@ export interface DocumentGeneratorOptions {
|
|
|
40
40
|
* and fails before rendering on anything outside it.
|
|
41
41
|
*/
|
|
42
42
|
renderer?: DocxRendererId;
|
|
43
|
+
/**
|
|
44
|
+
* Rasterize a PNG fallback for each inline SVG. Defaults to true.
|
|
45
|
+
*
|
|
46
|
+
* Only readers older than Word 2016 draw that raster; everything current
|
|
47
|
+
* draws the vector. Producing it dominates the render of a document whose
|
|
48
|
+
* artwork is many small SVGs, so it can be turned off.
|
|
49
|
+
*/
|
|
50
|
+
svgRasterFallback?: boolean;
|
|
43
51
|
}
|
|
44
52
|
/**
|
|
45
53
|
* Create a document generator with chainable component registration.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createDocumentGenerator.d.ts","sourceRoot":"","sources":["../../src/plugin/createDocumentGenerator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAK7C,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAEV,wBAAwB,EAOxB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AAajB;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,oFAAoF;IACpF,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,2BAA2B,CAAC;IACzC,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"createDocumentGenerator.d.ts","sourceRoot":"","sources":["../../src/plugin/createDocumentGenerator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAK7C,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9E,OAAO,KAAK,EAEV,wBAAwB,EAOxB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AAajB;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,kEAAkE;IAClE,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,oFAAoF;IACpF,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,2BAA2B,CAAC;IACzC,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AA4sBD;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,wBAAwB,GAChC,wBAAwB,CAAC,SAAS,EAAE,CAAC,CAkBvC"}
|
|
@@ -1834,6 +1834,7 @@ var init_widthUtils = __esm({
|
|
|
1834
1834
|
|
|
1835
1835
|
// src/utils/imageUtils.ts
|
|
1836
1836
|
import { readFileSync } from "fs";
|
|
1837
|
+
import { availableParallelism } from "os";
|
|
1837
1838
|
import probe from "probe-image-size";
|
|
1838
1839
|
function loadResvg() {
|
|
1839
1840
|
resvgModule ??= import("@resvg/resvg-js");
|
|
@@ -1852,10 +1853,36 @@ function capToPixelBudget(edge, aspect) {
|
|
|
1852
1853
|
const scaled = Math.floor(edge * Math.sqrt(SVG_MAX_TOTAL_PX / total));
|
|
1853
1854
|
return scaled >= SVG_MIN_EDGE_PX ? scaled : void 0;
|
|
1854
1855
|
}
|
|
1856
|
+
function fallbackConcurrency() {
|
|
1857
|
+
const cpus = availableParallelism?.() ?? 4;
|
|
1858
|
+
return Math.max(1, Math.min(8, cpus));
|
|
1859
|
+
}
|
|
1860
|
+
async function rasterizeSvgFallbacks(jobs, enabled = true) {
|
|
1861
|
+
const out = /* @__PURE__ */ new Map();
|
|
1862
|
+
if (!enabled || jobs.length === 0) return out;
|
|
1863
|
+
let next = 0;
|
|
1864
|
+
const worker = async () => {
|
|
1865
|
+
for (let i = next++; i < jobs.length; i = next++) {
|
|
1866
|
+
const job = jobs[i];
|
|
1867
|
+
out.set(
|
|
1868
|
+
job.key,
|
|
1869
|
+
await rasterizeSvgFallback(job.svg, {
|
|
1870
|
+
width: job.width,
|
|
1871
|
+
height: job.height
|
|
1872
|
+
})
|
|
1873
|
+
);
|
|
1874
|
+
}
|
|
1875
|
+
};
|
|
1876
|
+
await Promise.all(
|
|
1877
|
+
Array.from({ length: Math.min(fallbackConcurrency(), jobs.length) }, worker)
|
|
1878
|
+
);
|
|
1879
|
+
return out;
|
|
1880
|
+
}
|
|
1855
1881
|
async function rasterizeSvgFallback(svg, transformation) {
|
|
1856
1882
|
let Resvg;
|
|
1883
|
+
let renderAsync;
|
|
1857
1884
|
try {
|
|
1858
|
-
({ Resvg } = await loadResvg());
|
|
1885
|
+
({ Resvg, renderAsync } = await loadResvg());
|
|
1859
1886
|
} catch (error) {
|
|
1860
1887
|
reportWarning(
|
|
1861
1888
|
"image",
|
|
@@ -1890,7 +1917,7 @@ async function rasterizeSvgFallback(svg, transformation) {
|
|
|
1890
1917
|
return void 0;
|
|
1891
1918
|
}
|
|
1892
1919
|
return Buffer.from(
|
|
1893
|
-
|
|
1920
|
+
(await renderAsync(markup, { fitTo: { mode, value } })).asPng()
|
|
1894
1921
|
);
|
|
1895
1922
|
} catch (error) {
|
|
1896
1923
|
reportWarning(
|
|
@@ -2179,10 +2206,10 @@ import {
|
|
|
2179
2206
|
EndnoteReferenceRun,
|
|
2180
2207
|
ExternalHyperlink,
|
|
2181
2208
|
FootnoteReferenceRun,
|
|
2209
|
+
ImportedXmlComponent,
|
|
2182
2210
|
InsertedTextRun,
|
|
2183
2211
|
InternalHyperlink,
|
|
2184
2212
|
OverlapType,
|
|
2185
|
-
PageNumber,
|
|
2186
2213
|
Paragraph,
|
|
2187
2214
|
RelativeHorizontalPosition,
|
|
2188
2215
|
RelativeVerticalPosition,
|
|
@@ -2202,6 +2229,28 @@ import {
|
|
|
2202
2229
|
WpsShapeRun
|
|
2203
2230
|
} from "docx";
|
|
2204
2231
|
import { assertNever } from "@json-to-office/shared/rendering";
|
|
2232
|
+
function complexField(instruction, formatting, leading) {
|
|
2233
|
+
const options = runOptions(formatting);
|
|
2234
|
+
const fieldChar = (type, extra = {}) => new TextRun({
|
|
2235
|
+
children: [
|
|
2236
|
+
new ImportedXmlComponent("w:fldChar", { "w:fldCharType": type })
|
|
2237
|
+
],
|
|
2238
|
+
...options,
|
|
2239
|
+
...extra
|
|
2240
|
+
});
|
|
2241
|
+
const instrText = new ImportedXmlComponent("w:instrText", {
|
|
2242
|
+
"xml:space": "preserve"
|
|
2243
|
+
});
|
|
2244
|
+
instrText.push(instruction);
|
|
2245
|
+
return [
|
|
2246
|
+
// A pending line break rides on the first run of the field, the same way
|
|
2247
|
+
// it rides on the single run every other inline node emits.
|
|
2248
|
+
fieldChar("begin", leading),
|
|
2249
|
+
new TextRun({ children: [instrText], ...options }),
|
|
2250
|
+
fieldChar("separate"),
|
|
2251
|
+
fieldChar("end")
|
|
2252
|
+
];
|
|
2253
|
+
}
|
|
2205
2254
|
function runOptions(formatting) {
|
|
2206
2255
|
if (!formatting) return {};
|
|
2207
2256
|
const options = {};
|
|
@@ -2306,18 +2355,13 @@ function inlineChildren(children, resources = /* @__PURE__ */ new Map()) {
|
|
|
2306
2355
|
out.push(new SimpleField(child.instruction, child.cachedText));
|
|
2307
2356
|
break;
|
|
2308
2357
|
}
|
|
2309
|
-
|
|
2310
|
-
if (!page) {
|
|
2358
|
+
if (!PAGE_FIELDS.has(child.instruction)) {
|
|
2311
2359
|
throw new Error(
|
|
2312
2360
|
`the docxjs renderer has no emitter for the field "${child.instruction}"`
|
|
2313
2361
|
);
|
|
2314
2362
|
}
|
|
2315
2363
|
out.push(
|
|
2316
|
-
|
|
2317
|
-
children: [page],
|
|
2318
|
-
...runOptions(child.formatting),
|
|
2319
|
-
...breakOption()
|
|
2320
|
-
})
|
|
2364
|
+
...complexField(child.instruction, child.formatting, breakOption())
|
|
2321
2365
|
);
|
|
2322
2366
|
break;
|
|
2323
2367
|
}
|
|
@@ -2691,7 +2735,7 @@ function emitBorder(border3) {
|
|
|
2691
2735
|
...border3.spacePoints !== void 0 ? { space: border3.spacePoints } : {}
|
|
2692
2736
|
};
|
|
2693
2737
|
}
|
|
2694
|
-
var ALIGNMENT2,
|
|
2738
|
+
var ALIGNMENT2, PAGE_FIELDS, WRAP_TYPE, VERTICAL_ALIGN, TABLE_ANCHOR, HORIZONTAL_POSITION, VERTICAL_POSITION, BORDER_STYLE;
|
|
2695
2739
|
var init_emit = __esm({
|
|
2696
2740
|
"src/renderers/docxjs/emit.ts"() {
|
|
2697
2741
|
"use strict";
|
|
@@ -2703,10 +2747,7 @@ var init_emit = __esm({
|
|
|
2703
2747
|
start: AlignmentType.START,
|
|
2704
2748
|
end: AlignmentType.END
|
|
2705
2749
|
};
|
|
2706
|
-
|
|
2707
|
-
PAGE: PageNumber.CURRENT,
|
|
2708
|
-
NUMPAGES: PageNumber.TOTAL_PAGES
|
|
2709
|
-
};
|
|
2750
|
+
PAGE_FIELDS = /* @__PURE__ */ new Set(["PAGE", "NUMPAGES"]);
|
|
2710
2751
|
WRAP_TYPE = {
|
|
2711
2752
|
none: TextWrappingType.NONE,
|
|
2712
2753
|
square: TextWrappingType.SQUARE,
|
|
@@ -3053,7 +3094,10 @@ function createDocxJsRenderer() {
|
|
|
3053
3094
|
format: "docx",
|
|
3054
3095
|
capabilities: DOCXJS_CAPABILITIES,
|
|
3055
3096
|
async render(ir, renderOptions) {
|
|
3056
|
-
const resources = await prepareImages(
|
|
3097
|
+
const resources = await prepareImages(
|
|
3098
|
+
ir,
|
|
3099
|
+
renderOptions?.svgRasterFallback
|
|
3100
|
+
);
|
|
3057
3101
|
const document = buildDocument(ir, resources);
|
|
3058
3102
|
const packed = await Packer.toBuffer(document);
|
|
3059
3103
|
const fixed = fixFloatingImageIdsInBuffer(packed);
|
|
@@ -3138,22 +3182,22 @@ function numberingConfig(numbering) {
|
|
|
3138
3182
|
}))
|
|
3139
3183
|
};
|
|
3140
3184
|
}
|
|
3141
|
-
async function prepareImages(ir) {
|
|
3185
|
+
async function prepareImages(ir, svgRasterFallback) {
|
|
3142
3186
|
const placements = collectImagePlacements(ir);
|
|
3143
|
-
const
|
|
3187
|
+
const jobs = [];
|
|
3144
3188
|
for (const resource of ir.resources) {
|
|
3145
3189
|
if (resource.kind !== "image" || resource.mediaType !== "svg") continue;
|
|
3146
3190
|
for (const size of placements.get(resource.id) ?? []) {
|
|
3147
3191
|
const [width, height] = size.split("x").map(Number);
|
|
3148
|
-
|
|
3149
|
-
`${resource.id}:${size}`,
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
);
|
|
3192
|
+
jobs.push({
|
|
3193
|
+
key: `${resource.id}:${size}`,
|
|
3194
|
+
svg: Buffer.from(resource.bytes),
|
|
3195
|
+
width,
|
|
3196
|
+
height
|
|
3197
|
+
});
|
|
3155
3198
|
}
|
|
3156
3199
|
}
|
|
3200
|
+
const rasters = await rasterizeSvgFallbacks(jobs, svgRasterFallback);
|
|
3157
3201
|
const resources = /* @__PURE__ */ new Map();
|
|
3158
3202
|
for (const resource of ir.resources) {
|
|
3159
3203
|
if (resource.kind !== "image") continue;
|
|
@@ -4320,7 +4364,11 @@ async function createOfficeOpenDocxRenderer() {
|
|
|
4320
4364
|
capabilities: OFFICE_OPEN_CAPABILITIES,
|
|
4321
4365
|
async render(ir, options) {
|
|
4322
4366
|
const charts = [];
|
|
4323
|
-
const document = await buildDocumentOptions(
|
|
4367
|
+
const document = await buildDocumentOptions(
|
|
4368
|
+
ir,
|
|
4369
|
+
charts,
|
|
4370
|
+
options?.svgRasterFallback
|
|
4371
|
+
);
|
|
4324
4372
|
const bytes = await backend.generateDocument(document, {
|
|
4325
4373
|
type: "uint8array"
|
|
4326
4374
|
});
|
|
@@ -4345,10 +4393,10 @@ async function createOfficeOpenDocxRenderer() {
|
|
|
4345
4393
|
}
|
|
4346
4394
|
};
|
|
4347
4395
|
}
|
|
4348
|
-
async function buildDocumentOptions(ir, charts = []) {
|
|
4396
|
+
async function buildDocumentOptions(ir, charts = [], svgRasterFallback) {
|
|
4349
4397
|
let nextDrawingId = 1;
|
|
4350
4398
|
const ctx = {
|
|
4351
|
-
pictures: await prepareImages2(ir),
|
|
4399
|
+
pictures: await prepareImages2(ir, svgRasterFallback),
|
|
4352
4400
|
nextDrawingId: () => nextDrawingId++,
|
|
4353
4401
|
charts
|
|
4354
4402
|
};
|
|
@@ -4397,22 +4445,22 @@ function noteBodies2(notes, ctx) {
|
|
|
4397
4445
|
}
|
|
4398
4446
|
return bodies;
|
|
4399
4447
|
}
|
|
4400
|
-
async function prepareImages2(ir) {
|
|
4448
|
+
async function prepareImages2(ir, svgRasterFallback) {
|
|
4401
4449
|
const placements = collectImagePlacements2(ir);
|
|
4402
|
-
const
|
|
4450
|
+
const jobs = [];
|
|
4403
4451
|
for (const resource of ir.resources) {
|
|
4404
4452
|
if (resource.kind !== "image" || resource.mediaType !== "svg") continue;
|
|
4405
4453
|
for (const size of placements.get(resource.id) ?? []) {
|
|
4406
4454
|
const [width, height] = size.split("x").map(Number);
|
|
4407
|
-
|
|
4408
|
-
`${resource.id}:${size}`,
|
|
4409
|
-
|
|
4410
|
-
|
|
4411
|
-
|
|
4412
|
-
|
|
4413
|
-
);
|
|
4455
|
+
jobs.push({
|
|
4456
|
+
key: `${resource.id}:${size}`,
|
|
4457
|
+
svg: Buffer.from(resource.bytes),
|
|
4458
|
+
width,
|
|
4459
|
+
height
|
|
4460
|
+
});
|
|
4414
4461
|
}
|
|
4415
4462
|
}
|
|
4463
|
+
const rasters = await rasterizeSvgFallbacks(jobs, svgRasterFallback);
|
|
4416
4464
|
const resources = /* @__PURE__ */ new Map();
|
|
4417
4465
|
for (const resource of ir.resources) {
|
|
4418
4466
|
if (resource.kind !== "image") continue;
|
|
@@ -7988,6 +8036,44 @@ function buildNoProofWordsRegex(noProofWords2) {
|
|
|
7988
8036
|
);
|
|
7989
8037
|
}
|
|
7990
8038
|
var DECORATOR = /(\*\*\*|___)([\s\S]*?)\1|(\*\*|__)([\s\S]*?)\3|(\*|_)([\s\S]*?)\5/g;
|
|
8039
|
+
var ESCAPABLE = "*_[]{}\\";
|
|
8040
|
+
var ESCAPE = /\\([*_[\]{}\\])/g;
|
|
8041
|
+
var SENTINEL = "\uE000";
|
|
8042
|
+
var SENTINEL_SELF = "x";
|
|
8043
|
+
var SENTINEL_DIGIT_BASE = 48;
|
|
8044
|
+
function encodeEscapes(text) {
|
|
8045
|
+
const authored = text.includes(SENTINEL);
|
|
8046
|
+
if (!authored && !text.includes("\\")) return text;
|
|
8047
|
+
const guarded = authored ? text.split(SENTINEL).join(SENTINEL + SENTINEL_SELF) : text;
|
|
8048
|
+
return guarded.replace(
|
|
8049
|
+
ESCAPE,
|
|
8050
|
+
(_whole, char) => SENTINEL + String.fromCharCode(SENTINEL_DIGIT_BASE + ESCAPABLE.indexOf(char))
|
|
8051
|
+
);
|
|
8052
|
+
}
|
|
8053
|
+
function decodeEscapes(text) {
|
|
8054
|
+
if (!text.includes(SENTINEL)) return text;
|
|
8055
|
+
let out = "";
|
|
8056
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
8057
|
+
if (text[i] !== SENTINEL) {
|
|
8058
|
+
out += text[i];
|
|
8059
|
+
continue;
|
|
8060
|
+
}
|
|
8061
|
+
const marker = text[i + 1];
|
|
8062
|
+
if (marker === SENTINEL_SELF) {
|
|
8063
|
+
out += SENTINEL;
|
|
8064
|
+
i += 1;
|
|
8065
|
+
continue;
|
|
8066
|
+
}
|
|
8067
|
+
const index = marker === void 0 ? -1 : marker.charCodeAt(0) - SENTINEL_DIGIT_BASE;
|
|
8068
|
+
if (index >= 0 && index < ESCAPABLE.length) {
|
|
8069
|
+
out += ESCAPABLE[index];
|
|
8070
|
+
i += 1;
|
|
8071
|
+
continue;
|
|
8072
|
+
}
|
|
8073
|
+
out += text[i];
|
|
8074
|
+
}
|
|
8075
|
+
return out;
|
|
8076
|
+
}
|
|
7991
8077
|
var LINK = /\[([^\]]+)\]\(([^)]+)\)/g;
|
|
7992
8078
|
var DECORATOR_OR_PLACEHOLDER = /(\*\*\*|___)([\s\S]*?)\1|(\*\*|__)([\s\S]*?)\3|(\*|_)([\s\S]*?)\5|\{([^}]+)\}/g;
|
|
7993
8079
|
var PLACEHOLDER = /\{([^}]+)\}/;
|
|
@@ -8014,7 +8100,7 @@ function containsUnsupportedSyntax(text) {
|
|
|
8014
8100
|
return void 0;
|
|
8015
8101
|
}
|
|
8016
8102
|
function parseInline(text, options) {
|
|
8017
|
-
const normalized = normalizeUnicodeText(text);
|
|
8103
|
+
const normalized = encodeEscapes(normalizeUnicodeText(text));
|
|
8018
8104
|
if (!normalized) {
|
|
8019
8105
|
return [
|
|
8020
8106
|
{ kind: "text", text: "", formatting: emptyToUndefined(options.base) }
|
|
@@ -8112,7 +8198,7 @@ function parseLinks(normalized, options) {
|
|
|
8112
8198
|
lastIndex = match.index + match[0].length;
|
|
8113
8199
|
if (match[1] === void 0) {
|
|
8114
8200
|
const resolved = options.resolveCrossReference?.(
|
|
8115
|
-
match[3],
|
|
8201
|
+
decodeEscapes(match[3]),
|
|
8116
8202
|
match[4] ?? "relative",
|
|
8117
8203
|
match[0]
|
|
8118
8204
|
);
|
|
@@ -8120,7 +8206,8 @@ function parseLinks(normalized, options) {
|
|
|
8120
8206
|
else out.push(...parseDecorated(match[0], options));
|
|
8121
8207
|
continue;
|
|
8122
8208
|
}
|
|
8123
|
-
const [, linkText
|
|
8209
|
+
const [, linkText] = match;
|
|
8210
|
+
const target = decodeEscapes(match[2]);
|
|
8124
8211
|
out.push({
|
|
8125
8212
|
kind: "hyperlink",
|
|
8126
8213
|
// A `#anchor` target names a bookmark in this document and needs no
|
|
@@ -8176,7 +8263,7 @@ function pushSegment(out, text, options, override = {}) {
|
|
|
8176
8263
|
const bold = override.bold ?? options.base.bold;
|
|
8177
8264
|
const italic = override.italic ?? options.base.italic;
|
|
8178
8265
|
const formatting = runFormatting2(options, { bold, italic });
|
|
8179
|
-
const lines = text.split("\n");
|
|
8266
|
+
const lines = decodeEscapes(text).split("\n");
|
|
8180
8267
|
for (const [lineIndex, line] of lines.entries()) {
|
|
8181
8268
|
if (!line && lineIndex === 0) continue;
|
|
8182
8269
|
if (lineIndex > 0) out.push({ kind: "lineBreak" });
|
|
@@ -12113,6 +12200,7 @@ async function renderScoped(document, options, warnings) {
|
|
|
12113
12200
|
const bytes = await renderer.render(compiled.ir, {
|
|
12114
12201
|
...options.deterministic !== void 0 ? { deterministic: options.deterministic } : {},
|
|
12115
12202
|
...options.generatedAt !== void 0 ? { generatedAt: toDate(options.generatedAt) } : {},
|
|
12203
|
+
...options.svgRasterFallback !== void 0 ? { svgRasterFallback: options.svgRasterFallback } : {},
|
|
12116
12204
|
warnings: compiled.warnings
|
|
12117
12205
|
});
|
|
12118
12206
|
return { buffer: Buffer.from(bytes), warnings: compiled.warnings };
|
|
@@ -12289,7 +12377,8 @@ function createBuilderImpl(state) {
|
|
|
12289
12377
|
deterministic: state.deterministic,
|
|
12290
12378
|
generatedAt: state.generatedAt,
|
|
12291
12379
|
baseDir: state.baseDir,
|
|
12292
|
-
renderer: state.renderer
|
|
12380
|
+
renderer: state.renderer,
|
|
12381
|
+
svgRasterFallback: state.svgRasterFallback
|
|
12293
12382
|
};
|
|
12294
12383
|
return createBuilderImpl(
|
|
12295
12384
|
newState
|
|
@@ -12546,7 +12635,8 @@ function createDocumentGenerator(options) {
|
|
|
12546
12635
|
deterministic: options.deterministic ?? true,
|
|
12547
12636
|
generatedAt: options.generatedAt,
|
|
12548
12637
|
baseDir: options.baseDir,
|
|
12549
|
-
renderer: options.renderer
|
|
12638
|
+
renderer: options.renderer,
|
|
12639
|
+
svgRasterFallback: options.svgRasterFallback
|
|
12550
12640
|
};
|
|
12551
12641
|
return createBuilderImpl(initialState);
|
|
12552
12642
|
}
|