@extend-ai/react-docx 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -28,11 +28,13 @@ interface WasmOoxmlPart {
28
28
  interface WasmOoxmlPackage {
29
29
  parts: Record<string, WasmOoxmlPart>;
30
30
  binaryAssets: Record<string, Uint8Array>;
31
+ warnings?: string[];
31
32
  }
32
33
  /** Package shape produced by pre-Uint8Array versions of this library. */
33
34
  interface LegacyWasmOoxmlPackage {
34
35
  parts: Record<string, WasmOoxmlPart>;
35
36
  binaryAssets: Record<string, number[]>;
37
+ warnings?: string[];
36
38
  }
37
39
 
38
40
  interface OoxmlPart {
@@ -42,6 +44,8 @@ interface OoxmlPart {
42
44
  interface OoxmlPackage {
43
45
  parts: Map<string, OoxmlPart>;
44
46
  binaryAssets: Map<string, Uint8Array>;
47
+ /** Diagnostics produced while adapting a non-OOXML source such as legacy DOC. */
48
+ warnings?: string[];
45
49
  }
46
50
  declare function parseDocx(input: ArrayBuffer): Promise<OoxmlPackage>;
47
51
  declare function packageToArrayBuffer(pkg: OoxmlPackage): Promise<ArrayBuffer>;
@@ -413,6 +417,17 @@ interface NumberingLevelDefinition {
413
417
  format?: string;
414
418
  text?: string;
415
419
  suffix?: "tab" | "space" | "nothing";
420
+ /**
421
+ * `w:lvlRestart`: one-based level whose use restarts this level; 0 means the
422
+ * level never restarts. Absent means the OOXML default (restart when any
423
+ * shallower level is used).
424
+ */
425
+ lvlRestart?: number;
426
+ /**
427
+ * `w:isLgl`: legal numbering — every placeholder in this level's text
428
+ * renders as decimal regardless of the referenced levels' formats.
429
+ */
430
+ isLgl?: boolean;
416
431
  indent?: ParagraphIndent;
417
432
  runStyle?: TextStyle;
418
433
  bulletFontFamily?: string;
package/dist/index.d.ts CHANGED
@@ -28,11 +28,13 @@ interface WasmOoxmlPart {
28
28
  interface WasmOoxmlPackage {
29
29
  parts: Record<string, WasmOoxmlPart>;
30
30
  binaryAssets: Record<string, Uint8Array>;
31
+ warnings?: string[];
31
32
  }
32
33
  /** Package shape produced by pre-Uint8Array versions of this library. */
33
34
  interface LegacyWasmOoxmlPackage {
34
35
  parts: Record<string, WasmOoxmlPart>;
35
36
  binaryAssets: Record<string, number[]>;
37
+ warnings?: string[];
36
38
  }
37
39
 
38
40
  interface OoxmlPart {
@@ -42,6 +44,8 @@ interface OoxmlPart {
42
44
  interface OoxmlPackage {
43
45
  parts: Map<string, OoxmlPart>;
44
46
  binaryAssets: Map<string, Uint8Array>;
47
+ /** Diagnostics produced while adapting a non-OOXML source such as legacy DOC. */
48
+ warnings?: string[];
45
49
  }
46
50
  declare function parseDocx(input: ArrayBuffer): Promise<OoxmlPackage>;
47
51
  declare function packageToArrayBuffer(pkg: OoxmlPackage): Promise<ArrayBuffer>;
@@ -413,6 +417,17 @@ interface NumberingLevelDefinition {
413
417
  format?: string;
414
418
  text?: string;
415
419
  suffix?: "tab" | "space" | "nothing";
420
+ /**
421
+ * `w:lvlRestart`: one-based level whose use restarts this level; 0 means the
422
+ * level never restarts. Absent means the OOXML default (restart when any
423
+ * shallower level is used).
424
+ */
425
+ lvlRestart?: number;
426
+ /**
427
+ * `w:isLgl`: legal numbering — every placeholder in this level's text
428
+ * renders as decimal regardless of the referenced levels' formats.
429
+ */
430
+ isLgl?: boolean;
416
431
  indent?: ParagraphIndent;
417
432
  runStyle?: TextStyle;
418
433
  bulletFontFamily?: string;
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  packageToArrayBuffer,
5
5
  parseDocx,
6
6
  withPart
7
- } from "./chunk-XBI2PYTU.js";
7
+ } from "./chunk-KB6YHU6O.js";
8
8
  import {
9
9
  allocateBlockId,
10
10
  buildDocModel,
@@ -16,14 +16,14 @@ import {
16
16
  deepFreezeDocModel,
17
17
  ensureDocModelBlockIds,
18
18
  normalizeDocModel
19
- } from "./chunk-YE7GQOST.js";
19
+ } from "./chunk-4CPXLVFB.js";
20
20
  import {
21
21
  initWasm,
22
22
  mapsToWasmPackage,
23
23
  setWasmSource,
24
24
  wasmModelToDocumentXml,
25
25
  wasmSerializeDocx
26
- } from "./chunk-WKBPLHUA.js";
26
+ } from "./chunk-THNPK4N7.js";
27
27
 
28
28
  // src/index.tsx
29
29
  import * as React2 from "react";
@@ -333,8 +333,8 @@ async function importDocxOnMainThread(buffer, signal) {
333
333
  }
334
334
  const startedAt = performanceNow();
335
335
  const [{ parseDocx: parseDocx2 }, { buildDocModel: buildDocModel2, ensureDocModelBlockIds: ensureDocModelBlockIds2 }] = await Promise.all([
336
- import("./src-2FP7IUE6.js"),
337
- import("./src-AEHDFCS5.js")
336
+ import("./src-JS3OX73I.js"),
337
+ import("./src-KC2H22CB.js")
338
338
  ]);
339
339
  const pkg = await parseDocx2(buffer);
340
340
  const parsedAt = performanceNow();
@@ -440,7 +440,7 @@ async function importDocxBuffer(buffer, options = {}) {
440
440
  }
441
441
  });
442
442
  const result = await workerResult;
443
- const { ensureDocModelBlockIds: ensureDocModelBlockIds2 } = await import("./src-AEHDFCS5.js");
443
+ const { ensureDocModelBlockIds: ensureDocModelBlockIds2 } = await import("./src-KC2H22CB.js");
444
444
  ensureDocModelBlockIds2(result.model);
445
445
  return result;
446
446
  }
@@ -3327,7 +3327,7 @@ async function serializeDocModel(model, basePackage) {
3327
3327
  model,
3328
3328
  basePackage ? mapsToWasmPackage(basePackage) : void 0
3329
3329
  );
3330
- const { parseDocx: parseDocx2 } = await import("./src-2FP7IUE6.js");
3330
+ const { parseDocx: parseDocx2 } = await import("./src-JS3OX73I.js");
3331
3331
  return parseDocx2(bytes);
3332
3332
  }
3333
3333
  async function serializeDocx(model, basePackage) {
@@ -15135,14 +15135,53 @@ function resolveListParagraphIndent(paragraph, numberingDefinitions) {
15135
15135
  hangingTwips: nextHangingTwips
15136
15136
  };
15137
15137
  }
15138
- function resolveNumberingMarkerBoxWidthPx(paragraph, numberingDefinitions, numberingLabel) {
15138
+ function numberingIndentCandidateWidthPx(paragraph, numberingDefinitions) {
15139
15139
  const resolvedIndent = resolveListParagraphIndent(
15140
15140
  paragraph,
15141
15141
  numberingDefinitions
15142
15142
  );
15143
15143
  const hangingIndentPx = twipsToSignedPixels(resolvedIndent?.hangingTwips);
15144
15144
  const firstLineIndentPx = twipsToSignedPixels(resolvedIndent?.firstLineTwips);
15145
- const candidateWidthPx = Number.isFinite(hangingIndentPx) && Math.abs(hangingIndentPx) > 0 ? Math.abs(hangingIndentPx) : Number.isFinite(firstLineIndentPx) && firstLineIndentPx < 0 ? Math.abs(firstLineIndentPx) : void 0;
15145
+ return Number.isFinite(hangingIndentPx) && Math.abs(hangingIndentPx) > 0 ? Math.abs(hangingIndentPx) : Number.isFinite(firstLineIndentPx) && firstLineIndentPx < 0 ? Math.abs(firstLineIndentPx) : void 0;
15146
+ }
15147
+ function resolvedNumberingLevelForParagraph(paragraph, numberingDefinitions) {
15148
+ const numbering = paragraph.style?.numbering;
15149
+ if (!numberingDefinitions || !numbering || !Number.isFinite(numbering.numId) || numbering.numId <= 0) {
15150
+ return void 0;
15151
+ }
15152
+ const effectiveNumId = effectiveNumberingNumIdForParagraph(paragraph, numberingDefinitions) ?? numbering.numId;
15153
+ return findNumberingLevelDefinition(
15154
+ numberingDefinitions,
15155
+ effectiveNumId,
15156
+ Math.max(0, Math.round(numbering.ilvl ?? 0))
15157
+ );
15158
+ }
15159
+ function numberingTabAdvanceWidthPx(paragraph, numberingDefinitions, numberingLabel) {
15160
+ if (!numberingLabel?.text || numberingLabel.imageSrc || isTableOfContentsParagraph(paragraph)) {
15161
+ return void 0;
15162
+ }
15163
+ const level = resolvedNumberingLevelForParagraph(
15164
+ paragraph,
15165
+ numberingDefinitions
15166
+ );
15167
+ const suffix = level?.suffix ?? "tab";
15168
+ if (suffix !== "tab") {
15169
+ return void 0;
15170
+ }
15171
+ const labelWidthPx = Math.ceil(
15172
+ measureTextWidthPx2(
15173
+ numberingLabel.text.replace(/\t/g, " ").replace(/\u00a0/g, " "),
15174
+ numberingLabel.style,
15175
+ paragraphBaseFontSizePx(paragraph)
15176
+ )
15177
+ );
15178
+ return (Math.floor(labelWidthPx / DEFAULT_TAB_STOP_PX) + 1) * DEFAULT_TAB_STOP_PX;
15179
+ }
15180
+ function resolveNumberingMarkerBoxWidthPx(paragraph, numberingDefinitions, numberingLabel) {
15181
+ const candidateWidthPx = numberingIndentCandidateWidthPx(
15182
+ paragraph,
15183
+ numberingDefinitions
15184
+ );
15146
15185
  const labelTextForWidth = numberingLabel?.imageSrc ? numberingLabel.trailingText ?? "" : numberingLabel?.text ?? "";
15147
15186
  const normalizedLabelTextForWidth = labelTextForWidth.replace(/\t/g, " ").replace(/\u00a0/g, " ");
15148
15187
  const measuredLabelWidthPx = normalizedLabelTextForWidth.length > 0 ? Math.ceil(
@@ -15168,6 +15207,18 @@ function resolveNumberingMarkerBoxWidthPx(paragraph, numberingDefinitions, numbe
15168
15207
  tocMarkerTargetWidthPx
15169
15208
  );
15170
15209
  if (!Number.isFinite(candidateWidthPx) || candidateWidthPx < 8) {
15210
+ const tabAdvanceWidthPx = numberingTabAdvanceWidthPx(
15211
+ paragraph,
15212
+ numberingDefinitions,
15213
+ numberingLabel
15214
+ );
15215
+ if (tabAdvanceWidthPx !== void 0) {
15216
+ return clampNumber(
15217
+ Math.round(Math.max(tabAdvanceWidthPx, minimumVisualWidthPx)),
15218
+ 8,
15219
+ 220
15220
+ );
15221
+ }
15171
15222
  return minimumVisualWidthPx > 0 ? clampNumber(Math.round(minimumVisualWidthPx), 8, 220) : void 0;
15172
15223
  }
15173
15224
  return Math.max(
@@ -15182,11 +15233,16 @@ function numberingMarkerStyle(paragraph, numberingDefinitions, numberingLabel, b
15182
15233
  numberingLabel
15183
15234
  );
15184
15235
  const markerGapPx = isTableOfContentsParagraph(paragraph) ? 6 : markerBoxWidthPx ? 0 : 2;
15236
+ const tabSynthesized = markerBoxWidthPx !== void 0 && numberingIndentCandidateWidthPx(paragraph, numberingDefinitions) === void 0 && numberingTabAdvanceWidthPx(
15237
+ paragraph,
15238
+ numberingDefinitions,
15239
+ numberingLabel
15240
+ ) !== void 0;
15185
15241
  return {
15186
15242
  ...baseStyle ?? {},
15187
15243
  display: "inline-flex",
15188
15244
  alignItems: "baseline",
15189
- justifyContent: "flex-end",
15245
+ justifyContent: tabSynthesized ? "flex-start" : "flex-end",
15190
15246
  verticalAlign: "baseline",
15191
15247
  width: markerBoxWidthPx ? `${markerBoxWidthPx}px` : void 0,
15192
15248
  minWidth: markerBoxWidthPx ? `${markerBoxWidthPx}px` : "1.1em",
@@ -18209,40 +18265,157 @@ function numberToLetters(value) {
18209
18265
  if (!Number.isFinite(value) || value <= 0) {
18210
18266
  return "";
18211
18267
  }
18212
- let remaining = Math.floor(value);
18213
- let output = "";
18214
- while (remaining > 0) {
18215
- const offset = (remaining - 1) % 26;
18216
- output = String.fromCharCode(65 + offset) + output;
18217
- remaining = Math.floor((remaining - 1) / 26);
18268
+ const rounded = Math.floor(value);
18269
+ const letter = String.fromCharCode(65 + (rounded - 1) % 26);
18270
+ return letter.repeat(Math.floor((rounded - 1) / 26) + 1);
18271
+ }
18272
+ var CARDINAL_ONES = [
18273
+ "zero",
18274
+ "one",
18275
+ "two",
18276
+ "three",
18277
+ "four",
18278
+ "five",
18279
+ "six",
18280
+ "seven",
18281
+ "eight",
18282
+ "nine",
18283
+ "ten",
18284
+ "eleven",
18285
+ "twelve",
18286
+ "thirteen",
18287
+ "fourteen",
18288
+ "fifteen",
18289
+ "sixteen",
18290
+ "seventeen",
18291
+ "eighteen",
18292
+ "nineteen"
18293
+ ];
18294
+ var CARDINAL_TENS = [
18295
+ "",
18296
+ "",
18297
+ "twenty",
18298
+ "thirty",
18299
+ "forty",
18300
+ "fifty",
18301
+ "sixty",
18302
+ "seventy",
18303
+ "eighty",
18304
+ "ninety"
18305
+ ];
18306
+ var ORDINAL_ONES = [
18307
+ "zeroth",
18308
+ "first",
18309
+ "second",
18310
+ "third",
18311
+ "fourth",
18312
+ "fifth",
18313
+ "sixth",
18314
+ "seventh",
18315
+ "eighth",
18316
+ "ninth",
18317
+ "tenth",
18318
+ "eleventh",
18319
+ "twelfth",
18320
+ "thirteenth",
18321
+ "fourteenth",
18322
+ "fifteenth",
18323
+ "sixteenth",
18324
+ "seventeenth",
18325
+ "eighteenth",
18326
+ "nineteenth"
18327
+ ];
18328
+ var ORDINAL_TENS = [
18329
+ "",
18330
+ "",
18331
+ "twentieth",
18332
+ "thirtieth",
18333
+ "fortieth",
18334
+ "fiftieth",
18335
+ "sixtieth",
18336
+ "seventieth",
18337
+ "eightieth",
18338
+ "ninetieth"
18339
+ ];
18340
+ function numberToCardinalText(value) {
18341
+ if (value < 20) {
18342
+ return CARDINAL_ONES[value];
18343
+ }
18344
+ if (value < 100) {
18345
+ const tens = Math.floor(value / 10);
18346
+ const ones = value % 10;
18347
+ return ones === 0 ? CARDINAL_TENS[tens] : `${CARDINAL_TENS[tens]}-${CARDINAL_ONES[ones]}`;
18348
+ }
18349
+ if (value < 1e3) {
18350
+ const hundreds = Math.floor(value / 100);
18351
+ const rest = value % 100;
18352
+ const head = `${CARDINAL_ONES[hundreds]} hundred`;
18353
+ return rest === 0 ? head : `${head} ${numberToCardinalText(rest)}`;
18354
+ }
18355
+ return String(value);
18356
+ }
18357
+ function numberToOrdinalText(value) {
18358
+ if (value < 20) {
18359
+ return ORDINAL_ONES[value];
18360
+ }
18361
+ if (value < 100) {
18362
+ const tens = Math.floor(value / 10);
18363
+ const ones = value % 10;
18364
+ return ones === 0 ? ORDINAL_TENS[tens] : `${CARDINAL_TENS[tens]}-${ORDINAL_ONES[ones]}`;
18365
+ }
18366
+ if (value < 1e3) {
18367
+ const hundreds = Math.floor(value / 100);
18368
+ const rest = value % 100;
18369
+ return rest === 0 ? `${CARDINAL_ONES[hundreds]} hundredth` : `${CARDINAL_ONES[hundreds]} hundred ${numberToOrdinalText(rest)}`;
18370
+ }
18371
+ return String(value);
18372
+ }
18373
+ function numberToOrdinalDigits(value) {
18374
+ const mod100 = value % 100;
18375
+ if (mod100 >= 11 && mod100 <= 13) {
18376
+ return `${value}th`;
18377
+ }
18378
+ switch (value % 10) {
18379
+ case 1:
18380
+ return `${value}st`;
18381
+ case 2:
18382
+ return `${value}nd`;
18383
+ case 3:
18384
+ return `${value}rd`;
18385
+ default:
18386
+ return `${value}th`;
18218
18387
  }
18219
- return output;
18220
18388
  }
18221
18389
  function formatNumberingCounter(format, value) {
18222
- if (!Number.isFinite(value) || value <= 0) {
18390
+ if (!Number.isFinite(value) || value < 0) {
18223
18391
  return "";
18224
18392
  }
18393
+ const rounded = Math.round(value);
18225
18394
  switch ((format ?? "decimal").toLowerCase()) {
18226
18395
  case "decimal":
18227
- return String(value);
18396
+ return String(rounded);
18397
+ case "decimalzero":
18398
+ return rounded < 10 ? `0${rounded}` : String(rounded);
18228
18399
  case "upperroman":
18229
- return numberToRoman(value);
18400
+ return rounded === 0 ? String(rounded) : numberToRoman(rounded);
18230
18401
  case "lowerroman":
18231
- return numberToRoman(value).toLowerCase();
18402
+ return rounded === 0 ? String(rounded) : numberToRoman(rounded).toLowerCase();
18232
18403
  case "upperletter":
18233
- return numberToLetters(value);
18404
+ return rounded === 0 ? String(rounded) : numberToLetters(rounded);
18234
18405
  case "lowerletter":
18235
- return numberToLetters(value).toLowerCase();
18406
+ return rounded === 0 ? String(rounded) : numberToLetters(rounded).toLowerCase();
18236
18407
  case "ordinal":
18408
+ return numberToOrdinalDigits(rounded);
18237
18409
  case "cardinaltext":
18410
+ return numberToCardinalText(rounded);
18238
18411
  case "ordinaltext":
18239
- return String(value);
18412
+ return numberToOrdinalText(rounded);
18240
18413
  case "bullet":
18241
18414
  return "\u2022";
18242
18415
  case "none":
18243
18416
  return "";
18244
18417
  default:
18245
- return String(value);
18418
+ return String(rounded);
18246
18419
  }
18247
18420
  }
18248
18421
  function formatPageFieldValue(value, format) {
@@ -18357,10 +18530,10 @@ function numberingStartValue(numbering, numId, ilvl) {
18357
18530
  const instance = numbering.instances.find((item) => item.numId === numId);
18358
18531
  const override = instance?.levelStartOverrides?.[String(ilvl)];
18359
18532
  if (Number.isFinite(override)) {
18360
- return Math.max(1, Math.round(override));
18533
+ return Math.max(0, Math.round(override));
18361
18534
  }
18362
18535
  const level = findNumberingLevelDefinition(numbering, numId, ilvl);
18363
- if (Number.isFinite(level?.start) && level?.start > 0) {
18536
+ if (Number.isFinite(level?.start) && level?.start >= 0) {
18364
18537
  return Math.round(level?.start);
18365
18538
  }
18366
18539
  return 1;
@@ -18431,14 +18604,27 @@ function buildParagraphNumberingLabels(model) {
18431
18604
  if (!template || template.trim().length === 0) {
18432
18605
  return;
18433
18606
  }
18607
+ const restartTriggerCeiling = (levelIndex) => {
18608
+ const rawRestart = findNumberingLevelDefinition(
18609
+ numbering,
18610
+ numId,
18611
+ levelIndex
18612
+ )?.lvlRestart;
18613
+ if (rawRestart === void 0 || !Number.isFinite(rawRestart) || Math.round(rawRestart) > levelIndex) {
18614
+ return levelIndex - 1;
18615
+ }
18616
+ const restart = Math.round(rawRestart);
18617
+ return restart <= 0 ? -1 : restart - 1;
18618
+ };
18619
+ const currentRestartCeiling = restartTriggerCeiling(ilvl);
18434
18620
  const counters = countersByNumId.get(numId) ?? [];
18435
18621
  const sharedAbstractCounters = Number.isFinite(abstractNumId) ? abstractCountersByAbstractNumId.get(abstractNumId) ?? [] : void 0;
18436
18622
  let parentCountersChanged = false;
18437
18623
  for (let index = 0; index < ilvl; index += 1) {
18438
- const abstractCounterValue = sharedAbstractCounters && Number.isFinite(sharedAbstractCounters[index]) ? Math.max(1, Math.round(sharedAbstractCounters[index])) : void 0;
18624
+ const abstractCounterValue = sharedAbstractCounters && Number.isFinite(sharedAbstractCounters[index]) ? Math.max(0, Math.round(sharedAbstractCounters[index])) : void 0;
18439
18625
  if (abstractCounterValue !== void 0) {
18440
18626
  const previousCounter = counters[index];
18441
- if (!Number.isFinite(previousCounter) || Math.max(1, Math.round(previousCounter)) !== abstractCounterValue) {
18627
+ if ((!Number.isFinite(previousCounter) || Math.max(0, Math.round(previousCounter)) !== abstractCounterValue) && index <= currentRestartCeiling) {
18442
18628
  parentCountersChanged = true;
18443
18629
  }
18444
18630
  counters[index] = abstractCounterValue;
@@ -18451,7 +18637,9 @@ function buildParagraphNumberingLabels(model) {
18451
18637
  const currentValue = parentCountersChanged ? void 0 : counters[ilvl];
18452
18638
  counters[ilvl] = Number.isFinite(currentValue) ? currentValue + 1 : numberingStartValue(numbering, numId, ilvl);
18453
18639
  for (let index = ilvl + 1; index < counters.length; index += 1) {
18454
- counters[index] = void 0;
18640
+ if (ilvl <= restartTriggerCeiling(index)) {
18641
+ counters[index] = void 0;
18642
+ }
18455
18643
  }
18456
18644
  countersByNumId.set(numId, counters);
18457
18645
  if (sharedAbstractCounters && Number.isFinite(abstractNumId)) {
@@ -18459,7 +18647,9 @@ function buildParagraphNumberingLabels(model) {
18459
18647
  sharedAbstractCounters[index] = counters[index];
18460
18648
  }
18461
18649
  for (let index = ilvl + 1; index < sharedAbstractCounters.length; index += 1) {
18462
- sharedAbstractCounters[index] = void 0;
18650
+ if (ilvl <= restartTriggerCeiling(index)) {
18651
+ sharedAbstractCounters[index] = void 0;
18652
+ }
18463
18653
  }
18464
18654
  abstractCountersByAbstractNumId.set(
18465
18655
  abstractNumId,
@@ -18469,12 +18659,8 @@ function buildParagraphNumberingLabels(model) {
18469
18659
  const label = template.replaceAll(/%(\d+)/g, (_, rawLevel) => {
18470
18660
  const levelIndex = Math.max(0, Number(rawLevel) - 1);
18471
18661
  const levelValue = counters[levelIndex];
18472
- const safeValue = Number.isFinite(levelValue) ? Math.max(1, Math.round(levelValue)) : numberingStartValue(numbering, numId, levelIndex);
18473
- const levelFormat = findNumberingLevelDefinition(
18474
- numbering,
18475
- numId,
18476
- levelIndex
18477
- )?.format;
18662
+ const safeValue = Number.isFinite(levelValue) ? Math.max(0, Math.round(levelValue)) : numberingStartValue(numbering, numId, levelIndex);
18663
+ const levelFormat = level?.isLgl ? "decimal" : findNumberingLevelDefinition(numbering, numId, levelIndex)?.format;
18478
18664
  return formatNumberingCounter(levelFormat, safeValue);
18479
18665
  });
18480
18666
  if (!label || label.trim().length === 0) {