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.
- package/README.md +158 -7
- package/dist/core/Document.d.ts +97 -3
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +727 -50
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentContent.d.ts.map +1 -1
- package/dist/core/DocumentContent.js +0 -8
- package/dist/core/DocumentContent.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +9 -5
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +573 -101
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/core/RelationshipManager.d.ts.map +1 -1
- package/dist/core/RelationshipManager.js +4 -3
- package/dist/core/RelationshipManager.js.map +1 -1
- package/dist/elements/Bookmark.d.ts +7 -0
- package/dist/elements/Bookmark.d.ts.map +1 -1
- package/dist/elements/Bookmark.js +24 -4
- package/dist/elements/Bookmark.js.map +1 -1
- package/dist/elements/BookmarkManager.d.ts.map +1 -1
- package/dist/elements/BookmarkManager.js +4 -3
- package/dist/elements/BookmarkManager.js.map +1 -1
- package/dist/elements/CommonTypes.d.ts +2 -2
- package/dist/elements/CommonTypes.d.ts.map +1 -1
- package/dist/elements/CommonTypes.js +14 -1
- package/dist/elements/CommonTypes.js.map +1 -1
- package/dist/elements/Field.d.ts +1 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +1 -1
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/Footer.d.ts +2 -0
- package/dist/elements/Footer.d.ts.map +1 -1
- package/dist/elements/Footer.js +6 -0
- package/dist/elements/Footer.js.map +1 -1
- package/dist/elements/Header.d.ts +2 -0
- package/dist/elements/Header.d.ts.map +1 -1
- package/dist/elements/Header.js +6 -0
- package/dist/elements/Header.js.map +1 -1
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +3 -0
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +81 -1
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +515 -21
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/Revision.d.ts +0 -1
- package/dist/elements/Revision.d.ts.map +1 -1
- package/dist/elements/Revision.js +0 -12
- package/dist/elements/Revision.js.map +1 -1
- package/dist/elements/RevisionManager.d.ts +0 -1
- package/dist/elements/RevisionManager.d.ts.map +1 -1
- package/dist/elements/RevisionManager.js +0 -2
- package/dist/elements/RevisionManager.js.map +1 -1
- package/dist/elements/Run.d.ts +16 -4
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +114 -22
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts +7 -1
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +185 -4
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.js.map +1 -1
- package/dist/elements/Table.d.ts +30 -1
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +357 -40
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +3 -0
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +30 -3
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableGridChange.d.ts +0 -1
- package/dist/elements/TableGridChange.d.ts.map +1 -1
- package/dist/elements/TableGridChange.js +0 -10
- package/dist/elements/TableGridChange.js.map +1 -1
- package/dist/elements/TableRow.d.ts +4 -0
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +31 -3
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/formatting/AbstractNumbering.d.ts +5 -0
- package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
- package/dist/formatting/AbstractNumbering.js +22 -0
- package/dist/formatting/AbstractNumbering.js.map +1 -1
- package/dist/formatting/NumberingLevel.d.ts.map +1 -1
- package/dist/formatting/NumberingLevel.js +3 -3
- package/dist/formatting/NumberingLevel.js.map +1 -1
- package/dist/formatting/Style.d.ts +1 -0
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +25 -59
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +1 -0
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +12 -0
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/helpers/CleanupHelper.js.map +1 -1
- package/dist/images/ImageOptimizer.d.ts.map +1 -1
- package/dist/images/ImageOptimizer.js +0 -1
- package/dist/images/ImageOptimizer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.d.ts.map +1 -1
- package/dist/managers/DrawingManager.js +4 -2
- package/dist/managers/DrawingManager.js.map +1 -1
- package/dist/types/formatting.d.ts +2 -2
- package/dist/types/formatting.d.ts.map +1 -1
- package/dist/types/formatting.js.map +1 -1
- package/dist/utils/ChangelogGenerator.d.ts +2 -2
- package/dist/utils/ChangelogGenerator.d.ts.map +1 -1
- package/dist/utils/ChangelogGenerator.js +4 -5
- package/dist/utils/ChangelogGenerator.js.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/InMemoryRevisionAcceptor.js +0 -1
- package/dist/utils/InMemoryRevisionAcceptor.js.map +1 -1
- package/dist/utils/RevisionAwareProcessor.d.ts +2 -2
- package/dist/utils/RevisionAwareProcessor.d.ts.map +1 -1
- package/dist/utils/RevisionAwareProcessor.js +2 -2
- package/dist/utils/RevisionAwareProcessor.js.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.d.ts +0 -2
- package/dist/utils/SelectiveRevisionAcceptor.d.ts.map +1 -1
- package/dist/utils/SelectiveRevisionAcceptor.js +0 -26
- package/dist/utils/SelectiveRevisionAcceptor.js.map +1 -1
- package/dist/utils/ShadingResolver.d.ts.map +1 -1
- package/dist/utils/ShadingResolver.js.map +1 -1
- package/dist/utils/acceptRevisions.js +1 -1
- package/dist/utils/acceptRevisions.js.map +1 -1
- package/dist/utils/stripTrackedChanges.js +1 -1
- package/dist/utils/stripTrackedChanges.js.map +1 -1
- package/dist/utils/units.d.ts.map +1 -1
- package/dist/utils/units.js +1 -1
- package/dist/utils/units.js.map +1 -1
- package/dist/validation/RevisionAutoFixer.d.ts +2 -1
- package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
- package/dist/validation/RevisionAutoFixer.js.map +1 -1
- package/package.json +10 -1
- package/src/constants/CLAUDE.md +28 -0
- package/src/core/CLAUDE.md +4 -0
- package/src/core/Document.ts +1755 -85
- package/src/core/DocumentContent.ts +0 -11
- package/src/core/DocumentGenerator.ts +11 -12
- package/src/core/DocumentParser.ts +599 -138
- package/src/core/RelationshipManager.ts +6 -3
- package/src/elements/Bookmark.ts +39 -4
- package/src/elements/BookmarkManager.ts +4 -3
- package/src/elements/CLAUDE.md +18 -2
- package/src/elements/CommonTypes.ts +35 -8
- package/src/elements/Field.ts +1 -1
- package/src/elements/Footer.ts +23 -0
- package/src/elements/Header.ts +25 -0
- package/src/elements/Image.ts +5 -0
- package/src/elements/Paragraph.ts +1069 -41
- package/src/elements/Revision.ts +0 -19
- package/src/elements/RevisionManager.ts +1 -3
- package/src/elements/Run.ts +265 -35
- package/src/elements/Section.ts +214 -8
- package/src/elements/Shape.ts +1 -1
- package/src/elements/Table.ts +850 -61
- package/src/elements/TableCell.ts +84 -10
- package/src/elements/TableGridChange.ts +2 -16
- package/src/elements/TableRow.ts +94 -9
- package/src/formatting/AbstractNumbering.ts +42 -1
- package/src/formatting/CLAUDE.md +4 -0
- package/src/formatting/NumberingLevel.ts +11 -7
- package/src/formatting/Style.ts +39 -71
- package/src/formatting/StylesManager.ts +36 -0
- package/src/helpers/CleanupHelper.ts +1 -1
- package/src/images/ImageOptimizer.ts +0 -3
- package/src/index.ts +1 -1
- package/src/managers/DrawingManager.ts +5 -3
- package/src/tracking/CLAUDE.md +30 -0
- package/src/types/CLAUDE.md +39 -0
- package/src/types/formatting.ts +2 -2
- package/src/utils/CLAUDE.md +15 -0
- package/src/utils/ChangelogGenerator.ts +4 -5
- package/src/utils/InMemoryRevisionAcceptor.ts +0 -9
- package/src/utils/RevisionAwareProcessor.ts +2 -3
- package/src/utils/SelectiveRevisionAcceptor.ts +0 -39
- package/src/utils/ShadingResolver.ts +0 -1
- package/src/utils/acceptRevisions.ts +1 -1
- package/src/utils/stripTrackedChanges.ts +1 -1
- package/src/utils/units.ts +2 -1
- package/src/validation/CLAUDE.md +40 -0
- package/src/validation/RevisionAutoFixer.ts +2 -1
package/dist/elements/Table.js
CHANGED
|
@@ -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
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
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
|
|
803
|
-
|
|
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.
|
|
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
|
-
|
|
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
|