ooxml-core 1.11.0 → 1.12.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.
Files changed (58) hide show
  1. package/dist/automation/index.cjs +210 -20
  2. package/dist/automation/index.mjs +210 -20
  3. package/dist/docx/embedded.cjs +1 -1
  4. package/dist/docx/embedded.mjs +1 -1
  5. package/dist/docx/index.cjs +1 -1
  6. package/dist/docx/index.mjs +1 -1
  7. package/dist/docx/layout/adapt-table.d.ts.map +1 -1
  8. package/dist/docx/layout/flow-table.d.ts.map +1 -1
  9. package/dist/docx/layout/index.cjs +145 -9
  10. package/dist/docx/layout/index.d.ts +1 -0
  11. package/dist/docx/layout/index.d.ts.map +1 -1
  12. package/dist/docx/layout/index.mjs +145 -10
  13. package/dist/docx/layout/input.d.ts +5 -0
  14. package/dist/docx/layout/input.d.ts.map +1 -1
  15. package/dist/docx/layout/layout-session.d.ts +10 -0
  16. package/dist/docx/layout/layout-session.d.ts.map +1 -0
  17. package/dist/docx/layout/nested-fragment-edges.d.ts.map +1 -1
  18. package/dist/docx/layout/paragraph-cache.d.ts +8 -0
  19. package/dist/docx/layout/paragraph-cache.d.ts.map +1 -0
  20. package/dist/docx/layout/paragraph-layout.d.ts.map +1 -1
  21. package/dist/docx/layout/paragraph-tokens.d.ts +1 -1
  22. package/dist/docx/layout/paragraph-tokens.d.ts.map +1 -1
  23. package/dist/docx/layout/table-paragraph-keeps.d.ts +14 -0
  24. package/dist/docx/layout/table-paragraph-keeps.d.ts.map +1 -0
  25. package/dist/docx/load/index.cjs +1 -1
  26. package/dist/docx/load/index.mjs +1 -1
  27. package/dist/docx/ui/index.cjs +83 -6
  28. package/dist/docx/ui/index.mjs +83 -7
  29. package/dist/docx/ui/ribbon-action-ids.d.ts +1 -1
  30. package/dist/docx/ui/ribbon-action-ids.d.ts.map +1 -1
  31. package/dist/docx/ui/word-count.d.ts +3 -0
  32. package/dist/docx/ui/word-count.d.ts.map +1 -1
  33. package/dist/geometry/element-transform.d.ts +90 -0
  34. package/dist/geometry/element-transform.d.ts.map +1 -0
  35. package/dist/geometry/index.cjs +90 -0
  36. package/dist/geometry/index.d.ts +1 -0
  37. package/dist/geometry/index.d.ts.map +1 -1
  38. package/dist/geometry/index.mjs +83 -1
  39. package/dist/index.cjs +90 -0
  40. package/dist/index.mjs +90 -0
  41. package/dist/visio/index.cjs +314 -39
  42. package/dist/visio/index.d.ts +1 -0
  43. package/dist/visio/index.d.ts.map +1 -1
  44. package/dist/visio/index.mjs +313 -40
  45. package/dist/visio/model.d.ts +12 -0
  46. package/dist/visio/model.d.ts.map +1 -1
  47. package/dist/visio/paper-sizes.d.ts +5 -0
  48. package/dist/visio/paper-sizes.d.ts.map +1 -1
  49. package/dist/visio/parser.d.ts.map +1 -1
  50. package/dist/visio/print-count.d.ts +20 -0
  51. package/dist/visio/print-count.d.ts.map +1 -0
  52. package/dist/visio/print-settings.d.ts +14 -0
  53. package/dist/visio/print-settings.d.ts.map +1 -0
  54. package/dist/visio/ui/index.cjs +194 -4
  55. package/dist/visio/ui/index.mjs +194 -4
  56. package/dist/xlsx/ui/ribbon/parts.d.ts +1 -0
  57. package/dist/xlsx/ui/ribbon/parts.d.ts.map +1 -1
  58. package/package.json +1 -1
@@ -4526,10 +4526,14 @@ function fontOf(run) {
4526
4526
  };
4527
4527
  }
4528
4528
  var graphemes2 = new Intl.Segmenter(void 0, { granularity: "grapheme" });
4529
- function runTextWidth(text2, run, measurer) {
4529
+ function runTextWidth(text2, run, measurer, font = fontOf(run)) {
4530
+ let characters = 0;
4531
+ if (run.characterSpacingPx) {
4532
+ for (const _segment of graphemes2.segment(text2)) characters++;
4533
+ }
4530
4534
  return Math.max(
4531
4535
  0,
4532
- measurer.widthOf(text2, fontOf(run)) * (run.textScalePercent ?? 100) / 100 + [...graphemes2.segment(text2)].length * (run.characterSpacingPx ?? 0)
4536
+ measurer.widthOf(text2, font) * (run.textScalePercent ?? 100) / 100 + characters * (run.characterSpacingPx ?? 0)
4533
4537
  );
4534
4538
  }
4535
4539
  function resolveIndents(paragraph) {
@@ -4663,8 +4667,45 @@ function alignFragments(fragments, width, isLastLine, effectiveAlign) {
4663
4667
  return offset === 0 ? fragments : fragments.map((f) => ({ ...f, xPx: f.xPx + offset }));
4664
4668
  }
4665
4669
 
4670
+ // docx/layout/paragraph-cache.ts
4671
+ var sessions = /* @__PURE__ */ new WeakMap();
4672
+ function registerParagraphCache(measurer) {
4673
+ sessions.set(measurer, /* @__PURE__ */ new Map());
4674
+ }
4675
+ function cachedParagraphLayout(measurer, key, note, compute) {
4676
+ const cache = sessions.get(measurer);
4677
+ if (!cache) return compute(note);
4678
+ const { index, signature } = key();
4679
+ const cached = cache.get(index);
4680
+ if (cached?.signature === signature) {
4681
+ for (const warning of cached.warnings) note(warning);
4682
+ return structuredClone(cached.result);
4683
+ }
4684
+ const warnings = [];
4685
+ const result = compute((warning) => {
4686
+ warnings.push(warning);
4687
+ note(warning);
4688
+ });
4689
+ if (!cache.has(index) && cache.size >= 4e3) cache.delete(cache.keys().next().value);
4690
+ cache.set(index, { signature, result: structuredClone(result), warnings });
4691
+ return result;
4692
+ }
4693
+
4666
4694
  // docx/layout/paragraph-layout.ts
4667
4695
  function layoutParagraph(paragraph, contentWidthPx, measurer, note, lineBox, startToken = 0) {
4696
+ if (lineBox)
4697
+ return measureParagraph(paragraph, contentWidthPx, measurer, note, lineBox, startToken);
4698
+ return cachedParagraphLayout(
4699
+ measurer,
4700
+ () => ({
4701
+ index: JSON.stringify([paragraph.id, contentWidthPx, startToken]),
4702
+ signature: JSON.stringify(paragraph)
4703
+ }),
4704
+ note,
4705
+ (report) => measureParagraph(paragraph, contentWidthPx, measurer, report, void 0, startToken)
4706
+ );
4707
+ }
4708
+ function measureParagraph(paragraph, contentWidthPx, measurer, note, lineBox, startToken = 0) {
4668
4709
  const { leftPx, rightPx, firstLineExtraPx: initialIndent } = resolveIndents(paragraph);
4669
4710
  const firstLineExtraPx = startToken ? 0 : initialIndent;
4670
4711
  const bodyWidth = Math.max(1, contentWidthPx - leftPx - rightPx);
@@ -4721,7 +4762,8 @@ function layoutParagraph(paragraph, contentWidthPx, measurer, note, lineBox, sta
4721
4762
  const tokenWidth = (token) => token.kind === "word" || token.kind === "space" ? runTextWidth(
4722
4763
  token.text,
4723
4764
  expectDefined(paragraph.runs[token.runIndex], "token run"),
4724
- measurer
4765
+ measurer,
4766
+ fonts[token.runIndex]
4725
4767
  ) : token.kind === "object" ? paragraph.runs[token.runIndex]?.object?.widthPx ?? 0 : 0;
4726
4768
  const widths = tokens.map(tokenWidth);
4727
4769
  const ends = /* @__PURE__ */ new Set(["tab", "lineBreak", "pageBreak", "columnBreak"]);
@@ -4937,8 +4979,8 @@ function nestedFrameProfile(table, tableWidthPx = table.widthPx) {
4937
4979
  var plain = (paragraph) => !paragraph.keepLines && !paragraph.keepNext && !paragraph.pageBreakBefore && !paragraph.footnotes?.length && !paragraph.runs.some((run) => run.footnoteReferenceId !== void 0 || run.breakAfter);
4938
4980
  function nestedFragmentEdges(table) {
4939
4981
  if (table.widthPx === void 0 || !Number.isFinite(table.widthPx) || table.widthPx <= 0 || table.rows.length < 2 || !nestedFrameProfile(table, table.widthPx) || table.rows.some(
4940
- (row) => row.heightPx !== void 0 || row.cantSplit || row.isHeader || row.cells.length !== 2 || row.cells.some(
4941
- (cell) => cell.verticalAlign && cell.verticalAlign !== "top" || cell.blocks?.some((block) => block.kind !== "paragraph") || !(cell.blocks ?? cell.paragraphs).every(
4982
+ (row) => row.heightPx !== void 0 || row.heightSpecified || row.cantSplit || row.isHeader || row.cells.length !== 2 || row.cells.some(
4983
+ (cell) => (cell.gridSpan ?? 1) !== 1 || cell.verticalMerge !== void 0 || cell.verticalAlign && cell.verticalAlign !== "top" || cell.blocks?.some((block) => block.kind !== "paragraph") || !(cell.blocks ?? cell.paragraphs).every(
4942
4984
  (block) => block.kind === "paragraph" && plain(block)
4943
4985
  )
4944
4986
  )
@@ -4949,10 +4991,11 @@ function nestedFragmentEdges(table) {
4949
4991
  return top.every(Boolean) && bottom.every(Boolean) ? { top, bottom } : void 0;
4950
4992
  }
4951
4993
  function reflowNestedFragments(row) {
4952
- if (row.heightPx !== void 0 || row.cantSplit || row.isHeader || row.cells.length !== 2)
4994
+ if (row.heightPx !== void 0 || row.heightSpecified || row.cantSplit || row.isHeader || row.cells.length !== 2)
4953
4995
  return false;
4954
4996
  let tables = 0;
4955
4997
  for (const cell of row.cells) {
4998
+ if ((cell.gridSpan ?? 1) !== 1 || cell.verticalMerge !== void 0) return false;
4956
4999
  if (cell.verticalAlign && cell.verticalAlign !== "top") return false;
4957
5000
  for (const [index, block] of (cell.blocks ?? cell.paragraphs).entries()) {
4958
5001
  if (block.kind === "paragraph") {
@@ -6039,6 +6082,55 @@ function placeParagraph(cursor, placement, note) {
6039
6082
  }
6040
6083
  }
6041
6084
 
6085
+ // docx/layout/table-paragraph-keeps.ts
6086
+ function tableParagraphKeeps(table) {
6087
+ const row = table.rows[0];
6088
+ if (table.rows.length !== 1 || !row || row.cells.length !== 2 || row.heightPx !== void 0 || row.heightSpecified || row.cantSplit || row.isHeader || table.widthPx === void 0 || !Number.isFinite(table.widthPx) || table.widthPx <= 0 || !nestedFrameProfile(table, table.widthPx) || row.cells.some(
6089
+ (cell) => !cell.borders?.top || (cell.gridSpan ?? 1) !== 1 || cell.verticalMerge !== void 0 || cell.verticalAlign && cell.verticalAlign !== "top" || cell.blocks?.some((block) => block.kind !== "paragraph")
6090
+ ))
6091
+ return void 0;
6092
+ const paragraphs = row.cells.flatMap(cellParagraphs);
6093
+ if (paragraphs.some(
6094
+ (p) => p.keepNext || p.pageBreakBefore || p.footnotes?.length || p.floats?.length || p.borders || p.shading || p.widowControl !== false || p.lineSpacingRule !== "exact" || p.lineSpacingTwips === void 0 || !Number.isFinite(p.lineSpacingTwips) || p.lineSpacingTwips <= 0 || (p.spacingBeforeTwips ?? 0) !== 0 || (p.spacingAfterTwips ?? 0) !== 0 || p.runs.some((run) => run.footnoteReferenceId !== void 0 || run.breakAfter || run.object)
6095
+ ))
6096
+ return void 0;
6097
+ const sources = new Map(paragraphs.map((p) => [p.id, p]));
6098
+ if (sources.size !== paragraphs.length || !paragraphs.some((p) => p.keepLines)) return void 0;
6099
+ return new TableParagraphKeeps(sources);
6100
+ }
6101
+ var TableParagraphKeeps = class {
6102
+ constructor(sources) {
6103
+ this.sources = sources;
6104
+ }
6105
+ sources;
6106
+ /** Before an ordinary row starts, a first kept paragraph can defer the entire row. */
6107
+ startupMinimum(row) {
6108
+ return Math.max(
6109
+ 0,
6110
+ ...row.cells.map((cell, index) => {
6111
+ const first3 = cell[0];
6112
+ return first3 && this.sources.get(first3.blockId)?.keepLines ? first3.yPx + first3.heightPx + (row.cellPadding?.[index]?.bottom ?? 0) : 0;
6113
+ })
6114
+ );
6115
+ }
6116
+ /** Defer an unstarted paragraph and its following cell content, leaving other cells independent. */
6117
+ cuts(row, available, fresh) {
6118
+ const cuts = /* @__PURE__ */ new Map();
6119
+ row.cells.forEach((cell, index) => {
6120
+ const padding = row.cellPadding?.[index] ?? { top: 0, bottom: 0 };
6121
+ let deferred = false;
6122
+ for (const [position, box] of cell.entries()) {
6123
+ const source = this.sources.get(box.blockId);
6124
+ const atFreshOrigin = fresh && position === 0 && Math.abs(box.yPx - padding.top) < 1e-6;
6125
+ if (!deferred && source?.keepLines && (box.lines[0]?.firstToken ?? 0) === 0 && box.yPx + box.heightPx + padding.bottom > available + 1e-6 && !atFreshOrigin)
6126
+ deferred = true;
6127
+ if (deferred) cuts.set(box.blockId, 0);
6128
+ }
6129
+ });
6130
+ return cuts.size ? cuts : void 0;
6131
+ }
6132
+ };
6133
+
6042
6134
  // docx/layout/table-note-stories.ts
6043
6135
  function independentNoteStories(cell) {
6044
6136
  const first3 = cell.blocks?.[0];
@@ -6390,6 +6482,11 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6390
6482
  const firstBodyRow = table.rows.findIndex((row) => !row.isHeader);
6391
6483
  const headerRows = table.rows.slice(0, firstBodyRow < 0 ? table.rows.length : firstBodyRow);
6392
6484
  const nativeFragments = new Map(table.rows.map((row) => [row, reflowNestedFragments(row)]));
6485
+ const paragraphKeeps = tableParagraphKeeps(table);
6486
+ const hasParagraphKeeps = table.rows.some(
6487
+ (row) => row.cells.some((cell) => cellParagraphs(cell).some((paragraph) => paragraph.keepLines))
6488
+ );
6489
+ let keepWarning = false;
6393
6490
  const xPosition = () => {
6394
6491
  const width = (table.widthPx ?? cursor.columnWidthPx) + (activeBorders ? (profile.leftPx + profile.rightPx) / 2 : 0);
6395
6492
  return table.alignment === "center" ? Math.max(0, (cursor.columnWidthPx - width) / 2) : table.alignment === "right" ? Math.max(0, cursor.columnWidthPx - width) : table.indentPx ?? 0;
@@ -6464,6 +6561,17 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6464
6561
  let remainingRow = initial;
6465
6562
  while (remainingRow) {
6466
6563
  fragmentHeight += fragmentBorders.remove(fragmentRows.at(-1));
6564
+ const keeps = paragraphKeeps && cursor.page.columns.length === 1 && cursor.column.startYPx === void 0 && Math.abs(cursor.remainingHeightPx() - (cursor.columnHeightPx - cursor.usedColumnHeightPx)) < 1e-6 ? paragraphKeeps : void 0;
6565
+ if (hasParagraphKeeps && !keeps && !keepWarning) {
6566
+ note(
6567
+ "Table-cell keep-lines pagination remains approximate outside the measured ordinary automatic two-cell, top-aligned, single-column, note-free row with direct exact-spaced paragraphs, zero paragraph spacing and widow control off."
6568
+ );
6569
+ keepWarning = true;
6570
+ }
6571
+ if (keeps && remainingRow === initial && !cursor.atColumnTop && keeps.startupMinimum(remainingRow) > cursor.remainingHeightPx() - fragmentHeight + 1e-6) {
6572
+ startNewFragment();
6573
+ continue;
6574
+ }
6467
6575
  const minimum = cantSplit ? Math.min(remainingRow.heightPx, cursor.columnHeightPx) : Math.min(
6468
6576
  ...remainingRow.cells.flatMap(
6469
6577
  (cell, index) => cell.map(
@@ -6491,7 +6599,7 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6491
6599
  continue;
6492
6600
  }
6493
6601
  }
6494
- if (footnotes) {
6602
+ if (footnotes && !keeps) {
6495
6603
  const selected = footnotes.choose(remainingRow, cantSplit);
6496
6604
  if (selected) {
6497
6605
  if (selected.layout === remainingRow) {
@@ -6563,7 +6671,17 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6563
6671
  remainingRow = null;
6564
6672
  continue;
6565
6673
  }
6566
- const { before, after } = splitRowAtHeight(remainingRow, Math.max(0, remaining));
6674
+ const paragraphCuts = keeps?.cuts(
6675
+ remainingRow,
6676
+ remaining,
6677
+ cursor.atColumnTop && fragmentRows.length === 0
6678
+ );
6679
+ const { before, after } = splitRowAtHeight(
6680
+ remainingRow,
6681
+ Math.max(0, remaining),
6682
+ void 0,
6683
+ paragraphCuts
6684
+ );
6567
6685
  if (!before.cells.some((cell) => cell.length) && cursor.atColumnTop && fragmentRows.every((row2) => row2.repeated)) {
6568
6686
  note(
6569
6687
  "A table row cannot fit a line in an empty page/column and was placed without splitting."
@@ -6575,7 +6693,7 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6575
6693
  const previousWidth = cursor.columnWidthPx;
6576
6694
  if (before.cells.some((cell) => cell.length)) fragmentRows.push(toRowBox(before, false));
6577
6695
  startNewFragment();
6578
- remainingRow = after && (previousWidth !== cursor.columnWidthPx || nativeFragments.get(row)) ? layoutRow2(
6696
+ remainingRow = after && (paragraphCuts || previousWidth !== cursor.columnWidthPx || nativeFragments.get(row)) ? layoutRow2(
6579
6697
  { ...row, heightPx: 0, heightRule: "atLeast" },
6580
6698
  cursor.columnWidthPx,
6581
6699
  measurer,
@@ -7123,6 +7241,7 @@ function border(side, theme, preserveSingleWidth = false) {
7123
7241
  function rowLayout(props) {
7124
7242
  if (!props) return {};
7125
7243
  return {
7244
+ ...props.heightTwips !== void 0 ? { heightSpecified: true } : {},
7126
7245
  ...props.heightTwips ? { heightPx: twipsToPx2(props.heightTwips), heightRule: props.heightRule ?? "atLeast" } : {},
7127
7246
  ...props.cantSplit ? { cantSplit: true } : {},
7128
7247
  ...props.header ? { isHeader: true } : {}
@@ -7187,6 +7306,8 @@ function adaptTable(table, model, adaptParagraph, _nested = false) {
7187
7306
  const fill = cssHex(visuals.shadingFill);
7188
7307
  return {
7189
7308
  paragraphs: cell.paragraphs.map(adaptParagraph),
7309
+ ...cell.gridSpan !== void 0 ? { gridSpan: cell.gridSpan } : {},
7310
+ ...cell.verticalMerge ? { verticalMerge: cell.verticalMerge } : {},
7190
7311
  ...cell.sourceBlocks ? {
7191
7312
  blocks: cellSourceBlocks(cell).map(
7192
7313
  (block) => block.type === "paragraph" ? adaptParagraph(block) : adaptTable(block, model, adaptParagraph, true)
@@ -7756,6 +7877,20 @@ function cssFontStack(family) {
7756
7877
  );
7757
7878
  }
7758
7879
 
7880
+ // docx/layout/layout-session.ts
7881
+ function createLayoutSession(measurer) {
7882
+ const sessionMeasurer = {
7883
+ widthOf: (text2, font) => measurer.widthOf(text2, font),
7884
+ lineHeightOf: (font) => measurer.lineHeightOf(font),
7885
+ ...measurer.ascentOf ? { ascentOf: measurer.ascentOf.bind(measurer) } : {}
7886
+ };
7887
+ registerParagraphCache(sessionMeasurer);
7888
+ return {
7889
+ layoutDocument: (input) => layoutDocument(input, sessionMeasurer),
7890
+ layoutDocumentModel: (model, options = {}) => layoutDocumentModel(model, sessionMeasurer, options)
7891
+ };
7892
+ }
7893
+
7759
7894
  exports.DEFAULT_FONT_FAMILY = DEFAULT_FONT_FAMILY;
7760
7895
  exports.DEFAULT_FONT_SIZE_PT = DEFAULT_FONT_SIZE_PT;
7761
7896
  exports.DEFAULT_TAB_STOP_PX = DEFAULT_TAB_STOP_PX;
@@ -7768,6 +7903,7 @@ exports.adjustForWidowOrphan = adjustForWidowOrphan;
7768
7903
  exports.appendBreakMarker = appendBreakMarker;
7769
7904
  exports.cellVerticalOffset = cellVerticalOffset;
7770
7905
  exports.createFakeMeasurer = createFakeMeasurer;
7906
+ exports.createLayoutSession = createLayoutSession;
7771
7907
  exports.cssFontStack = cssFontStack;
7772
7908
  exports.fieldDisplayText = fieldDisplayText;
7773
7909
  exports.floatPosition = floatPosition;
@@ -19,4 +19,5 @@ export type { LayoutReviewOptions } from './review-display.js';
19
19
  export { floatPosition, positionFloats, FLOAT_WRAP_NOTE } from './floats.js';
20
20
  export { cssFontStack } from './fonts.js';
21
21
  export { placeTab, type TabPlacement } from './tab-stops.js';
22
+ export { createLayoutSession } from './layout-session.js';
22
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../docx/layout/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/D,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../docx/layout/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/D,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -4524,10 +4524,14 @@ function fontOf(run) {
4524
4524
  };
4525
4525
  }
4526
4526
  var graphemes2 = new Intl.Segmenter(void 0, { granularity: "grapheme" });
4527
- function runTextWidth(text2, run, measurer) {
4527
+ function runTextWidth(text2, run, measurer, font = fontOf(run)) {
4528
+ let characters = 0;
4529
+ if (run.characterSpacingPx) {
4530
+ for (const _segment of graphemes2.segment(text2)) characters++;
4531
+ }
4528
4532
  return Math.max(
4529
4533
  0,
4530
- measurer.widthOf(text2, fontOf(run)) * (run.textScalePercent ?? 100) / 100 + [...graphemes2.segment(text2)].length * (run.characterSpacingPx ?? 0)
4534
+ measurer.widthOf(text2, font) * (run.textScalePercent ?? 100) / 100 + characters * (run.characterSpacingPx ?? 0)
4531
4535
  );
4532
4536
  }
4533
4537
  function resolveIndents(paragraph) {
@@ -4661,8 +4665,45 @@ function alignFragments(fragments, width, isLastLine, effectiveAlign) {
4661
4665
  return offset === 0 ? fragments : fragments.map((f) => ({ ...f, xPx: f.xPx + offset }));
4662
4666
  }
4663
4667
 
4668
+ // docx/layout/paragraph-cache.ts
4669
+ var sessions = /* @__PURE__ */ new WeakMap();
4670
+ function registerParagraphCache(measurer) {
4671
+ sessions.set(measurer, /* @__PURE__ */ new Map());
4672
+ }
4673
+ function cachedParagraphLayout(measurer, key, note, compute) {
4674
+ const cache = sessions.get(measurer);
4675
+ if (!cache) return compute(note);
4676
+ const { index, signature } = key();
4677
+ const cached = cache.get(index);
4678
+ if (cached?.signature === signature) {
4679
+ for (const warning of cached.warnings) note(warning);
4680
+ return structuredClone(cached.result);
4681
+ }
4682
+ const warnings = [];
4683
+ const result = compute((warning) => {
4684
+ warnings.push(warning);
4685
+ note(warning);
4686
+ });
4687
+ if (!cache.has(index) && cache.size >= 4e3) cache.delete(cache.keys().next().value);
4688
+ cache.set(index, { signature, result: structuredClone(result), warnings });
4689
+ return result;
4690
+ }
4691
+
4664
4692
  // docx/layout/paragraph-layout.ts
4665
4693
  function layoutParagraph(paragraph, contentWidthPx, measurer, note, lineBox, startToken = 0) {
4694
+ if (lineBox)
4695
+ return measureParagraph(paragraph, contentWidthPx, measurer, note, lineBox, startToken);
4696
+ return cachedParagraphLayout(
4697
+ measurer,
4698
+ () => ({
4699
+ index: JSON.stringify([paragraph.id, contentWidthPx, startToken]),
4700
+ signature: JSON.stringify(paragraph)
4701
+ }),
4702
+ note,
4703
+ (report) => measureParagraph(paragraph, contentWidthPx, measurer, report, void 0, startToken)
4704
+ );
4705
+ }
4706
+ function measureParagraph(paragraph, contentWidthPx, measurer, note, lineBox, startToken = 0) {
4666
4707
  const { leftPx, rightPx, firstLineExtraPx: initialIndent } = resolveIndents(paragraph);
4667
4708
  const firstLineExtraPx = startToken ? 0 : initialIndent;
4668
4709
  const bodyWidth = Math.max(1, contentWidthPx - leftPx - rightPx);
@@ -4719,7 +4760,8 @@ function layoutParagraph(paragraph, contentWidthPx, measurer, note, lineBox, sta
4719
4760
  const tokenWidth = (token) => token.kind === "word" || token.kind === "space" ? runTextWidth(
4720
4761
  token.text,
4721
4762
  expectDefined(paragraph.runs[token.runIndex], "token run"),
4722
- measurer
4763
+ measurer,
4764
+ fonts[token.runIndex]
4723
4765
  ) : token.kind === "object" ? paragraph.runs[token.runIndex]?.object?.widthPx ?? 0 : 0;
4724
4766
  const widths = tokens.map(tokenWidth);
4725
4767
  const ends = /* @__PURE__ */ new Set(["tab", "lineBreak", "pageBreak", "columnBreak"]);
@@ -4935,8 +4977,8 @@ function nestedFrameProfile(table, tableWidthPx = table.widthPx) {
4935
4977
  var plain = (paragraph) => !paragraph.keepLines && !paragraph.keepNext && !paragraph.pageBreakBefore && !paragraph.footnotes?.length && !paragraph.runs.some((run) => run.footnoteReferenceId !== void 0 || run.breakAfter);
4936
4978
  function nestedFragmentEdges(table) {
4937
4979
  if (table.widthPx === void 0 || !Number.isFinite(table.widthPx) || table.widthPx <= 0 || table.rows.length < 2 || !nestedFrameProfile(table, table.widthPx) || table.rows.some(
4938
- (row) => row.heightPx !== void 0 || row.cantSplit || row.isHeader || row.cells.length !== 2 || row.cells.some(
4939
- (cell) => cell.verticalAlign && cell.verticalAlign !== "top" || cell.blocks?.some((block) => block.kind !== "paragraph") || !(cell.blocks ?? cell.paragraphs).every(
4980
+ (row) => row.heightPx !== void 0 || row.heightSpecified || row.cantSplit || row.isHeader || row.cells.length !== 2 || row.cells.some(
4981
+ (cell) => (cell.gridSpan ?? 1) !== 1 || cell.verticalMerge !== void 0 || cell.verticalAlign && cell.verticalAlign !== "top" || cell.blocks?.some((block) => block.kind !== "paragraph") || !(cell.blocks ?? cell.paragraphs).every(
4940
4982
  (block) => block.kind === "paragraph" && plain(block)
4941
4983
  )
4942
4984
  )
@@ -4947,10 +4989,11 @@ function nestedFragmentEdges(table) {
4947
4989
  return top.every(Boolean) && bottom.every(Boolean) ? { top, bottom } : void 0;
4948
4990
  }
4949
4991
  function reflowNestedFragments(row) {
4950
- if (row.heightPx !== void 0 || row.cantSplit || row.isHeader || row.cells.length !== 2)
4992
+ if (row.heightPx !== void 0 || row.heightSpecified || row.cantSplit || row.isHeader || row.cells.length !== 2)
4951
4993
  return false;
4952
4994
  let tables = 0;
4953
4995
  for (const cell of row.cells) {
4996
+ if ((cell.gridSpan ?? 1) !== 1 || cell.verticalMerge !== void 0) return false;
4954
4997
  if (cell.verticalAlign && cell.verticalAlign !== "top") return false;
4955
4998
  for (const [index, block] of (cell.blocks ?? cell.paragraphs).entries()) {
4956
4999
  if (block.kind === "paragraph") {
@@ -6037,6 +6080,55 @@ function placeParagraph(cursor, placement, note) {
6037
6080
  }
6038
6081
  }
6039
6082
 
6083
+ // docx/layout/table-paragraph-keeps.ts
6084
+ function tableParagraphKeeps(table) {
6085
+ const row = table.rows[0];
6086
+ if (table.rows.length !== 1 || !row || row.cells.length !== 2 || row.heightPx !== void 0 || row.heightSpecified || row.cantSplit || row.isHeader || table.widthPx === void 0 || !Number.isFinite(table.widthPx) || table.widthPx <= 0 || !nestedFrameProfile(table, table.widthPx) || row.cells.some(
6087
+ (cell) => !cell.borders?.top || (cell.gridSpan ?? 1) !== 1 || cell.verticalMerge !== void 0 || cell.verticalAlign && cell.verticalAlign !== "top" || cell.blocks?.some((block) => block.kind !== "paragraph")
6088
+ ))
6089
+ return void 0;
6090
+ const paragraphs = row.cells.flatMap(cellParagraphs);
6091
+ if (paragraphs.some(
6092
+ (p) => p.keepNext || p.pageBreakBefore || p.footnotes?.length || p.floats?.length || p.borders || p.shading || p.widowControl !== false || p.lineSpacingRule !== "exact" || p.lineSpacingTwips === void 0 || !Number.isFinite(p.lineSpacingTwips) || p.lineSpacingTwips <= 0 || (p.spacingBeforeTwips ?? 0) !== 0 || (p.spacingAfterTwips ?? 0) !== 0 || p.runs.some((run) => run.footnoteReferenceId !== void 0 || run.breakAfter || run.object)
6093
+ ))
6094
+ return void 0;
6095
+ const sources = new Map(paragraphs.map((p) => [p.id, p]));
6096
+ if (sources.size !== paragraphs.length || !paragraphs.some((p) => p.keepLines)) return void 0;
6097
+ return new TableParagraphKeeps(sources);
6098
+ }
6099
+ var TableParagraphKeeps = class {
6100
+ constructor(sources) {
6101
+ this.sources = sources;
6102
+ }
6103
+ sources;
6104
+ /** Before an ordinary row starts, a first kept paragraph can defer the entire row. */
6105
+ startupMinimum(row) {
6106
+ return Math.max(
6107
+ 0,
6108
+ ...row.cells.map((cell, index) => {
6109
+ const first3 = cell[0];
6110
+ return first3 && this.sources.get(first3.blockId)?.keepLines ? first3.yPx + first3.heightPx + (row.cellPadding?.[index]?.bottom ?? 0) : 0;
6111
+ })
6112
+ );
6113
+ }
6114
+ /** Defer an unstarted paragraph and its following cell content, leaving other cells independent. */
6115
+ cuts(row, available, fresh) {
6116
+ const cuts = /* @__PURE__ */ new Map();
6117
+ row.cells.forEach((cell, index) => {
6118
+ const padding = row.cellPadding?.[index] ?? { top: 0, bottom: 0 };
6119
+ let deferred = false;
6120
+ for (const [position, box] of cell.entries()) {
6121
+ const source = this.sources.get(box.blockId);
6122
+ const atFreshOrigin = fresh && position === 0 && Math.abs(box.yPx - padding.top) < 1e-6;
6123
+ if (!deferred && source?.keepLines && (box.lines[0]?.firstToken ?? 0) === 0 && box.yPx + box.heightPx + padding.bottom > available + 1e-6 && !atFreshOrigin)
6124
+ deferred = true;
6125
+ if (deferred) cuts.set(box.blockId, 0);
6126
+ }
6127
+ });
6128
+ return cuts.size ? cuts : void 0;
6129
+ }
6130
+ };
6131
+
6040
6132
  // docx/layout/table-note-stories.ts
6041
6133
  function independentNoteStories(cell) {
6042
6134
  const first3 = cell.blocks?.[0];
@@ -6388,6 +6480,11 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6388
6480
  const firstBodyRow = table.rows.findIndex((row) => !row.isHeader);
6389
6481
  const headerRows = table.rows.slice(0, firstBodyRow < 0 ? table.rows.length : firstBodyRow);
6390
6482
  const nativeFragments = new Map(table.rows.map((row) => [row, reflowNestedFragments(row)]));
6483
+ const paragraphKeeps = tableParagraphKeeps(table);
6484
+ const hasParagraphKeeps = table.rows.some(
6485
+ (row) => row.cells.some((cell) => cellParagraphs(cell).some((paragraph) => paragraph.keepLines))
6486
+ );
6487
+ let keepWarning = false;
6391
6488
  const xPosition = () => {
6392
6489
  const width = (table.widthPx ?? cursor.columnWidthPx) + (activeBorders ? (profile.leftPx + profile.rightPx) / 2 : 0);
6393
6490
  return table.alignment === "center" ? Math.max(0, (cursor.columnWidthPx - width) / 2) : table.alignment === "right" ? Math.max(0, cursor.columnWidthPx - width) : table.indentPx ?? 0;
@@ -6462,6 +6559,17 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6462
6559
  let remainingRow = initial;
6463
6560
  while (remainingRow) {
6464
6561
  fragmentHeight += fragmentBorders.remove(fragmentRows.at(-1));
6562
+ const keeps = paragraphKeeps && cursor.page.columns.length === 1 && cursor.column.startYPx === void 0 && Math.abs(cursor.remainingHeightPx() - (cursor.columnHeightPx - cursor.usedColumnHeightPx)) < 1e-6 ? paragraphKeeps : void 0;
6563
+ if (hasParagraphKeeps && !keeps && !keepWarning) {
6564
+ note(
6565
+ "Table-cell keep-lines pagination remains approximate outside the measured ordinary automatic two-cell, top-aligned, single-column, note-free row with direct exact-spaced paragraphs, zero paragraph spacing and widow control off."
6566
+ );
6567
+ keepWarning = true;
6568
+ }
6569
+ if (keeps && remainingRow === initial && !cursor.atColumnTop && keeps.startupMinimum(remainingRow) > cursor.remainingHeightPx() - fragmentHeight + 1e-6) {
6570
+ startNewFragment();
6571
+ continue;
6572
+ }
6465
6573
  const minimum = cantSplit ? Math.min(remainingRow.heightPx, cursor.columnHeightPx) : Math.min(
6466
6574
  ...remainingRow.cells.flatMap(
6467
6575
  (cell, index) => cell.map(
@@ -6489,7 +6597,7 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6489
6597
  continue;
6490
6598
  }
6491
6599
  }
6492
- if (footnotes) {
6600
+ if (footnotes && !keeps) {
6493
6601
  const selected = footnotes.choose(remainingRow, cantSplit);
6494
6602
  if (selected) {
6495
6603
  if (selected.layout === remainingRow) {
@@ -6561,7 +6669,17 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6561
6669
  remainingRow = null;
6562
6670
  continue;
6563
6671
  }
6564
- const { before, after } = splitRowAtHeight(remainingRow, Math.max(0, remaining));
6672
+ const paragraphCuts = keeps?.cuts(
6673
+ remainingRow,
6674
+ remaining,
6675
+ cursor.atColumnTop && fragmentRows.length === 0
6676
+ );
6677
+ const { before, after } = splitRowAtHeight(
6678
+ remainingRow,
6679
+ Math.max(0, remaining),
6680
+ void 0,
6681
+ paragraphCuts
6682
+ );
6565
6683
  if (!before.cells.some((cell) => cell.length) && cursor.atColumnTop && fragmentRows.every((row2) => row2.repeated)) {
6566
6684
  note(
6567
6685
  "A table row cannot fit a line in an empty page/column and was placed without splitting."
@@ -6573,7 +6691,7 @@ function placeTable(cursor, table, measurer, note, resolveFootnotes) {
6573
6691
  const previousWidth = cursor.columnWidthPx;
6574
6692
  if (before.cells.some((cell) => cell.length)) fragmentRows.push(toRowBox(before, false));
6575
6693
  startNewFragment();
6576
- remainingRow = after && (previousWidth !== cursor.columnWidthPx || nativeFragments.get(row)) ? layoutRow2(
6694
+ remainingRow = after && (paragraphCuts || previousWidth !== cursor.columnWidthPx || nativeFragments.get(row)) ? layoutRow2(
6577
6695
  { ...row, heightPx: 0, heightRule: "atLeast" },
6578
6696
  cursor.columnWidthPx,
6579
6697
  measurer,
@@ -7121,6 +7239,7 @@ function border(side, theme, preserveSingleWidth = false) {
7121
7239
  function rowLayout(props) {
7122
7240
  if (!props) return {};
7123
7241
  return {
7242
+ ...props.heightTwips !== void 0 ? { heightSpecified: true } : {},
7124
7243
  ...props.heightTwips ? { heightPx: twipsToPx2(props.heightTwips), heightRule: props.heightRule ?? "atLeast" } : {},
7125
7244
  ...props.cantSplit ? { cantSplit: true } : {},
7126
7245
  ...props.header ? { isHeader: true } : {}
@@ -7185,6 +7304,8 @@ function adaptTable(table, model, adaptParagraph, _nested = false) {
7185
7304
  const fill = cssHex(visuals.shadingFill);
7186
7305
  return {
7187
7306
  paragraphs: cell.paragraphs.map(adaptParagraph),
7307
+ ...cell.gridSpan !== void 0 ? { gridSpan: cell.gridSpan } : {},
7308
+ ...cell.verticalMerge ? { verticalMerge: cell.verticalMerge } : {},
7188
7309
  ...cell.sourceBlocks ? {
7189
7310
  blocks: cellSourceBlocks(cell).map(
7190
7311
  (block) => block.type === "paragraph" ? adaptParagraph(block) : adaptTable(block, model, adaptParagraph, true)
@@ -7754,4 +7875,18 @@ function cssFontStack(family) {
7754
7875
  );
7755
7876
  }
7756
7877
 
7757
- export { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE_PT, DEFAULT_TAB_STOP_PX, FLOAT_WRAP_NOTE, NO_TWIPS, PageCursor, SINGLE_LINE_SPACING_UNITS, adaptDocumentModel, adjustForWidowOrphan, appendBreakMarker, cellVerticalOffset, createFakeMeasurer, cssFontStack, fieldDisplayText, floatPosition, fontMetrics, headerFooterForPage, isEastAsianChar, layoutDocument, layoutDocumentModel, layoutParagraph, layoutRow, layoutSections, ligatureCss, pageNumberValues, pageNumbers, paragraphFloats, placeParagraph, placeTab, placeTable, positionFloats, ptToPx, pxToTwips, sectionPageCounts, splitRowAtHeight, suppressesSpacing, tokenizeRun, twipsToPx, widowControlEnabled };
7878
+ // docx/layout/layout-session.ts
7879
+ function createLayoutSession(measurer) {
7880
+ const sessionMeasurer = {
7881
+ widthOf: (text2, font) => measurer.widthOf(text2, font),
7882
+ lineHeightOf: (font) => measurer.lineHeightOf(font),
7883
+ ...measurer.ascentOf ? { ascentOf: measurer.ascentOf.bind(measurer) } : {}
7884
+ };
7885
+ registerParagraphCache(sessionMeasurer);
7886
+ return {
7887
+ layoutDocument: (input) => layoutDocument(input, sessionMeasurer),
7888
+ layoutDocumentModel: (model, options = {}) => layoutDocumentModel(model, sessionMeasurer, options)
7889
+ };
7890
+ }
7891
+
7892
+ export { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE_PT, DEFAULT_TAB_STOP_PX, FLOAT_WRAP_NOTE, NO_TWIPS, PageCursor, SINGLE_LINE_SPACING_UNITS, adaptDocumentModel, adjustForWidowOrphan, appendBreakMarker, cellVerticalOffset, createFakeMeasurer, createLayoutSession, cssFontStack, fieldDisplayText, floatPosition, fontMetrics, headerFooterForPage, isEastAsianChar, layoutDocument, layoutDocumentModel, layoutParagraph, layoutRow, layoutSections, ligatureCss, pageNumberValues, pageNumbers, paragraphFloats, placeParagraph, placeTab, placeTable, positionFloats, ptToPx, pxToTwips, sectionPageCounts, splitRowAtHeight, suppressesSpacing, tokenizeRun, twipsToPx, widowControlEnabled };
@@ -155,6 +155,9 @@ export interface LayoutCellPadding {
155
155
  }
156
156
  export interface LayoutTableCell {
157
157
  paragraphs: LayoutParagraph[];
158
+ /** Source merge provenance, retained for bounded paragraph-keeping admission. */
159
+ gridSpan?: number;
160
+ verticalMerge?: 'restart' | 'continue';
158
161
  /** Source child order including read-only nested table stories. */
159
162
  blocks?: LayoutBlock[];
160
163
  /** Column width in CSS pixels; undefined cells share the row's remaining width evenly. */
@@ -170,6 +173,8 @@ export interface LayoutTableCell {
170
173
  }
171
174
  export interface LayoutTableRow {
172
175
  cells: LayoutTableCell[];
176
+ /** Source height provenance, including zero heights not retained by the existing box adapter. */
177
+ heightSpecified?: boolean;
173
178
  /** `w:trPr/w:cantSplit`: this row must stay on one page. */
174
179
  cantSplit?: boolean;
175
180
  /** `w:trHeight`: a minimum (`atLeast`) or fixed (`exact`) row height. */
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../docx/layout/input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../docx/layout/input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { DocumentModel } from '../index.js';
2
+ import type { LayoutDocumentInput } from './input.js';
3
+ import type { TextMeasurer } from './measure.js';
4
+ import type { LayoutReviewOptions } from './review-display.js';
5
+ /** Reuses measured paragraphs across edits. Create a new session when font metrics change. */
6
+ export declare function createLayoutSession(measurer: TextMeasurer): {
7
+ layoutDocument: (input: LayoutDocumentInput) => import("./result.js").LayoutResult;
8
+ layoutDocumentModel: (model: DocumentModel, options?: LayoutReviewOptions) => import("./result.js").LayoutResult;
9
+ };
10
+ //# sourceMappingURL=layout-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-session.d.ts","sourceRoot":"","sources":["../../../docx/layout/layout-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY;IAQxD,cAAc,UAAU,mBAAmB;IAC3C,mBAAmB,UAAU,aAAa,YAAW,mBAAmB;EAGzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"nested-fragment-edges.d.ts","sourceRoot":"","sources":["../../../docx/layout/nested-fragment-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAQ5E,+FAA+F;AAC/F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW;;;cA2BrD;AACD,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAelE"}
1
+ {"version":3,"file":"nested-fragment-edges.d.ts","sourceRoot":"","sources":["../../../docx/layout/nested-fragment-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAQ5E,+FAA+F;AAC/F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW;;;cA8BrD;AACD,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAsBlE"}
@@ -0,0 +1,8 @@
1
+ import type { TextMeasurer } from './measure.js';
2
+ import type { ParagraphLayoutResult } from './paragraph-layout.js';
3
+ export declare function registerParagraphCache(measurer: TextMeasurer): void;
4
+ export declare function cachedParagraphLayout(measurer: TextMeasurer, key: () => {
5
+ index: string;
6
+ signature: string;
7
+ }, note: (message: string) => void, compute: (note: (message: string) => void) => ParagraphLayoutResult): ParagraphLayoutResult;
8
+ //# sourceMappingURL=paragraph-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraph-cache.d.ts","sourceRoot":"","sources":["../../../docx/layout/paragraph-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAWhE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAEnE;AAED,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,MAAM;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC/C,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAAK,qBAAqB,GACjE,qBAAqB,CAkBvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"paragraph-layout.d.ts","sourceRoot":"","sources":["../../../docx/layout/paragraph-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAkB,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAe/C,MAAM,WAAW,qBAAqB;IACrC,uFAAuF;IACvF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,uEAAuE;IACvE,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC7B;AAED;;;;;;GAMG;AACH;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,CACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,KACZ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,wBAAgB,eAAe,CAC9B,SAAS,EAAE,eAAe,EAC1B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC/B,OAAO,CAAC,EAAE,SAAS,EACnB,UAAU,SAAI,GACZ,qBAAqB,CAoQvB"}
1
+ {"version":3,"file":"paragraph-layout.d.ts","sourceRoot":"","sources":["../../../docx/layout/paragraph-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,KAAK,EAAkB,UAAU,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAgB/C,MAAM,WAAW,qBAAqB;IACrC,uFAAuF;IACvF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,uEAAuE;IACvE,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,oBAAoB,CAAC;CAC7B;AAED;;;;;;GAMG;AACH;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,CACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,KACZ;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,wBAAgB,eAAe,CAC9B,SAAS,EAAE,eAAe,EAC1B,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,EAC/B,OAAO,CAAC,EAAE,SAAS,EACnB,UAAU,SAAI,GACZ,qBAAqB,CAavB"}
@@ -6,7 +6,7 @@ import type { LayoutParagraph, LayoutRun } from './input.js';
6
6
  export declare const SCRIPT_SCALE = 0.65;
7
7
  export declare function fontOf(run: LayoutRun): LayoutFontSpec;
8
8
  /** Word applies additional character spacing after scaling the glyph advances. */
9
- export declare function runTextWidth(text: string, run: LayoutRun, measurer: TextMeasurer): number;
9
+ export declare function runTextWidth(text: string, run: LayoutRun, measurer: TextMeasurer, font?: LayoutFontSpec): number;
10
10
  export declare function resolveIndents(paragraph: LayoutParagraph): {
11
11
  leftPx: number;
12
12
  rightPx: number;
@@ -1 +1 @@
1
- {"version":3,"file":"paragraph-tokens.d.ts","sourceRoot":"","sources":["../../../docx/layout/paragraph-tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAG1D,uFAAuF;AACvF,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,wBAAgB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,cAAc,CAerD;AAGD,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAMzF;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,GAAG;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CACzB,CAqBA;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAErD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG;IAC9D,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB,CA6BA;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CAClC"}
1
+ {"version":3,"file":"paragraph-tokens.d.ts","sourceRoot":"","sources":["../../../docx/layout/paragraph-tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAG1D,uFAAuF;AACvF,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,wBAAgB,MAAM,CAAC,GAAG,EAAE,SAAS,GAAG,cAAc,CAerD;AAGD,kFAAkF;AAClF,wBAAgB,YAAY,CAC3B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,YAAY,EACtB,IAAI,iBAAc,GAChB,MAAM,CAUR;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,eAAe,GAAG;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;CACzB,CAqBA;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAErD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG;IAC9D,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACrB,CA6BA;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CAClC"}