@usejunior/docx-core 0.20.1 → 0.21.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/conformance-adapter.d.ts.map +1 -1
- package/dist/cli/conformance-adapter.js +0 -27
- package/dist/cli/conformance-adapter.js.map +1 -1
- package/dist/generation/compile.d.ts.map +1 -1
- package/dist/generation/compile.js +1 -3
- package/dist/generation/compile.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/integration/libreoffice-oracle.d.ts +3 -1
- package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
- package/dist/integration/libreoffice-oracle.js +9 -3
- package/dist/integration/libreoffice-oracle.js.map +1 -1
- package/dist/primitives/accept_changes.d.ts +3 -4
- package/dist/primitives/accept_changes.d.ts.map +1 -1
- package/dist/primitives/accept_changes.js +165 -79
- package/dist/primitives/accept_changes.js.map +1 -1
- package/dist/primitives/bookmarks.d.ts +7 -2
- package/dist/primitives/bookmarks.d.ts.map +1 -1
- package/dist/primitives/bookmarks.js +30 -6
- package/dist/primitives/bookmarks.js.map +1 -1
- package/dist/primitives/comments.d.ts +73 -4
- package/dist/primitives/comments.d.ts.map +1 -1
- package/dist/primitives/comments.js +266 -165
- package/dist/primitives/comments.js.map +1 -1
- package/dist/primitives/conformance.d.ts +42 -0
- package/dist/primitives/conformance.d.ts.map +1 -0
- package/dist/primitives/conformance.js +61 -0
- package/dist/primitives/conformance.js.map +1 -0
- package/dist/primitives/document.d.ts +98 -1
- package/dist/primitives/document.d.ts.map +1 -1
- package/dist/primitives/document.js +315 -22
- package/dist/primitives/document.js.map +1 -1
- package/dist/primitives/errors.d.ts +3 -2
- package/dist/primitives/errors.d.ts.map +1 -1
- package/dist/primitives/errors.js +3 -1
- package/dist/primitives/errors.js.map +1 -1
- package/dist/primitives/extract_revisions.d.ts +23 -6
- package/dist/primitives/extract_revisions.d.ts.map +1 -1
- package/dist/primitives/extract_revisions.js +208 -38
- package/dist/primitives/extract_revisions.js.map +1 -1
- package/dist/primitives/footnotes.d.ts +36 -0
- package/dist/primitives/footnotes.d.ts.map +1 -1
- package/dist/primitives/footnotes.js +173 -75
- package/dist/primitives/footnotes.js.map +1 -1
- package/dist/primitives/index.d.ts +7 -1
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +7 -1
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/paragraph-index.d.ts +31 -0
- package/dist/primitives/paragraph-index.d.ts.map +1 -0
- package/dist/primitives/paragraph-index.js +140 -0
- package/dist/primitives/paragraph-index.js.map +1 -0
- package/dist/primitives/paragraph_merge_formatting.d.ts +24 -0
- package/dist/primitives/paragraph_merge_formatting.d.ts.map +1 -0
- package/dist/primitives/paragraph_merge_formatting.js +86 -0
- package/dist/primitives/paragraph_merge_formatting.js.map +1 -0
- package/dist/primitives/paragraph_structure.d.ts +19 -0
- package/dist/primitives/paragraph_structure.d.ts.map +1 -0
- package/dist/primitives/paragraph_structure.js +66 -0
- package/dist/primitives/paragraph_structure.js.map +1 -0
- package/dist/primitives/reject_changes.d.ts +3 -4
- package/dist/primitives/reject_changes.d.ts.map +1 -1
- package/dist/primitives/reject_changes.js +166 -79
- package/dist/primitives/reject_changes.js.map +1 -1
- package/dist/primitives/relationships.d.ts +22 -0
- package/dist/primitives/relationships.d.ts.map +1 -1
- package/dist/primitives/relationships.js +87 -0
- package/dist/primitives/relationships.js.map +1 -1
- package/dist/primitives/revision-parts.d.ts +15 -0
- package/dist/primitives/revision-parts.d.ts.map +1 -1
- package/dist/primitives/revision-parts.js +33 -1
- package/dist/primitives/revision-parts.js.map +1 -1
- package/dist/primitives/sections.d.ts +2 -1
- package/dist/primitives/sections.d.ts.map +1 -1
- package/dist/primitives/sections.js +2 -2
- package/dist/primitives/sections.js.map +1 -1
- package/dist/primitives/styles.d.ts +1 -0
- package/dist/primitives/styles.d.ts.map +1 -1
- package/dist/primitives/styles.js +1 -0
- package/dist/primitives/styles.js.map +1 -1
- package/dist/primitives/table_cells.d.ts +49 -0
- package/dist/primitives/table_cells.d.ts.map +1 -0
- package/dist/primitives/table_cells.js +149 -0
- package/dist/primitives/table_cells.js.map +1 -0
- package/dist/primitives/table_columns.d.ts +50 -0
- package/dist/primitives/table_columns.d.ts.map +1 -0
- package/dist/primitives/table_columns.js +138 -0
- package/dist/primitives/table_columns.js.map +1 -0
- package/dist/primitives/table_edit_common.d.ts +39 -0
- package/dist/primitives/table_edit_common.d.ts.map +1 -0
- package/dist/primitives/table_edit_common.js +163 -0
- package/dist/primitives/table_edit_common.js.map +1 -0
- package/dist/primitives/table_occupancy.d.ts +39 -0
- package/dist/primitives/table_occupancy.d.ts.map +1 -0
- package/dist/primitives/table_occupancy.js +145 -0
- package/dist/primitives/table_occupancy.js.map +1 -0
- package/dist/primitives/table_rows.d.ts +56 -0
- package/dist/primitives/table_rows.d.ts.map +1 -0
- package/dist/primitives/table_rows.js +390 -0
- package/dist/primitives/table_rows.js.map +1 -0
- package/dist/primitives/text.d.ts +40 -1
- package/dist/primitives/text.d.ts.map +1 -1
- package/dist/primitives/text.js +309 -129
- package/dist/primitives/text.js.map +1 -1
- package/dist/primitives/track-changes-emitter.d.ts +16 -2
- package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
- package/dist/primitives/track-changes-emitter.js +38 -13
- package/dist/primitives/track-changes-emitter.js.map +1 -1
- package/dist/primitives/zip.d.ts +22 -1
- package/dist/primitives/zip.d.ts.map +1 -1
- package/dist/primitives/zip.js +47 -8
- package/dist/primitives/zip.js.map +1 -1
- package/dist/shared/docx/DocxArchive.d.ts +6 -2
- package/dist/shared/docx/DocxArchive.d.ts.map +1 -1
- package/dist/shared/docx/DocxArchive.js +10 -4
- package/dist/shared/docx/DocxArchive.js.map +1 -1
- package/dist/shared/field-structure.d.ts +3 -0
- package/dist/shared/field-structure.d.ts.map +1 -1
- package/dist/shared/field-structure.js +7 -5
- package/dist/shared/field-structure.js.map +1 -1
- package/package.json +3 -4
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type BookmarkReservation } from './bookmarks.js';
|
|
2
|
+
import { type TableEditDetail } from './table_edit_common.js';
|
|
3
|
+
import type { RevisionContext } from './track-changes-emitter.js';
|
|
4
|
+
export type ColumnInsertRowAction = {
|
|
5
|
+
kind: 'cell';
|
|
6
|
+
text: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'growCell';
|
|
9
|
+
side: 'left' | 'right';
|
|
10
|
+
};
|
|
11
|
+
export type InsertTableColumnParams = {
|
|
12
|
+
anchorParagraphId: string;
|
|
13
|
+
columnIndex: number;
|
|
14
|
+
widthTwips: number;
|
|
15
|
+
rowActions: ColumnInsertRowAction[];
|
|
16
|
+
};
|
|
17
|
+
export type DeleteTableColumnParams = {
|
|
18
|
+
anchorParagraphId: string;
|
|
19
|
+
columnIndex: number;
|
|
20
|
+
};
|
|
21
|
+
export type InsertTableColumnResult = {
|
|
22
|
+
gridColumns: number;
|
|
23
|
+
cellParagraphIds: string[];
|
|
24
|
+
};
|
|
25
|
+
export type DeleteTableColumnResult = {
|
|
26
|
+
gridColumns: number;
|
|
27
|
+
deleted: true;
|
|
28
|
+
};
|
|
29
|
+
export type TableColumnEditDetail = TableEditDetail;
|
|
30
|
+
/**
|
|
31
|
+
* Insert a clean logical table-grid column, leaving source XML untouched on failure.
|
|
32
|
+
*
|
|
33
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.48
|
|
34
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.16
|
|
35
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.17
|
|
36
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.71
|
|
37
|
+
* @see #1041
|
|
38
|
+
*/
|
|
39
|
+
export declare function insertTableColumn(doc: Document, params: InsertTableColumnParams, ctx?: RevisionContext, reservation?: BookmarkReservation): InsertTableColumnResult;
|
|
40
|
+
/**
|
|
41
|
+
* Delete a clean logical table-grid column, removing width-one physical cells.
|
|
42
|
+
*
|
|
43
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.48
|
|
44
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.16
|
|
45
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.17
|
|
46
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.71
|
|
47
|
+
* @see #1041
|
|
48
|
+
*/
|
|
49
|
+
export declare function deleteTableColumn(doc: Document, params: DeleteTableColumnParams, ctx?: RevisionContext): DeleteTableColumnResult;
|
|
50
|
+
//# sourceMappingURL=table_columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table_columns.d.ts","sourceRoot":"","sources":["../../src/primitives/table_columns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiC,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGzF,OAAO,EAWL,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAClH,MAAM,MAAM,uBAAuB,GAAG;IACpC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,qBAAqB,EAAE,CAAC;CACrC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AACzF,MAAM,MAAM,uBAAuB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAC1F,MAAM,MAAM,uBAAuB,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC;AAC7E,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAEpD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB,EAAE,GAAG,CAAC,EAAE,eAAe,EAAE,WAAW,CAAC,EAAE,mBAAmB,GAAG,uBAAuB,CAuDnK;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,uBAAuB,CAgDhI"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { insertSingleParagraphBookmark } from './bookmarks.js';
|
|
2
|
+
import { createWmlElement } from './dom-helpers.js';
|
|
3
|
+
import { inventoryTableOccupancy } from './table_occupancy.js';
|
|
4
|
+
import { applyWidthUpdates, createTableCell, failTableEdit as fail, hasPendingRevision, plannedCellWidthChange, plannedTableWidthChange, setCellSpan, setTableAttr as setAttr, tableAttr as attr, tableEditTarget as target, } from './table_edit_common.js';
|
|
5
|
+
import { removeOrphanedRangeEndpointsForSubtree } from './table_rows.js';
|
|
6
|
+
/**
|
|
7
|
+
* Insert a clean logical table-grid column, leaving source XML untouched on failure.
|
|
8
|
+
*
|
|
9
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.48
|
|
10
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.16
|
|
11
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.17
|
|
12
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.71
|
|
13
|
+
* @see #1041
|
|
14
|
+
*/
|
|
15
|
+
export function insertTableColumn(doc, params, ctx, reservation) {
|
|
16
|
+
const { anchorParagraphId: anchorId, columnIndex, widthTwips: width, rowActions } = params;
|
|
17
|
+
const initial = { anchorId, tableIndex: -1, rowIndex: -1, columnIndex, feature: 'argument' };
|
|
18
|
+
if (ctx)
|
|
19
|
+
fail('UNSUPPORTED_EDIT', 'Tracked column edits are not supported', { ...initial, feature: 'revisionContext' });
|
|
20
|
+
const shape = target(doc, anchorId, columnIndex);
|
|
21
|
+
if (!Number.isSafeInteger(columnIndex) || columnIndex < 0 || columnIndex > shape.columns.length) {
|
|
22
|
+
fail('INVALID_ARGUMENT', 'Column boundary is outside the table grid', initial);
|
|
23
|
+
}
|
|
24
|
+
if (!Number.isSafeInteger(width) || width <= 0)
|
|
25
|
+
fail('INVALID_ARGUMENT', 'widthTwips must be a positive integer', { ...initial, feature: 'width' });
|
|
26
|
+
if (!Array.isArray(rowActions) || rowActions.length !== shape.rows.length) {
|
|
27
|
+
fail('INVALID_ARGUMENT', 'One row action is required per physical row', { ...initial, feature: 'rowActions' });
|
|
28
|
+
}
|
|
29
|
+
const plans = [];
|
|
30
|
+
for (const row of shape.rows) {
|
|
31
|
+
const action = rowActions[row.rowIndex];
|
|
32
|
+
const info = { ...initial, tableIndex: shape.tableIndex, rowIndex: row.rowIndex, feature: 'rowAction' };
|
|
33
|
+
if (!action || !['cell', 'growCell'].includes(action.kind))
|
|
34
|
+
fail('INVALID_ARGUMENT', 'Unsupported row action', info);
|
|
35
|
+
if (action.kind === 'growCell') {
|
|
36
|
+
if (!['left', 'right'].includes(action.side))
|
|
37
|
+
fail('INVALID_ARGUMENT', 'Invalid growCell side', info);
|
|
38
|
+
const owner = action.side === 'left'
|
|
39
|
+
? row.cells.find((cell) => cell.start < columnIndex && cell.end >= columnIndex)
|
|
40
|
+
: row.cells.find((cell) => cell.start <= columnIndex && cell.end > columnIndex);
|
|
41
|
+
if (!owner)
|
|
42
|
+
fail('INVALID_ARGUMENT', 'No cell on requested side of column boundary', info);
|
|
43
|
+
const widthUpdate = plannedCellWidthChange(owner.element, width, { ...info, cellIndex: owner.cellIndex });
|
|
44
|
+
plans.push({ kind: 'growCell', owner, widthUpdate });
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
if (typeof action.text !== 'string')
|
|
48
|
+
fail('INVALID_ARGUMENT', 'Cell text must be a string', info);
|
|
49
|
+
const next = row.cells.find((cell) => cell.start === columnIndex);
|
|
50
|
+
if (!next && columnIndex !== shape.columns.length)
|
|
51
|
+
fail('INVALID_ARGUMENT', 'Cannot insert a cell inside a horizontal span', info);
|
|
52
|
+
const source = next?.element ?? row.cells.at(-1).element;
|
|
53
|
+
plans.push({ kind: 'cell', row, next, source, text: action.text });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const tableWidthUpdate = plannedTableWidthChange(shape.table, width, { ...initial, tableIndex: shape.tableIndex });
|
|
57
|
+
const newParagraphs = [];
|
|
58
|
+
for (const plan of plans) {
|
|
59
|
+
if (plan.kind === 'growCell') {
|
|
60
|
+
applyWidthUpdates([plan.widthUpdate]);
|
|
61
|
+
setCellSpan(plan.owner, plan.owner.end - plan.owner.start + 1);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const created = createTableCell(doc, plan.source, plan.text, width);
|
|
65
|
+
plan.row.element.insertBefore(created.cell, plan.next?.element ?? null);
|
|
66
|
+
newParagraphs.push(created.paragraph);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
applyWidthUpdates([tableWidthUpdate]);
|
|
70
|
+
const gridCol = createWmlElement(doc, 'gridCol');
|
|
71
|
+
setAttr(gridCol, 'w', width);
|
|
72
|
+
shape.grid.insertBefore(gridCol, shape.columns[columnIndex] ?? null);
|
|
73
|
+
inventoryTableOccupancy(shape.table);
|
|
74
|
+
const cellParagraphIds = newParagraphs.map((paragraph) => insertSingleParagraphBookmark(doc, paragraph, reservation));
|
|
75
|
+
return { gridColumns: shape.columns.length + 1, cellParagraphIds };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Delete a clean logical table-grid column, removing width-one physical cells.
|
|
79
|
+
*
|
|
80
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.48
|
|
81
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.16
|
|
82
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.17
|
|
83
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.71
|
|
84
|
+
* @see #1041
|
|
85
|
+
*/
|
|
86
|
+
export function deleteTableColumn(doc, params, ctx) {
|
|
87
|
+
const { anchorParagraphId: anchorId, columnIndex } = params;
|
|
88
|
+
const initial = { anchorId, tableIndex: -1, rowIndex: -1, columnIndex, feature: 'argument' };
|
|
89
|
+
if (ctx)
|
|
90
|
+
fail('UNSUPPORTED_EDIT', 'Tracked column edits are not supported', { ...initial, feature: 'revisionContext' });
|
|
91
|
+
const shape = target(doc, anchorId, columnIndex);
|
|
92
|
+
if (!Number.isSafeInteger(columnIndex) || columnIndex < 0 || columnIndex >= shape.columns.length) {
|
|
93
|
+
fail('INVALID_ARGUMENT', 'Column is outside the table grid', initial);
|
|
94
|
+
}
|
|
95
|
+
if (shape.columns.length === 1)
|
|
96
|
+
fail('INVALID_ARGUMENT', 'Cannot remove the final table column', { ...initial, feature: 'lastColumn' });
|
|
97
|
+
const rawWidth = attr(shape.columns[columnIndex], 'w');
|
|
98
|
+
if (rawWidth === null || !/^\d+$/.test(rawWidth) || !Number.isSafeInteger(Number(rawWidth))) {
|
|
99
|
+
fail('UNSUPPORTED_EDIT', 'Deleted grid column needs an integer twip width', { ...initial, feature: 'width' });
|
|
100
|
+
}
|
|
101
|
+
const width = Number(rawWidth);
|
|
102
|
+
const plans = [];
|
|
103
|
+
for (const row of shape.rows) {
|
|
104
|
+
const owner = row.slots[columnIndex];
|
|
105
|
+
if (!owner)
|
|
106
|
+
fail('UNSUPPORTED_EDIT', 'Missing physical cell at column', { ...initial, rowIndex: row.rowIndex, feature: 'occupancy' });
|
|
107
|
+
const info = { ...initial, tableIndex: shape.tableIndex, rowIndex: row.rowIndex, cellIndex: owner.cellIndex };
|
|
108
|
+
const span = owner.end - owner.start;
|
|
109
|
+
if (span === 1) {
|
|
110
|
+
if (row.cells.length === 1)
|
|
111
|
+
fail('INVALID_ARGUMENT', 'Deleting this column would leave a row empty', { ...info, feature: 'lastCell' });
|
|
112
|
+
if (hasPendingRevision(owner.element)) {
|
|
113
|
+
fail('UNSUPPORTED_EDIT', 'Cannot discard pending revisions inside a removed cell', { ...info, feature: 'contentRevision' });
|
|
114
|
+
}
|
|
115
|
+
plans.push({ kind: 'remove', row, owner });
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const widthUpdate = plannedCellWidthChange(owner.element, -width, { ...info, feature: 'width' });
|
|
119
|
+
plans.push({ kind: 'shrink', owner, nextSpan: span - 1, widthUpdate });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const tableWidthUpdate = plannedTableWidthChange(shape.table, -width, { ...initial, tableIndex: shape.tableIndex });
|
|
123
|
+
for (const plan of plans) {
|
|
124
|
+
if (plan.kind === 'remove') {
|
|
125
|
+
removeOrphanedRangeEndpointsForSubtree(doc.documentElement, plan.owner.element);
|
|
126
|
+
plan.row.element.removeChild(plan.owner.element);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
applyWidthUpdates([plan.widthUpdate]);
|
|
130
|
+
setCellSpan(plan.owner, plan.nextSpan);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
applyWidthUpdates([tableWidthUpdate]);
|
|
134
|
+
shape.grid.removeChild(shape.columns[columnIndex]);
|
|
135
|
+
inventoryTableOccupancy(shape.table);
|
|
136
|
+
return { gridColumns: shape.columns.length - 1, deleted: true };
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=table_columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table_columns.js","sourceRoot":"","sources":["../../src/primitives/table_columns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAA4B,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAuC,MAAM,sBAAsB,CAAC;AACpG,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,aAAa,IAAI,IAAI,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,WAAW,EACX,YAAY,IAAI,OAAO,EACvB,SAAS,IAAI,IAAI,EACjB,eAAe,IAAI,MAAM,GAG1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,sCAAsC,EAAE,MAAM,iBAAiB,CAAC;AAezE;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAa,EAAE,MAA+B,EAAE,GAAqB,EAAE,WAAiC;IACxI,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC3F,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC7F,IAAI,GAAG;QAAE,IAAI,CAAC,kBAAkB,EAAE,wCAAwC,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACxH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAChG,IAAI,CAAC,kBAAkB,EAAE,2CAA2C,EAAE,OAAO,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,IAAI,CAAC,kBAAkB,EAAE,uCAAuC,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACpJ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1E,IAAI,CAAC,kBAAkB,EAAE,6CAA6C,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IACjH,CAAC;IACD,MAAM,KAAK,GAGP,EAAE,CAAC;IACP,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACxG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,IAAI,CAAC,CAAC;QACrH,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,IAAI,CAAC,CAAC;YACtG,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM;gBAClC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,IAAI,IAAI,CAAC,GAAG,IAAI,WAAW,CAAC;gBAC/E,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,WAAW,IAAI,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC;YAClF,IAAI,CAAC,KAAK;gBAAE,IAAI,CAAC,kBAAkB,EAAE,8CAA8C,EAAE,IAAI,CAAC,CAAC;YAC3F,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YAC1G,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAAE,IAAI,CAAC,kBAAkB,EAAE,4BAA4B,EAAE,IAAI,CAAC,CAAC;YAClG,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC;YAClE,IAAI,CAAC,IAAI,IAAI,WAAW,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM;gBAAE,IAAI,CAAC,kBAAkB,EAAE,+CAA+C,EAAE,IAAI,CAAC,CAAC;YACnI,MAAM,MAAM,GAAG,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACnH,MAAM,aAAa,GAAc,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC7B,iBAAiB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACtC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACpE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;YACxE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,iBAAiB,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACjD,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC;IACrE,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,gBAAgB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,6BAA6B,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IACtH,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,gBAAgB,EAAE,CAAC;AACrE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAa,EAAE,MAA+B,EAAE,GAAqB;IACrG,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAC5D,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC7F,IAAI,GAAG;QAAE,IAAI,CAAC,kBAAkB,EAAE,wCAAwC,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACxH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACjG,IAAI,CAAC,kBAAkB,EAAE,kCAAkC,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,IAAI,CAAC,kBAAkB,EAAE,sCAAsC,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IACxI,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAE,EAAE,GAAG,CAAC,CAAC;IACxD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC5F,IAAI,CAAC,kBAAkB,EAAE,iDAAiD,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAChH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,KAAK,GAGP,EAAE,CAAC;IACP,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,kBAAkB,EAAE,iCAAiC,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QACtI,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;QAC9G,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;QACrC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,IAAI,CAAC,kBAAkB,EAAE,8CAA8C,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACvI,IAAI,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,kBAAkB,EAAE,wDAAwD,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC9H,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACjG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IACpH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,sCAAsC,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChF,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,iBAAiB,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACtC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,iBAAiB,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAE,CAAC,CAAC;IACpD,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type OccupiedCell, type OccupiedRow } from './table_occupancy.js';
|
|
2
|
+
export type TableEditDetail = {
|
|
3
|
+
anchorId: string;
|
|
4
|
+
tableIndex: number;
|
|
5
|
+
rowIndex: number;
|
|
6
|
+
columnIndex: number;
|
|
7
|
+
cellIndex?: number;
|
|
8
|
+
feature: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function failTableEdit(code: 'INVALID_ARGUMENT' | 'UNSUPPORTED_EDIT', message: string, detail: TableEditDetail): never;
|
|
11
|
+
export declare function tableAncestor(node: Node | null, name: string): Element | null;
|
|
12
|
+
export declare function tableAttr(element: Element, name: string): string | null;
|
|
13
|
+
export declare function setTableAttr(element: Element, name: string, value: number | string): void;
|
|
14
|
+
export type TableEditTarget = {
|
|
15
|
+
table: Element;
|
|
16
|
+
tableIndex: number;
|
|
17
|
+
rows: OccupiedRow[];
|
|
18
|
+
grid: Element;
|
|
19
|
+
columns: Element[];
|
|
20
|
+
anchorCell: OccupiedCell;
|
|
21
|
+
anchorRow: OccupiedRow;
|
|
22
|
+
};
|
|
23
|
+
/** Resolve a body-level table and reject geometry unsupported by the clean edit phase. */
|
|
24
|
+
export declare function tableEditTarget(doc: Document, anchorId: string, columnIndex: number, operation?: string): TableEditTarget;
|
|
25
|
+
export type WidthUpdate = {
|
|
26
|
+
element: Element;
|
|
27
|
+
next: number;
|
|
28
|
+
};
|
|
29
|
+
export declare function plannedWidthChange(element: Element | undefined, delta: number, detail: TableEditDetail): WidthUpdate | null;
|
|
30
|
+
export declare function plannedCellWidthChange(cell: Element, delta: number, detail: TableEditDetail): WidthUpdate | null;
|
|
31
|
+
export declare function plannedTableWidthChange(table: Element, delta: number, detail: TableEditDetail): WidthUpdate | null;
|
|
32
|
+
export declare function applyWidthUpdates(updates: Array<WidthUpdate | null>): void;
|
|
33
|
+
export declare function setCellSpan(cell: Pick<OccupiedCell, 'element'>, next: number): void;
|
|
34
|
+
export declare function createTableCell(doc: Document, source: Element, text: string, width: number): {
|
|
35
|
+
cell: Element;
|
|
36
|
+
paragraph: Element;
|
|
37
|
+
};
|
|
38
|
+
export declare function hasPendingRevision(element: Element): boolean;
|
|
39
|
+
//# sourceMappingURL=table_edit_common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table_edit_common.d.ts","sourceRoot":"","sources":["../../src/primitives/table_edit_common.ts"],"names":[],"mappings":"AAKA,OAAO,EAAgD,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEzH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,GAAG,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,KAAK,CAE5H;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAK7E;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEzF;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,EAAE,CAAC;IAC3F,UAAU,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,WAAW,CAAC;CAClD,CAAC;AAEF,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,SAAW,GAAG,eAAe,CA4C3H;AAED,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI,CAc3H;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI,CAGhH;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,WAAW,GAAG,IAAI,CAGlH;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI,CAE1E;AAmBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKnF;AAOD,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAuBlI;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAG5D"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { findParagraphByBookmarkId } from './bookmarks.js';
|
|
2
|
+
import { childElements, createWmlElement, getDirectChildrenByName, isW } from './dom-helpers.js';
|
|
3
|
+
import { SafeDocxError } from './errors.js';
|
|
4
|
+
import { OOXML } from './namespaces.js';
|
|
5
|
+
import { REVISION_ID_ELEMENT_NAME_SET } from './revision-vocabulary.js';
|
|
6
|
+
import { inventoryTableOccupancy, TableOccupancyError } from './table_occupancy.js';
|
|
7
|
+
export function failTableEdit(code, message, detail) {
|
|
8
|
+
throw new SafeDocxError(code, message, undefined, detail);
|
|
9
|
+
}
|
|
10
|
+
export function tableAncestor(node, name) {
|
|
11
|
+
for (let parent = node?.parentNode; parent; parent = parent.parentNode) {
|
|
12
|
+
if (parent.nodeType === 1 && isW(parent, name))
|
|
13
|
+
return parent;
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
export function tableAttr(element, name) {
|
|
18
|
+
return element.getAttributeNS(OOXML.W_NS, name) ?? element.getAttribute(`w:${name}`);
|
|
19
|
+
}
|
|
20
|
+
export function setTableAttr(element, name, value) {
|
|
21
|
+
element.setAttributeNS(OOXML.W_NS, `w:${name}`, String(value));
|
|
22
|
+
}
|
|
23
|
+
/** Resolve a body-level table and reject geometry unsupported by the clean edit phase. */
|
|
24
|
+
export function tableEditTarget(doc, anchorId, columnIndex, operation = 'column') {
|
|
25
|
+
const base = { anchorId, tableIndex: -1, rowIndex: -1, columnIndex, feature: 'anchor' };
|
|
26
|
+
const paragraph = findParagraphByBookmarkId(doc, anchorId);
|
|
27
|
+
if (!paragraph)
|
|
28
|
+
failTableEdit('INVALID_ARGUMENT', `Paragraph anchor not found: ${anchorId}`, base);
|
|
29
|
+
const cell = tableAncestor(paragraph, 'tc');
|
|
30
|
+
const row = tableAncestor(paragraph, 'tr');
|
|
31
|
+
const table = tableAncestor(paragraph, 'tbl');
|
|
32
|
+
const body = tableAncestor(table, 'body');
|
|
33
|
+
if (!cell || !row || !table || !body || row.parentNode !== table || table.parentNode !== body) {
|
|
34
|
+
failTableEdit('UNSUPPORTED_EDIT', `${operation === 'column' ? 'Column' : 'Cell'} anchor must be in a direct row of a body-level table`, base);
|
|
35
|
+
}
|
|
36
|
+
const tableIndex = childElements(body).filter((part) => isW(part, 'tbl')).indexOf(table);
|
|
37
|
+
const detail = { ...base, tableIndex };
|
|
38
|
+
if (table.getElementsByTagNameNS(OOXML.W_NS, 'tbl').length > 0) {
|
|
39
|
+
failTableEdit('UNSUPPORTED_EDIT', `Nested tables are unsupported for ${operation} edits`, { ...detail, feature: 'nestedTable' });
|
|
40
|
+
}
|
|
41
|
+
let occupancy;
|
|
42
|
+
try {
|
|
43
|
+
occupancy = inventoryTableOccupancy(table);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
if (error instanceof TableOccupancyError) {
|
|
47
|
+
failTableEdit('UNSUPPORTED_EDIT', error.message, { ...detail, rowIndex: error.rowIndex, cellIndex: error.cellIndex, feature: error.feature });
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
const { rows } = occupancy;
|
|
52
|
+
for (const occupiedRow of rows) {
|
|
53
|
+
if (occupiedRow.before || occupiedRow.after) {
|
|
54
|
+
failTableEdit('UNSUPPORTED_EDIT', `Offset rows are unsupported for ${operation} edits`, { ...detail, rowIndex: occupiedRow.rowIndex, feature: 'gridBefore/gridAfter' });
|
|
55
|
+
}
|
|
56
|
+
for (const occupiedCell of occupiedRow.cells) {
|
|
57
|
+
if (occupiedCell.merge !== 'none') {
|
|
58
|
+
failTableEdit('UNSUPPORTED_EDIT', `Vertical merges are unsupported for ${operation} edits`, { ...detail, rowIndex: occupiedRow.rowIndex, cellIndex: occupiedCell.cellIndex, feature: 'vMerge' });
|
|
59
|
+
}
|
|
60
|
+
const cellContent = childElements(occupiedCell.element).filter((element) => isW(element, 'p') || isW(element, 'tbl'));
|
|
61
|
+
if (!cellContent.length || !isW(cellContent.at(-1), 'p')) {
|
|
62
|
+
failTableEdit('UNSUPPORTED_EDIT', 'Every surviving cell must end in a direct paragraph', { ...detail, rowIndex: occupiedRow.rowIndex, cellIndex: occupiedCell.cellIndex, feature: 'trailingParagraph' });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const anchorRow = rows.find((candidate) => candidate.element === row);
|
|
67
|
+
const anchorCell = anchorRow?.cells.find((candidate) => candidate.element === cell);
|
|
68
|
+
if (!anchorRow || !anchorCell)
|
|
69
|
+
failTableEdit('UNSUPPORTED_EDIT', 'Anchor cell is not in the table occupancy inventory', { ...detail, feature: 'occupancy' });
|
|
70
|
+
const grid = getDirectChildrenByName(table, 'tblGrid')[0];
|
|
71
|
+
return { table, tableIndex, rows, grid, columns: getDirectChildrenByName(grid, 'gridCol'), anchorRow, anchorCell };
|
|
72
|
+
}
|
|
73
|
+
export function plannedWidthChange(element, delta, detail) {
|
|
74
|
+
if (!element)
|
|
75
|
+
return null;
|
|
76
|
+
const type = tableAttr(element, 'type');
|
|
77
|
+
const raw = tableAttr(element, 'w');
|
|
78
|
+
if (!type || !['dxa', 'pct', 'auto', 'nil'].includes(type)) {
|
|
79
|
+
failTableEdit('UNSUPPORTED_EDIT', 'Unresolvable width', { ...detail, feature: 'width' });
|
|
80
|
+
}
|
|
81
|
+
if (type !== 'dxa')
|
|
82
|
+
return null;
|
|
83
|
+
if (raw === null || !/^\d+$/.test(raw))
|
|
84
|
+
failTableEdit('UNSUPPORTED_EDIT', 'Non-integer dxa width', { ...detail, feature: 'width' });
|
|
85
|
+
const next = Number(raw) + delta;
|
|
86
|
+
if (!Number.isSafeInteger(next) || next < 0) {
|
|
87
|
+
failTableEdit('UNSUPPORTED_EDIT', 'Width arithmetic exceeds supported range', { ...detail, feature: 'width' });
|
|
88
|
+
}
|
|
89
|
+
return { element, next };
|
|
90
|
+
}
|
|
91
|
+
export function plannedCellWidthChange(cell, delta, detail) {
|
|
92
|
+
const tcPr = getDirectChildrenByName(cell, 'tcPr')[0];
|
|
93
|
+
return plannedWidthChange(tcPr ? getDirectChildrenByName(tcPr, 'tcW')[0] : undefined, delta, detail);
|
|
94
|
+
}
|
|
95
|
+
export function plannedTableWidthChange(table, delta, detail) {
|
|
96
|
+
const tblPr = getDirectChildrenByName(table, 'tblPr')[0];
|
|
97
|
+
return plannedWidthChange(tblPr ? getDirectChildrenByName(tblPr, 'tblW')[0] : undefined, delta, detail);
|
|
98
|
+
}
|
|
99
|
+
export function applyWidthUpdates(updates) {
|
|
100
|
+
for (const update of updates)
|
|
101
|
+
if (update)
|
|
102
|
+
setTableAttr(update.element, 'w', update.next);
|
|
103
|
+
}
|
|
104
|
+
function spanElement(cell) {
|
|
105
|
+
let tcPr = getDirectChildrenByName(cell, 'tcPr')[0];
|
|
106
|
+
if (!tcPr) {
|
|
107
|
+
tcPr = createWmlElement(cell.ownerDocument, 'tcPr');
|
|
108
|
+
cell.insertBefore(tcPr, cell.firstChild);
|
|
109
|
+
}
|
|
110
|
+
let span = getDirectChildrenByName(tcPr, 'gridSpan')[0];
|
|
111
|
+
if (!span) {
|
|
112
|
+
span = createWmlElement(cell.ownerDocument, 'gridSpan');
|
|
113
|
+
const tcW = getDirectChildrenByName(tcPr, 'tcW')[0];
|
|
114
|
+
const cnfStyle = getDirectChildrenByName(tcPr, 'cnfStyle')[0];
|
|
115
|
+
const preceding = tcW ?? cnfStyle;
|
|
116
|
+
tcPr.insertBefore(span, preceding ? preceding.nextSibling : tcPr.firstChild);
|
|
117
|
+
}
|
|
118
|
+
return span;
|
|
119
|
+
}
|
|
120
|
+
export function setCellSpan(cell, next) {
|
|
121
|
+
const tcPr = getDirectChildrenByName(cell.element, 'tcPr')[0];
|
|
122
|
+
const span = tcPr ? getDirectChildrenByName(tcPr, 'gridSpan')[0] : undefined;
|
|
123
|
+
if (next === 1)
|
|
124
|
+
span?.parentNode?.removeChild(span);
|
|
125
|
+
else
|
|
126
|
+
setTableAttr(spanElement(cell.element), 'val', next);
|
|
127
|
+
}
|
|
128
|
+
const NEW_CELL_EXCLUDED_PROPERTIES = new Set([
|
|
129
|
+
'tcW', 'gridSpan', 'vMerge', 'hMerge', 'cellIns', 'cellDel', 'cellMerge', 'tcPrChange',
|
|
130
|
+
'cnfStyle', 'hideMark', 'headers',
|
|
131
|
+
]);
|
|
132
|
+
export function createTableCell(doc, source, text, width) {
|
|
133
|
+
const cell = createWmlElement(doc, 'tc');
|
|
134
|
+
const tcPr = createWmlElement(doc, 'tcPr');
|
|
135
|
+
const sourcePr = getDirectChildrenByName(source, 'tcPr')[0];
|
|
136
|
+
if (sourcePr)
|
|
137
|
+
for (const property of childElements(sourcePr)) {
|
|
138
|
+
if (!NEW_CELL_EXCLUDED_PROPERTIES.has(property.localName))
|
|
139
|
+
tcPr.appendChild(property.cloneNode(true));
|
|
140
|
+
}
|
|
141
|
+
const tcW = createWmlElement(doc, 'tcW');
|
|
142
|
+
setTableAttr(tcW, 'w', width);
|
|
143
|
+
setTableAttr(tcW, 'type', 'dxa');
|
|
144
|
+
tcPr.insertBefore(tcW, tcPr.firstChild);
|
|
145
|
+
cell.appendChild(tcPr);
|
|
146
|
+
const paragraph = createWmlElement(doc, 'p');
|
|
147
|
+
if (text) {
|
|
148
|
+
const run = createWmlElement(doc, 'r');
|
|
149
|
+
const leaf = createWmlElement(doc, 't');
|
|
150
|
+
if (/^\s|\s$/.test(text))
|
|
151
|
+
leaf.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
|
|
152
|
+
leaf.appendChild(doc.createTextNode(text));
|
|
153
|
+
run.appendChild(leaf);
|
|
154
|
+
paragraph.appendChild(run);
|
|
155
|
+
}
|
|
156
|
+
cell.appendChild(paragraph);
|
|
157
|
+
return { cell, paragraph };
|
|
158
|
+
}
|
|
159
|
+
export function hasPendingRevision(element) {
|
|
160
|
+
return Array.from(element.getElementsByTagNameNS(OOXML.W_NS, '*'))
|
|
161
|
+
.some((descendant) => REVISION_ID_ELEMENT_NAME_SET.has(descendant.localName));
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=table_edit_common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table_edit_common.js","sourceRoot":"","sources":["../../src/primitives/table_edit_common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type MergeState = 'none' | 'restart' | 'continue';
|
|
2
|
+
export type OccupiedCell = {
|
|
3
|
+
element: Element;
|
|
4
|
+
cellIndex: number;
|
|
5
|
+
start: number;
|
|
6
|
+
end: number;
|
|
7
|
+
merge: MergeState;
|
|
8
|
+
owner: OccupiedCell;
|
|
9
|
+
};
|
|
10
|
+
export type OccupiedRow = {
|
|
11
|
+
element: Element;
|
|
12
|
+
rowIndex: number;
|
|
13
|
+
before: number;
|
|
14
|
+
after: number;
|
|
15
|
+
cells: OccupiedCell[];
|
|
16
|
+
slots: Array<OccupiedCell | null>;
|
|
17
|
+
};
|
|
18
|
+
export type TableOccupancy = {
|
|
19
|
+
gridColumns: number;
|
|
20
|
+
rows: OccupiedRow[];
|
|
21
|
+
};
|
|
22
|
+
export declare class TableOccupancyError extends Error {
|
|
23
|
+
readonly feature: 'occupancy' | 'gridSpan' | 'hMerge' | 'vMerge' | 'gridBefore' | 'gridAfter' | 'topologyRevision';
|
|
24
|
+
readonly rowIndex: number;
|
|
25
|
+
readonly cellIndex: number | undefined;
|
|
26
|
+
constructor(feature: 'occupancy' | 'gridSpan' | 'hMerge' | 'vMerge' | 'gridBefore' | 'gridAfter' | 'topologyRevision', rowIndex: number, cellIndex: number | undefined, message: string);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Inventory direct physical cells in logical grid coordinates without rewriting XML.
|
|
30
|
+
* Each continuation points to the restart cell owning the exact same interval.
|
|
31
|
+
*
|
|
32
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.48
|
|
33
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.17
|
|
34
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.23
|
|
35
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.84
|
|
36
|
+
* @see #1040
|
|
37
|
+
*/
|
|
38
|
+
export declare function inventoryTableOccupancy(table: Element): TableOccupancy;
|
|
39
|
+
//# sourceMappingURL=table_occupancy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table_occupancy.d.ts","sourceRoot":"","sources":["../../src/primitives/table_occupancy.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,YAAY,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC;AAE1E,qBAAa,mBAAoB,SAAQ,KAAK;IAE1C,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,kBAAkB;IAClH,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;gBAF7B,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,kBAAkB,EACzG,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,EACtC,OAAO,EAAE,MAAM;CAKlB;AA6CD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAqEtE"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { childElements, getDirectChildrenByName, isW } from './dom-helpers.js';
|
|
2
|
+
import { OOXML } from './namespaces.js';
|
|
3
|
+
export class TableOccupancyError extends Error {
|
|
4
|
+
feature;
|
|
5
|
+
rowIndex;
|
|
6
|
+
cellIndex;
|
|
7
|
+
constructor(feature, rowIndex, cellIndex, message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.feature = feature;
|
|
10
|
+
this.rowIndex = rowIndex;
|
|
11
|
+
this.cellIndex = cellIndex;
|
|
12
|
+
this.name = 'TableOccupancyError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const RANGE_MARKERS = new Set([
|
|
16
|
+
'bookmarkStart', 'bookmarkEnd', 'commentRangeStart', 'commentRangeEnd',
|
|
17
|
+
'permStart', 'permEnd', 'proofErr', 'moveFromRangeStart', 'moveFromRangeEnd',
|
|
18
|
+
'moveToRangeStart', 'moveToRangeEnd', 'customXmlInsRangeStart',
|
|
19
|
+
'customXmlInsRangeEnd', 'customXmlDelRangeStart', 'customXmlDelRangeEnd',
|
|
20
|
+
'customXmlMoveFromRangeStart', 'customXmlMoveFromRangeEnd',
|
|
21
|
+
'customXmlMoveToRangeStart', 'customXmlMoveToRangeEnd',
|
|
22
|
+
]);
|
|
23
|
+
function oneChild(parent, name, rowIndex, cellIndex) {
|
|
24
|
+
if (!parent)
|
|
25
|
+
return undefined;
|
|
26
|
+
const children = getDirectChildrenByName(parent, name);
|
|
27
|
+
if (children.length > 1) {
|
|
28
|
+
throw new TableOccupancyError('occupancy', rowIndex, cellIndex, `Duplicate ${name}`);
|
|
29
|
+
}
|
|
30
|
+
return children[0];
|
|
31
|
+
}
|
|
32
|
+
function value(element) {
|
|
33
|
+
return element.getAttributeNS(OOXML.W_NS, 'val') ?? element.getAttribute('w:val');
|
|
34
|
+
}
|
|
35
|
+
function width(element, feature, rowIndex, cellIndex) {
|
|
36
|
+
if (!element)
|
|
37
|
+
return feature === 'gridSpan' ? 1 : 0;
|
|
38
|
+
const raw = value(element);
|
|
39
|
+
const parsed = raw === null ? NaN : Number(raw);
|
|
40
|
+
if (!Number.isSafeInteger(parsed) || parsed < (feature === 'gridSpan' ? 1 : 0)) {
|
|
41
|
+
throw new TableOccupancyError(feature, rowIndex, cellIndex, `Invalid ${feature} value`);
|
|
42
|
+
}
|
|
43
|
+
return parsed;
|
|
44
|
+
}
|
|
45
|
+
function verticalState(cell, rowIndex, cellIndex) {
|
|
46
|
+
const tcPr = getDirectChildrenByName(cell, 'tcPr')[0];
|
|
47
|
+
const markers = tcPr ? getDirectChildrenByName(tcPr, 'vMerge') : [];
|
|
48
|
+
if (markers.length > 1)
|
|
49
|
+
throw new TableOccupancyError('vMerge', rowIndex, cellIndex, 'Duplicate vMerge');
|
|
50
|
+
if (!markers.length)
|
|
51
|
+
return 'none';
|
|
52
|
+
const raw = value(markers[0]);
|
|
53
|
+
if (raw === null || raw === 'continue')
|
|
54
|
+
return 'continue';
|
|
55
|
+
if (raw === 'restart')
|
|
56
|
+
return 'restart';
|
|
57
|
+
throw new TableOccupancyError('vMerge', rowIndex, cellIndex, `Invalid vMerge value: ${raw}`);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Inventory direct physical cells in logical grid coordinates without rewriting XML.
|
|
61
|
+
* Each continuation points to the restart cell owning the exact same interval.
|
|
62
|
+
*
|
|
63
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.48
|
|
64
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.17
|
|
65
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.23
|
|
66
|
+
* @conformance ECMA-376 edition 5, Part 1 § 17.4.84
|
|
67
|
+
* @see #1040
|
|
68
|
+
*/
|
|
69
|
+
export function inventoryTableOccupancy(table) {
|
|
70
|
+
const grids = getDirectChildrenByName(table, 'tblGrid');
|
|
71
|
+
const gridColumns = grids.length === 1 ? getDirectChildrenByName(grids[0], 'gridCol').length : 0;
|
|
72
|
+
if (gridColumns < 1)
|
|
73
|
+
throw new TableOccupancyError('occupancy', -1, undefined, 'Table must have one nonempty tblGrid');
|
|
74
|
+
if (grids[0].getElementsByTagNameNS(OOXML.W_NS, 'tblGridChange').length) {
|
|
75
|
+
throw new TableOccupancyError('topologyRevision', -1, undefined, 'Tracked grid changes are unsupported');
|
|
76
|
+
}
|
|
77
|
+
const rows = [];
|
|
78
|
+
let previousActive = new Map();
|
|
79
|
+
for (const rowElement of childElements(table)) {
|
|
80
|
+
if (isW(rowElement, 'tblPr') || isW(rowElement, 'tblGrid') || RANGE_MARKERS.has(rowElement.localName))
|
|
81
|
+
continue;
|
|
82
|
+
const rowIndex = rows.length;
|
|
83
|
+
if (!isW(rowElement, 'tr'))
|
|
84
|
+
throw new TableOccupancyError('occupancy', rowIndex, undefined, 'Unsupported row container');
|
|
85
|
+
if (getDirectChildrenByName(rowElement, 'tblPrEx').length) {
|
|
86
|
+
throw new TableOccupancyError('topologyRevision', rowIndex, undefined, 'Row table-property exceptions are unsupported');
|
|
87
|
+
}
|
|
88
|
+
const trPr = oneChild(rowElement, 'trPr', rowIndex);
|
|
89
|
+
if (trPr && getDirectChildrenByName(trPr, 'trPrChange').length) {
|
|
90
|
+
throw new TableOccupancyError('topologyRevision', rowIndex, undefined, 'Pending row-property changes are unsupported');
|
|
91
|
+
}
|
|
92
|
+
const before = width(oneChild(trPr, 'gridBefore', rowIndex), 'gridBefore', rowIndex);
|
|
93
|
+
const after = width(oneChild(trPr, 'gridAfter', rowIndex), 'gridAfter', rowIndex);
|
|
94
|
+
if (before + after >= gridColumns) {
|
|
95
|
+
throw new TableOccupancyError('occupancy', rowIndex, undefined, 'Row offsets leave no physical cell slots');
|
|
96
|
+
}
|
|
97
|
+
const cells = [];
|
|
98
|
+
const slots = Array(gridColumns).fill(null);
|
|
99
|
+
const currentActive = new Map();
|
|
100
|
+
let column = before;
|
|
101
|
+
for (const cellElement of childElements(rowElement)) {
|
|
102
|
+
if (isW(cellElement, 'trPr') || RANGE_MARKERS.has(cellElement.localName))
|
|
103
|
+
continue;
|
|
104
|
+
const cellIndex = cells.length;
|
|
105
|
+
if (!isW(cellElement, 'tc')) {
|
|
106
|
+
throw new TableOccupancyError('occupancy', rowIndex, cellIndex, 'Unsupported cell container');
|
|
107
|
+
}
|
|
108
|
+
const tcPr = oneChild(cellElement, 'tcPr', rowIndex, cellIndex);
|
|
109
|
+
if (tcPr && getDirectChildrenByName(tcPr, 'hMerge').length) {
|
|
110
|
+
throw new TableOccupancyError('hMerge', rowIndex, cellIndex, 'Legacy hMerge is unsupported');
|
|
111
|
+
}
|
|
112
|
+
if (tcPr && ['cellIns', 'cellDel', 'cellMerge', 'tcPrChange'].some((name) => getDirectChildrenByName(tcPr, name).length > 0)) {
|
|
113
|
+
throw new TableOccupancyError('topologyRevision', rowIndex, cellIndex, 'Pending cell topology changes are unsupported');
|
|
114
|
+
}
|
|
115
|
+
const span = width(oneChild(tcPr, 'gridSpan', rowIndex, cellIndex), 'gridSpan', rowIndex, cellIndex);
|
|
116
|
+
const end = column + span;
|
|
117
|
+
if (end > gridColumns - after) {
|
|
118
|
+
throw new TableOccupancyError('occupancy', rowIndex, cellIndex, 'Cell extends beyond effective grid');
|
|
119
|
+
}
|
|
120
|
+
const merge = verticalState(cellElement, rowIndex, cellIndex);
|
|
121
|
+
const interval = `${column}:${end}`;
|
|
122
|
+
const previousOwner = previousActive.get(interval);
|
|
123
|
+
if (merge === 'continue' && !previousOwner) {
|
|
124
|
+
throw new TableOccupancyError('vMerge', rowIndex, cellIndex, 'Orphan or changed-width continuation');
|
|
125
|
+
}
|
|
126
|
+
const occupied = { element: cellElement, cellIndex, start: column, end, merge, owner: null };
|
|
127
|
+
occupied.owner = merge === 'continue' ? previousOwner : occupied;
|
|
128
|
+
cells.push(occupied);
|
|
129
|
+
for (let slot = column; slot < end; slot++)
|
|
130
|
+
slots[slot] = occupied;
|
|
131
|
+
if (merge !== 'none')
|
|
132
|
+
currentActive.set(interval, occupied.owner);
|
|
133
|
+
column = end;
|
|
134
|
+
}
|
|
135
|
+
if (column !== gridColumns - after || cells.length === 0) {
|
|
136
|
+
throw new TableOccupancyError('occupancy', rowIndex, undefined, 'Row occupancy does not match tblGrid and offsets');
|
|
137
|
+
}
|
|
138
|
+
rows.push({ element: rowElement, rowIndex, before, after, cells, slots });
|
|
139
|
+
previousActive = currentActive;
|
|
140
|
+
}
|
|
141
|
+
if (!rows.length)
|
|
142
|
+
throw new TableOccupancyError('occupancy', -1, undefined, 'Table has no direct rows');
|
|
143
|
+
return { gridColumns, rows };
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=table_occupancy.js.map
|