docxmlater 10.3.6 → 10.4.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 (184) hide show
  1. package/README.md +158 -7
  2. package/dist/core/Document.d.ts +97 -3
  3. package/dist/core/Document.d.ts.map +1 -1
  4. package/dist/core/Document.js +727 -50
  5. package/dist/core/Document.js.map +1 -1
  6. package/dist/core/DocumentContent.d.ts.map +1 -1
  7. package/dist/core/DocumentContent.js +0 -8
  8. package/dist/core/DocumentContent.js.map +1 -1
  9. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  10. package/dist/core/DocumentGenerator.js +9 -5
  11. package/dist/core/DocumentGenerator.js.map +1 -1
  12. package/dist/core/DocumentParser.d.ts.map +1 -1
  13. package/dist/core/DocumentParser.js +573 -101
  14. package/dist/core/DocumentParser.js.map +1 -1
  15. package/dist/core/RelationshipManager.d.ts.map +1 -1
  16. package/dist/core/RelationshipManager.js +4 -3
  17. package/dist/core/RelationshipManager.js.map +1 -1
  18. package/dist/elements/Bookmark.d.ts +7 -0
  19. package/dist/elements/Bookmark.d.ts.map +1 -1
  20. package/dist/elements/Bookmark.js +24 -4
  21. package/dist/elements/Bookmark.js.map +1 -1
  22. package/dist/elements/BookmarkManager.d.ts.map +1 -1
  23. package/dist/elements/BookmarkManager.js +4 -3
  24. package/dist/elements/BookmarkManager.js.map +1 -1
  25. package/dist/elements/CommonTypes.d.ts +2 -2
  26. package/dist/elements/CommonTypes.d.ts.map +1 -1
  27. package/dist/elements/CommonTypes.js +14 -1
  28. package/dist/elements/CommonTypes.js.map +1 -1
  29. package/dist/elements/Field.d.ts +1 -1
  30. package/dist/elements/Field.d.ts.map +1 -1
  31. package/dist/elements/Field.js +1 -1
  32. package/dist/elements/Field.js.map +1 -1
  33. package/dist/elements/Footer.d.ts +2 -0
  34. package/dist/elements/Footer.d.ts.map +1 -1
  35. package/dist/elements/Footer.js +6 -0
  36. package/dist/elements/Footer.js.map +1 -1
  37. package/dist/elements/Header.d.ts +2 -0
  38. package/dist/elements/Header.d.ts.map +1 -1
  39. package/dist/elements/Header.js +6 -0
  40. package/dist/elements/Header.js.map +1 -1
  41. package/dist/elements/Image.d.ts.map +1 -1
  42. package/dist/elements/Image.js +3 -0
  43. package/dist/elements/Image.js.map +1 -1
  44. package/dist/elements/Paragraph.d.ts +81 -1
  45. package/dist/elements/Paragraph.d.ts.map +1 -1
  46. package/dist/elements/Paragraph.js +515 -21
  47. package/dist/elements/Paragraph.js.map +1 -1
  48. package/dist/elements/Revision.d.ts +0 -1
  49. package/dist/elements/Revision.d.ts.map +1 -1
  50. package/dist/elements/Revision.js +0 -12
  51. package/dist/elements/Revision.js.map +1 -1
  52. package/dist/elements/RevisionManager.d.ts +0 -1
  53. package/dist/elements/RevisionManager.d.ts.map +1 -1
  54. package/dist/elements/RevisionManager.js +0 -2
  55. package/dist/elements/RevisionManager.js.map +1 -1
  56. package/dist/elements/Run.d.ts +16 -4
  57. package/dist/elements/Run.d.ts.map +1 -1
  58. package/dist/elements/Run.js +114 -22
  59. package/dist/elements/Run.js.map +1 -1
  60. package/dist/elements/Section.d.ts +7 -1
  61. package/dist/elements/Section.d.ts.map +1 -1
  62. package/dist/elements/Section.js +185 -4
  63. package/dist/elements/Section.js.map +1 -1
  64. package/dist/elements/Shape.js.map +1 -1
  65. package/dist/elements/Table.d.ts +30 -1
  66. package/dist/elements/Table.d.ts.map +1 -1
  67. package/dist/elements/Table.js +357 -40
  68. package/dist/elements/Table.js.map +1 -1
  69. package/dist/elements/TableCell.d.ts +3 -0
  70. package/dist/elements/TableCell.d.ts.map +1 -1
  71. package/dist/elements/TableCell.js +30 -3
  72. package/dist/elements/TableCell.js.map +1 -1
  73. package/dist/elements/TableGridChange.d.ts +0 -1
  74. package/dist/elements/TableGridChange.d.ts.map +1 -1
  75. package/dist/elements/TableGridChange.js +0 -10
  76. package/dist/elements/TableGridChange.js.map +1 -1
  77. package/dist/elements/TableRow.d.ts +4 -0
  78. package/dist/elements/TableRow.d.ts.map +1 -1
  79. package/dist/elements/TableRow.js +31 -3
  80. package/dist/elements/TableRow.js.map +1 -1
  81. package/dist/formatting/AbstractNumbering.d.ts +5 -0
  82. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  83. package/dist/formatting/AbstractNumbering.js +22 -0
  84. package/dist/formatting/AbstractNumbering.js.map +1 -1
  85. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  86. package/dist/formatting/NumberingLevel.js +3 -3
  87. package/dist/formatting/NumberingLevel.js.map +1 -1
  88. package/dist/formatting/Style.d.ts +1 -0
  89. package/dist/formatting/Style.d.ts.map +1 -1
  90. package/dist/formatting/Style.js +25 -59
  91. package/dist/formatting/Style.js.map +1 -1
  92. package/dist/formatting/StylesManager.d.ts +1 -0
  93. package/dist/formatting/StylesManager.d.ts.map +1 -1
  94. package/dist/formatting/StylesManager.js +12 -0
  95. package/dist/formatting/StylesManager.js.map +1 -1
  96. package/dist/helpers/CleanupHelper.js.map +1 -1
  97. package/dist/images/ImageOptimizer.d.ts.map +1 -1
  98. package/dist/images/ImageOptimizer.js +0 -1
  99. package/dist/images/ImageOptimizer.js.map +1 -1
  100. package/dist/index.d.ts +1 -1
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js.map +1 -1
  103. package/dist/managers/DrawingManager.d.ts.map +1 -1
  104. package/dist/managers/DrawingManager.js +4 -2
  105. package/dist/managers/DrawingManager.js.map +1 -1
  106. package/dist/types/formatting.d.ts +2 -2
  107. package/dist/types/formatting.d.ts.map +1 -1
  108. package/dist/types/formatting.js.map +1 -1
  109. package/dist/utils/ChangelogGenerator.d.ts +2 -2
  110. package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
  111. package/dist/utils/ChangelogGenerator.js +4 -5
  112. package/dist/utils/ChangelogGenerator.js.map +1 -1
  113. package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
  114. package/dist/utils/InMemoryRevisionAcceptor.js +0 -1
  115. package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
  116. package/dist/utils/RevisionAwareProcessor.d.ts +2 -2
  117. package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
  118. package/dist/utils/RevisionAwareProcessor.js +2 -2
  119. package/dist/utils/RevisionAwareProcessor.js.map +1 -1
  120. package/dist/utils/SelectiveRevisionAcceptor.d.ts +0 -2
  121. package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
  122. package/dist/utils/SelectiveRevisionAcceptor.js +0 -26
  123. package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
  124. package/dist/utils/ShadingResolver.d.ts.map +1 -1
  125. package/dist/utils/ShadingResolver.js.map +1 -1
  126. package/dist/utils/acceptRevisions.js +1 -1
  127. package/dist/utils/acceptRevisions.js.map +1 -1
  128. package/dist/utils/stripTrackedChanges.js +1 -1
  129. package/dist/utils/stripTrackedChanges.js.map +1 -1
  130. package/dist/utils/units.d.ts.map +1 -1
  131. package/dist/utils/units.js +1 -1
  132. package/dist/utils/units.js.map +1 -1
  133. package/dist/validation/RevisionAutoFixer.d.ts +2 -1
  134. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  135. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  136. package/package.json +10 -1
  137. package/src/constants/CLAUDE.md +28 -0
  138. package/src/core/CLAUDE.md +4 -0
  139. package/src/core/Document.ts +1755 -85
  140. package/src/core/DocumentContent.ts +0 -11
  141. package/src/core/DocumentGenerator.ts +11 -12
  142. package/src/core/DocumentParser.ts +599 -138
  143. package/src/core/RelationshipManager.ts +6 -3
  144. package/src/elements/Bookmark.ts +39 -4
  145. package/src/elements/BookmarkManager.ts +4 -3
  146. package/src/elements/CLAUDE.md +18 -2
  147. package/src/elements/CommonTypes.ts +35 -8
  148. package/src/elements/Field.ts +1 -1
  149. package/src/elements/Footer.ts +23 -0
  150. package/src/elements/Header.ts +25 -0
  151. package/src/elements/Image.ts +5 -0
  152. package/src/elements/Paragraph.ts +1069 -41
  153. package/src/elements/Revision.ts +0 -19
  154. package/src/elements/RevisionManager.ts +1 -3
  155. package/src/elements/Run.ts +265 -35
  156. package/src/elements/Section.ts +214 -8
  157. package/src/elements/Shape.ts +1 -1
  158. package/src/elements/Table.ts +850 -61
  159. package/src/elements/TableCell.ts +84 -10
  160. package/src/elements/TableGridChange.ts +2 -16
  161. package/src/elements/TableRow.ts +94 -9
  162. package/src/formatting/AbstractNumbering.ts +42 -1
  163. package/src/formatting/CLAUDE.md +4 -0
  164. package/src/formatting/NumberingLevel.ts +11 -7
  165. package/src/formatting/Style.ts +39 -71
  166. package/src/formatting/StylesManager.ts +36 -0
  167. package/src/helpers/CleanupHelper.ts +1 -1
  168. package/src/images/ImageOptimizer.ts +0 -3
  169. package/src/index.ts +1 -1
  170. package/src/managers/DrawingManager.ts +5 -3
  171. package/src/tracking/CLAUDE.md +30 -0
  172. package/src/types/CLAUDE.md +39 -0
  173. package/src/types/formatting.ts +2 -2
  174. package/src/utils/CLAUDE.md +15 -0
  175. package/src/utils/ChangelogGenerator.ts +4 -5
  176. package/src/utils/InMemoryRevisionAcceptor.ts +0 -9
  177. package/src/utils/RevisionAwareProcessor.ts +2 -3
  178. package/src/utils/SelectiveRevisionAcceptor.ts +0 -39
  179. package/src/utils/ShadingResolver.ts +0 -1
  180. package/src/utils/acceptRevisions.ts +1 -1
  181. package/src/utils/stripTrackedChanges.ts +1 -1
  182. package/src/utils/units.ts +2 -1
  183. package/src/validation/CLAUDE.md +40 -0
  184. package/src/validation/RevisionAutoFixer.ts +2 -1
@@ -63,6 +63,38 @@ class Table {
63
63
  row._setParentTable(this);
64
64
  return this;
65
65
  }
66
+ addRowFromArray(cells) {
67
+ const row = new TableRow_1.TableRow();
68
+ for (const text of cells) {
69
+ row.createCell(text || undefined);
70
+ }
71
+ this.rows.push(row);
72
+ row._setParentTable(this);
73
+ return row;
74
+ }
75
+ addSummaryRow(options) {
76
+ const label = options?.label ?? 'Total';
77
+ const startRow = options?.startRow ?? 1;
78
+ const colCount = this.getColumnCount();
79
+ const defaultCompute = (values) => {
80
+ const nums = values.map((v) => parseFloat(v)).filter((n) => !isNaN(n));
81
+ if (nums.length === 0)
82
+ return '';
83
+ return String(nums.reduce((a, b) => a + b, 0));
84
+ };
85
+ const compute = options?.compute ?? defaultCompute;
86
+ const cells = [];
87
+ for (let c = 0; c < colCount; c++) {
88
+ if (c === 0) {
89
+ cells.push(label);
90
+ continue;
91
+ }
92
+ const colTexts = this.getColumnTexts(c);
93
+ const dataValues = colTexts.slice(startRow);
94
+ cells.push(compute(dataValues, c));
95
+ }
96
+ return this.addRowFromArray(cells);
97
+ }
66
98
  createRow(cellCount, formatting) {
67
99
  const row = new TableRow_1.TableRow(cellCount, formatting);
68
100
  this.rows.push(row);
@@ -112,6 +144,22 @@ class Table {
112
144
  const row = this.getRow(rowIndex);
113
145
  return row ? row.getCell(columnIndex) : undefined;
114
146
  }
147
+ setCell(rowIndex, colIndex, text) {
148
+ const cell = this.getCell(rowIndex, colIndex);
149
+ if (!cell)
150
+ return this;
151
+ const paragraphs = cell.getParagraphs();
152
+ if (paragraphs.length > 0) {
153
+ paragraphs[0].setText(text);
154
+ for (let p = paragraphs.length - 1; p >= 1; p--) {
155
+ cell.removeParagraph(p);
156
+ }
157
+ }
158
+ else {
159
+ cell.createParagraph(text);
160
+ }
161
+ return this;
162
+ }
115
163
  setWidth(twips) {
116
164
  const prev = this.formatting.width;
117
165
  this.formatting.width = twips;
@@ -240,6 +288,17 @@ class Table {
240
288
  }
241
289
  return this;
242
290
  }
291
+ setIndentType(type) {
292
+ const prev = this.formatting.indentType;
293
+ this.formatting.indentType = type;
294
+ if (this.trackingContext?.isEnabled() && prev !== type) {
295
+ this.trackingContext.trackTableChange(this, 'indentType', prev, type);
296
+ }
297
+ return this;
298
+ }
299
+ getIndentType() {
300
+ return this.formatting.indentType;
301
+ }
243
302
  setStyle(style) {
244
303
  const prev = this.formatting.style;
245
304
  this.formatting.style = style;
@@ -570,7 +629,7 @@ class Table {
570
629
  if (this.formatting.indent !== undefined) {
571
630
  tblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblInd', {
572
631
  'w:w': this.formatting.indent,
573
- 'w:type': 'dxa',
632
+ 'w:type': this.formatting.indentType || 'dxa',
574
633
  }));
575
634
  }
576
635
  if (this.formatting.borders) {
@@ -660,6 +719,41 @@ class Table {
660
719
  if (prev.style) {
661
720
  prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblStyle', { 'w:val': prev.style }));
662
721
  }
722
+ if (prev.position) {
723
+ const posAttrs = {};
724
+ const pos = prev.position;
725
+ if (pos.x !== undefined)
726
+ posAttrs['w:tblpX'] = pos.x;
727
+ if (pos.y !== undefined)
728
+ posAttrs['w:tblpY'] = pos.y;
729
+ if (pos.horizontalAnchor)
730
+ posAttrs['w:horzAnchor'] = pos.horizontalAnchor;
731
+ if (pos.verticalAnchor)
732
+ posAttrs['w:vertAnchor'] = pos.verticalAnchor;
733
+ if (pos.leftFromText !== undefined)
734
+ posAttrs['w:leftFromText'] = pos.leftFromText;
735
+ if (pos.rightFromText !== undefined)
736
+ posAttrs['w:rightFromText'] = pos.rightFromText;
737
+ if (pos.topFromText !== undefined)
738
+ posAttrs['w:topFromText'] = pos.topFromText;
739
+ if (pos.bottomFromText !== undefined)
740
+ posAttrs['w:bottomFromText'] = pos.bottomFromText;
741
+ if (Object.keys(posAttrs).length > 0) {
742
+ prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblpPr', posAttrs));
743
+ }
744
+ }
745
+ if (prev.overlap) {
746
+ prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblOverlap', { 'w:val': prev.overlap }));
747
+ }
748
+ if (prev.bidiVisual) {
749
+ prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('bidiVisual'));
750
+ }
751
+ if (prev.tblStyleRowBandSize !== undefined) {
752
+ prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblStyleRowBandSize', { 'w:val': prev.tblStyleRowBandSize }));
753
+ }
754
+ if (prev.tblStyleColBandSize !== undefined) {
755
+ prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblStyleColBandSize', { 'w:val': prev.tblStyleColBandSize }));
756
+ }
663
757
  if (prev.width !== undefined) {
664
758
  prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblW', {
665
759
  'w:w': prev.width,
@@ -669,8 +763,15 @@ class Table {
669
763
  if (prev.alignment) {
670
764
  prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('jc', { 'w:val': prev.alignment }));
671
765
  }
766
+ if (prev.cellSpacing !== undefined) {
767
+ const csAttrs = {
768
+ 'w:w': prev.cellSpacing,
769
+ 'w:type': prev.cellSpacingType || 'dxa',
770
+ };
771
+ prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblCellSpacing', csAttrs));
772
+ }
672
773
  if (prev.indent !== undefined) {
673
- prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblInd', { 'w:w': prev.indent, 'w:type': 'dxa' }));
774
+ prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblInd', { 'w:w': prev.indent, 'w:type': prev.indentType || 'dxa' }));
674
775
  }
675
776
  if (prev.borders) {
676
777
  const borderChildren = [];
@@ -701,23 +802,19 @@ class Table {
701
802
  if (prev.layout) {
702
803
  prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblLayout', { 'w:type': prev.layout }));
703
804
  }
704
- if (prev.cellSpacing !== undefined) {
705
- const csAttrs = {
706
- 'w:w': prev.cellSpacing,
707
- 'w:type': prev.cellSpacingType || 'dxa',
708
- };
709
- prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblCellSpacing', csAttrs));
710
- }
711
- if (prev.bidiVisual) {
712
- prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('bidiVisual'));
713
- }
714
805
  if (prev.cellMargins) {
715
806
  const cmChildren = [];
716
- for (const side of ['top', 'start', 'bottom', 'end']) {
717
- const val = prev.cellMargins[side];
718
- if (val !== undefined) {
719
- cmChildren.push(XMLBuilder_1.XMLBuilder.wSelf(side, { 'w:w': val, 'w:type': 'dxa' }));
720
- }
807
+ if (prev.cellMargins.top !== undefined) {
808
+ cmChildren.push(XMLBuilder_1.XMLBuilder.wSelf('top', { 'w:w': prev.cellMargins.top, 'w:type': 'dxa' }));
809
+ }
810
+ if (prev.cellMargins.left !== undefined) {
811
+ cmChildren.push(XMLBuilder_1.XMLBuilder.wSelf('left', { 'w:w': prev.cellMargins.left, 'w:type': 'dxa' }));
812
+ }
813
+ if (prev.cellMargins.bottom !== undefined) {
814
+ cmChildren.push(XMLBuilder_1.XMLBuilder.wSelf('bottom', { 'w:w': prev.cellMargins.bottom, 'w:type': 'dxa' }));
815
+ }
816
+ if (prev.cellMargins.right !== undefined) {
817
+ cmChildren.push(XMLBuilder_1.XMLBuilder.wSelf('right', { 'w:w': prev.cellMargins.right, 'w:type': 'dxa' }));
721
818
  }
722
819
  if (cmChildren.length > 0) {
723
820
  prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.w('tblCellMar', undefined, cmChildren));
@@ -726,15 +823,6 @@ class Table {
726
823
  if (prev.tblLook) {
727
824
  prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblLook', buildTblLookAttributes(prev.tblLook)));
728
825
  }
729
- if (prev.tblStyleRowBandSize !== undefined) {
730
- prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblStyleRowBandSize', { 'w:val': prev.tblStyleRowBandSize }));
731
- }
732
- if (prev.tblStyleColBandSize !== undefined) {
733
- prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblStyleColBandSize', { 'w:val': prev.tblStyleColBandSize }));
734
- }
735
- if (prev.overlap) {
736
- prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblOverlap', { 'w:val': prev.overlap }));
737
- }
738
826
  if (prev.caption) {
739
827
  prevTblPrChildren.push(XMLBuilder_1.XMLBuilder.wSelf('tblCaption', { 'w:val': prev.caption }));
740
828
  }
@@ -772,6 +860,9 @@ class Table {
772
860
  }
773
861
  removeRow(index) {
774
862
  if (index >= 0 && index < this.rows.length) {
863
+ if (this.rows.length <= 1 && !this.trackingContext?.isEnabled()) {
864
+ return false;
865
+ }
775
866
  if (this.trackingContext?.isEnabled()) {
776
867
  const author = this.trackingContext.getAuthor();
777
868
  const row = this.rows[index];
@@ -799,8 +890,10 @@ class Table {
799
890
  if (index > this.rows.length)
800
891
  index = this.rows.length;
801
892
  if (!row) {
802
- const columnCount = this.getColumnCount();
803
- row = new TableRow_1.TableRow(columnCount);
893
+ const gridColumns = this.formatting.tableGrid
894
+ ? this.formatting.tableGrid.length
895
+ : Math.max(...this.rows.map((r) => r.getTotalGridSpan()), 1);
896
+ row = new TableRow_1.TableRow(gridColumns);
804
897
  }
805
898
  this.rows.splice(index, 0, row);
806
899
  if (this.trackingContext?.isEnabled()) {
@@ -865,6 +958,94 @@ class Table {
865
958
  }
866
959
  return Math.max(...this.rows.map((row) => row.getCellCount()));
867
960
  }
961
+ getColumnCells(colIndex) {
962
+ const cells = [];
963
+ for (const row of this.rows) {
964
+ const cell = row.getCell(colIndex);
965
+ if (cell)
966
+ cells.push(cell);
967
+ }
968
+ return cells;
969
+ }
970
+ getColumnTexts(colIndex) {
971
+ return this.getColumnCells(colIndex).map((cell) => cell.getText());
972
+ }
973
+ mapColumn(colIndex, transform) {
974
+ for (let r = 0; r < this.rows.length; r++) {
975
+ const cell = this.rows[r].getCell(colIndex);
976
+ if (!cell)
977
+ continue;
978
+ const currentText = cell.getText();
979
+ const newText = transform(currentText, r);
980
+ if (newText !== currentText) {
981
+ const paragraphs = cell.getParagraphs();
982
+ if (paragraphs.length > 0) {
983
+ const firstPara = paragraphs[0];
984
+ firstPara.setText(newText);
985
+ for (let p = paragraphs.length - 1; p >= 1; p--) {
986
+ cell.removeParagraph(p);
987
+ }
988
+ }
989
+ else {
990
+ cell.createParagraph(newText);
991
+ }
992
+ }
993
+ }
994
+ return this;
995
+ }
996
+ forEachCell(callback) {
997
+ for (let r = 0; r < this.rows.length; r++) {
998
+ const cells = this.rows[r].getCells();
999
+ for (let c = 0; c < cells.length; c++) {
1000
+ const result = callback(r, c, cells[c]);
1001
+ if (result === false)
1002
+ return;
1003
+ }
1004
+ }
1005
+ }
1006
+ findCell(predicate) {
1007
+ for (let r = 0; r < this.rows.length; r++) {
1008
+ const cells = this.rows[r].getCells();
1009
+ for (let c = 0; c < cells.length; c++) {
1010
+ if (predicate(cells[c], r, c)) {
1011
+ return { row: r, col: c, cell: cells[c] };
1012
+ }
1013
+ }
1014
+ }
1015
+ return undefined;
1016
+ }
1017
+ filterRows(predicate) {
1018
+ const indices = [];
1019
+ for (let r = 0; r < this.rows.length; r++) {
1020
+ if (predicate(this.rows[r].getCells(), r)) {
1021
+ indices.push(r);
1022
+ }
1023
+ }
1024
+ return indices;
1025
+ }
1026
+ removeEmptyRows() {
1027
+ const emptyIndices = this.filterRows((cells) => cells.every((c) => c.getText().trim() === ''));
1028
+ const toRemove = emptyIndices.length === this.rows.length
1029
+ ? emptyIndices.slice(1)
1030
+ : emptyIndices;
1031
+ for (let i = toRemove.length - 1; i >= 0; i--) {
1032
+ this.removeRow(toRemove[i]);
1033
+ }
1034
+ return toRemove.length;
1035
+ }
1036
+ removeEmptyColumns() {
1037
+ const colCount = this.getColumnCount();
1038
+ let removed = 0;
1039
+ for (let c = colCount - 1; c >= 0; c--) {
1040
+ const columnCells = this.getColumnCells(c);
1041
+ const isEmpty = columnCells.every((cell) => cell.getText().trim() === '');
1042
+ if (isEmpty) {
1043
+ this.removeColumn(c);
1044
+ removed++;
1045
+ }
1046
+ }
1047
+ return removed;
1048
+ }
868
1049
  setColumnWidths(widths) {
869
1050
  this.formatting.tableGrid = widths.map((w) => (w === null ? undefined : w));
870
1051
  return this;
@@ -872,6 +1053,21 @@ class Table {
872
1053
  static create(rows, columns, formatting) {
873
1054
  return new Table(rows, columns, formatting);
874
1055
  }
1056
+ static fromArray(data, formatting) {
1057
+ if (data.length === 0)
1058
+ return new Table(0, 0, formatting);
1059
+ const maxCols = Math.max(...data.map((row) => row.length));
1060
+ const table = new Table(0, 0, formatting);
1061
+ for (const rowData of data) {
1062
+ const row = new TableRow_1.TableRow();
1063
+ for (let c = 0; c < maxCols; c++) {
1064
+ const text = c < rowData.length ? rowData[c] : undefined;
1065
+ row.createCell(text || undefined);
1066
+ }
1067
+ table.addRow(row);
1068
+ }
1069
+ return table;
1070
+ }
875
1071
  mergeCells(startRow, startCol, endRow, endCol) {
876
1072
  if (startRow < 0 || endRow >= this.rows.length || startCol < 0 || endCol < 0) {
877
1073
  return this;
@@ -1029,7 +1225,9 @@ class Table {
1029
1225
  }
1030
1226
  insertRows(startIndex, count) {
1031
1227
  const insertedRows = [];
1032
- const columnCount = this.getColumnCount();
1228
+ const columnCount = this.formatting.tableGrid
1229
+ ? this.formatting.tableGrid.length
1230
+ : Math.max(...this.rows.map((r) => r.getTotalGridSpan()), 1);
1033
1231
  for (let i = 0; i < count; i++) {
1034
1232
  const row = new TableRow_1.TableRow(columnCount);
1035
1233
  this.insertRow(startIndex + i, row);
@@ -1091,24 +1289,143 @@ class Table {
1091
1289
  this.rows = headerRow ? [headerRow, ...rowsToSort] : rowsToSort;
1092
1290
  return this;
1093
1291
  }
1292
+ toArray() {
1293
+ return this.rows.map((row) => row.getCells().map((cell) => cell.getText()));
1294
+ }
1295
+ toPlainText(columnSeparator = '\t', rowSeparator = '\n') {
1296
+ return this.rows
1297
+ .map((row) => row
1298
+ .getCells()
1299
+ .map((cell) => cell.getText())
1300
+ .join(columnSeparator))
1301
+ .join(rowSeparator);
1302
+ }
1303
+ toCSV(delimiter = ',') {
1304
+ return this.rows
1305
+ .map((row) => row
1306
+ .getCells()
1307
+ .map((cell) => {
1308
+ const text = cell.getText();
1309
+ if (text.includes(delimiter) || text.includes('"') || text.includes('\n')) {
1310
+ return '"' + text.replace(/"/g, '""') + '"';
1311
+ }
1312
+ return text;
1313
+ })
1314
+ .join(delimiter))
1315
+ .join('\n');
1316
+ }
1317
+ static fromCSV(csv, delimiter = ',', formatting) {
1318
+ const rows = [];
1319
+ let currentRow = [];
1320
+ let currentField = '';
1321
+ let inQuotes = false;
1322
+ let i = 0;
1323
+ while (i < csv.length) {
1324
+ const ch = csv[i];
1325
+ if (inQuotes) {
1326
+ if (ch === '"') {
1327
+ if (i + 1 < csv.length && csv[i + 1] === '"') {
1328
+ currentField += '"';
1329
+ i += 2;
1330
+ }
1331
+ else {
1332
+ inQuotes = false;
1333
+ i++;
1334
+ }
1335
+ }
1336
+ else {
1337
+ currentField += ch;
1338
+ i++;
1339
+ }
1340
+ }
1341
+ else {
1342
+ if (ch === '"') {
1343
+ inQuotes = true;
1344
+ i++;
1345
+ }
1346
+ else if (ch === delimiter) {
1347
+ currentRow.push(currentField);
1348
+ currentField = '';
1349
+ i++;
1350
+ }
1351
+ else if (ch === '\n') {
1352
+ currentRow.push(currentField);
1353
+ currentField = '';
1354
+ rows.push(currentRow);
1355
+ currentRow = [];
1356
+ i++;
1357
+ }
1358
+ else if (ch === '\r') {
1359
+ if (i + 1 < csv.length && csv[i + 1] === '\n') {
1360
+ i++;
1361
+ }
1362
+ currentRow.push(currentField);
1363
+ currentField = '';
1364
+ rows.push(currentRow);
1365
+ currentRow = [];
1366
+ i++;
1367
+ }
1368
+ else {
1369
+ currentField += ch;
1370
+ i++;
1371
+ }
1372
+ }
1373
+ }
1374
+ if (currentField || currentRow.length > 0) {
1375
+ currentRow.push(currentField);
1376
+ rows.push(currentRow);
1377
+ }
1378
+ if (rows.length === 0)
1379
+ return new Table(0, 0, formatting);
1380
+ return Table.fromArray(rows, formatting);
1381
+ }
1382
+ transpose() {
1383
+ const srcRows = this.rows.length;
1384
+ if (srcRows === 0)
1385
+ return new Table(0, 0);
1386
+ const srcCols = this.getColumnCount();
1387
+ if (srcCols === 0)
1388
+ return new Table(0, 0);
1389
+ const transposed = new Table(0, 0);
1390
+ for (let c = 0; c < srcCols; c++) {
1391
+ const newRow = new TableRow_1.TableRow();
1392
+ for (let r = 0; r < srcRows; r++) {
1393
+ const srcCell = this.getCell(r, c);
1394
+ if (srcCell) {
1395
+ newRow.addCell(srcCell.clone());
1396
+ }
1397
+ else {
1398
+ newRow.createCell();
1399
+ }
1400
+ }
1401
+ transposed.addRow(newRow);
1402
+ }
1403
+ return transposed;
1404
+ }
1094
1405
  clone() {
1095
1406
  const clonedFormatting = (0, deepClone_1.deepClone)(this.formatting);
1096
1407
  const clonedTable = new Table(0, 0, clonedFormatting);
1097
1408
  for (const row of this.rows) {
1098
- const cells = row.getCells();
1099
- const clonedRow = new TableRow_1.TableRow(0);
1100
- for (const cell of cells) {
1101
- const cellFormatting = cell.getFormatting();
1102
- const clonedCell = new TableCell_1.TableCell((0, deepClone_1.deepClone)(cellFormatting));
1103
- for (const para of cell.getParagraphs()) {
1104
- clonedCell.addParagraph(para.clone());
1105
- }
1106
- clonedRow.addCell(clonedCell);
1107
- }
1108
- clonedTable.addRow(clonedRow);
1409
+ clonedTable.addRow(row.clone());
1109
1410
  }
1110
1411
  return clonedTable;
1111
1412
  }
1413
+ duplicateRow(rowIndex, count = 1) {
1414
+ if (rowIndex < 0 || rowIndex >= this.rows.length) {
1415
+ throw new RangeError(`Row index ${rowIndex} is out of bounds (0-${this.rows.length - 1})`);
1416
+ }
1417
+ if (count < 1)
1418
+ return [];
1419
+ const sourceRow = this.rows[rowIndex];
1420
+ const inserted = [];
1421
+ for (let i = 0; i < count; i++) {
1422
+ const clonedRow = sourceRow.clone();
1423
+ this.rows.splice(rowIndex + 1 + i, 0, clonedRow);
1424
+ clonedRow._setParentTable(this);
1425
+ inserted.push(clonedRow);
1426
+ }
1427
+ return inserted;
1428
+ }
1112
1429
  }
1113
1430
  exports.Table = Table;
1114
1431
  //# sourceMappingURL=Table.js.map