docxmlater 9.5.38 → 9.6.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 (131) hide show
  1. package/dist/core/Document.d.ts +13 -82
  2. package/dist/core/Document.d.ts.map +1 -1
  3. package/dist/core/Document.js +89 -1696
  4. package/dist/core/Document.js.map +1 -1
  5. package/dist/core/DocumentContent.d.ts +5 -1
  6. package/dist/core/DocumentContent.d.ts.map +1 -1
  7. package/dist/core/DocumentContent.js.map +1 -1
  8. package/dist/core/DocumentGenerator.d.ts +5 -1
  9. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  10. package/dist/core/DocumentGenerator.js.map +1 -1
  11. package/dist/core/DocumentParser.d.ts +6 -1
  12. package/dist/core/DocumentParser.d.ts.map +1 -1
  13. package/dist/core/DocumentParser.js +462 -45
  14. package/dist/core/DocumentParser.js.map +1 -1
  15. package/dist/core/DocumentValidator.d.ts +5 -1
  16. package/dist/core/DocumentValidator.d.ts.map +1 -1
  17. package/dist/core/DocumentValidator.js.map +1 -1
  18. package/dist/core/ListNormalizer.d.ts.map +1 -1
  19. package/dist/core/ListNormalizer.js +3 -5
  20. package/dist/core/ListNormalizer.js.map +1 -1
  21. package/dist/elements/AlternateContent.d.ts +9 -0
  22. package/dist/elements/AlternateContent.d.ts.map +1 -0
  23. package/dist/elements/AlternateContent.js +23 -0
  24. package/dist/elements/AlternateContent.js.map +1 -0
  25. package/dist/elements/CustomXml.d.ts +9 -0
  26. package/dist/elements/CustomXml.d.ts.map +1 -0
  27. package/dist/elements/CustomXml.js +23 -0
  28. package/dist/elements/CustomXml.js.map +1 -0
  29. package/dist/elements/Field.d.ts.map +1 -1
  30. package/dist/elements/Field.js +3 -2
  31. package/dist/elements/Field.js.map +1 -1
  32. package/dist/elements/Hyperlink.d.ts +3 -1
  33. package/dist/elements/Hyperlink.d.ts.map +1 -1
  34. package/dist/elements/Image.d.ts +9 -0
  35. package/dist/elements/Image.d.ts.map +1 -1
  36. package/dist/elements/Image.js +39 -17
  37. package/dist/elements/Image.js.map +1 -1
  38. package/dist/elements/ImageManager.d.ts.map +1 -1
  39. package/dist/elements/ImageManager.js +2 -1
  40. package/dist/elements/ImageManager.js.map +1 -1
  41. package/dist/elements/MathElement.d.ts +16 -0
  42. package/dist/elements/MathElement.d.ts.map +1 -0
  43. package/dist/elements/MathElement.js +42 -0
  44. package/dist/elements/MathElement.js.map +1 -0
  45. package/dist/elements/Paragraph.d.ts +5 -3
  46. package/dist/elements/Paragraph.d.ts.map +1 -1
  47. package/dist/elements/Paragraph.js +4 -0
  48. package/dist/elements/Paragraph.js.map +1 -1
  49. package/dist/elements/PreservedElement.d.ts +14 -0
  50. package/dist/elements/PreservedElement.d.ts.map +1 -0
  51. package/dist/elements/PreservedElement.js +33 -0
  52. package/dist/elements/PreservedElement.js.map +1 -0
  53. package/dist/elements/Run.d.ts +18 -1
  54. package/dist/elements/Run.d.ts.map +1 -1
  55. package/dist/elements/Run.js +137 -10
  56. package/dist/elements/Run.js.map +1 -1
  57. package/dist/elements/Section.d.ts +23 -1
  58. package/dist/elements/Section.d.ts.map +1 -1
  59. package/dist/elements/Section.js +82 -3
  60. package/dist/elements/Section.js.map +1 -1
  61. package/dist/elements/Shape.d.ts +4 -1
  62. package/dist/elements/Shape.d.ts.map +1 -1
  63. package/dist/elements/Shape.js +16 -1
  64. package/dist/elements/Shape.js.map +1 -1
  65. package/dist/elements/Table.d.ts +4 -0
  66. package/dist/elements/Table.d.ts.map +1 -1
  67. package/dist/elements/Table.js +14 -0
  68. package/dist/elements/Table.js.map +1 -1
  69. package/dist/elements/TableRow.d.ts +11 -0
  70. package/dist/elements/TableRow.d.ts.map +1 -1
  71. package/dist/elements/TableRow.js +40 -0
  72. package/dist/elements/TableRow.js.map +1 -1
  73. package/dist/elements/TextBox.d.ts +1 -0
  74. package/dist/elements/TextBox.d.ts.map +1 -1
  75. package/dist/elements/TextBox.js +26 -1
  76. package/dist/elements/TextBox.js.map +1 -1
  77. package/dist/formatting/AbstractNumbering.js.map +1 -1
  78. package/dist/formatting/Style.d.ts.map +1 -1
  79. package/dist/formatting/Style.js +2 -1
  80. package/dist/formatting/Style.js.map +1 -1
  81. package/dist/formatting/StylesManager.js.map +1 -1
  82. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  83. package/dist/helpers/CleanupHelper.js +40 -6
  84. package/dist/helpers/CleanupHelper.js.map +1 -1
  85. package/dist/index.d.ts +59 -55
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +220 -209
  88. package/dist/index.js.map +1 -1
  89. package/dist/ms-doc/converter/DocToDocxConverter.js.map +1 -1
  90. package/dist/ms-doc/properties/SPRM.d.ts.map +1 -1
  91. package/dist/ms-doc/properties/SPRM.js +2 -1
  92. package/dist/ms-doc/properties/SPRM.js.map +1 -1
  93. package/dist/tracking/DocumentTrackingContext.d.ts +7 -7
  94. package/dist/tracking/DocumentTrackingContext.d.ts.map +1 -1
  95. package/dist/tracking/DocumentTrackingContext.js +4 -3
  96. package/dist/tracking/DocumentTrackingContext.js.map +1 -1
  97. package/dist/tracking/TrackingContext.d.ts +14 -9
  98. package/dist/tracking/TrackingContext.d.ts.map +1 -1
  99. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  100. package/dist/utils/corruptionDetection.d.ts +5 -1
  101. package/dist/utils/corruptionDetection.d.ts.map +1 -1
  102. package/dist/utils/corruptionDetection.js.map +1 -1
  103. package/dist/utils/deepClone.js.map +1 -1
  104. package/dist/utils/diagnostics.d.ts +4 -4
  105. package/dist/utils/diagnostics.d.ts.map +1 -1
  106. package/dist/utils/diagnostics.js.map +1 -1
  107. package/dist/utils/formatting.d.ts +2 -2
  108. package/dist/utils/formatting.d.ts.map +1 -1
  109. package/dist/utils/formatting.js +1 -1
  110. package/dist/utils/formatting.js.map +1 -1
  111. package/dist/utils/units.d.ts +3 -0
  112. package/dist/utils/units.d.ts.map +1 -1
  113. package/dist/utils/units.js +9 -0
  114. package/dist/utils/units.js.map +1 -1
  115. package/dist/validation/RevisionAutoFixer.d.ts +3 -1
  116. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  117. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  118. package/dist/validation/ValidationRules.d.ts +2 -2
  119. package/dist/validation/ValidationRules.d.ts.map +1 -1
  120. package/dist/xml/XMLBuilder.d.ts +3 -1
  121. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  122. package/dist/xml/XMLBuilder.js.map +1 -1
  123. package/dist/zip/ZipReader.d.ts.map +1 -1
  124. package/dist/zip/ZipReader.js +4 -2
  125. package/dist/zip/ZipReader.js.map +1 -1
  126. package/dist/zip/ZipWriter.js.map +1 -1
  127. package/package.json +1 -1
  128. package/dist/core/BaseManager.d.ts +0 -21
  129. package/dist/core/BaseManager.d.ts.map +0 -1
  130. package/dist/core/BaseManager.js +0 -86
  131. package/dist/core/BaseManager.js.map +0 -1
@@ -47,8 +47,6 @@ const RangeMarker_1 = require("../elements/RangeMarker");
47
47
  const Revision_1 = require("../elements/Revision");
48
48
  const RevisionManager_1 = require("../elements/RevisionManager");
49
49
  const Run_1 = require("../elements/Run");
50
- const Shape_1 = require("../elements/Shape");
51
- const TextBox_1 = require("../elements/TextBox");
52
50
  const validation_1 = require("../validation");
53
51
  const Section_1 = require("../elements/Section");
54
52
  const StructuredDocumentTag_1 = require("../elements/StructuredDocumentTag");
@@ -60,6 +58,7 @@ const Style_1 = require("../formatting/Style");
60
58
  const StylesManager_1 = require("../formatting/StylesManager");
61
59
  const ListNormalizer_1 = require("./ListNormalizer");
62
60
  const logger_1 = require("../utils/logger");
61
+ const units_1 = require("../utils/units");
63
62
  function getLogger() {
64
63
  return (0, logger_1.createScopedLogger)((0, logger_1.getGlobalLogger)(), 'Document');
65
64
  }
@@ -1481,7 +1480,8 @@ class Document {
1481
1480
  nextElement.getNumbering().numId !== numbering.numId;
1482
1481
  if (isListEnd) {
1483
1482
  const alreadyHasBlank = nextElement instanceof Paragraph_1.Paragraph &&
1484
- this.isParagraphBlank(nextElement);
1483
+ nextElement.getText().trim() === '' &&
1484
+ nextElement.getContent().length === 0;
1485
1485
  if (!alreadyHasBlank) {
1486
1486
  const blankPara = new Paragraph_1.Paragraph();
1487
1487
  blankPara.setStyle("Normal");
@@ -2490,1430 +2490,63 @@ class Document {
2490
2490
  }
2491
2491
  return this.applyStyles(options);
2492
2492
  }
2493
- removeExtraBlankParagraphs(options) {
2494
- const addStructureBlankLines = options?.addStructureBlankLines ?? true;
2495
- const removeTrailingCellBlanks = options?.removeTrailingCellBlanks ?? true;
2496
- const preserveSingleBlanks = options?.preserveSingleBlanks ?? false;
2497
- let removed = 0;
2498
- let added = 0;
2499
- let preserved = 0;
2500
- if (addStructureBlankLines) {
2501
- this.clearCustom();
2502
- }
2503
- if (preserveSingleBlanks) {
2504
- preserved = this.markSingleBlanksAsPreserved();
2505
- }
2506
- const indicesToRemove = [];
2507
- for (let i = 0; i < this.bodyElements.length; i++) {
2508
- const element = this.bodyElements[i];
2509
- if (!(element instanceof Paragraph_1.Paragraph)) {
2510
- continue;
2511
- }
2512
- const para = element;
2513
- if (para.isPreserved()) {
2514
- continue;
2515
- }
2516
- const isBlank = this.isParagraphBlank(para);
2517
- if (isBlank) {
2518
- indicesToRemove.push(i);
2519
- }
2520
- }
2521
- for (let i = indicesToRemove.length - 1; i >= 0; i--) {
2522
- const index = indicesToRemove[i];
2523
- if (index !== undefined) {
2524
- this.bodyElements.splice(index, 1);
2525
- removed++;
2526
- }
2527
- }
2528
- for (const table of this.getAllTables()) {
2529
- for (const row of table.getRows()) {
2530
- for (const cell of row.getCells()) {
2531
- let cellParaCount = cell.getParagraphs().length;
2532
- for (let i = cellParaCount - 1; i >= 0; i--) {
2533
- if (cell.getParagraphs().length <= 1)
2534
- break;
2535
- const para = cell.getParagraphs()[i];
2536
- if (para && !para.isPreserved() && this.isParagraphBlank(para)) {
2537
- cell.removeParagraph(i);
2538
- removed++;
2539
- }
2540
- }
2541
- }
2542
- }
2543
- }
2544
- if (addStructureBlankLines) {
2545
- added = this.addStructureBlankLinesAfterElements({
2546
- stopBoldColonAfterHeading: options?.stopBoldColonAfterHeading,
2547
- });
2548
- }
2549
- if (removeTrailingCellBlanks) {
2550
- const trailingRemoved = this.removeTrailingBlanksInTableCells({
2551
- ignorePreserveFlag: true,
2552
- });
2553
- removed += trailingRemoved;
2554
- }
2555
- return {
2556
- removed,
2557
- added,
2558
- total: removed,
2559
- preserved,
2560
- };
2561
- }
2562
- removeTrailingBlanksInTableCells(options) {
2563
- let totalRemoved = 0;
2564
- const ignorePreserve = options?.ignorePreserveFlag ?? true;
2565
- for (const table of this.getAllTables()) {
2566
- for (const row of table.getRows()) {
2567
- for (const cell of row.getCells()) {
2568
- totalRemoved += cell.removeTrailingBlankParagraphs({
2569
- ignorePreserveFlag: ignorePreserve,
2570
- });
2571
- }
2572
- }
2573
- }
2574
- return totalRemoved;
2575
- }
2576
- updateTableStyleShading(oldColor, newColor) {
2577
- const normalizedOld = oldColor.replace("#", "").toUpperCase();
2578
- const normalizedNew = newColor.replace("#", "").toUpperCase();
2579
- if (normalizedOld === normalizedNew) {
2580
- return 0;
2581
- }
2582
- let stylesXml = this.getStylesXml();
2583
- if (!stylesXml) {
2584
- return 0;
2585
- }
2586
- let updateCount = 0;
2587
- const fillPattern = new RegExp(`(w:fill=["'])${normalizedOld}(["'])`, "gi");
2588
- stylesXml = stylesXml.replace(fillPattern, (match, prefix, suffix) => {
2589
- updateCount++;
2590
- return `${prefix}${normalizedNew}${suffix}`;
2591
- });
2592
- const colorPattern = new RegExp(`(<w:shd[^>]*w:color=["'])${normalizedOld}(["'])`, "gi");
2593
- stylesXml = stylesXml.replace(colorPattern, (match, prefix, suffix) => {
2594
- updateCount++;
2595
- return `${prefix}${normalizedNew}${suffix}`;
2596
- });
2597
- if (updateCount > 0) {
2598
- this.setStylesXml(stylesXml);
2599
- }
2600
- return updateCount;
2601
- }
2602
- updateTableStyleShadingBulk(settings) {
2603
- let totalUpdated = 0;
2604
- const defaultReplaceColors = ["A5A5A5", "C0C0C0", "D9D9D9", "E7E6E6"];
2605
- const colorsToReplace = settings.replaceColors || defaultReplaceColors;
2606
- if (settings.headerShading) {
2607
- for (const oldColor of colorsToReplace) {
2608
- totalUpdated += this.updateTableStyleShading(oldColor, settings.headerShading);
2609
- }
2610
- }
2611
- if (settings.dataShading && settings.dataShading !== settings.headerShading) {
2612
- const dataColors = ["D9D9D9", "E7E6E6", "F2F2F2"];
2613
- for (const oldColor of dataColors) {
2614
- totalUpdated += this.updateTableStyleShading(oldColor, settings.dataShading);
2615
- }
2616
- }
2617
- return totalUpdated;
2618
- }
2619
- processConsecutiveBlanks(blanks, keepOne, toRemove) {
2620
- if (blanks.length === 0)
2621
- return;
2622
- if (keepOne && blanks.length > 1) {
2623
- for (let i = 1; i < blanks.length; i++) {
2624
- const blank = blanks[i];
2625
- if (blank) {
2626
- toRemove.push(blank);
2627
- }
2628
- }
2629
- }
2630
- else if (!keepOne) {
2631
- toRemove.push(...blanks);
2632
- }
2633
- }
2634
- addStructureBlankLines(options) {
2635
- const spacingAfter = options?.spacingAfter ?? 120;
2636
- const markAsPreserved = options?.markAsPreserved ?? true;
2637
- const style = options?.style ?? 'Normal';
2638
- const after1x1Tables = options?.after1x1Tables ?? true;
2639
- const afterOtherTables = options?.afterOtherTables ?? true;
2640
- const filter1x1 = options?.filter1x1;
2641
- const filterOther = options?.filterOther;
2642
- const aboveFirstTable = options?.aboveFirstTable ?? true;
2643
- const aboveTODHyperlinks = options?.aboveTODHyperlinks ?? true;
2644
- const aboveReturnToHLP = options?.aboveReturnToHLP ?? true;
2645
- const belowHeading1Lines = options?.belowHeading1Lines ?? true;
2646
- const belowTOC = options?.belowTOC ?? true;
2647
- const aboveWarning = options?.aboveWarning ?? true;
2648
- const afterLists = options?.afterLists ?? true;
2649
- const aroundImages = options?.aroundImages ?? true;
2650
- const aboveBoldColon = options?.aboveBoldColon ?? true;
2651
- const stopBoldColonAfterHeading = options?.stopBoldColonAfterHeading?.toLowerCase();
2652
- let totalTablesProcessed = 0;
2653
- let totalBlankLinesAdded = 0;
2654
- let totalExistingLinesMarked = 0;
2655
- let blankLinesRemoved = 0;
2656
- let totalListsProcessed = 0;
2657
- const cleanupResult = this.removeExtraBlankParagraphs({ addStructureBlankLines: false });
2658
- blankLinesRemoved = cleanupResult.removed;
2659
- if (after1x1Tables) {
2660
- const result1x1 = this.ensureBlankLinesAfter1x1Tables({
2661
- spacingAfter,
2662
- markAsPreserved,
2663
- style,
2664
- filter: filter1x1,
2665
- });
2666
- totalTablesProcessed += result1x1.tablesProcessed;
2667
- totalBlankLinesAdded += result1x1.blankLinesAdded;
2668
- totalExistingLinesMarked += result1x1.existingLinesMarked;
2669
- }
2670
- if (afterOtherTables) {
2671
- const resultOther = this.ensureBlankLinesAfterOtherTables({
2672
- spacingAfter,
2673
- markAsPreserved,
2674
- style,
2675
- filter: filterOther,
2676
- });
2677
- totalTablesProcessed += resultOther.tablesProcessed;
2678
- totalBlankLinesAdded += resultOther.blankLinesAdded;
2679
- totalExistingLinesMarked += resultOther.existingLinesMarked;
2680
- }
2681
- if (aboveFirstTable) {
2682
- const tables = this.getAllTables();
2683
- if (tables.length > 0) {
2684
- const firstTable = tables[0];
2685
- if (firstTable) {
2686
- const tableIndex = this.bodyElements.indexOf(firstTable);
2687
- if (tableIndex > 0) {
2688
- const prevElement = this.bodyElements[tableIndex - 1];
2689
- if (prevElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(prevElement)) {
2690
- prevElement.setStyle(style);
2691
- if (markAsPreserved && !prevElement.isPreserved()) {
2692
- prevElement.setPreserved(true);
2693
- totalExistingLinesMarked++;
2694
- }
2695
- }
2696
- else {
2697
- const blankPara = Paragraph_1.Paragraph.create();
2698
- blankPara.setStyle(style);
2699
- blankPara.setSpaceAfter(spacingAfter);
2700
- if (markAsPreserved) {
2701
- blankPara.setPreserved(true);
2702
- }
2703
- this.bodyElements.splice(tableIndex, 0, blankPara);
2704
- totalBlankLinesAdded++;
2705
- }
2706
- }
2707
- }
2708
- }
2709
- }
2710
- if (aboveTODHyperlinks) {
2711
- const hyperlinks = this.getHyperlinks();
2712
- for (const { hyperlink, paragraph } of hyperlinks) {
2713
- const text = hyperlink.getText().toLowerCase();
2714
- if ((text === 'top of document' || text === 'top of the document')) {
2715
- const paraIndex = this.bodyElements.indexOf(paragraph);
2716
- if (paraIndex > 0) {
2717
- const prevElement = this.bodyElements[paraIndex - 1];
2718
- if (prevElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(prevElement)) {
2719
- if (paraIndex >= 2) {
2720
- const twoPrevElement = this.bodyElements[paraIndex - 2];
2721
- if (twoPrevElement instanceof Table_1.Table) {
2722
- const is1x1 = twoPrevElement.getRowCount() === 1 && twoPrevElement.getColumnCount() === 1;
2723
- if (is1x1) {
2724
- continue;
2725
- }
2726
- }
2727
- }
2728
- prevElement.setStyle(style);
2729
- if (markAsPreserved && !prevElement.isPreserved()) {
2730
- prevElement.setPreserved(true);
2731
- totalExistingLinesMarked++;
2732
- }
2733
- }
2734
- else if (!(prevElement instanceof Table_1.Table && prevElement.getRowCount() === 1 && prevElement.getColumnCount() === 1)) {
2735
- const blankPara = Paragraph_1.Paragraph.create();
2736
- blankPara.setStyle(style);
2737
- blankPara.setSpaceAfter(spacingAfter);
2738
- if (markAsPreserved) {
2739
- blankPara.setPreserved(true);
2740
- }
2741
- this.bodyElements.splice(paraIndex, 0, blankPara);
2742
- totalBlankLinesAdded++;
2743
- }
2744
- }
2745
- }
2746
- }
2747
- }
2748
- if (aboveReturnToHLP) {
2749
- if (!this.getStylesManager().hasStyle('HLPHyperlinks')) {
2750
- const hlpStyle = Style_1.Style.create({
2751
- styleId: 'HLPHyperlinks',
2752
- name: 'HLP Hyperlinks',
2753
- type: 'paragraph',
2754
- basedOn: 'Normal',
2755
- customStyle: true,
2756
- paragraphFormatting: {
2757
- alignment: 'right',
2758
- spacing: {
2759
- before: 0,
2760
- after: 0,
2761
- }
2762
- },
2763
- runFormatting: {
2764
- font: 'Verdana',
2765
- size: 12,
2766
- color: '0000FF',
2767
- bold: false,
2768
- italic: false
2769
- }
2770
- });
2771
- this.addStyle(hlpStyle);
2772
- }
2773
- const hlpHyperlinks = this.getHyperlinks();
2774
- for (const { hyperlink, paragraph } of hlpHyperlinks) {
2775
- const text = hyperlink.getText().toLowerCase();
2776
- if (text === 'return to hlp') {
2777
- const paraIndex = this.bodyElements.indexOf(paragraph);
2778
- if (paraIndex > 0) {
2779
- const prevElement = this.bodyElements[paraIndex - 1];
2780
- if (prevElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(prevElement)) {
2781
- prevElement.setStyle(style);
2782
- if (markAsPreserved && !prevElement.isPreserved()) {
2783
- prevElement.setPreserved(true);
2784
- totalExistingLinesMarked++;
2785
- }
2786
- }
2787
- else if (!(prevElement instanceof Table_1.Table && prevElement.getRowCount() === 1 && prevElement.getColumnCount() === 1)) {
2788
- const blankPara = Paragraph_1.Paragraph.create();
2789
- blankPara.setStyle(style);
2790
- blankPara.setSpaceAfter(spacingAfter);
2791
- if (markAsPreserved) {
2792
- blankPara.setPreserved(true);
2793
- }
2794
- this.bodyElements.splice(paraIndex, 0, blankPara);
2795
- totalBlankLinesAdded++;
2796
- }
2797
- }
2798
- hyperlink.setFormatting({
2799
- font: 'Verdana',
2800
- size: 12,
2801
- underline: 'single',
2802
- color: '0000FF',
2803
- bold: false,
2804
- italic: false
2805
- });
2806
- paragraph.setStyle('HLPHyperlinks');
2807
- paragraph.setAlignment('right');
2808
- paragraph.setSpaceBefore(0);
2809
- paragraph.setSpaceAfter(0);
2810
- }
2811
- }
2812
- }
2813
- if (belowHeading1Lines) {
2814
- const allParas = this.getAllParagraphs();
2815
- for (const para of allParas) {
2816
- const styleId = para.getStyle();
2817
- if (styleId === 'Heading1' && para.getText().trim() !== '') {
2818
- const paraIndex = this.bodyElements.indexOf(para);
2819
- if (paraIndex !== -1 && paraIndex < this.bodyElements.length - 1) {
2820
- const nextElement = this.bodyElements[paraIndex + 1];
2821
- if (nextElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(nextElement)) {
2822
- nextElement.setStyle(style);
2823
- if (markAsPreserved && !nextElement.isPreserved()) {
2824
- nextElement.setPreserved(true);
2825
- totalExistingLinesMarked++;
2826
- }
2827
- }
2828
- else {
2829
- const blankPara = Paragraph_1.Paragraph.create();
2830
- blankPara.setStyle(style);
2831
- blankPara.setSpaceAfter(spacingAfter);
2832
- if (markAsPreserved) {
2833
- blankPara.setPreserved(true);
2834
- }
2835
- this.bodyElements.splice(paraIndex + 1, 0, blankPara);
2836
- totalBlankLinesAdded++;
2837
- }
2838
- }
2839
- }
2840
- }
2841
- }
2842
- if (belowTOC) {
2843
- const tocElements = this.getTableOfContentsElements();
2844
- for (const toc of tocElements) {
2845
- const tocIndex = this.bodyElements.indexOf(toc);
2846
- if (tocIndex !== -1 && tocIndex < this.bodyElements.length - 1) {
2847
- const nextElement = this.bodyElements[tocIndex + 1];
2848
- if (nextElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(nextElement)) {
2849
- nextElement.setStyle(style);
2850
- if (markAsPreserved && !nextElement.isPreserved()) {
2851
- nextElement.setPreserved(true);
2852
- totalExistingLinesMarked++;
2853
- }
2854
- }
2855
- else {
2856
- const blankPara = Paragraph_1.Paragraph.create();
2857
- blankPara.setStyle(style);
2858
- blankPara.setSpaceAfter(spacingAfter);
2859
- if (markAsPreserved) {
2860
- blankPara.setPreserved(true);
2861
- }
2862
- this.bodyElements.splice(tocIndex + 1, 0, blankPara);
2863
- totalBlankLinesAdded++;
2864
- }
2865
- }
2866
- }
2867
- let inTocBlock = false;
2868
- let lastTocParaIndex = -1;
2869
- for (let idx = 0; idx < this.bodyElements.length; idx++) {
2870
- const element = this.bodyElements[idx];
2871
- if (element instanceof Paragraph_1.Paragraph && this.isTocParagraph(element)) {
2872
- inTocBlock = true;
2873
- lastTocParaIndex = idx;
2874
- }
2875
- else if (inTocBlock) {
2876
- inTocBlock = false;
2877
- if (lastTocParaIndex !== -1 && lastTocParaIndex < this.bodyElements.length - 1) {
2878
- const nextElement = this.bodyElements[lastTocParaIndex + 1];
2879
- if (nextElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(nextElement)) {
2880
- nextElement.setStyle(style);
2881
- if (markAsPreserved && !nextElement.isPreserved()) {
2882
- nextElement.setPreserved(true);
2883
- totalExistingLinesMarked++;
2884
- }
2885
- }
2886
- else {
2887
- const blankPara = Paragraph_1.Paragraph.create();
2888
- blankPara.setStyle(style);
2889
- blankPara.setSpaceAfter(spacingAfter);
2890
- if (markAsPreserved) {
2891
- blankPara.setPreserved(true);
2892
- }
2893
- this.bodyElements.splice(lastTocParaIndex + 1, 0, blankPara);
2894
- totalBlankLinesAdded++;
2895
- idx++;
2896
- }
2897
- }
2898
- lastTocParaIndex = -1;
2899
- }
2900
- }
2901
- if (inTocBlock && lastTocParaIndex !== -1 && lastTocParaIndex < this.bodyElements.length - 1) {
2902
- const nextElement = this.bodyElements[lastTocParaIndex + 1];
2903
- if (nextElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(nextElement)) {
2904
- nextElement.setStyle(style);
2905
- if (markAsPreserved && !nextElement.isPreserved()) {
2906
- nextElement.setPreserved(true);
2907
- totalExistingLinesMarked++;
2908
- }
2909
- }
2910
- else {
2911
- const blankPara = Paragraph_1.Paragraph.create();
2912
- blankPara.setStyle(style);
2913
- blankPara.setSpaceAfter(spacingAfter);
2914
- if (markAsPreserved) {
2915
- blankPara.setPreserved(true);
2916
- }
2917
- this.bodyElements.splice(lastTocParaIndex + 1, 0, blankPara);
2918
- totalBlankLinesAdded++;
2919
- }
2920
- }
2921
- }
2922
- if (aboveWarning) {
2923
- for (let i = 0; i < this.bodyElements.length - 1; i++) {
2924
- const firstElem = this.bodyElements[i];
2925
- const secondElem = this.bodyElements[i + 1];
2926
- if (firstElem instanceof Paragraph_1.Paragraph && secondElem instanceof Paragraph_1.Paragraph) {
2927
- const firstText = firstElem.getText().trim().toLowerCase();
2928
- const secondText = secondElem.getText().trim().toLowerCase();
2929
- const isWarningFirst = firstText.includes('warning') || firstText.includes('caution') ||
2930
- firstText.includes('important') || firstText.includes('note');
2931
- const hasSecondLine = secondText.length > 0;
2932
- if (this.isWithinListContext(i))
2933
- continue;
2934
- if (isWarningFirst && hasSecondLine && i > 0) {
2935
- const prevElement = this.bodyElements[i - 1];
2936
- if (prevElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(prevElement)) {
2937
- prevElement.setStyle(style);
2938
- if (markAsPreserved && !prevElement.isPreserved()) {
2939
- prevElement.setPreserved(true);
2940
- totalExistingLinesMarked++;
2941
- }
2942
- }
2943
- else {
2944
- const blankPara = Paragraph_1.Paragraph.create();
2945
- blankPara.setStyle(style);
2946
- blankPara.setSpaceAfter(spacingAfter);
2947
- if (markAsPreserved) {
2948
- blankPara.setPreserved(true);
2949
- }
2950
- this.bodyElements.splice(i, 0, blankPara);
2951
- totalBlankLinesAdded++;
2952
- i++;
2953
- }
2954
- break;
2955
- }
2956
- }
2957
- }
2958
- }
2959
- if (afterLists) {
2960
- for (let i = 0; i < this.bodyElements.length; i++) {
2961
- const element = this.bodyElements[i];
2962
- if (element instanceof Paragraph_1.Paragraph) {
2963
- const numbering = element.getNumbering();
2964
- if (numbering) {
2965
- const nextElement = this.bodyElements[i + 1];
2966
- const nextIsAnyListItem = nextElement instanceof Paragraph_1.Paragraph && nextElement.getNumbering();
2967
- if (nextIsAnyListItem) {
2968
- continue;
2969
- }
2970
- if (nextElement instanceof Paragraph_1.Paragraph && this.isSmallImageParagraph(nextElement)) {
2971
- const elementAfterImage = i + 2 < this.bodyElements.length ? this.bodyElements[i + 2] : undefined;
2972
- if (elementAfterImage && elementAfterImage instanceof Paragraph_1.Paragraph && elementAfterImage.getNumbering()) {
2973
- continue;
2974
- }
2975
- }
2976
- const nextIsWithinList = nextElement instanceof Paragraph_1.Paragraph &&
2977
- !nextElement.getNumbering() &&
2978
- this.isWithinListContext(i + 1);
2979
- const nextIsIndented = nextElement instanceof Paragraph_1.Paragraph &&
2980
- !nextElement.getNumbering() &&
2981
- nextElement.getFormatting()?.indentation?.left &&
2982
- nextElement.getFormatting().indentation.left > 0;
2983
- const isListEnd = !nextElement ||
2984
- !(nextElement instanceof Paragraph_1.Paragraph) ||
2985
- (!nextElement.getNumbering() && !nextIsWithinList && !nextIsIndented);
2986
- if (isListEnd) {
2987
- const alreadyHasBlank = nextElement instanceof Paragraph_1.Paragraph &&
2988
- this.isParagraphBlank(nextElement);
2989
- if (alreadyHasBlank) {
2990
- const elementAfterBlank = this.bodyElements[i + 2];
2991
- const listContinuesAfterBlank = elementAfterBlank instanceof Paragraph_1.Paragraph &&
2992
- elementAfterBlank.getNumbering()?.numId === numbering.numId;
2993
- if (listContinuesAfterBlank) {
2994
- }
2995
- else {
2996
- nextElement.setStyle(style);
2997
- if (markAsPreserved && !nextElement.isPreserved()) {
2998
- nextElement.setPreserved(true);
2999
- totalExistingLinesMarked++;
3000
- }
3001
- }
3002
- }
3003
- else {
3004
- const blankPara = Paragraph_1.Paragraph.create();
3005
- blankPara.setStyle(style);
3006
- blankPara.setSpaceAfter(spacingAfter);
3007
- blankPara.setPreserved(markAsPreserved);
3008
- this.bodyElements.splice(i + 1, 0, blankPara);
3009
- totalBlankLinesAdded++;
3010
- }
3011
- totalListsProcessed++;
3012
- i++;
3013
- }
3014
- }
3015
- }
3016
- }
3017
- for (const table of this.getAllTables()) {
3018
- for (const row of table.getRows()) {
3019
- for (const cell of row.getCells()) {
3020
- let cellParaCount = cell.getParagraphs().length;
3021
- for (let ci = 0; ci < cellParaCount; ci++) {
3022
- const cellParas = cell.getParagraphs();
3023
- const para = cellParas[ci];
3024
- if (!para)
3025
- continue;
3026
- const numbering = para.getNumbering();
3027
- if (!numbering)
3028
- continue;
3029
- const nextParaInCell = cellParas[ci + 1];
3030
- if (nextParaInCell && nextParaInCell.getNumbering()) {
3031
- continue;
3032
- }
3033
- if (nextParaInCell && this.isSmallImageParagraph(nextParaInCell)) {
3034
- const paraAfterImage = cellParas[ci + 2];
3035
- if (paraAfterImage && paraAfterImage.getNumbering()) {
3036
- continue;
3037
- }
3038
- }
3039
- const nextIsWithinListInCell = nextParaInCell &&
3040
- !nextParaInCell.getNumbering() &&
3041
- this.isWithinListContextInCell(cell, ci + 1);
3042
- const nextIsIndentedInCell = nextParaInCell &&
3043
- !nextParaInCell.getNumbering() &&
3044
- nextParaInCell.getFormatting()?.indentation?.left &&
3045
- nextParaInCell.getFormatting().indentation.left > 0;
3046
- const isListEndInCell = !nextParaInCell ||
3047
- (!nextParaInCell.getNumbering() && !nextIsWithinListInCell && !nextIsIndentedInCell);
3048
- if (isListEndInCell) {
3049
- const isLastInCell = ci === cellParas.length - 1;
3050
- if (isLastInCell) {
3051
- continue;
3052
- }
3053
- if (nextParaInCell && this.isParagraphBlank(nextParaInCell)) {
3054
- nextParaInCell.setStyle(style);
3055
- if (markAsPreserved && !nextParaInCell.isPreserved()) {
3056
- nextParaInCell.setPreserved(true);
3057
- totalExistingLinesMarked++;
3058
- }
3059
- }
3060
- else {
3061
- const blankPara = Paragraph_1.Paragraph.create();
3062
- blankPara.setStyle(style);
3063
- blankPara.setSpaceAfter(spacingAfter);
3064
- blankPara.setPreserved(markAsPreserved);
3065
- cell.addParagraphAt(ci + 1, blankPara);
3066
- totalBlankLinesAdded++;
3067
- ci++;
3068
- cellParaCount++;
3069
- }
3070
- totalListsProcessed++;
3071
- }
3072
- }
3073
- }
3074
- }
3075
- }
3076
- }
3077
- if (afterLists) {
3078
- for (let i = 0; i < this.bodyElements.length; i++) {
3079
- const element = this.bodyElements[i];
3080
- if (!(element instanceof Paragraph_1.Paragraph))
3081
- continue;
3082
- const currentIndent = element.getFormatting()?.indentation?.left;
3083
- const isIndented = currentIndent && currentIndent > 0 && !element.getNumbering();
3084
- if (!isIndented)
3085
- continue;
3086
- if (this.isParagraphBlank(element))
3087
- continue;
3088
- const nextElement = this.bodyElements[i + 1];
3089
- if (!nextElement || !(nextElement instanceof Paragraph_1.Paragraph))
3090
- continue;
3091
- if (this.isParagraphBlank(nextElement))
3092
- continue;
3093
- const nextIndent = nextElement.getFormatting()?.indentation?.left;
3094
- const nextIsIndented = nextIndent && nextIndent > 0;
3095
- const nextIsList = !!nextElement.getNumbering();
3096
- if (!nextIsIndented && !nextIsList) {
3097
- const blankPara = Paragraph_1.Paragraph.create();
3098
- blankPara.setStyle(style);
3099
- blankPara.setSpaceAfter(spacingAfter);
3100
- blankPara.setPreserved(markAsPreserved);
3101
- this.bodyElements.splice(i + 1, 0, blankPara);
3102
- totalBlankLinesAdded++;
3103
- i++;
3104
- }
3105
- }
3106
- for (const table of this.getAllTables()) {
3107
- for (const row of table.getRows()) {
3108
- for (const cell of row.getCells()) {
3109
- let cellParas = cell.getParagraphs();
3110
- let cellParaCount = cellParas.length;
3111
- for (let ci = 0; ci < cellParaCount; ci++) {
3112
- cellParas = cell.getParagraphs();
3113
- const para = cellParas[ci];
3114
- if (!para)
3115
- continue;
3116
- const currentIndent = para.getFormatting()?.indentation?.left;
3117
- const isIndented = currentIndent && currentIndent > 0 && !para.getNumbering();
3118
- if (!isIndented)
3119
- continue;
3120
- if (this.isParagraphBlank(para))
3121
- continue;
3122
- const isLastInCell = ci === cellParas.length - 1;
3123
- if (isLastInCell)
3124
- continue;
3125
- const nextPara = cellParas[ci + 1];
3126
- if (!nextPara)
3127
- continue;
3128
- if (this.isParagraphBlank(nextPara))
3129
- continue;
3130
- const nextIndent = nextPara.getFormatting()?.indentation?.left;
3131
- const nextIsIndented = nextIndent && nextIndent > 0;
3132
- const nextIsList = !!nextPara.getNumbering();
3133
- if (!nextIsIndented && !nextIsList) {
3134
- const blankPara = Paragraph_1.Paragraph.create();
3135
- blankPara.setStyle(style);
3136
- blankPara.setSpaceAfter(spacingAfter);
3137
- blankPara.setPreserved(markAsPreserved);
3138
- cell.addParagraphAt(ci + 1, blankPara);
3139
- totalBlankLinesAdded++;
3140
- ci++;
3141
- cellParaCount++;
3142
- }
3143
- }
3144
- }
3145
- }
3146
- }
3147
- }
3148
- if (afterLists) {
3149
- for (let i = 0; i < this.bodyElements.length; i++) {
3150
- const element = this.bodyElements[i];
3151
- if (!(element instanceof Paragraph_1.Paragraph))
3152
- continue;
3153
- if (element.getNumbering())
3154
- continue;
3155
- const currentIndent = element.getFormatting()?.indentation?.left;
3156
- if (currentIndent && currentIndent > 0)
3157
- continue;
3158
- const text = element.getText() || '';
3159
- if (text.length <= 60)
3160
- continue;
3161
- const content = element.getContent();
3162
- const isOnlyHyperlinks = content.length > 0 && content.every(item => item instanceof Hyperlink_1.Hyperlink);
3163
- if (isOnlyHyperlinks)
3164
- continue;
3165
- const nextElement = this.bodyElements[i + 1];
3166
- if (!nextElement || !(nextElement instanceof Paragraph_1.Paragraph))
3167
- continue;
3168
- if (this.isParagraphBlank(nextElement))
3169
- continue;
3170
- if (nextElement.getNumbering())
3171
- continue;
3172
- const nextIndent = nextElement.getFormatting()?.indentation?.left;
3173
- if (nextIndent && nextIndent > 0)
3174
- continue;
3175
- const blankPara = Paragraph_1.Paragraph.create();
3176
- blankPara.setStyle(style);
3177
- blankPara.setSpaceAfter(spacingAfter);
3178
- blankPara.setPreserved(markAsPreserved);
3179
- this.bodyElements.splice(i + 1, 0, blankPara);
3180
- totalBlankLinesAdded++;
3181
- i++;
3182
- }
3183
- for (const table of this.getAllTables()) {
3184
- for (const row of table.getRows()) {
3185
- for (const cell of row.getCells()) {
3186
- let cellParas = cell.getParagraphs();
3187
- let cellParaCount = cellParas.length;
3188
- for (let ci = 0; ci < cellParaCount; ci++) {
3189
- cellParas = cell.getParagraphs();
3190
- const para = cellParas[ci];
3191
- if (!para)
3192
- continue;
3193
- if (para.getNumbering())
3194
- continue;
3195
- const currentIndent = para.getFormatting()?.indentation?.left;
3196
- if (currentIndent && currentIndent > 0)
3197
- continue;
3198
- const text = para.getText() || '';
3199
- if (text.length <= 60)
3200
- continue;
3201
- const content = para.getContent();
3202
- const isOnlyHyperlinks = content.length > 0 && content.every(item => item instanceof Hyperlink_1.Hyperlink);
3203
- if (isOnlyHyperlinks)
3204
- continue;
3205
- const isLastInCell = ci === cellParas.length - 1;
3206
- if (isLastInCell)
3207
- continue;
3208
- const nextPara = cellParas[ci + 1];
3209
- if (!nextPara)
3210
- continue;
3211
- if (this.isParagraphBlank(nextPara))
3212
- continue;
3213
- if (nextPara.getNumbering())
3214
- continue;
3215
- const nextIndent = nextPara.getFormatting()?.indentation?.left;
3216
- if (nextIndent && nextIndent > 0)
3217
- continue;
3218
- const blankPara = Paragraph_1.Paragraph.create();
3219
- blankPara.setStyle(style);
3220
- blankPara.setSpaceAfter(spacingAfter);
3221
- blankPara.setPreserved(markAsPreserved);
3222
- cell.addParagraphAt(ci + 1, blankPara);
3223
- totalBlankLinesAdded++;
3224
- ci++;
3225
- cellParaCount++;
3226
- }
3227
- }
3228
- }
3229
- }
3230
- }
3231
- if (aroundImages) {
3232
- for (let imgIdx = 0; imgIdx < this.bodyElements.length; imgIdx++) {
3233
- const element = this.bodyElements[imgIdx];
3234
- if (!(element instanceof Paragraph_1.Paragraph))
3235
- continue;
3236
- const imageRun = this.getImageRunFromParagraph(element);
3237
- if (!imageRun)
3238
- continue;
3239
- const image = imageRun.getImageElement();
3240
- const isSmall = this.isImageSmall(image);
3241
- if (isSmall) {
3242
- if (imgIdx > 0) {
3243
- const prevElement = this.bodyElements[imgIdx - 1];
3244
- const prevIsBlank = prevElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(prevElement);
3245
- const prevIsCenteredBold = prevElement instanceof Paragraph_1.Paragraph && this.isCenteredBoldText(prevElement);
3246
- const prevIsListItem = prevElement instanceof Paragraph_1.Paragraph && prevElement.getNumbering();
3247
- const leftIndent = element.getLeftIndent();
3248
- const currentHasLeftIndent = leftIndent !== undefined && leftIndent > 0;
3249
- if (!prevIsBlank && !prevIsCenteredBold && !(prevIsListItem && currentHasLeftIndent)) {
3250
- const blankBefore = Paragraph_1.Paragraph.create();
3251
- blankBefore.setStyle(style);
3252
- blankBefore.setSpaceAfter(spacingAfter);
3253
- if (markAsPreserved)
3254
- blankBefore.setPreserved(true);
3255
- this.bodyElements.splice(imgIdx, 0, blankBefore);
3256
- totalBlankLinesAdded++;
3257
- imgIdx++;
3258
- }
3259
- }
3260
- if (imgIdx < this.bodyElements.length - 1) {
3261
- const nextElement = this.bodyElements[imgIdx + 1];
3262
- const nextIsBlank = nextElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(nextElement);
3263
- const nextIsListItem = nextElement instanceof Paragraph_1.Paragraph && nextElement.getNumbering();
3264
- const nextIsSmallImage = nextElement instanceof Paragraph_1.Paragraph && this.isSmallImageParagraph(nextElement);
3265
- if (nextIsBlank) {
3266
- nextElement.setStyle(style);
3267
- if (markAsPreserved && !nextElement.isPreserved()) {
3268
- nextElement.setPreserved(true);
3269
- totalExistingLinesMarked++;
3270
- }
3271
- }
3272
- else if (!nextIsListItem && !nextIsSmallImage) {
3273
- const blankAfter = Paragraph_1.Paragraph.create();
3274
- blankAfter.setStyle(style);
3275
- blankAfter.setSpaceAfter(spacingAfter);
3276
- if (markAsPreserved)
3277
- blankAfter.setPreserved(true);
3278
- this.bodyElements.splice(imgIdx + 1, 0, blankAfter);
3279
- totalBlankLinesAdded++;
3280
- imgIdx++;
3281
- }
3282
- }
3283
- continue;
3284
- }
3285
- if (imgIdx > 0) {
3286
- const prevElement = this.bodyElements[imgIdx - 1];
3287
- const prevIsBlank = prevElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(prevElement);
3288
- const prevIsCenteredBold = prevElement instanceof Paragraph_1.Paragraph && this.isCenteredBoldText(prevElement);
3289
- if (!prevIsBlank && !prevIsCenteredBold) {
3290
- const blankBefore = Paragraph_1.Paragraph.create();
3291
- blankBefore.setStyle(style);
3292
- blankBefore.setSpaceAfter(spacingAfter);
3293
- if (markAsPreserved)
3294
- blankBefore.setPreserved(true);
3295
- this.bodyElements.splice(imgIdx, 0, blankBefore);
3296
- totalBlankLinesAdded++;
3297
- imgIdx++;
3298
- }
3299
- }
3300
- if (imgIdx < this.bodyElements.length - 1) {
3301
- const nextElement = this.bodyElements[imgIdx + 1];
3302
- if (nextElement instanceof Paragraph_1.Paragraph && this.isParagraphBlank(nextElement)) {
3303
- nextElement.setStyle(style);
3304
- if (markAsPreserved && !nextElement.isPreserved()) {
3305
- nextElement.setPreserved(true);
3306
- totalExistingLinesMarked++;
3307
- }
3308
- }
3309
- else {
3310
- const blankAfter = Paragraph_1.Paragraph.create();
3311
- blankAfter.setStyle(style);
3312
- blankAfter.setSpaceAfter(spacingAfter);
3313
- if (markAsPreserved)
3314
- blankAfter.setPreserved(true);
3315
- this.bodyElements.splice(imgIdx + 1, 0, blankAfter);
3316
- totalBlankLinesAdded++;
3317
- imgIdx++;
3318
- }
3319
- }
3320
- }
3321
- for (const table of this.getAllTables()) {
3322
- for (const row of table.getRows()) {
3323
- for (const cell of row.getCells()) {
3324
- let cellParaCount = cell.getParagraphs().length;
3325
- for (let ci = 0; ci < cellParaCount; ci++) {
3326
- const cellParas = cell.getParagraphs();
3327
- const para = cellParas[ci];
3328
- if (!para)
3329
- continue;
3330
- const imageRun = this.getImageRunFromParagraph(para);
3331
- if (!imageRun)
3332
- continue;
3333
- const image = imageRun.getImageElement();
3334
- const isSmall = this.isImageSmall(image);
3335
- if (isSmall) {
3336
- if (ci > 0) {
3337
- const prevPara = cellParas[ci - 1];
3338
- const prevIsBlank = prevPara && this.isParagraphBlank(prevPara);
3339
- const prevIsCenteredBold = prevPara && this.isCenteredBoldText(prevPara);
3340
- const prevIsListItem = prevPara && prevPara.getNumbering();
3341
- const leftIndent = para.getLeftIndent();
3342
- const currentHasLeftIndent = leftIndent !== undefined && leftIndent > 0;
3343
- if (!prevIsBlank && !prevIsCenteredBold && !(prevIsListItem && currentHasLeftIndent)) {
3344
- const blankBefore = Paragraph_1.Paragraph.create();
3345
- blankBefore.setStyle(style);
3346
- blankBefore.setSpaceAfter(spacingAfter);
3347
- if (markAsPreserved)
3348
- blankBefore.setPreserved(true);
3349
- cell.addParagraphAt(ci, blankBefore);
3350
- totalBlankLinesAdded++;
3351
- ci++;
3352
- cellParaCount++;
3353
- }
3354
- }
3355
- const isLastInCellSmall = ci === cell.getParagraphs().length - 1;
3356
- if (!isLastInCellSmall) {
3357
- const nextPara = cell.getParagraphs()[ci + 1];
3358
- const nextIsBlank = nextPara && this.isParagraphBlank(nextPara);
3359
- const nextIsListItem = nextPara && nextPara.getNumbering();
3360
- const nextIsSmallImage = nextPara && this.isSmallImageParagraph(nextPara);
3361
- if (nextIsBlank) {
3362
- nextPara.setStyle(style);
3363
- if (markAsPreserved && !nextPara.isPreserved()) {
3364
- nextPara.setPreserved(true);
3365
- totalExistingLinesMarked++;
3366
- }
3367
- }
3368
- else if (!nextIsListItem && !nextIsSmallImage) {
3369
- const blankAfter = Paragraph_1.Paragraph.create();
3370
- blankAfter.setStyle(style);
3371
- blankAfter.setSpaceAfter(spacingAfter);
3372
- if (markAsPreserved)
3373
- blankAfter.setPreserved(true);
3374
- cell.addParagraphAt(ci + 1, blankAfter);
3375
- totalBlankLinesAdded++;
3376
- ci++;
3377
- cellParaCount++;
3378
- }
3379
- }
3380
- continue;
3381
- }
3382
- if (ci > 0) {
3383
- const prevPara = cellParas[ci - 1];
3384
- const prevIsBlank = prevPara && this.isParagraphBlank(prevPara);
3385
- const prevIsCenteredBold = prevPara && this.isCenteredBoldText(prevPara);
3386
- if (prevPara && !prevIsBlank && !prevIsCenteredBold) {
3387
- const blankBefore = Paragraph_1.Paragraph.create();
3388
- blankBefore.setStyle(style);
3389
- blankBefore.setSpaceAfter(spacingAfter);
3390
- if (markAsPreserved)
3391
- blankBefore.setPreserved(true);
3392
- cell.addParagraphAt(ci, blankBefore);
3393
- totalBlankLinesAdded++;
3394
- ci++;
3395
- cellParaCount++;
3396
- }
3397
- }
3398
- const isLastInCell = ci === cell.getParagraphs().length - 1;
3399
- if (!isLastInCell) {
3400
- const nextPara = cell.getParagraphs()[ci + 1];
3401
- if (nextPara && this.isParagraphBlank(nextPara)) {
3402
- nextPara.setStyle(style);
3403
- if (markAsPreserved && !nextPara.isPreserved()) {
3404
- nextPara.setPreserved(true);
3405
- totalExistingLinesMarked++;
3406
- }
3407
- }
3408
- else {
3409
- const blankAfter = Paragraph_1.Paragraph.create();
3410
- blankAfter.setStyle(style);
3411
- blankAfter.setSpaceAfter(spacingAfter);
3412
- if (markAsPreserved)
3413
- blankAfter.setPreserved(true);
3414
- cell.addParagraphAt(ci + 1, blankAfter);
3415
- totalBlankLinesAdded++;
3416
- ci++;
3417
- cellParaCount++;
3418
- }
3419
- }
3420
- }
3421
- }
3422
- }
3423
- }
3424
- }
3425
- if (aboveBoldColon) {
3426
- let foundStopHeading = false;
3427
- for (let i = 1; i < this.bodyElements.length; i++) {
3428
- const element = this.bodyElements[i];
3429
- if (stopBoldColonAfterHeading && !foundStopHeading && element instanceof Table_1.Table) {
3430
- const rowCount = element.getRowCount();
3431
- const colCount = element.getColumnCount();
3432
- if (rowCount === 1 && colCount === 1) {
3433
- const cell = element.getCell(0, 0);
3434
- if (cell) {
3435
- const cellText = cell
3436
- .getParagraphs()
3437
- .map((p) => p.getText())
3438
- .join(" ")
3439
- .toLowerCase();
3440
- if (cellText.includes(stopBoldColonAfterHeading)) {
3441
- foundStopHeading = true;
3442
- continue;
3443
- }
3444
- }
3445
- }
3446
- }
3447
- if (foundStopHeading)
3448
- continue;
3449
- if (!(element instanceof Paragraph_1.Paragraph))
3450
- continue;
3451
- if (this.isParagraphBlank(element))
3452
- continue;
3453
- if (this.startsWithBoldColon(element)) {
3454
- const numbering = element.getNumbering();
3455
- if (numbering)
3456
- continue;
3457
- if (this.isWithinListContext(i))
3458
- continue;
3459
- const indentation = element.getFormatting().indentation;
3460
- if (indentation && indentation.left && indentation.left > 0)
3461
- continue;
3462
- const prevElement = this.bodyElements[i - 1];
3463
- if (prevElement instanceof Paragraph_1.Paragraph &&
3464
- this.isParagraphBlank(prevElement)) {
3465
- prevElement.setStyle(style);
3466
- if (markAsPreserved && !prevElement.isPreserved()) {
3467
- prevElement.setPreserved(true);
3468
- totalExistingLinesMarked++;
3469
- }
3470
- }
3471
- else {
3472
- const blankPara = Paragraph_1.Paragraph.create();
3473
- blankPara.setStyle(style);
3474
- blankPara.setSpaceAfter(spacingAfter);
3475
- if (markAsPreserved) {
3476
- blankPara.setPreserved(true);
3477
- }
3478
- this.bodyElements.splice(i, 0, blankPara);
3479
- totalBlankLinesAdded++;
3480
- i++;
3481
- }
3482
- }
3483
- }
3484
- }
3485
- if (aboveBoldColon) {
3486
- let foundStopHeadingInTable = false;
3487
- for (const table of this.getAllTables()) {
3488
- if (stopBoldColonAfterHeading && !foundStopHeadingInTable) {
3489
- const rowCount = table.getRowCount();
3490
- const colCount = table.getColumnCount();
3491
- if (rowCount === 1 && colCount === 1) {
3492
- const cell = table.getCell(0, 0);
3493
- if (cell) {
3494
- const cellText = cell
3495
- .getParagraphs()
3496
- .map((p) => p.getText())
3497
- .join(" ")
3498
- .toLowerCase();
3499
- if (cellText.includes(stopBoldColonAfterHeading)) {
3500
- foundStopHeadingInTable = true;
3501
- continue;
3502
- }
3503
- }
3504
- }
3505
- }
3506
- if (foundStopHeadingInTable)
3507
- continue;
3508
- for (const row of table.getRows()) {
3509
- for (const cell of row.getCells()) {
3510
- let cellParas = cell.getParagraphs();
3511
- let cellParaCount = cellParas.length;
3512
- for (let ci = 0; ci < cellParaCount; ci++) {
3513
- cellParas = cell.getParagraphs();
3514
- const para = cellParas[ci];
3515
- if (!para)
3516
- continue;
3517
- if (this.isParagraphBlank(para))
3518
- continue;
3519
- if (para.getNumbering())
3520
- continue;
3521
- if (this.isWithinListContextInCell(cell, ci))
3522
- continue;
3523
- if (!this.startsWithBoldColon(para))
3524
- continue;
3525
- const indentation = para.getFormatting().indentation;
3526
- if (indentation && indentation.left && indentation.left > 0)
3527
- continue;
3528
- if (ci === 0)
3529
- continue;
3530
- const prevPara = cellParas[ci - 1];
3531
- if (prevPara && this.isParagraphBlank(prevPara)) {
3532
- prevPara.setStyle(style);
3533
- if (markAsPreserved && !prevPara.isPreserved()) {
3534
- prevPara.setPreserved(true);
3535
- totalExistingLinesMarked++;
3536
- }
3537
- }
3538
- else {
3539
- const blankPara = Paragraph_1.Paragraph.create();
3540
- blankPara.setStyle(style);
3541
- blankPara.setSpaceAfter(spacingAfter);
3542
- if (markAsPreserved) {
3543
- blankPara.setPreserved(true);
3544
- }
3545
- cell.addParagraphAt(ci, blankPara);
3546
- totalBlankLinesAdded++;
3547
- ci++;
3548
- cellParaCount++;
3549
- }
3550
- }
3551
- }
3552
- }
3553
- }
3554
- }
3555
- for (let i = 1; i < this.bodyElements.length; i++) {
3556
- const element = this.bodyElements[i];
3557
- if (!(element instanceof Paragraph_1.Paragraph))
3558
- continue;
3559
- if (this.isParagraphBlank(element))
3560
- continue;
3561
- if (!this.isCenteredBoldText(element))
3562
- continue;
3563
- const prevElement = this.bodyElements[i - 1];
3564
- if (prevElement instanceof Paragraph_1.Paragraph) {
3565
- const prevIsBlank = this.isParagraphBlank(prevElement);
3566
- const prevIsListItem = prevElement.getNumbering() !== undefined;
3567
- const prevIsTextOnly = this.isTextOnlyParagraph(prevElement);
3568
- if (prevIsTextOnly || prevIsListItem) {
3569
- if (prevIsBlank) {
3570
- prevElement.setStyle(style);
3571
- if (markAsPreserved && !prevElement.isPreserved()) {
3572
- prevElement.setPreserved(true);
3573
- totalExistingLinesMarked++;
3574
- }
3575
- }
3576
- else {
3577
- const blankAbove = Paragraph_1.Paragraph.create();
3578
- blankAbove.setStyle(style);
3579
- blankAbove.setSpaceAfter(spacingAfter);
3580
- if (markAsPreserved)
3581
- blankAbove.setPreserved(true);
3582
- this.bodyElements.splice(i, 0, blankAbove);
3583
- totalBlankLinesAdded++;
3584
- i++;
3585
- }
3586
- }
3587
- }
3588
- }
3589
- for (const table of this.getAllTables()) {
3590
- for (const row of table.getRows()) {
3591
- for (const cell of row.getCells()) {
3592
- let cellParas = cell.getParagraphs();
3593
- for (let ci = 1; ci < cellParas.length; ci++) {
3594
- const para = cellParas[ci];
3595
- if (!para || this.isParagraphBlank(para))
3596
- continue;
3597
- if (!this.isCenteredBoldText(para))
3598
- continue;
3599
- const prevPara = cellParas[ci - 1];
3600
- if (!prevPara)
3601
- continue;
3602
- const prevIsBlank = this.isParagraphBlank(prevPara);
3603
- const prevIsListItem = prevPara.getNumbering() !== undefined;
3604
- const prevIsTextOnly = this.isTextOnlyParagraph(prevPara);
3605
- if (prevIsTextOnly || prevIsListItem) {
3606
- if (prevIsBlank) {
3607
- prevPara.setStyle(style);
3608
- if (markAsPreserved && !prevPara.isPreserved()) {
3609
- prevPara.setPreserved(true);
3610
- totalExistingLinesMarked++;
3611
- }
3612
- }
3613
- else {
3614
- const blankAbove = Paragraph_1.Paragraph.create();
3615
- blankAbove.setStyle(style);
3616
- blankAbove.setSpaceAfter(spacingAfter);
3617
- if (markAsPreserved)
3618
- blankAbove.setPreserved(true);
3619
- cell.addParagraphAt(ci, blankAbove);
3620
- totalBlankLinesAdded++;
3621
- ci++;
3622
- cellParas = cell.getParagraphs();
3623
- }
3624
- }
3625
- }
3626
- }
3627
- }
3628
- }
3629
- let listItemBlanksRemoved = 0;
3630
- for (let bi = 1; bi < this.bodyElements.length - 1; bi++) {
3631
- const prev = this.bodyElements[bi - 1];
3632
- const current = this.bodyElements[bi];
3633
- const next = this.bodyElements[bi + 1];
3634
- if (!(current instanceof Paragraph_1.Paragraph) || !this.isParagraphBlank(current))
3635
- continue;
3636
- if (prev instanceof Table_1.Table || next instanceof Table_1.Table)
3637
- continue;
3638
- if (prev instanceof Paragraph_1.Paragraph && next instanceof Paragraph_1.Paragraph) {
3639
- const prevNumbering = prev.getNumbering();
3640
- const nextNumbering = next.getNumbering();
3641
- if (prevNumbering && nextNumbering) {
3642
- this.bodyElements.splice(bi, 1);
3643
- bi--;
3644
- listItemBlanksRemoved++;
3645
- }
3646
- }
3647
- }
3648
- for (const table of this.getAllTables()) {
3649
- for (const row of table.getRows()) {
3650
- for (const cell of row.getCells()) {
3651
- let cellParas = cell.getParagraphs();
3652
- for (let ci = 1; ci < cellParas.length - 1; ci++) {
3653
- const prev = cellParas[ci - 1];
3654
- const current = cellParas[ci];
3655
- const next = cellParas[ci + 1];
3656
- if (!current || !this.isParagraphBlank(current))
3657
- continue;
3658
- const prevNumbering = prev?.getNumbering();
3659
- const nextNumbering = next?.getNumbering();
3660
- if (prevNumbering && nextNumbering) {
3661
- cell.removeParagraph(ci);
3662
- ci--;
3663
- listItemBlanksRemoved++;
3664
- cellParas = cell.getParagraphs();
3665
- }
3666
- }
3667
- }
3668
- }
3669
- }
3670
- blankLinesRemoved += listItemBlanksRemoved;
3671
- let duplicateBlanksRemoved = 0;
3672
- let i = 0;
3673
- while (i < this.bodyElements.length - 1) {
3674
- const current = this.bodyElements[i];
3675
- const next = this.bodyElements[i + 1];
3676
- if (current instanceof Paragraph_1.Paragraph &&
3677
- this.isParagraphBlank(current) &&
3678
- next instanceof Paragraph_1.Paragraph &&
3679
- this.isParagraphBlank(next)) {
3680
- this.bodyElements.splice(i + 1, 1);
3681
- duplicateBlanksRemoved++;
3682
- }
3683
- else {
3684
- i++;
3685
- }
2493
+ updateTableStyleShading(oldColor, newColor) {
2494
+ const normalizedOld = oldColor.replace("#", "").toUpperCase();
2495
+ const normalizedNew = newColor.replace("#", "").toUpperCase();
2496
+ if (normalizedOld === normalizedNew) {
2497
+ return 0;
3686
2498
  }
3687
- return {
3688
- tablesProcessed: totalTablesProcessed,
3689
- blankLinesAdded: totalBlankLinesAdded - duplicateBlanksRemoved,
3690
- existingLinesMarked: totalExistingLinesMarked,
3691
- blankLinesRemoved: blankLinesRemoved + duplicateBlanksRemoved,
3692
- listsProcessed: totalListsProcessed,
3693
- };
3694
- }
3695
- removeBlanksBetweenListItems() {
3696
- let removed = 0;
3697
- for (const table of this.getAllTables()) {
3698
- for (const row of table.getRows()) {
3699
- for (const cell of row.getCells()) {
3700
- let cellParas = cell.getParagraphs();
3701
- for (let ci = 1; ci < cellParas.length - 1; ci++) {
3702
- const prev = cellParas[ci - 1];
3703
- const current = cellParas[ci];
3704
- const next = cellParas[ci + 1];
3705
- if (!current || !this.isParagraphBlank(current))
3706
- continue;
3707
- const prevNumbering = prev?.getNumbering();
3708
- const nextNumbering = next?.getNumbering();
3709
- if (prevNumbering && nextNumbering) {
3710
- cell.removeParagraph(ci);
3711
- ci--;
3712
- removed++;
3713
- cellParas = cell.getParagraphs();
3714
- }
3715
- }
3716
- }
3717
- }
2499
+ let stylesXml = this.getStylesXml();
2500
+ if (!stylesXml) {
2501
+ return 0;
3718
2502
  }
3719
- for (let bi = 1; bi < this.bodyElements.length - 1; bi++) {
3720
- const prev = this.bodyElements[bi - 1];
3721
- const current = this.bodyElements[bi];
3722
- const next = this.bodyElements[bi + 1];
3723
- if (!(current instanceof Paragraph_1.Paragraph) || !this.isParagraphBlank(current))
3724
- continue;
3725
- if (prev instanceof Table_1.Table || next instanceof Table_1.Table)
3726
- continue;
3727
- if (prev instanceof Paragraph_1.Paragraph && next instanceof Paragraph_1.Paragraph) {
3728
- const prevNumbering = prev.getNumbering();
3729
- const nextNumbering = next.getNumbering();
3730
- if (prevNumbering && nextNumbering) {
3731
- this.bodyElements.splice(bi, 1);
3732
- bi--;
3733
- removed++;
3734
- }
3735
- }
3736
- }
3737
- return removed;
3738
- }
3739
- addStructureBlankLinesAfterElements(options) {
3740
- const result = this.addStructureBlankLines({
3741
- spacingAfter: 120,
3742
- markAsPreserved: true,
3743
- style: 'Normal',
3744
- after1x1Tables: true,
3745
- afterOtherTables: true,
3746
- aboveFirstTable: true,
3747
- aboveTODHyperlinks: true,
3748
- aboveReturnToHLP: true,
3749
- belowHeading1Lines: true,
3750
- belowTOC: true,
3751
- aboveWarning: true,
3752
- afterLists: true,
3753
- aroundImages: true,
3754
- stopBoldColonAfterHeading: options?.stopBoldColonAfterHeading,
2503
+ let updateCount = 0;
2504
+ const fillPattern = new RegExp(`(w:fill=["'])${normalizedOld}(["'])`, "gi");
2505
+ stylesXml = stylesXml.replace(fillPattern, (match, prefix, suffix) => {
2506
+ updateCount++;
2507
+ return `${prefix}${normalizedNew}${suffix}`;
3755
2508
  });
3756
- return result.blankLinesAdded;
3757
- }
3758
- markHeading2BlankLinesAsPreserved() {
3759
- const tables = this.getAllTables();
3760
- for (const table of tables) {
3761
- const rowCount = table.getRowCount();
3762
- const colCount = table.getColumnCount();
3763
- if (rowCount !== 1 || colCount !== 1) {
3764
- continue;
3765
- }
3766
- const cell = table.getCell(0, 0);
3767
- if (!cell)
3768
- continue;
3769
- const cellParas = cell.getParagraphs();
3770
- let hasHeading2 = false;
3771
- for (const para of cellParas) {
3772
- const style = para.getStyle();
3773
- if (style === "Heading2" ||
3774
- style === "Heading 2" ||
3775
- style === "CustomHeader2" ||
3776
- style === "Header2") {
3777
- hasHeading2 = true;
3778
- break;
3779
- }
3780
- }
3781
- if (!hasHeading2)
3782
- continue;
3783
- const tableIndex = this.bodyElements.indexOf(table);
3784
- if (tableIndex === -1)
3785
- continue;
3786
- const nextElement = this.bodyElements[tableIndex + 1];
3787
- if (nextElement instanceof Paragraph_1.Paragraph) {
3788
- if (this.isParagraphBlank(nextElement)) {
3789
- nextElement.setPreserved(true);
3790
- }
3791
- }
2509
+ const colorPattern = new RegExp(`(<w:shd[^>]*w:color=["'])${normalizedOld}(["'])`, "gi");
2510
+ stylesXml = stylesXml.replace(colorPattern, (match, prefix, suffix) => {
2511
+ updateCount++;
2512
+ return `${prefix}${normalizedNew}${suffix}`;
2513
+ });
2514
+ if (updateCount > 0) {
2515
+ this.setStylesXml(stylesXml);
3792
2516
  }
2517
+ return updateCount;
3793
2518
  }
3794
- ensureBlankLinesAfter1x1Tables(options) {
3795
- const spacingAfter = options?.spacingAfter ?? 120;
3796
- const markAsPreserved = options?.markAsPreserved ?? true;
3797
- const style = options?.style ?? "Normal";
3798
- const filter = options?.filter;
3799
- let tablesProcessed = 0;
3800
- let blankLinesAdded = 0;
3801
- let existingLinesMarked = 0;
3802
- const tables = this.getAllTables();
3803
- for (let i = 0; i < tables.length; i++) {
3804
- const table = tables[i];
3805
- if (!table)
3806
- continue;
3807
- const rowCount = table.getRowCount();
3808
- const colCount = table.getColumnCount();
3809
- if (rowCount !== 1 || colCount !== 1) {
3810
- continue;
3811
- }
3812
- if (filter && !filter(table, i)) {
3813
- continue;
3814
- }
3815
- tablesProcessed++;
3816
- const tableIndex = this.bodyElements.indexOf(table);
3817
- if (tableIndex === -1)
3818
- continue;
3819
- const nextElement = this.bodyElements[tableIndex + 1];
3820
- if (nextElement instanceof Paragraph_1.Paragraph) {
3821
- if (this.isParagraphBlank(nextElement)) {
3822
- nextElement.setStyle(style);
3823
- if (markAsPreserved && !nextElement.isPreserved()) {
3824
- nextElement.setPreserved(true);
3825
- existingLinesMarked++;
3826
- }
3827
- }
3828
- else {
3829
- const blankPara = Paragraph_1.Paragraph.create();
3830
- blankPara.setStyle(style);
3831
- blankPara.setSpaceAfter(spacingAfter);
3832
- if (markAsPreserved) {
3833
- blankPara.setPreserved(true);
3834
- }
3835
- this.bodyElements.splice(tableIndex + 1, 0, blankPara);
3836
- blankLinesAdded++;
3837
- }
2519
+ updateTableStyleShadingBulk(settings) {
2520
+ let totalUpdated = 0;
2521
+ const defaultReplaceColors = ["A5A5A5", "C0C0C0", "D9D9D9", "E7E6E6"];
2522
+ const colorsToReplace = settings.replaceColors || defaultReplaceColors;
2523
+ if (settings.headerShading) {
2524
+ for (const oldColor of colorsToReplace) {
2525
+ totalUpdated += this.updateTableStyleShading(oldColor, settings.headerShading);
3838
2526
  }
3839
- else {
3840
- const blankPara = Paragraph_1.Paragraph.create();
3841
- blankPara.setStyle(style);
3842
- blankPara.setSpaceAfter(spacingAfter);
3843
- if (markAsPreserved) {
3844
- blankPara.setPreserved(true);
3845
- }
3846
- this.bodyElements.splice(tableIndex + 1, 0, blankPara);
3847
- blankLinesAdded++;
2527
+ }
2528
+ if (settings.dataShading && settings.dataShading !== settings.headerShading) {
2529
+ const dataColors = ["D9D9D9", "E7E6E6", "F2F2F2"];
2530
+ for (const oldColor of dataColors) {
2531
+ totalUpdated += this.updateTableStyleShading(oldColor, settings.dataShading);
3848
2532
  }
3849
2533
  }
3850
- return {
3851
- tablesProcessed,
3852
- blankLinesAdded,
3853
- existingLinesMarked,
3854
- };
2534
+ return totalUpdated;
3855
2535
  }
3856
- ensureBlankLinesAfterOtherTables(options) {
3857
- const spacingAfter = options?.spacingAfter ?? 120;
3858
- const markAsPreserved = options?.markAsPreserved ?? true;
3859
- const style = options?.style ?? "Normal";
3860
- const filter = options?.filter;
3861
- let tablesProcessed = 0;
3862
- let blankLinesAdded = 0;
3863
- let existingLinesMarked = 0;
3864
- const tables = this.getAllTables();
3865
- for (let i = 0; i < tables.length; i++) {
3866
- const table = tables[i];
3867
- if (!table)
3868
- continue;
3869
- const rowCount = table.getRowCount();
3870
- const colCount = table.getColumnCount();
3871
- if (rowCount === 1 && colCount === 1) {
3872
- continue;
3873
- }
3874
- if (filter && !filter(table, i)) {
3875
- continue;
3876
- }
3877
- tablesProcessed++;
3878
- const tableIndex = this.bodyElements.indexOf(table);
3879
- if (tableIndex === -1)
3880
- continue;
3881
- const nextElement = this.bodyElements[tableIndex + 1];
3882
- if (nextElement instanceof Paragraph_1.Paragraph) {
3883
- if (this.isParagraphBlank(nextElement)) {
3884
- nextElement.setStyle(style);
3885
- if (markAsPreserved && !nextElement.isPreserved()) {
3886
- nextElement.setPreserved(true);
3887
- existingLinesMarked++;
3888
- }
3889
- }
3890
- else {
3891
- const blankPara = Paragraph_1.Paragraph.create();
3892
- blankPara.setStyle(style);
3893
- blankPara.setSpaceAfter(spacingAfter);
3894
- if (markAsPreserved) {
3895
- blankPara.setPreserved(true);
3896
- }
3897
- this.bodyElements.splice(tableIndex + 1, 0, blankPara);
3898
- blankLinesAdded++;
3899
- }
3900
- }
3901
- else {
3902
- const blankPara = Paragraph_1.Paragraph.create();
3903
- blankPara.setStyle(style);
3904
- blankPara.setSpaceAfter(spacingAfter);
3905
- if (markAsPreserved) {
3906
- blankPara.setPreserved(true);
2536
+ processConsecutiveBlanks(blanks, keepOne, toRemove) {
2537
+ if (blanks.length === 0)
2538
+ return;
2539
+ if (keepOne && blanks.length > 1) {
2540
+ for (let i = 1; i < blanks.length; i++) {
2541
+ const blank = blanks[i];
2542
+ if (blank) {
2543
+ toRemove.push(blank);
3907
2544
  }
3908
- this.bodyElements.splice(tableIndex + 1, 0, blankPara);
3909
- blankLinesAdded++;
3910
2545
  }
3911
2546
  }
3912
- return {
3913
- tablesProcessed,
3914
- blankLinesAdded,
3915
- existingLinesMarked,
3916
- };
2547
+ else if (!keepOne) {
2548
+ toRemove.push(...blanks);
2549
+ }
3917
2550
  }
3918
2551
  standardizeBulletSymbols(options) {
3919
2552
  const { bold = false, fontSize = 24, color = "000000", font = "Arial", } = options || {};
@@ -4092,28 +2725,28 @@ class Document {
4092
2725
  para.setAlignment(options.alignment);
4093
2726
  }
4094
2727
  if (options.spaceAbove !== undefined) {
4095
- para.setSpaceBefore(options.spaceAbove * 20);
2728
+ para.setSpaceBefore(options.spaceAbove * units_1.UNITS.TWIPS_PER_POINT);
4096
2729
  }
4097
2730
  if (options.spaceBelow !== undefined) {
4098
- para.setSpaceAfter(options.spaceBelow * 20);
2731
+ para.setSpaceAfter(options.spaceBelow * units_1.UNITS.TWIPS_PER_POINT);
4099
2732
  }
4100
2733
  if (options.lineSpacing !== undefined) {
4101
- para.setLineSpacing(options.lineSpacing * 20);
2734
+ para.setLineSpacing(options.lineSpacing * units_1.UNITS.TWIPS_PER_POINT);
4102
2735
  }
4103
2736
  if (options.indentLeft !== undefined) {
4104
- para.setLeftIndent(options.indentLeft * 1440);
2737
+ para.setLeftIndent(options.indentLeft * units_1.UNITS.TWIPS_PER_INCH);
4105
2738
  }
4106
2739
  if (options.indentRight !== undefined) {
4107
- para.setRightIndent(options.indentRight * 1440);
2740
+ para.setRightIndent(options.indentRight * units_1.UNITS.TWIPS_PER_INCH);
4108
2741
  }
4109
2742
  if (options.indentFirst !== undefined) {
4110
- para.setFirstLineIndent(options.indentFirst * 1440);
2743
+ para.setFirstLineIndent(options.indentFirst * units_1.UNITS.TWIPS_PER_INCH);
4111
2744
  }
4112
2745
  if (options.indentHanging !== undefined) {
4113
2746
  if (!para.formatting.indentation) {
4114
2747
  para.formatting.indentation = {};
4115
2748
  }
4116
- para.formatting.indentation.hanging = options.indentHanging * 1440;
2749
+ para.formatting.indentation.hanging = options.indentHanging * units_1.UNITS.TWIPS_PER_INCH;
4117
2750
  }
4118
2751
  if (options.keepWithNext) {
4119
2752
  para.setKeepNext(true);
@@ -4131,9 +2764,10 @@ class Document {
4131
2764
  }
4132
2765
  }
4133
2766
  para.clearDirectFormatting();
2767
+ const restoredFormatting = para.formatting;
4134
2768
  for (const prop of keepProperties) {
4135
2769
  if (savedProps[prop] !== undefined) {
4136
- para.formatting[prop] = savedProps[prop];
2770
+ restoredFormatting[prop] = savedProps[prop];
4137
2771
  }
4138
2772
  }
4139
2773
  for (const run of para.getRuns()) {
@@ -4191,224 +2825,7 @@ class Document {
4191
2825
  }
4192
2826
  return count;
4193
2827
  }
4194
- isParagraphBlank(para) {
4195
- const content = para.getContent();
4196
- if (!content || content.length === 0) {
4197
- return true;
4198
- }
4199
- for (const item of content) {
4200
- if (item instanceof Hyperlink_1.Hyperlink) {
4201
- return false;
4202
- }
4203
- if (item instanceof ImageRun_1.ImageRun) {
4204
- return false;
4205
- }
4206
- if (item instanceof Shape_1.Shape) {
4207
- return false;
4208
- }
4209
- if (item instanceof TextBox_1.TextBox) {
4210
- return false;
4211
- }
4212
- if (item instanceof Field_1.Field) {
4213
- return false;
4214
- }
4215
- if (item instanceof Revision_1.Revision) {
4216
- const revisionText = item.getText().trim();
4217
- if (revisionText !== '') {
4218
- return false;
4219
- }
4220
- for (const revContent of item.getContent()) {
4221
- if (revContent instanceof Hyperlink_1.Hyperlink) {
4222
- return false;
4223
- }
4224
- }
4225
- continue;
4226
- }
4227
- if (item.getText) {
4228
- const text = item.getText().trim();
4229
- if (text !== "") {
4230
- return false;
4231
- }
4232
- }
4233
- }
4234
- if (para.getBookmarksStart().length > 0 ||
4235
- para.getBookmarksEnd().length > 0) {
4236
- return false;
4237
- }
4238
- return true;
4239
- }
4240
- markSingleBlanksAsPreserved() {
4241
- let markedCount = 0;
4242
- const paragraphs = this.getAllParagraphs();
4243
- for (let i = 0; i < paragraphs.length; i++) {
4244
- const para = paragraphs[i];
4245
- if (!para)
4246
- continue;
4247
- if (para.isPreserved())
4248
- continue;
4249
- if (!this.isParagraphBlank(para))
4250
- continue;
4251
- const nextPara = paragraphs[i + 1];
4252
- const nextIsBlank = nextPara && this.isParagraphBlank(nextPara);
4253
- if (!nextIsBlank) {
4254
- para.setPreserved(true);
4255
- markedCount++;
4256
- }
4257
- }
4258
- return markedCount;
4259
- }
4260
- startsWithBoldColon(para) {
4261
- const content = para.getContent();
4262
- if (!content || content.length === 0)
4263
- return false;
4264
- const firstRun = content.find((item) => item instanceof Run_1.Run);
4265
- if (!firstRun)
4266
- return false;
4267
- const formatting = firstRun.getFormatting();
4268
- if (!formatting.bold)
4269
- return false;
4270
- const fullText = para.getText();
4271
- if (!fullText)
4272
- return false;
4273
- const first55 = fullText.substring(0, 55);
4274
- return first55.includes(':');
4275
- }
4276
- isWithinListContext(index) {
4277
- const current = this.bodyElements[index];
4278
- if (!(current instanceof Paragraph_1.Paragraph)) {
4279
- return false;
4280
- }
4281
- const currentNum = current.getNumbering();
4282
- if (currentNum) {
4283
- return false;
4284
- }
4285
- let prevNumId;
4286
- for (let i = index - 1; i >= 0; i--) {
4287
- const el = this.bodyElements[i];
4288
- if (el instanceof Paragraph_1.Paragraph) {
4289
- const num = el.getNumbering();
4290
- if (num) {
4291
- prevNumId = num.numId;
4292
- break;
4293
- }
4294
- }
4295
- else if (el instanceof Table_1.Table) {
4296
- break;
4297
- }
4298
- }
4299
- let nextNumId;
4300
- for (let i = index + 1; i < this.bodyElements.length; i++) {
4301
- const el = this.bodyElements[i];
4302
- if (el instanceof Paragraph_1.Paragraph) {
4303
- const num = el.getNumbering();
4304
- if (num) {
4305
- nextNumId = num.numId;
4306
- break;
4307
- }
4308
- }
4309
- else if (el instanceof Table_1.Table) {
4310
- break;
4311
- }
4312
- }
4313
- return prevNumId !== undefined && nextNumId !== undefined && prevNumId === nextNumId;
4314
- }
4315
- isWithinListContextInCell(cell, paraIndex) {
4316
- const cellParas = cell.getParagraphs();
4317
- const current = cellParas[paraIndex];
4318
- if (!current)
4319
- return false;
4320
- const currentNum = current.getNumbering();
4321
- if (currentNum)
4322
- return false;
4323
- let prevNumId;
4324
- for (let i = paraIndex - 1; i >= 0; i--) {
4325
- const num = cellParas[i]?.getNumbering();
4326
- if (num) {
4327
- prevNumId = num.numId;
4328
- break;
4329
- }
4330
- }
4331
- let nextNumId;
4332
- for (let i = paraIndex + 1; i < cellParas.length; i++) {
4333
- const num = cellParas[i]?.getNumbering();
4334
- if (num) {
4335
- nextNumId = num.numId;
4336
- break;
4337
- }
4338
- }
4339
- return prevNumId !== undefined && nextNumId !== undefined && prevNumId === nextNumId;
4340
- }
4341
- isTocParagraph(para) {
4342
- const styleId = para.getStyle()?.toLowerCase() || '';
4343
- return /^toc\s?\d$/i.test(styleId) || styleId.startsWith('toc');
4344
- }
4345
- isImageSmall(image) {
4346
- const EMU_PER_PIXEL = 9525;
4347
- const widthPx = image.getWidth() / EMU_PER_PIXEL;
4348
- const heightPx = image.getHeight() / EMU_PER_PIXEL;
4349
- return widthPx < 100 && heightPx < 100;
4350
- }
4351
- isSmallImageParagraph(para) {
4352
- const imageRun = this.getImageRunFromParagraph(para);
4353
- if (!imageRun)
4354
- return false;
4355
- const image = imageRun.getImageElement();
4356
- return this.isImageSmall(image);
4357
- }
4358
- getImageRunFromParagraph(para) {
4359
- for (const item of para.getContent()) {
4360
- if (item instanceof ImageRun_1.ImageRun) {
4361
- return item;
4362
- }
4363
- if (item instanceof Revision_1.Revision) {
4364
- for (const revContent of item.getContent()) {
4365
- if (revContent instanceof ImageRun_1.ImageRun) {
4366
- return revContent;
4367
- }
4368
- }
4369
- }
4370
- }
4371
- return null;
4372
- }
4373
- isCenteredBoldText(para) {
4374
- if (para.getAlignment() !== 'center')
4375
- return false;
4376
- const content = para.getContent();
4377
- if (!content || content.length === 0)
4378
- return false;
4379
- let hasTextRuns = false;
4380
- for (const item of content) {
4381
- if (item instanceof Run_1.Run) {
4382
- const text = item.getText().trim();
4383
- if (text !== '') {
4384
- hasTextRuns = true;
4385
- const formatting = item.getFormatting();
4386
- if (!formatting.bold) {
4387
- return false;
4388
- }
4389
- }
4390
- }
4391
- }
4392
- return hasTextRuns;
4393
- }
4394
- isTextOnlyParagraph(para) {
4395
- if (this.isParagraphBlank(para))
4396
- return false;
4397
- const content = para.getContent();
4398
- if (!content || content.length === 0)
4399
- return false;
4400
- for (const item of content) {
4401
- if (item instanceof ImageRun_1.ImageRun)
4402
- return false;
4403
- if (item instanceof Shape_1.Shape)
4404
- return false;
4405
- if (item instanceof TextBox_1.TextBox)
4406
- return false;
4407
- }
4408
- const text = para.getText().trim();
4409
- return text !== '';
4410
- }
4411
- removeAllPreserveFlags() {
2828
+ clearAllPreserveFlags() {
4412
2829
  let cleared = 0;
4413
2830
  for (const para of this.getAllParagraphs()) {
4414
2831
  if (para.isPreserved()) {
@@ -4418,9 +2835,6 @@ class Document {
4418
2835
  }
4419
2836
  return cleared;
4420
2837
  }
4421
- clearAllPreserveFlags() {
4422
- return this.removeAllPreserveFlags();
4423
- }
4424
2838
  parseTOCFieldInstruction(instrText) {
4425
2839
  const levels = new Set();
4426
2840
  let hasOutlineSwitch = false;
@@ -6779,6 +5193,26 @@ class Document {
6779
5193
  }
6780
5194
  return false;
6781
5195
  }
5196
+ getBodyElementIndex(element) {
5197
+ return this.bodyElements.indexOf(element);
5198
+ }
5199
+ getBodyElementCount() {
5200
+ return this.bodyElements.length;
5201
+ }
5202
+ removeBodyElementAt(index) {
5203
+ if (index >= 0 && index < this.bodyElements.length) {
5204
+ this.bodyElements.splice(index, 1);
5205
+ return true;
5206
+ }
5207
+ return false;
5208
+ }
5209
+ insertBodyElementAt(index, element) {
5210
+ const clampedIndex = Math.max(0, Math.min(index, this.bodyElements.length));
5211
+ this.bodyElements.splice(clampedIndex, 0, element);
5212
+ }
5213
+ setBodyElements(elements) {
5214
+ this.bodyElements = elements;
5215
+ }
6782
5216
  getHyperlinks() {
6783
5217
  const hyperlinks = [];
6784
5218
  const extractHyperlinksFromParagraph = (para) => {
@@ -7099,66 +5533,25 @@ class Document {
7099
5533
  }
7100
5534
  clearCustom() {
7101
5535
  const unwrappedBody = [];
7102
- for (const element of this.bodyElements) {
7103
- if (element instanceof StructuredDocumentTag_1.StructuredDocumentTag) {
7104
- const sdtContent = element.getContent();
7105
- for (const item of sdtContent) {
7106
- if (item instanceof Table_1.Table) {
7107
- this.sanitizeTableRowExceptions(item);
7108
- unwrappedBody.push(item);
7109
- }
7110
- else if (item instanceof Paragraph_1.Paragraph || item instanceof Table_1.Table) {
7111
- unwrappedBody.push(item);
7112
- }
7113
- else if (item instanceof StructuredDocumentTag_1.StructuredDocumentTag) {
7114
- this.unwrapNestedStructuredDocumentTags(item, unwrappedBody);
7115
- }
5536
+ const unwrapSDT = (sdt, target) => {
5537
+ for (const item of sdt.getContent()) {
5538
+ if (item instanceof Paragraph_1.Paragraph || item instanceof Table_1.Table) {
5539
+ target.push(item);
5540
+ }
5541
+ else if (item instanceof StructuredDocumentTag_1.StructuredDocumentTag) {
5542
+ unwrapSDT(item, target);
7116
5543
  }
7117
5544
  }
7118
- else if (element instanceof Table_1.Table) {
7119
- this.clearCustomInTable(element);
7120
- unwrappedBody.push(element);
5545
+ };
5546
+ for (const element of this.bodyElements) {
5547
+ if (element instanceof StructuredDocumentTag_1.StructuredDocumentTag) {
5548
+ unwrapSDT(element, unwrappedBody);
7121
5549
  }
7122
5550
  else {
7123
5551
  unwrappedBody.push(element);
7124
5552
  }
7125
5553
  }
7126
5554
  this.bodyElements = unwrappedBody;
7127
- return this;
7128
- }
7129
- sanitizeTableRowExceptions(table) {
7130
- const rows = table.getRows();
7131
- for (const row of rows) {
7132
- const exceptions = row.getTablePropertyExceptions();
7133
- if (exceptions && Object.keys(exceptions).length > 0) {
7134
- row.setTablePropertyExceptions(undefined);
7135
- }
7136
- }
7137
- }
7138
- unwrapNestedStructuredDocumentTags(sdt, targetArray) {
7139
- const content = sdt.getContent();
7140
- for (const item of content) {
7141
- if (item instanceof Paragraph_1.Paragraph || item instanceof Table_1.Table) {
7142
- targetArray.push(item);
7143
- }
7144
- else if (item instanceof StructuredDocumentTag_1.StructuredDocumentTag) {
7145
- this.unwrapNestedStructuredDocumentTags(item, targetArray);
7146
- }
7147
- }
7148
- }
7149
- clearCustomInTable(table) {
7150
- const rows = table.getRows();
7151
- for (const row of rows) {
7152
- const cells = row.getCells();
7153
- for (const cell of cells) {
7154
- if (!(cell instanceof TableCell_1.TableCell)) {
7155
- continue;
7156
- }
7157
- const cellParagraphs = cell.getParagraphs();
7158
- for (const para of cellParagraphs) {
7159
- }
7160
- }
7161
- }
7162
5555
  }
7163
5556
  rebuildTOCs() {
7164
5557
  const results = [];