@pdfme/schemas 6.1.13 → 6.2.0-dev.13
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/barcodes/helper.d.ts +17 -2
- package/dist/{builtins-8En4EIAG.js → builtins-C-2wyB_3.js} +140 -83
- package/dist/builtins-C-2wyB_3.js.map +1 -0
- package/dist/builtins.js +1 -1
- package/dist/dynamicLayout.js +4 -4
- package/dist/{dynamicTemplate-DQF7c6NR.js → dynamicTemplate-CcnCXHfM.js} +2 -2
- package/dist/{dynamicTemplate-DQF7c6NR.js.map → dynamicTemplate-CcnCXHfM.js.map} +1 -1
- package/dist/{dynamicTemplate-DFk_de1Y.js → dynamicTemplate-DEwOv_DE.js} +7 -6
- package/dist/dynamicTemplate-DEwOv_DE.js.map +1 -0
- package/dist/{dynamicTemplate-CnK0nlnj.js → dynamicTemplate-DkTVIMNr.js} +2 -2
- package/dist/{dynamicTemplate-CnK0nlnj.js.map → dynamicTemplate-DkTVIMNr.js.map} +1 -1
- package/dist/graphics/image.d.ts +26 -1
- package/dist/graphics/orientation.d.ts +31 -0
- package/dist/{helper-VroN19Ci.js → helper-BR4_UZA5.js} +26 -3
- package/dist/helper-BR4_UZA5.js.map +1 -0
- package/dist/index.js +676 -142
- package/dist/index.js.map +1 -1
- package/dist/lists.js +2 -2
- package/dist/{measure-BC7tjAtT.js → measure-BarlRI1L.js} +71 -227
- package/dist/measure-BarlRI1L.js.map +1 -0
- package/dist/multiVariableText/helper.d.ts +8 -0
- package/dist/multiVariableText/types.d.ts +2 -0
- package/dist/pdfFont.d.ts +8 -0
- package/dist/splitRange-B6311Noc.js +10854 -0
- package/dist/splitRange-B6311Noc.js.map +1 -0
- package/dist/tables.js +2 -2
- package/dist/text/helper.d.ts +33 -1
- package/dist/text/lineBreak.d.ts +69 -0
- package/dist/text/lineBreakClasses.generated.d.ts +11 -0
- package/dist/text/richText.d.ts +2 -0
- package/dist/text/uiRender.d.ts +3 -1
- package/dist/text/wrap.d.ts +67 -0
- package/dist/texts.js +3 -3
- package/dist/{utils-D_sFXK0U.js → utils-CPYF2FY_.js} +18 -15
- package/dist/utils-CPYF2FY_.js.map +1 -0
- package/dist/utils.d.ts +3 -2
- package/dist/utils.js +3 -3
- package/package.json +3 -1
- package/dist/builtins-8En4EIAG.js.map +0 -1
- package/dist/dynamicTemplate-DFk_de1Y.js.map +0 -1
- package/dist/helper-VroN19Ci.js.map +0 -1
- package/dist/measure-BC7tjAtT.js.map +0 -1
- package/dist/splitRange-BHV0vb0Q.js +0 -504
- package/dist/splitRange-BHV0vb0Q.js.map +0 -1
- package/dist/utils-D_sFXK0U.js.map +0 -1
package/dist/lists.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as createListItemSplitRange, c as getListItemRange, n as LIST_ITEM_SPLIT_UNIT } from "./splitRange-
|
|
2
|
-
import { a as normalizeListItems, i as normalizeListItemEntries, n as calculateListLayout, o as serializeListItems, r as getListMarkers, t as getDynamicLayoutForList } from "./dynamicTemplate-
|
|
1
|
+
import { a as createListItemSplitRange, c as getListItemRange, n as LIST_ITEM_SPLIT_UNIT } from "./splitRange-B6311Noc.js";
|
|
2
|
+
import { a as normalizeListItems, i as normalizeListItemEntries, n as calculateListLayout, o as serializeListItems, r as getListMarkers, t as getDynamicLayoutForList } from "./dynamicTemplate-CcnCXHfM.js";
|
|
3
3
|
export { LIST_ITEM_SPLIT_UNIT, calculateListLayout, createListItemSplitRange, getDynamicLayoutForList, getListItemRange, getListMarkers, normalizeListItemEntries, normalizeListItems, serializeListItems };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as getBoxVerticalInset, D as getBoxContentArea, M as hasBoxDimension, Q as SYNTHETIC_BOLD_OFFSET_RATIO, R as CODE_HORIZONTAL_PADDING, _ as getLineBoxHeightPt, b as splitTextToSize, d as calculateDynamicFontSize, g as getFontKitFont, j as getSplitBoxDimension, k as getBoxInsets, p as fitDynamicFontSize, u as getTextLineRange, v as heightOfFontAtSize, w as layoutStyledRuns, x as widthOfTextAtSize } from "./splitRange-B6311Noc.js";
|
|
2
2
|
import { getDefaultFont, getFallbackFontName, mm2pt, normalizeLinkHref, pt2mm } from "@pdfme/common";
|
|
3
3
|
//#region src/text/inlineMarkdown.ts
|
|
4
4
|
var MARKDOWN_ESCAPABLE_CHARS = /* @__PURE__ */ new Set([
|
|
@@ -172,8 +172,6 @@ var escapeInlineMarkdown = (value) => value.replace(MARKDOWN_ESCAPE_PATTERN, (ch
|
|
|
172
172
|
var stripInlineMarkdown = (value) => parseInlineMarkdown(value).map((run) => run.text).join("");
|
|
173
173
|
//#endregion
|
|
174
174
|
//#region src/text/richText.ts
|
|
175
|
-
var richTextWordSegmenter = new Intl.Segmenter(void 0, { granularity: "word" });
|
|
176
|
-
var richTextGraphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
|
|
177
175
|
var getBaseFontName = (schema, font) => schema.fontName && font[schema.fontName] ? schema.fontName : getFallbackFontName(font);
|
|
178
176
|
var getLoadedFontName = (font, fontName) => fontName && font[fontName] ? fontName : void 0;
|
|
179
177
|
var isInlineMarkdownTextSchema = (schema) => schema.textFormat === "inline-markdown" && !(schema.type === "text" && schema.readOnly !== true);
|
|
@@ -244,250 +242,101 @@ var measureRunText = (run, text, fontSize, characterSpacing) => {
|
|
|
244
242
|
const syntheticItalicWidth = run.syntheticItalic ? heightOfFontAtSize(run.fontKitFont, fontSize) * Math.tan(12 * Math.PI / 180) : 0;
|
|
245
243
|
return widthOfTextAtSize(text, run.fontKitFont, fontSize, characterSpacing) + syntheticBoldWidth + syntheticItalicWidth + (run.code ? CODE_HORIZONTAL_PADDING * 2 : 0);
|
|
246
244
|
};
|
|
247
|
-
var createLine = () => ({
|
|
248
|
-
runs: [],
|
|
249
|
-
width: 0,
|
|
250
|
-
hardBreak: false
|
|
251
|
-
});
|
|
252
|
-
var pushRunToLine = (line, run, text, fontSize, characterSpacing) => {
|
|
253
|
-
if (!text) return;
|
|
254
|
-
const width = measureRunText(run, text, fontSize, characterSpacing);
|
|
255
|
-
const lastRun = line.runs[line.runs.length - 1];
|
|
256
|
-
if (lastRun && canMergeRichTextRuns(lastRun, run)) {
|
|
257
|
-
const previousWidth = lastRun.width;
|
|
258
|
-
lastRun.text += text;
|
|
259
|
-
lastRun.width = measureRunText(lastRun, lastRun.text, fontSize, characterSpacing);
|
|
260
|
-
line.width += lastRun.width - previousWidth;
|
|
261
|
-
return;
|
|
262
|
-
}
|
|
263
|
-
if (line.runs.length > 0) line.width += characterSpacing;
|
|
264
|
-
line.runs.push({
|
|
265
|
-
...run,
|
|
266
|
-
text,
|
|
267
|
-
width
|
|
268
|
-
});
|
|
269
|
-
line.width += width;
|
|
270
|
-
};
|
|
271
|
-
var canMergeRichTextRuns = (a, b) => a.fontName === b.fontName && a.fontKitFont === b.fontKitFont && a.syntheticBold === b.syntheticBold && a.syntheticItalic === b.syntheticItalic && a.bold === b.bold && a.italic === b.italic && a.strikethrough === b.strikethrough && a.code === b.code && a.href === b.href;
|
|
272
|
-
var measurePiecesWidth = (pieces, fontSize, characterSpacing) => {
|
|
273
|
-
let width = 0;
|
|
274
|
-
let hasText = false;
|
|
275
|
-
pieces.forEach((piece) => {
|
|
276
|
-
if (!piece.text) return;
|
|
277
|
-
if (hasText) width += characterSpacing;
|
|
278
|
-
width += measureRunText(piece.run, piece.text, fontSize, characterSpacing);
|
|
279
|
-
hasText = true;
|
|
280
|
-
});
|
|
281
|
-
return width;
|
|
282
|
-
};
|
|
283
|
-
var sliceRunPieces = (pieces, startIndex, endIndex) => {
|
|
284
|
-
const result = [];
|
|
285
|
-
let offset = 0;
|
|
286
|
-
pieces.forEach((piece) => {
|
|
287
|
-
const pieceStart = offset;
|
|
288
|
-
const pieceEnd = pieceStart + piece.text.length;
|
|
289
|
-
const sliceStart = Math.max(startIndex, pieceStart);
|
|
290
|
-
const sliceEnd = Math.min(endIndex, pieceEnd);
|
|
291
|
-
if (sliceStart < sliceEnd) result.push({
|
|
292
|
-
run: piece.run,
|
|
293
|
-
text: piece.text.slice(sliceStart - pieceStart, sliceEnd - pieceStart)
|
|
294
|
-
});
|
|
295
|
-
offset = pieceEnd;
|
|
296
|
-
});
|
|
297
|
-
return result;
|
|
298
|
-
};
|
|
299
|
-
var segmentRunPiecesByWord = (runs, onSegment, onHardBreak) => {
|
|
300
|
-
let paragraphPieces = [];
|
|
301
|
-
const flushParagraph = () => {
|
|
302
|
-
if (paragraphPieces.length === 0) return;
|
|
303
|
-
const paragraphText = paragraphPieces.map((piece) => piece.text).join("");
|
|
304
|
-
Array.from(richTextWordSegmenter.segment(paragraphText), ({ segment, index }) => {
|
|
305
|
-
const pieces = sliceRunPieces(paragraphPieces, index, index + segment.length);
|
|
306
|
-
if (pieces.length > 0) onSegment(pieces);
|
|
307
|
-
});
|
|
308
|
-
paragraphPieces = [];
|
|
309
|
-
};
|
|
310
|
-
runs.forEach((run) => {
|
|
311
|
-
run.text.split(/(\r\n|\r|\n)/).forEach((part) => {
|
|
312
|
-
if (part === "\r\n" || part === "\r" || part === "\n") {
|
|
313
|
-
flushParagraph();
|
|
314
|
-
onHardBreak();
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
if (part) paragraphPieces.push({
|
|
318
|
-
run,
|
|
319
|
-
text: part
|
|
320
|
-
});
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
flushParagraph();
|
|
324
|
-
};
|
|
325
|
-
var splitIntoGraphemes = (value) => Array.from(richTextGraphemeSegmenter.segment(value), ({ segment }) => segment);
|
|
326
|
-
var countRichTextLineGraphemes = (line) => splitIntoGraphemes(line.runs.map((run) => run.text).join("")).length;
|
|
327
245
|
var layoutRichTextLines = (arg) => {
|
|
328
246
|
const { runs, fontSize, characterSpacing, boxWidthInPt } = arg;
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
let remainingText = text;
|
|
343
|
-
while (remainingText.length > 0) {
|
|
344
|
-
const pendingSpacing = currentLine.runs.length > 0 ? characterSpacing : 0;
|
|
345
|
-
const remainingWidth = Math.max(boxWidthInPt - currentLine.width - pendingSpacing, 0);
|
|
346
|
-
const remainingTextWidth = measureRunText(run, remainingText, fontSize, characterSpacing);
|
|
347
|
-
if (remainingTextWidth <= remainingWidth || currentLine.runs.length === 0 && remainingTextWidth <= boxWidthInPt) {
|
|
348
|
-
pushRunToLine(currentLine, run, remainingText, fontSize, characterSpacing);
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
if (currentLine.runs.length > 0 && remainingTextWidth <= boxWidthInPt) {
|
|
352
|
-
pushCurrentLine(false);
|
|
353
|
-
continue;
|
|
354
|
-
}
|
|
355
|
-
const graphemes = splitIntoGraphemes(remainingText);
|
|
356
|
-
let fittingText = "";
|
|
357
|
-
let fittingLength = 0;
|
|
358
|
-
for (const grapheme of graphemes) {
|
|
359
|
-
const candidate = fittingText + grapheme;
|
|
360
|
-
const candidateWidth = measureRunText(run, candidate, fontSize, characterSpacing);
|
|
361
|
-
const maxWidth = currentLine.runs.length === 0 ? boxWidthInPt : remainingWidth;
|
|
362
|
-
if (candidateWidth > maxWidth) {
|
|
363
|
-
if (fittingText) break;
|
|
364
|
-
if (currentLine.runs.length > 0) break;
|
|
365
|
-
}
|
|
366
|
-
fittingText = candidate;
|
|
367
|
-
fittingLength += grapheme.length;
|
|
368
|
-
if (candidateWidth > maxWidth) break;
|
|
369
|
-
}
|
|
370
|
-
if (!fittingText) {
|
|
371
|
-
pushCurrentLine(false);
|
|
372
|
-
continue;
|
|
373
|
-
}
|
|
374
|
-
pushRunToLine(currentLine, run, fittingText, fontSize, characterSpacing);
|
|
375
|
-
remainingText = remainingText.slice(fittingLength);
|
|
376
|
-
if (remainingText.length > 0) pushCurrentLine(false);
|
|
377
|
-
}
|
|
378
|
-
};
|
|
379
|
-
const pushSegment = (pieces) => {
|
|
380
|
-
const segmentWidth = measurePiecesWidth(pieces, fontSize, characterSpacing);
|
|
381
|
-
const pendingSpacing = currentLine.runs.length > 0 ? characterSpacing : 0;
|
|
382
|
-
if (segmentWidth <= Math.max(boxWidthInPt - currentLine.width - pendingSpacing, 0) || currentLine.runs.length === 0 && segmentWidth <= boxWidthInPt) {
|
|
383
|
-
pushPiecesToLine(pieces);
|
|
384
|
-
return;
|
|
385
|
-
}
|
|
386
|
-
if (currentLine.runs.length > 0) {
|
|
387
|
-
pushCurrentLine(false);
|
|
388
|
-
if (segmentWidth <= boxWidthInPt) {
|
|
389
|
-
pushPiecesToLine(pieces);
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
pieces.forEach((piece) => pushOversizedText(piece.run, piece.text));
|
|
394
|
-
};
|
|
395
|
-
segmentRunPiecesByWord(runs, pushSegment, () => pushCurrentLine(true));
|
|
396
|
-
if (currentLine.runs.length > 0 || lines.length === 0) pushCurrentLine(false);
|
|
397
|
-
return lines;
|
|
247
|
+
return layoutStyledRuns(runs.map((run) => ({
|
|
248
|
+
text: run.text,
|
|
249
|
+
measure: (text) => measureRunText(run, text, fontSize, characterSpacing),
|
|
250
|
+
style: run
|
|
251
|
+
})), boxWidthInPt, { characterSpacing }).map((line) => ({
|
|
252
|
+
runs: line.spans.map((span) => ({
|
|
253
|
+
...span.style,
|
|
254
|
+
text: span.text,
|
|
255
|
+
width: span.width
|
|
256
|
+
})),
|
|
257
|
+
width: line.width,
|
|
258
|
+
hardBreak: line.hardBreak
|
|
259
|
+
}));
|
|
398
260
|
};
|
|
399
261
|
var measureParagraphWidths = (runs, fontSize, characterSpacing) => {
|
|
400
262
|
const widths = [];
|
|
401
|
-
let
|
|
263
|
+
let paragraphText = "";
|
|
264
|
+
let paragraphRuns = [];
|
|
402
265
|
const pushWidth = () => {
|
|
403
|
-
|
|
404
|
-
|
|
266
|
+
if (paragraphRuns.length === 0 && paragraphText === "") {
|
|
267
|
+
widths.push(0);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
let width = 0;
|
|
271
|
+
paragraphRuns.forEach((run, index) => {
|
|
272
|
+
if (index > 0) width += characterSpacing;
|
|
273
|
+
width += measureRunText(run, run.text, fontSize, characterSpacing);
|
|
274
|
+
});
|
|
275
|
+
widths.push(width);
|
|
276
|
+
paragraphText = "";
|
|
277
|
+
paragraphRuns = [];
|
|
405
278
|
};
|
|
406
279
|
runs.forEach((run) => {
|
|
407
|
-
run.text.split(/(\r\n|\r|\n)/).forEach((part) => {
|
|
408
|
-
if (part === "\r\n" || part === "\r" || part === "\n") {
|
|
280
|
+
run.text.split(/(\r\n|\r|\n|\f|\v)/).forEach((part) => {
|
|
281
|
+
if (part === "\r\n" || part === "\r" || part === "\n" || part === "\f" || part === "\v") {
|
|
409
282
|
pushWidth();
|
|
410
283
|
return;
|
|
411
284
|
}
|
|
412
|
-
if (part)
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
285
|
+
if (part) {
|
|
286
|
+
paragraphText += part;
|
|
287
|
+
paragraphRuns.push({
|
|
288
|
+
...run,
|
|
289
|
+
text: part
|
|
290
|
+
});
|
|
291
|
+
}
|
|
416
292
|
});
|
|
417
293
|
});
|
|
418
294
|
pushWidth();
|
|
419
295
|
return widths;
|
|
420
296
|
};
|
|
421
|
-
var
|
|
422
|
-
if (line.runs.length === 0) return fontSize;
|
|
423
|
-
return Math.max(...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)));
|
|
424
|
-
};
|
|
297
|
+
var getRichTextLineBoxHeightPt = (line, fontSize, isFirstLine, fallbackFont) => getLineBoxHeightPt(fontSize, isFirstLine, line.runs.map((run) => run.fontKitFont), fallbackFont);
|
|
425
298
|
var calculateDynamicRichTextFontSize = async (arg) => {
|
|
426
299
|
const { value, schema, font, _cache, startingFontSize } = arg;
|
|
427
300
|
const { fontSize: schemaFontSize, dynamicFontSize: dynamicFontSizeSetting, characterSpacing: schemaCharacterSpacing, lineHeight = 1 } = schema;
|
|
428
301
|
const { width: boxWidth, height: boxHeight } = getBoxContentArea(schema);
|
|
429
302
|
const fontSize = startingFontSize || schemaFontSize || 13;
|
|
430
303
|
if (!dynamicFontSizeSetting) return fontSize;
|
|
431
|
-
if (dynamicFontSizeSetting.max < dynamicFontSizeSetting.min) return fontSize;
|
|
432
304
|
const resolvedRuns = await resolveRichTextRuns({
|
|
433
305
|
runs: parseInlineMarkdown(value),
|
|
434
306
|
schema,
|
|
435
307
|
font,
|
|
436
308
|
_cache
|
|
437
309
|
});
|
|
310
|
+
const fallbackFont = resolvedRuns[0]?.fontKitFont ?? await getFontKitFont(schema.fontName, font, _cache);
|
|
438
311
|
const characterSpacing = schemaCharacterSpacing ?? 0;
|
|
439
312
|
const dynamicFontFit = dynamicFontSizeSetting.fit ?? "vertical";
|
|
440
313
|
const boxWidthInPt = mm2pt(boxWidth);
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
const shouldFontGrowToFit = (totalWidthInMm, totalHeightInMm) => {
|
|
466
|
-
if (dynamicFontSize >= dynamicFontSizeSetting.max) return false;
|
|
467
|
-
if (dynamicFontFit === "horizontal") return totalWidthInMm < boxWidth;
|
|
468
|
-
return totalHeightInMm < boxHeight;
|
|
469
|
-
};
|
|
470
|
-
const shouldFontShrinkToFit = (totalWidthInMm, totalHeightInMm) => {
|
|
471
|
-
if (dynamicFontSize <= dynamicFontSizeSetting.min || dynamicFontSize <= 0) return false;
|
|
472
|
-
return totalWidthInMm > boxWidth || totalHeightInMm > boxHeight;
|
|
473
|
-
};
|
|
474
|
-
let { totalWidthInMm, totalHeightInMm } = calculateConstraints(dynamicFontSize);
|
|
475
|
-
while (shouldFontGrowToFit(totalWidthInMm, totalHeightInMm)) {
|
|
476
|
-
dynamicFontSize += FONT_SIZE_ADJUSTMENT;
|
|
477
|
-
const { totalWidthInMm: newWidth, totalHeightInMm: newHeight } = calculateConstraints(dynamicFontSize);
|
|
478
|
-
if (newHeight < boxHeight) {
|
|
479
|
-
totalWidthInMm = newWidth;
|
|
480
|
-
totalHeightInMm = newHeight;
|
|
481
|
-
} else {
|
|
482
|
-
dynamicFontSize -= FONT_SIZE_ADJUSTMENT;
|
|
483
|
-
break;
|
|
314
|
+
return fitDynamicFontSize({
|
|
315
|
+
startSize: fontSize,
|
|
316
|
+
setting: dynamicFontSizeSetting,
|
|
317
|
+
boxWidth,
|
|
318
|
+
boxHeight,
|
|
319
|
+
calculateConstraints: (size) => {
|
|
320
|
+
let totalWidthInMm = 0;
|
|
321
|
+
let totalHeightInMm = 0;
|
|
322
|
+
layoutRichTextLines({
|
|
323
|
+
runs: resolvedRuns,
|
|
324
|
+
fontSize: size,
|
|
325
|
+
characterSpacing,
|
|
326
|
+
boxWidthInPt
|
|
327
|
+
}).forEach((line, lineIndex) => {
|
|
328
|
+
if (dynamicFontFit === "vertical") totalWidthInMm = Math.max(totalWidthInMm, pt2mm(line.width));
|
|
329
|
+
totalHeightInMm += pt2mm(getRichTextLineBoxHeightPt(line, size, lineIndex === 0, fallbackFont) * lineHeight);
|
|
330
|
+
});
|
|
331
|
+
if (dynamicFontFit === "horizontal") measureParagraphWidths(resolvedRuns, size, characterSpacing).forEach((paragraphWidth) => {
|
|
332
|
+
totalWidthInMm = Math.max(totalWidthInMm, pt2mm(paragraphWidth));
|
|
333
|
+
});
|
|
334
|
+
return {
|
|
335
|
+
totalWidthInMm,
|
|
336
|
+
totalHeightInMm
|
|
337
|
+
};
|
|
484
338
|
}
|
|
485
|
-
}
|
|
486
|
-
while (shouldFontShrinkToFit(totalWidthInMm, totalHeightInMm)) {
|
|
487
|
-
dynamicFontSize -= FONT_SIZE_ADJUSTMENT;
|
|
488
|
-
({totalWidthInMm, totalHeightInMm} = calculateConstraints(dynamicFontSize));
|
|
489
|
-
}
|
|
490
|
-
return dynamicFontSize;
|
|
339
|
+
});
|
|
491
340
|
};
|
|
492
341
|
//#endregion
|
|
493
342
|
//#region src/text/measure.ts
|
|
@@ -533,9 +382,10 @@ var measureTextLines = async ({ value, schema, font = getDefaultFont(), _cache =
|
|
|
533
382
|
characterSpacing,
|
|
534
383
|
boxWidthInPt
|
|
535
384
|
});
|
|
385
|
+
const fallbackFont = resolvedRuns[0]?.fontKitFont ?? await getFontKitFont(schema.fontName, font, _cache);
|
|
536
386
|
return {
|
|
537
387
|
lines: lines.map((line) => line.runs.map((run) => run.text).join("")),
|
|
538
|
-
lineHeights: measureRichTextLineHeights(lines, resolvedFontSize, lineHeight)
|
|
388
|
+
lineHeights: measureRichTextLineHeights(lines, resolvedFontSize, lineHeight, fallbackFont)
|
|
539
389
|
};
|
|
540
390
|
}
|
|
541
391
|
const fontKitFont = await getFontKitFont(schema.fontName, font, _cache);
|
|
@@ -595,19 +445,13 @@ var getTextBoxVerticalInsetForRange = (schema, range, totalLines) => {
|
|
|
595
445
|
};
|
|
596
446
|
var measurePlainTextLineHeights = (lines, fontKitFont, fontSize, lineHeight) => {
|
|
597
447
|
if (lines.length === 0) return [];
|
|
598
|
-
|
|
599
|
-
const otherLineHeight = fontSize * lineHeight;
|
|
600
|
-
return lines.map((_, index) => pt2mm(index === 0 ? firstLineHeight : otherLineHeight));
|
|
448
|
+
return lines.map((_, index) => pt2mm(getLineBoxHeightPt(fontSize, index === 0, [fontKitFont], fontKitFont) * lineHeight));
|
|
601
449
|
};
|
|
602
|
-
var measureRichTextLineHeights = (lines, fontSize, lineHeight) => {
|
|
450
|
+
var measureRichTextLineHeights = (lines, fontSize, lineHeight, fallbackFont) => {
|
|
603
451
|
if (lines.length === 0) return [];
|
|
604
|
-
return lines.map((line, index) => pt2mm((index === 0
|
|
605
|
-
};
|
|
606
|
-
var getRichTextLineHeight = (line, fontSize) => {
|
|
607
|
-
if (line.runs.length === 0) return fontSize;
|
|
608
|
-
return Math.max(...line.runs.map((run) => heightOfFontAtSize(run.fontKitFont, fontSize)));
|
|
452
|
+
return lines.map((line, index) => pt2mm(getLineBoxHeightPt(fontSize, index === 0, line.runs.map((run) => run.fontKitFont), fallbackFont) * lineHeight));
|
|
609
453
|
};
|
|
610
454
|
//#endregion
|
|
611
|
-
export {
|
|
455
|
+
export { measureTextLines as a, sumLineHeights as c, layoutRichTextLines as d, resolveFontVariant as f, stripInlineMarkdown as g, parseInlineMarkdown as h, measureTextHeight as i, calculateDynamicRichTextFontSize as l, escapeInlineMarkdown as m, getTextLineHeightsWithBox as n, mergeTextLineRangeValue as o, resolveRichTextRuns as p, getTextSplitBoxStyle as r, plainTextLinesToValue as s, applyTextLineRange as t, isInlineMarkdownTextSchema as u };
|
|
612
456
|
|
|
613
|
-
//# sourceMappingURL=measure-
|
|
457
|
+
//# sourceMappingURL=measure-BarlRI1L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure-BarlRI1L.js","names":[],"sources":["../src/text/inlineMarkdown.ts","../src/text/richText.ts","../src/text/measure.ts"],"sourcesContent":["import { normalizeLinkHref } from '@pdfme/common';\nimport type { RichTextRun } from './types.js';\n\ntype InlineStyle = Omit<RichTextRun, 'text'>;\n\nconst MARKDOWN_ESCAPABLE_CHARS = new Set(['\\\\', '*', '~', '`', '[', ']', '(', ')']);\nconst MARKDOWN_ESCAPE_PATTERN = /[\\\\*~`[\\]()]/g;\nconst MARKDOWN_UNESCAPE_PATTERN = /\\\\([\\\\*~`[\\]()])/g;\n\nconst sameStyle = (a: InlineStyle, b: InlineStyle) =>\n Boolean(a.bold) === Boolean(b.bold) &&\n Boolean(a.italic) === Boolean(b.italic) &&\n Boolean(a.strikethrough) === Boolean(b.strikethrough) &&\n Boolean(a.code) === Boolean(b.code) &&\n a.href === b.href;\n\nconst appendRun = (runs: RichTextRun[], text: string, style: InlineStyle) => {\n if (!text) return;\n\n const lastRun = runs.at(-1);\n if (lastRun && sameStyle(lastRun, style)) {\n lastRun.text += text;\n return;\n }\n\n runs.push({\n text,\n ...(style.bold ? { bold: true } : {}),\n ...(style.italic ? { italic: true } : {}),\n ...(style.strikethrough ? { strikethrough: true } : {}),\n ...(style.code ? { code: true } : {}),\n ...(style.href ? { href: style.href } : {}),\n });\n};\n\nconst findClosingDelimiter = (value: string, delimiter: string, from: number): number => {\n for (let i = from; i < value.length; i++) {\n if (value[i] === '\\\\') {\n i += 1;\n continue;\n }\n\n if (delimiter !== '`' && value[i] === '`') {\n const codeEnd = findClosingDelimiter(value, '`', i + 1);\n if (codeEnd === -1) continue;\n i = codeEnd;\n continue;\n }\n\n if (value.startsWith(delimiter, i)) {\n return i;\n }\n }\n\n return -1;\n};\n\nconst getDelimiter = (value: string, index: number) => {\n if (value[index] === '`') return '`';\n if (value.startsWith('***', index)) return '***';\n if (value.startsWith('**', index)) return '**';\n if (value.startsWith('~~', index)) return '~~';\n if (value[index] === '*') return '*';\n return '';\n};\n\nconst findLinkLabelEnd = (value: string, from: number, to: number): number => {\n for (let index = from; index < to; index += 1) {\n if (value[index] === '\\\\') {\n index += 1;\n continue;\n }\n\n if (value[index] === ']') return index;\n }\n\n return -1;\n};\n\nconst findLinkDestinationEnd = (value: string, from: number, to: number): number => {\n let depth = 0;\n\n for (let index = from; index < to; index += 1) {\n if (value[index] === '\\\\') {\n index += 1;\n continue;\n }\n\n if (value[index] === '(') {\n depth += 1;\n continue;\n }\n\n if (value[index] === ')') {\n if (depth === 0) return index;\n depth -= 1;\n }\n }\n\n return -1;\n};\n\nconst parseLinkAt = (value: string, index: number, to: number) => {\n if (value[index] !== '[') return undefined;\n\n const labelEnd = findLinkLabelEnd(value, index + 1, to);\n if (labelEnd === -1 || value[labelEnd + 1] !== '(') return undefined;\n\n const destinationStart = labelEnd + 2;\n const destinationEnd = findLinkDestinationEnd(value, destinationStart, to);\n if (destinationEnd === -1) return undefined;\n\n const href = value\n .slice(destinationStart, destinationEnd)\n .replace(MARKDOWN_UNESCAPE_PATTERN, '$1');\n const safeHref = normalizeLinkHref(href);\n if (!safeHref) return undefined;\n\n return {\n labelStart: index + 1,\n labelEnd,\n href: safeHref,\n end: destinationEnd + 1,\n };\n};\n\nconst mergeStyle = (style: InlineStyle, delimiter: string): InlineStyle => {\n if (delimiter === '***') {\n return { ...style, bold: true, italic: true };\n }\n if (delimiter === '**') {\n return { ...style, bold: true };\n }\n if (delimiter === '*') {\n return { ...style, italic: true };\n }\n if (delimiter === '~~') {\n return { ...style, strikethrough: true };\n }\n return style;\n};\n\nconst parseRange = (value: string, from: number, to: number, style: InlineStyle): RichTextRun[] => {\n const runs: RichTextRun[] = [];\n let buffer = '';\n\n const flush = () => {\n appendRun(runs, buffer, style);\n buffer = '';\n };\n\n for (let index = from; index < to; index++) {\n const char = value[index];\n\n if (char === '\\\\' && index + 1 < to && MARKDOWN_ESCAPABLE_CHARS.has(value[index + 1])) {\n buffer += value[index + 1];\n index += 1;\n continue;\n }\n\n const link = style.href ? undefined : parseLinkAt(value, index, to);\n if (link) {\n flush();\n const nestedRuns = parseRange(value, link.labelStart, link.labelEnd, {\n ...style,\n href: link.href,\n });\n nestedRuns.forEach((run) => appendRun(runs, run.text, run));\n index = link.end - 1;\n continue;\n }\n\n const delimiter = getDelimiter(value, index);\n if (!delimiter) {\n buffer += char;\n continue;\n }\n\n const closingIndex = findClosingDelimiter(value, delimiter, index + delimiter.length);\n if (closingIndex === -1 || closingIndex + delimiter.length > to) {\n buffer += char;\n continue;\n }\n\n flush();\n\n if (delimiter === '`') {\n appendRun(\n runs,\n value.slice(index + 1, closingIndex).replace(MARKDOWN_UNESCAPE_PATTERN, '$1'),\n { ...style, code: true },\n );\n } else {\n const nestedRuns = parseRange(\n value,\n index + delimiter.length,\n closingIndex,\n mergeStyle(style, delimiter),\n );\n nestedRuns.forEach((run) => appendRun(runs, run.text, run));\n }\n\n index = closingIndex + delimiter.length - 1;\n }\n\n flush();\n return runs;\n};\n\nexport const parseInlineMarkdown = (value: string): RichTextRun[] => {\n if (!value) return [];\n return parseRange(value, 0, value.length, {});\n};\n\nexport const escapeInlineMarkdown = (value: string): string =>\n value.replace(MARKDOWN_ESCAPE_PATTERN, (char) => `\\\\${char}`);\n\nexport const stripInlineMarkdown = (value: string): string =>\n parseInlineMarkdown(value)\n .map((run) => run.text)\n .join('');\n","import { getFallbackFontName, mm2pt, pt2mm, type Font } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport {\n DEFAULT_CHARACTER_SPACING,\n DEFAULT_DYNAMIC_FIT,\n DEFAULT_FONT_SIZE,\n DEFAULT_LINE_HEIGHT,\n DEFAULT_FONT_VARIANT_FALLBACK,\n CODE_HORIZONTAL_PADDING,\n DYNAMIC_FIT_HORIZONTAL,\n DYNAMIC_FIT_VERTICAL,\n FONT_VARIANT_FALLBACK_ERROR,\n FONT_VARIANT_FALLBACK_PLAIN,\n SYNTHETIC_BOLD_OFFSET_RATIO,\n SYNTHETIC_BOLD_PDF_EXTRA_DRAWS,\n SYNTHETIC_ITALIC_SKEW_DEGREES,\n TEXT_FORMAT_INLINE_MARKDOWN,\n} from './constants.js';\nimport {\n fitDynamicFontSize,\n getFontKitFont,\n getLineBoxHeightPt,\n heightOfFontAtSize,\n widthOfTextAtSize,\n} from './helper.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport type { RichTextRun, TextSchema } from './types.js';\nimport { getBoxContentArea } from '../box.js';\nimport { countGraphemes, layoutStyledRuns } from './wrap.js';\n\nexport type ResolvedRichTextRun = RichTextRun & {\n fontName: string;\n fontKitFont: FontKitFont;\n syntheticBold: boolean;\n syntheticItalic: boolean;\n};\n\nexport type RichTextLineRun = ResolvedRichTextRun & {\n width: number;\n};\n\nexport type RichTextLine = {\n runs: RichTextLineRun[];\n width: number;\n hardBreak: boolean;\n};\n\ntype FontVariantResolution = {\n fontName: string;\n syntheticBold: boolean;\n syntheticItalic: boolean;\n};\n\nconst getBaseFontName = (schema: TextSchema, font: Font) =>\n schema.fontName && font[schema.fontName] ? schema.fontName : getFallbackFontName(font);\n\nconst getLoadedFontName = (font: Font, fontName?: string) =>\n fontName && font[fontName] ? fontName : undefined;\n\nexport const isInlineMarkdownTextSchema = (schema: TextSchema) =>\n schema.textFormat === TEXT_FORMAT_INLINE_MARKDOWN &&\n !(schema.type === 'text' && schema.readOnly !== true);\n\nexport const resolveFontVariant = (\n run: RichTextRun,\n schema: TextSchema,\n font: Font,\n): FontVariantResolution => {\n const baseFontName = getBaseFontName(schema, font);\n const variants = schema.fontVariants ?? {};\n const fallback = schema.fontVariantFallback ?? DEFAULT_FONT_VARIANT_FALLBACK;\n\n let fontName = baseFontName;\n let needsBold = Boolean(run.bold);\n let needsItalic = Boolean(run.italic);\n\n if (run.code) {\n fontName = getLoadedFontName(font, variants.code) ?? baseFontName;\n } else if (run.bold && run.italic) {\n const boldItalic = getLoadedFontName(font, variants.boldItalic);\n const italic = getLoadedFontName(font, variants.italic);\n const bold = getLoadedFontName(font, variants.bold);\n\n if (boldItalic) {\n fontName = boldItalic;\n needsBold = false;\n needsItalic = false;\n } else if (italic) {\n fontName = italic;\n needsItalic = false;\n } else if (bold) {\n fontName = bold;\n needsBold = false;\n }\n } else if (run.bold) {\n const bold = getLoadedFontName(font, variants.bold);\n if (bold) {\n fontName = bold;\n needsBold = false;\n }\n } else if (run.italic) {\n const italic = getLoadedFontName(font, variants.italic);\n if (italic) {\n fontName = italic;\n needsItalic = false;\n }\n }\n\n if (\n (needsBold || needsItalic || (run.code && !getLoadedFontName(font, variants.code))) &&\n fallback === FONT_VARIANT_FALLBACK_ERROR\n ) {\n throw new Error(\n `[@pdfme/schemas] Missing font variant for markdown text in field \"${schema.name}\".`,\n );\n }\n\n return {\n fontName,\n syntheticBold: fallback !== FONT_VARIANT_FALLBACK_PLAIN && needsBold,\n syntheticItalic: fallback !== FONT_VARIANT_FALLBACK_PLAIN && needsItalic,\n };\n};\n\nexport const resolveRichTextRuns = async (arg: {\n runs: RichTextRun[];\n schema: TextSchema;\n font: Font;\n _cache: Map<string | number, unknown>;\n}): Promise<ResolvedRichTextRun[]> => {\n const { runs, schema, font, _cache } = arg;\n const fontKitCache = new Map<string, FontKitFont>();\n\n const getResolvedFontKitFont = async (fontName: string) => {\n const cached = fontKitCache.get(fontName);\n if (cached) return cached;\n\n const fontKitFont = await getFontKitFont(fontName, font, _cache as Map<string, FontKitFont>);\n fontKitCache.set(fontName, fontKitFont);\n return fontKitFont;\n };\n\n return Promise.all(\n runs.map(async (run) => {\n const resolution = resolveFontVariant(run, schema, font);\n return {\n ...run,\n ...resolution,\n fontKitFont: await getResolvedFontKitFont(resolution.fontName),\n };\n }),\n );\n};\n\nexport const measureRunText = (\n run: ResolvedRichTextRun,\n text: string,\n fontSize: number,\n characterSpacing: number,\n) => {\n const syntheticBoldWidth = run.syntheticBold\n ? fontSize * SYNTHETIC_BOLD_OFFSET_RATIO * SYNTHETIC_BOLD_PDF_EXTRA_DRAWS\n : 0;\n const syntheticItalicWidth = run.syntheticItalic\n ? heightOfFontAtSize(run.fontKitFont, fontSize) *\n Math.tan((SYNTHETIC_ITALIC_SKEW_DEGREES * Math.PI) / 180)\n : 0;\n return (\n widthOfTextAtSize(text, run.fontKitFont, fontSize, characterSpacing) +\n syntheticBoldWidth +\n syntheticItalicWidth +\n (run.code ? CODE_HORIZONTAL_PADDING * 2 : 0)\n );\n};\n\nexport const countRichTextLineGraphemes = (line: RichTextLine) =>\n countGraphemes(line.runs.map((run) => run.text).join(''));\n\nexport const getRichTextLineText = (line: RichTextLine) =>\n line.runs.map((run) => run.text).join('');\n\nexport const layoutRichTextLines = (arg: {\n runs: ResolvedRichTextRun[];\n fontSize: number;\n characterSpacing: number;\n boxWidthInPt: number;\n}): RichTextLine[] => {\n const { runs, fontSize, characterSpacing, boxWidthInPt } = arg;\n return layoutStyledRuns(\n runs.map((run) => ({\n text: run.text,\n measure: (text) => measureRunText(run, text, fontSize, characterSpacing),\n style: run,\n })),\n boxWidthInPt,\n { characterSpacing },\n ).map((line) => ({\n runs: line.spans.map((span) => ({\n ...span.style,\n text: span.text,\n width: span.width,\n })),\n width: line.width,\n hardBreak: line.hardBreak,\n }));\n};\n\nconst measureParagraphWidths = (\n runs: ResolvedRichTextRun[],\n fontSize: number,\n characterSpacing: number,\n) => {\n const widths: number[] = [];\n let paragraphText = '';\n let paragraphRuns: ResolvedRichTextRun[] = [];\n\n const pushWidth = () => {\n if (paragraphRuns.length === 0 && paragraphText === '') {\n widths.push(0);\n return;\n }\n let width = 0;\n paragraphRuns.forEach((run, index) => {\n if (index > 0) width += characterSpacing;\n width += measureRunText(run, run.text, fontSize, characterSpacing);\n });\n widths.push(width);\n paragraphText = '';\n paragraphRuns = [];\n };\n\n runs.forEach((run) => {\n run.text.split(/(\\r\\n|\\r|\\n|\\f|\\v)/).forEach((part) => {\n if (part === '\\r\\n' || part === '\\r' || part === '\\n' || part === '\\f' || part === '\\v') {\n pushWidth();\n return;\n }\n\n if (part) {\n paragraphText += part;\n paragraphRuns.push({ ...run, text: part });\n }\n });\n });\n\n pushWidth();\n return widths;\n};\n\nexport const getRichTextLineBoxHeightPt = (\n line: RichTextLine,\n fontSize: number,\n isFirstLine: boolean,\n fallbackFont: FontKitFont,\n) =>\n getLineBoxHeightPt(\n fontSize,\n isFirstLine,\n line.runs.map((run) => run.fontKitFont),\n fallbackFont,\n );\n\nexport const calculateDynamicRichTextFontSize = async (arg: {\n value: string;\n schema: TextSchema;\n font: Font;\n _cache: Map<string | number, unknown>;\n startingFontSize?: number | undefined;\n}) => {\n const { value, schema, font, _cache, startingFontSize } = arg;\n const {\n fontSize: schemaFontSize,\n dynamicFontSize: dynamicFontSizeSetting,\n characterSpacing: schemaCharacterSpacing,\n lineHeight = DEFAULT_LINE_HEIGHT,\n } = schema;\n const { width: boxWidth, height: boxHeight } = getBoxContentArea(schema);\n const fontSize = startingFontSize || schemaFontSize || DEFAULT_FONT_SIZE;\n if (!dynamicFontSizeSetting) return fontSize;\n\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const fallbackFont =\n resolvedRuns[0]?.fontKitFont ??\n (await getFontKitFont(schema.fontName, font, _cache as Map<string, FontKitFont>));\n const characterSpacing = schemaCharacterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const dynamicFontFit = dynamicFontSizeSetting.fit ?? DEFAULT_DYNAMIC_FIT;\n const boxWidthInPt = mm2pt(boxWidth);\n\n return fitDynamicFontSize({\n startSize: fontSize,\n setting: dynamicFontSizeSetting,\n boxWidth,\n boxHeight,\n calculateConstraints: (size) => {\n let totalWidthInMm = 0;\n let totalHeightInMm = 0;\n\n const lines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize: size,\n characterSpacing,\n boxWidthInPt,\n });\n\n lines.forEach((line, lineIndex) => {\n if (dynamicFontFit === DYNAMIC_FIT_VERTICAL) {\n totalWidthInMm = Math.max(totalWidthInMm, pt2mm(line.width));\n }\n\n totalHeightInMm += pt2mm(\n getRichTextLineBoxHeightPt(line, size, lineIndex === 0, fallbackFont) * lineHeight,\n );\n });\n\n if (dynamicFontFit === DYNAMIC_FIT_HORIZONTAL) {\n measureParagraphWidths(resolvedRuns, size, characterSpacing).forEach((paragraphWidth) => {\n totalWidthInMm = Math.max(totalWidthInMm, pt2mm(paragraphWidth));\n });\n }\n\n return { totalWidthInMm, totalHeightInMm };\n },\n });\n};\n","import { getDefaultFont, mm2pt, pt2mm, type DynamicLayoutRange, type Font } from '@pdfme/common';\nimport type { Font as FontKitFont } from 'fontkit';\nimport { DEFAULT_CHARACTER_SPACING, DEFAULT_FONT_SIZE, DEFAULT_LINE_HEIGHT } from './constants.js';\nimport {\n calculateDynamicFontSize,\n getFontKitFont,\n getLineBoxHeightPt,\n splitTextToSize,\n} from './helper.js';\nimport { parseInlineMarkdown } from './inlineMarkdown.js';\nimport {\n calculateDynamicRichTextFontSize,\n isInlineMarkdownTextSchema,\n layoutRichTextLines,\n resolveRichTextRuns,\n type RichTextLine,\n} from './richText.js';\nimport type { TextSchema } from './types.js';\nimport { getTextLineRange } from '../splitRange.js';\nimport {\n getBoxContentArea,\n getBoxInsets,\n getBoxVerticalInset,\n getSplitBoxDimension,\n hasBoxDimension,\n} from '../box.js';\n\ntype MeasureTextHeightArgs = {\n value: string;\n schema: TextSchema;\n font?: Font;\n _cache?: Map<string | number, unknown>;\n ignoreDynamicFontSize?: boolean;\n};\n\ntype MeasureTextLinesResult = {\n lines: string[];\n lineHeights: number[];\n};\n\nexport const applyTextLineRange = <T>(lines: T[], range?: DynamicLayoutRange) => {\n if (!range) return lines;\n return lines.slice(range.start, range.end ?? lines.length);\n};\n\nexport const plainTextLinesToValue = (lines: string[]) =>\n lines.map((line) => line.replace(/[\\r\\n]+$/g, '')).join('\\n');\n\nconst splitReplacementTextToLines = (value: string) => {\n const lines: string[] = [];\n let start = 0;\n\n for (let i = 0; i < value.length; i += 1) {\n const charCode = value.charCodeAt(i);\n if (charCode !== 10 && charCode !== 13) continue;\n\n lines.push(value.slice(start, i));\n if (charCode === 13 && value.charCodeAt(i + 1) === 10) i += 1;\n start = i + 1;\n }\n\n lines.push(value.slice(start));\n return lines;\n};\n\nexport const measureTextLines = async ({\n value,\n schema,\n font = getDefaultFont(),\n _cache = new Map<string | number, unknown>(),\n ignoreDynamicFontSize = false,\n}: MeasureTextHeightArgs): Promise<MeasureTextLinesResult> => {\n const fontSize = schema.fontSize ?? DEFAULT_FONT_SIZE;\n const lineHeight = schema.lineHeight ?? DEFAULT_LINE_HEIGHT;\n const characterSpacing = schema.characterSpacing ?? DEFAULT_CHARACTER_SPACING;\n const boxWidthInPt = mm2pt(getBoxContentArea(schema).width);\n\n if (isInlineMarkdownTextSchema(schema)) {\n const richTextRuns = parseInlineMarkdown(value);\n const resolvedRuns = await resolveRichTextRuns({ runs: richTextRuns, schema, font, _cache });\n const resolvedFontSize =\n schema.dynamicFontSize && schema.height > 0 && !ignoreDynamicFontSize\n ? await calculateDynamicRichTextFontSize({ value, schema, font, _cache })\n : fontSize;\n const lines = layoutRichTextLines({\n runs: resolvedRuns,\n fontSize: resolvedFontSize,\n characterSpacing,\n boxWidthInPt,\n });\n\n const fallbackFont =\n resolvedRuns[0]?.fontKitFont ??\n (await getFontKitFont(schema.fontName, font, _cache as Map<string, FontKitFont>));\n return {\n lines: lines.map((line) => line.runs.map((run) => run.text).join('')),\n lineHeights: measureRichTextLineHeights(lines, resolvedFontSize, lineHeight, fallbackFont),\n };\n }\n\n const fontKitFont = await getFontKitFont(\n schema.fontName,\n font,\n _cache as Map<string, FontKitFont>,\n );\n const resolvedFontSize =\n schema.dynamicFontSize && schema.height > 0 && !ignoreDynamicFontSize\n ? calculateDynamicFontSize({ textSchema: schema, fontKitFont, value })\n : fontSize;\n const lines = splitTextToSize({\n value,\n characterSpacing,\n fontSize: resolvedFontSize,\n fontKitFont,\n boxWidthInPt,\n });\n\n return {\n lines,\n lineHeights: measurePlainTextLineHeights(lines, fontKitFont, resolvedFontSize, lineHeight),\n };\n};\n\nexport const mergeTextLineRangeValue = async ({\n value,\n replacement,\n schema,\n font = getDefaultFont(),\n _cache = new Map<string | number, unknown>(),\n}: {\n value: string;\n replacement: string;\n schema: TextSchema;\n font?: Font;\n _cache?: Map<string | number, unknown>;\n}) => {\n const range = getTextLineRange(schema);\n if (!range) return replacement;\n\n const { lines } = await measureTextLines({\n value,\n schema,\n font,\n _cache,\n ignoreDynamicFontSize: true,\n });\n const { start, end = lines.length } = range;\n const nextLines = [...lines];\n nextLines.splice(start, end - start, ...splitReplacementTextToLines(replacement));\n return plainTextLinesToValue(nextLines);\n};\n\nexport const measureTextHeight = async (args: MeasureTextHeightArgs): Promise<number> => {\n const { lineHeights } = await measureTextLines(args);\n return sumLineHeights(lineHeights) + getBoxVerticalInset(args.schema);\n};\n\nexport const sumLineHeights = (lineHeights: number[]) =>\n lineHeights.reduce((sum, height) => sum + height, 0);\n\nexport const getTextLineHeightsWithBox = (lineHeights: number[], schema: TextSchema) =>\n lineHeights.map(\n (height, index) =>\n height +\n getTextBoxVerticalInsetForRange(schema, { start: index, end: index + 1 }, lineHeights.length),\n );\n\nexport const getTextSplitBoxStyle = (\n schema: TextSchema,\n range: DynamicLayoutRange,\n totalLines: number,\n) => {\n const { borderWidth, padding } = getBoxInsets(schema);\n return {\n ...(hasBoxDimension(schema.borderWidth)\n ? { borderWidth: getSplitBoxDimension(borderWidth, range, totalLines) }\n : {}),\n ...(hasBoxDimension(schema.padding)\n ? { padding: getSplitBoxDimension(padding, range, totalLines) }\n : {}),\n };\n};\n\nexport const getTextBoxVerticalInsetForRange = (\n schema: TextSchema,\n range: DynamicLayoutRange,\n totalLines: number,\n) => {\n const { borderWidth, padding } = getBoxInsets(schema);\n const splitBorderWidth = getSplitBoxDimension(borderWidth, range, totalLines);\n const splitPadding = getSplitBoxDimension(padding, range, totalLines);\n return splitBorderWidth.top + splitBorderWidth.bottom + splitPadding.top + splitPadding.bottom;\n};\n\nconst measurePlainTextLineHeights = (\n lines: string[],\n fontKitFont: FontKitFont,\n fontSize: number,\n lineHeight: number,\n) => {\n if (lines.length === 0) return [];\n return lines.map((_, index) =>\n pt2mm(getLineBoxHeightPt(fontSize, index === 0, [fontKitFont], fontKitFont) * lineHeight),\n );\n};\n\nconst measureRichTextLineHeights = (\n lines: RichTextLine[],\n fontSize: number,\n lineHeight: number,\n fallbackFont: FontKitFont,\n) => {\n if (lines.length === 0) return [];\n return lines.map((line, index) =>\n pt2mm(\n getLineBoxHeightPt(\n fontSize,\n index === 0,\n line.runs.map((run) => run.fontKitFont),\n fallbackFont,\n ) * lineHeight,\n ),\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { MultiVariableTextSchema } from './types.js';
|
|
2
|
+
export declare const tryParseVariableMap: (variablesIn: string | Record<string, string> | undefined) => Record<string, string> | undefined;
|
|
2
3
|
export declare const substituteVariables: (text: string, variablesIn: string | Record<string, string>, valueMapper?: (value: string, variableName: string) => string) => string;
|
|
3
4
|
export declare const substituteVariablesAsInlineMarkdownLiterals: (text: string, variablesIn: string | Record<string, string>) => string;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve a read-only MVT field to display text.
|
|
7
|
+
* jsx locked fields set `contentSnapshot` and store already-substituted text
|
|
8
|
+
* in `content`. Designer templates omit that flag and store variable JSON.
|
|
9
|
+
* Never treat `content` as an expression, and never infer a snapshot from keys.
|
|
10
|
+
*/
|
|
11
|
+
export declare const resolveReadOnlyMultiVariableText: (schema: MultiVariableTextSchema, value?: string) => string;
|
|
4
12
|
export declare const validateVariables: (value: string, schema: MultiVariableTextSchema) => boolean;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PDFFont, PDFDocument } from '@pdfme/pdf-lib';
|
|
2
|
+
import { Font } from '@pdfme/common';
|
|
3
|
+
export declare const embedAndGetFont: (arg: {
|
|
4
|
+
pdfDoc: PDFDocument;
|
|
5
|
+
font: Font;
|
|
6
|
+
fontName: string;
|
|
7
|
+
_cache: Map<string | number, unknown>;
|
|
8
|
+
}) => Promise<PDFFont>;
|