@ckeditor/ckeditor5-table 36.0.1 → 37.0.0-alpha.1
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 +1 -1
- package/build/table.js +1 -1
- package/ckeditor5-metadata.json +6 -6
- package/package.json +34 -29
- package/src/augmentation.d.ts +76 -0
- package/src/augmentation.js +5 -0
- package/src/commands/insertcolumncommand.d.ts +55 -0
- package/src/commands/insertcolumncommand.js +45 -60
- package/src/commands/insertrowcommand.d.ts +54 -0
- package/src/commands/insertrowcommand.js +44 -59
- package/src/commands/inserttablecommand.d.ts +44 -0
- package/src/commands/inserttablecommand.js +50 -68
- package/src/commands/mergecellcommand.d.ts +68 -0
- package/src/commands/mergecellcommand.js +169 -244
- package/src/commands/mergecellscommand.d.ts +28 -0
- package/src/commands/mergecellscommand.js +72 -101
- package/src/commands/removecolumncommand.d.ts +29 -0
- package/src/commands/removecolumncommand.js +88 -102
- package/src/commands/removerowcommand.d.ts +29 -0
- package/src/commands/removerowcommand.js +63 -80
- package/src/commands/selectcolumncommand.d.ts +33 -0
- package/src/commands/selectcolumncommand.js +41 -54
- package/src/commands/selectrowcommand.d.ts +33 -0
- package/src/commands/selectrowcommand.js +38 -48
- package/src/commands/setheadercolumncommand.d.ts +50 -0
- package/src/commands/setheadercolumncommand.js +48 -73
- package/src/commands/setheaderrowcommand.d.ts +53 -0
- package/src/commands/setheaderrowcommand.js +56 -85
- package/src/commands/splitcellcommand.d.ts +43 -0
- package/src/commands/splitcellcommand.js +35 -49
- package/src/converters/downcast.d.ts +63 -0
- package/src/converters/downcast.js +98 -130
- package/src/converters/table-caption-post-fixer.d.ts +20 -0
- package/src/converters/table-caption-post-fixer.js +36 -52
- package/src/converters/table-cell-paragraph-post-fixer.d.ts +32 -0
- package/src/converters/table-cell-paragraph-post-fixer.js +88 -119
- package/src/converters/table-cell-refresh-handler.d.ts +18 -0
- package/src/converters/table-cell-refresh-handler.js +29 -48
- package/src/converters/table-headings-refresh-handler.d.ts +17 -0
- package/src/converters/table-headings-refresh-handler.js +35 -54
- package/src/converters/table-layout-post-fixer.d.ts +226 -0
- package/src/converters/table-layout-post-fixer.js +276 -313
- package/src/converters/tableproperties.d.ts +54 -0
- package/src/converters/tableproperties.js +136 -168
- package/src/converters/upcasttable.d.ts +49 -0
- package/src/converters/upcasttable.js +199 -251
- package/src/index.d.ts +60 -0
- package/src/index.js +1 -2
- package/src/plaintableoutput.d.ts +25 -0
- package/src/plaintableoutput.js +107 -135
- package/src/table.d.ts +33 -0
- package/src/table.js +12 -88
- package/src/tablecaption/tablecaptionediting.d.ts +63 -0
- package/src/tablecaption/tablecaptionediting.js +104 -135
- package/src/tablecaption/tablecaptionui.d.ts +21 -0
- package/src/tablecaption/tablecaptionui.js +42 -58
- package/src/tablecaption/toggletablecaptioncommand.d.ts +68 -0
- package/src/tablecaption/toggletablecaptioncommand.js +77 -92
- package/src/tablecaption/utils.d.ts +42 -0
- package/src/tablecaption/utils.js +35 -61
- package/src/tablecaption.d.ts +22 -0
- package/src/tablecaption.js +12 -19
- package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.d.ts +32 -0
- package/src/tablecellproperties/commands/tablecellbackgroundcolorcommand.js +14 -20
- package/src/tablecellproperties/commands/tablecellbordercolorcommand.d.ts +37 -0
- package/src/tablecellproperties/commands/tablecellbordercolorcommand.js +27 -37
- package/src/tablecellproperties/commands/tablecellborderstylecommand.d.ts +37 -0
- package/src/tablecellproperties/commands/tablecellborderstylecommand.js +27 -37
- package/src/tablecellproperties/commands/tablecellborderwidthcommand.d.ts +51 -0
- package/src/tablecellproperties/commands/tablecellborderwidthcommand.js +42 -53
- package/src/tablecellproperties/commands/tablecellheightcommand.d.ts +46 -0
- package/src/tablecellproperties/commands/tablecellheightcommand.js +29 -36
- package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.d.ts +32 -0
- package/src/tablecellproperties/commands/tablecellhorizontalalignmentcommand.js +14 -20
- package/src/tablecellproperties/commands/tablecellpaddingcommand.d.ts +51 -0
- package/src/tablecellproperties/commands/tablecellpaddingcommand.js +42 -53
- package/src/tablecellproperties/commands/tablecellpropertycommand.d.ts +62 -0
- package/src/tablecellproperties/commands/tablecellpropertycommand.js +77 -122
- package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.d.ts +40 -0
- package/src/tablecellproperties/commands/tablecellverticalalignmentcommand.js +14 -20
- package/src/tablecellproperties/tablecellpropertiesediting.d.ts +41 -0
- package/src/tablecellproperties/tablecellpropertiesediting.js +193 -236
- package/src/tablecellproperties/tablecellpropertiesui.d.ts +111 -0
- package/src/tablecellproperties/tablecellpropertiesui.js +302 -456
- package/src/tablecellproperties/ui/tablecellpropertiesview.d.ts +227 -0
- package/src/tablecellproperties/ui/tablecellpropertiesview.js +509 -844
- package/src/tablecellproperties.d.ts +28 -0
- package/src/tablecellproperties.js +12 -98
- package/src/tablecellwidth/commands/tablecellwidthcommand.d.ts +46 -0
- package/src/tablecellwidth/commands/tablecellwidthcommand.js +29 -35
- package/src/tablecellwidth/tablecellwidthediting.d.ts +28 -0
- package/src/tablecellwidth/tablecellwidthediting.js +25 -38
- package/src/tableclipboard.d.ts +63 -0
- package/src/tableclipboard.js +429 -568
- package/src/tablecolumnresize/constants.d.ts +20 -0
- package/src/tablecolumnresize/constants.js +0 -10
- package/src/tablecolumnresize/converters.d.ts +18 -0
- package/src/tablecolumnresize/converters.js +35 -119
- package/src/tablecolumnresize/tablecolumnresizeediting.d.ts +137 -0
- package/src/tablecolumnresize/tablecolumnresizeediting.js +545 -711
- package/src/tablecolumnresize/tablewidthscommand.d.ts +38 -0
- package/src/tablecolumnresize/tablewidthscommand.js +61 -0
- package/src/tablecolumnresize/utils.d.ts +141 -0
- package/src/tablecolumnresize/utils.js +256 -233
- package/src/tablecolumnresize.d.ts +24 -0
- package/src/tablecolumnresize.js +12 -19
- package/src/tableconfig.d.ts +331 -0
- package/src/tableconfig.js +5 -0
- package/src/tableediting.d.ts +97 -0
- package/src/tableediting.js +157 -176
- package/src/tablekeyboard.d.ts +63 -0
- package/src/tablekeyboard.js +261 -344
- package/src/tablemouse/mouseeventsobserver.d.ts +62 -0
- package/src/tablemouse/mouseeventsobserver.js +13 -50
- package/src/tablemouse.d.ts +46 -0
- package/src/tablemouse.js +154 -202
- package/src/tableproperties/commands/tablealignmentcommand.d.ts +32 -0
- package/src/tableproperties/commands/tablealignmentcommand.js +14 -20
- package/src/tableproperties/commands/tablebackgroundcolorcommand.d.ts +32 -0
- package/src/tableproperties/commands/tablebackgroundcolorcommand.js +14 -20
- package/src/tableproperties/commands/tablebordercolorcommand.d.ts +37 -0
- package/src/tableproperties/commands/tablebordercolorcommand.js +27 -37
- package/src/tableproperties/commands/tableborderstylecommand.d.ts +37 -0
- package/src/tableproperties/commands/tableborderstylecommand.js +27 -37
- package/src/tableproperties/commands/tableborderwidthcommand.d.ts +51 -0
- package/src/tableproperties/commands/tableborderwidthcommand.js +42 -53
- package/src/tableproperties/commands/tableheightcommand.d.ts +46 -0
- package/src/tableproperties/commands/tableheightcommand.js +29 -33
- package/src/tableproperties/commands/tablepropertycommand.d.ts +61 -0
- package/src/tableproperties/commands/tablepropertycommand.js +68 -112
- package/src/tableproperties/commands/tablewidthcommand.d.ts +46 -0
- package/src/tableproperties/commands/tablewidthcommand.js +29 -33
- package/src/tableproperties/tablepropertiesediting.d.ts +39 -0
- package/src/tableproperties/tablepropertiesediting.js +163 -210
- package/src/tableproperties/tablepropertiesui.d.ts +113 -0
- package/src/tableproperties/tablepropertiesui.js +293 -439
- package/src/tableproperties/ui/tablepropertiesview.d.ts +203 -0
- package/src/tableproperties/ui/tablepropertiesview.js +427 -718
- package/src/tableproperties.d.ts +28 -0
- package/src/tableproperties.js +12 -95
- package/src/tableselection.d.ts +106 -0
- package/src/tableselection.js +279 -376
- package/src/tabletoolbar.d.ts +31 -0
- package/src/tabletoolbar.js +38 -92
- package/src/tableui.d.ts +53 -0
- package/src/tableui.js +281 -338
- package/src/tableutils.d.ts +448 -0
- package/src/tableutils.js +1015 -1229
- package/src/tablewalker.d.ts +323 -0
- package/src/tablewalker.js +308 -548
- package/src/ui/colorinputview.d.ts +143 -0
- package/src/ui/colorinputview.js +229 -366
- package/src/ui/formrowview.d.ts +61 -0
- package/src/ui/formrowview.js +38 -84
- package/src/ui/inserttableview.d.ts +77 -0
- package/src/ui/inserttableview.js +152 -242
- package/src/utils/common.d.ts +42 -0
- package/src/utils/common.js +33 -57
- package/src/utils/structure.d.ts +245 -0
- package/src/utils/structure.js +261 -379
- package/src/utils/table-properties.d.ts +67 -0
- package/src/utils/table-properties.js +60 -81
- package/src/utils/ui/contextualballoon.d.ts +34 -0
- package/src/utils/ui/contextualballoon.js +70 -89
- package/src/utils/ui/table-properties.d.ts +193 -0
- package/src/utils/ui/table-properties.js +259 -319
- package/src/utils/ui/widget.d.ts +16 -0
- package/src/utils/ui/widget.js +24 -46
- package/src/tablecolumnresize/tablecolumnwidthscommand.js +0 -55
- package/src/tablecolumnresize/tablewidthresizecommand.js +0 -65
|
@@ -2,14 +2,8 @@
|
|
|
2
2
|
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
3
|
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @module table/converters/table-layout-post-fixer
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
5
|
import TableWalker from './../tablewalker';
|
|
11
6
|
import { createEmptyTableCell, updateNumericAttribute } from '../utils/common';
|
|
12
|
-
|
|
13
7
|
/**
|
|
14
8
|
* Injects a table layout post-fixer into the model.
|
|
15
9
|
*
|
|
@@ -33,33 +27,37 @@ import { createEmptyTableCell, updateNumericAttribute } from '../utils/common';
|
|
|
33
27
|
*
|
|
34
28
|
* For example, see the following table which has a cell (FOO) with the rowspan attribute (2):
|
|
35
29
|
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
30
|
+
* ```xml
|
|
31
|
+
* <table headingRows="1">
|
|
32
|
+
* <tableRow>
|
|
33
|
+
* <tableCell rowspan="2"><paragraph>FOO</paragraph></tableCell>
|
|
34
|
+
* <tableCell colspan="2"><paragraph>BAR</paragraph></tableCell>
|
|
35
|
+
* </tableRow>
|
|
36
|
+
* <tableRow>
|
|
37
|
+
* <tableCell><paragraph>BAZ</paragraph></tableCell>
|
|
38
|
+
* <tableCell><paragraph>XYZ</paragraph></tableCell>
|
|
39
|
+
* </tableRow>
|
|
40
|
+
* </table>
|
|
41
|
+
* ```
|
|
46
42
|
*
|
|
47
43
|
* It will be rendered in the view as:
|
|
48
44
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
45
|
+
* ```xml
|
|
46
|
+
* <table>
|
|
47
|
+
* <thead>
|
|
48
|
+
* <tr>
|
|
49
|
+
* <td rowspan="2">FOO</td>
|
|
50
|
+
* <td colspan="2">BAR</td>
|
|
51
|
+
* </tr>
|
|
52
|
+
* </thead>
|
|
53
|
+
* <tbody>
|
|
54
|
+
* <tr>
|
|
55
|
+
* <td>BAZ</td>
|
|
56
|
+
* <td>XYZ</td>
|
|
57
|
+
* </tr>
|
|
58
|
+
* </tbody>
|
|
59
|
+
* </table>
|
|
60
|
+
* ```
|
|
63
61
|
*
|
|
64
62
|
* In the above example the table will be rendered as a table with two rows: one in the header and second one in the body.
|
|
65
63
|
* The table cell (FOO) cannot span over multiple rows as it would extend from the header to the body section.
|
|
@@ -81,20 +79,22 @@ import { createEmptyTableCell, updateNumericAttribute } from '../utils/common';
|
|
|
81
79
|
*
|
|
82
80
|
* The table from the above example will be fixed and rendered to the view as below:
|
|
83
81
|
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
82
|
+
* ```xml
|
|
83
|
+
* <table>
|
|
84
|
+
* <thead>
|
|
85
|
+
* <tr>
|
|
86
|
+
* <td rowspan="2">FOO</td>
|
|
87
|
+
* <td colspan="2">BAR</td>
|
|
88
|
+
* </tr>
|
|
89
|
+
* </thead>
|
|
90
|
+
* <tbody>
|
|
91
|
+
* <tr>
|
|
92
|
+
* <td>BAZ</td>
|
|
93
|
+
* <td>XYZ</td>
|
|
94
|
+
* </tr>
|
|
95
|
+
* </tbody>
|
|
96
|
+
* </table>
|
|
97
|
+
* ```
|
|
98
98
|
*
|
|
99
99
|
* ## Collaboration and undo - Expectations vs post-fixer results
|
|
100
100
|
*
|
|
@@ -106,18 +106,20 @@ import { createEmptyTableCell, updateNumericAttribute } from '../utils/common';
|
|
|
106
106
|
*
|
|
107
107
|
* As an example see the table below:
|
|
108
108
|
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
109
|
+
* ```xml
|
|
110
|
+
* <table>
|
|
111
|
+
* <tbody>
|
|
112
|
+
* <tr>
|
|
113
|
+
* <td>11</td>
|
|
114
|
+
* <td>12</td>
|
|
115
|
+
* </tr>
|
|
116
|
+
* <tr>
|
|
117
|
+
* <td>21</td>
|
|
118
|
+
* <td>22</td>
|
|
119
|
+
* </tr>
|
|
120
|
+
* </tbody>
|
|
121
|
+
* </table>
|
|
122
|
+
* ```
|
|
121
123
|
*
|
|
122
124
|
* and the user actions:
|
|
123
125
|
*
|
|
@@ -126,279 +128,240 @@ import { createEmptyTableCell, updateNumericAttribute } from '../utils/common';
|
|
|
126
128
|
* 3. User B adds a row at the end of the table. This will insert a row with two empty table cells.
|
|
127
129
|
* 4. Both users will have a table as below:
|
|
128
130
|
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
*
|
|
131
|
+
* ```xml
|
|
132
|
+
* <table>
|
|
133
|
+
* <tbody>
|
|
134
|
+
* <tr>
|
|
135
|
+
* <td>11</td>
|
|
136
|
+
* <td>12</td>
|
|
137
|
+
* <td>(empty, inserted by A)</td>
|
|
138
|
+
* </tr>
|
|
139
|
+
* <tr>
|
|
140
|
+
* <td>21</td>
|
|
141
|
+
* <td>22</td>
|
|
142
|
+
* <td>(empty, inserted by A)</td>
|
|
143
|
+
* </tr>
|
|
144
|
+
* <tr>
|
|
145
|
+
* <td>(empty, inserted by B)</td>
|
|
146
|
+
* <td>(empty, inserted by B)</td>
|
|
147
|
+
* </tr>
|
|
148
|
+
* </tbody>
|
|
149
|
+
* </table>
|
|
150
|
+
* ```
|
|
148
151
|
*
|
|
149
152
|
* The last row is shorter then others so the table post-fixer will add an empty row to the last row:
|
|
150
153
|
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
154
|
+
* ```xml
|
|
155
|
+
* <table>
|
|
156
|
+
* <tbody>
|
|
157
|
+
* <tr>
|
|
158
|
+
* <td>11</td>
|
|
159
|
+
* <td>12</td>
|
|
160
|
+
* <td>(empty, inserted by A)</td>
|
|
161
|
+
* </tr>
|
|
162
|
+
* <tr>
|
|
163
|
+
* <td>21</td>
|
|
164
|
+
* <td>22</td>
|
|
165
|
+
* <td>(empty, inserted by A)</td>
|
|
166
|
+
* </tr>
|
|
167
|
+
* <tr>
|
|
168
|
+
* <td>(empty, inserted by B)</td>
|
|
169
|
+
* <td>(empty, inserted by B)</td>
|
|
170
|
+
* <td>(empty, inserted by the post-fixer)</td>
|
|
171
|
+
* </tr>
|
|
172
|
+
* </tbody>
|
|
173
|
+
* </table>
|
|
174
|
+
* ```
|
|
170
175
|
*
|
|
171
176
|
* Unfortunately undo does not know the nature of the changes and depending on which user applies the post-fixer changes, undoing them
|
|
172
177
|
* might lead to a broken table. If User B undoes inserting the column to the table, the undo engine will undo only the operations of
|
|
173
178
|
* inserting empty cells to rows from the initial table state (row 1 and 2) but the cell in the post-fixed row will remain:
|
|
174
179
|
*
|
|
175
|
-
*
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
180
|
+
* ```xml
|
|
181
|
+
* <table>
|
|
182
|
+
* <tbody>
|
|
183
|
+
* <tr>
|
|
184
|
+
* <td>11</td>
|
|
185
|
+
* <td>12</td>
|
|
186
|
+
* </tr>
|
|
187
|
+
* <tr>
|
|
188
|
+
* <td>21</td>
|
|
189
|
+
* <td>22</td>
|
|
190
|
+
* </tr>
|
|
191
|
+
* <tr>
|
|
192
|
+
* <td>(empty, inserted by B)</td>
|
|
193
|
+
* <td>(empty, inserted by B)</td>
|
|
194
|
+
* <td>(empty, inserted by a post-fixer)</td>
|
|
195
|
+
* </tr>
|
|
196
|
+
* </tbody>
|
|
197
|
+
* </table>
|
|
198
|
+
* ```
|
|
192
199
|
*
|
|
193
200
|
* After undo, the table post-fixer will detect that two rows are shorter than others and will fix the table to:
|
|
194
201
|
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
*
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
202
|
+
* ```xml
|
|
203
|
+
* <table>
|
|
204
|
+
* <tbody>
|
|
205
|
+
* <tr>
|
|
206
|
+
* <td>11</td>
|
|
207
|
+
* <td>12</td>
|
|
208
|
+
* <td>(empty, inserted by a post-fixer after undo)</td>
|
|
209
|
+
* </tr>
|
|
210
|
+
* <tr>
|
|
211
|
+
* <td>21</td>
|
|
212
|
+
* <td>22</td>
|
|
213
|
+
* <td>(empty, inserted by a post-fixer after undo)</td>
|
|
214
|
+
* </tr>
|
|
215
|
+
* <tr>
|
|
216
|
+
* <td>(empty, inserted by B)</td>
|
|
217
|
+
* <td>(empty, inserted by B)</td>
|
|
218
|
+
* <td>(empty, inserted by a post-fixer)</td>
|
|
219
|
+
* </tr>
|
|
220
|
+
* </tbody>
|
|
221
|
+
* </table>
|
|
222
|
+
* ```
|
|
215
223
|
*/
|
|
216
|
-
export default function injectTableLayoutPostFixer(
|
|
217
|
-
|
|
224
|
+
export default function injectTableLayoutPostFixer(model) {
|
|
225
|
+
model.document.registerPostFixer(writer => tableLayoutPostFixer(writer, model));
|
|
218
226
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
// Step 1: correct rowspans of table cells if necessary.
|
|
251
|
-
// The wasFixed flag should be true if any of tables in batch was fixed - might be more then one.
|
|
252
|
-
wasFixed = fixTableCellsRowspan( table, writer ) || wasFixed;
|
|
253
|
-
// Step 2: fix table rows sizes.
|
|
254
|
-
wasFixed = fixTableRowsSizes( table, writer ) || wasFixed;
|
|
255
|
-
|
|
256
|
-
analyzedTables.add( table );
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
return wasFixed;
|
|
227
|
+
/**
|
|
228
|
+
* The table layout post-fixer.
|
|
229
|
+
*/
|
|
230
|
+
function tableLayoutPostFixer(writer, model) {
|
|
231
|
+
const changes = model.document.differ.getChanges();
|
|
232
|
+
let wasFixed = false;
|
|
233
|
+
// Do not analyze the same table more then once - may happen for multiple changes in the same table.
|
|
234
|
+
const analyzedTables = new Set();
|
|
235
|
+
for (const entry of changes) {
|
|
236
|
+
let table = null;
|
|
237
|
+
if (entry.type == 'insert' && entry.name == 'table') {
|
|
238
|
+
table = entry.position.nodeAfter;
|
|
239
|
+
}
|
|
240
|
+
// Fix table on adding/removing table cells and rows.
|
|
241
|
+
if ((entry.type == 'insert' || entry.type == 'remove') && (entry.name == 'tableRow' || entry.name == 'tableCell')) {
|
|
242
|
+
table = entry.position.findAncestor('table');
|
|
243
|
+
}
|
|
244
|
+
// Fix table on any table's attribute change - including attributes of table cells.
|
|
245
|
+
if (isTableAttributeEntry(entry)) {
|
|
246
|
+
table = entry.range.start.findAncestor('table');
|
|
247
|
+
}
|
|
248
|
+
if (table && !analyzedTables.has(table)) {
|
|
249
|
+
// Step 1: correct rowspans of table cells if necessary.
|
|
250
|
+
// The wasFixed flag should be true if any of tables in batch was fixed - might be more then one.
|
|
251
|
+
wasFixed = fixTableCellsRowspan(table, writer) || wasFixed;
|
|
252
|
+
// Step 2: fix table rows sizes.
|
|
253
|
+
wasFixed = fixTableRowsSizes(table, writer) || wasFixed;
|
|
254
|
+
analyzedTables.add(table);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return wasFixed;
|
|
261
258
|
}
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
for ( const data of cellsToTrim ) {
|
|
279
|
-
updateNumericAttribute( 'rowspan', data.rowspan, data.cell, writer, 1 );
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
return wasFixed;
|
|
259
|
+
/**
|
|
260
|
+
* Fixes the invalid value of the `rowspan` attribute because a table cell cannot vertically extend beyond the table section it belongs to.
|
|
261
|
+
*
|
|
262
|
+
* @returns Returns `true` if the table was fixed.
|
|
263
|
+
*/
|
|
264
|
+
function fixTableCellsRowspan(table, writer) {
|
|
265
|
+
let wasFixed = false;
|
|
266
|
+
const cellsToTrim = findCellsToTrim(table);
|
|
267
|
+
if (cellsToTrim.length) {
|
|
268
|
+
// @if CK_DEBUG_TABLE // console.log( `Post-fixing table: trimming cells row-spans (${ cellsToTrim.length }).` );
|
|
269
|
+
wasFixed = true;
|
|
270
|
+
for (const data of cellsToTrim) {
|
|
271
|
+
updateNumericAttribute('rowspan', data.rowspan, data.cell, writer, 1);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return wasFixed;
|
|
284
275
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
for ( const [ rowIndex, size ] of rowsLengths.entries() ) {
|
|
331
|
-
const columnsToInsert = maxColumns - size;
|
|
332
|
-
|
|
333
|
-
if ( columnsToInsert ) {
|
|
334
|
-
for ( let i = 0; i < columnsToInsert; i++ ) {
|
|
335
|
-
createEmptyTableCell( writer, writer.createPositionAt( table.getChild( rowIndex ), 'end' ) );
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
wasFixed = true;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
return wasFixed;
|
|
276
|
+
/**
|
|
277
|
+
* Makes all table rows in a table the same size.
|
|
278
|
+
*
|
|
279
|
+
* @returns Returns `true` if the table was fixed.
|
|
280
|
+
*/
|
|
281
|
+
function fixTableRowsSizes(table, writer) {
|
|
282
|
+
let wasFixed = false;
|
|
283
|
+
const childrenLengths = getChildrenLengths(table);
|
|
284
|
+
const rowsToRemove = [];
|
|
285
|
+
// Find empty rows.
|
|
286
|
+
for (const [rowIndex, size] of childrenLengths.entries()) {
|
|
287
|
+
// Ignore all non-row models.
|
|
288
|
+
if (!size && table.getChild(rowIndex).is('element', 'tableRow')) {
|
|
289
|
+
rowsToRemove.push(rowIndex);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Remove empty rows.
|
|
293
|
+
if (rowsToRemove.length) {
|
|
294
|
+
// @if CK_DEBUG_TABLE // console.log( `Post-fixing table: remove empty rows (${ rowsToRemove.length }).` );
|
|
295
|
+
wasFixed = true;
|
|
296
|
+
for (const rowIndex of rowsToRemove.reverse()) {
|
|
297
|
+
writer.remove(table.getChild(rowIndex));
|
|
298
|
+
childrenLengths.splice(rowIndex, 1);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// Filter out everything that's not a table row.
|
|
302
|
+
const rowsLengths = childrenLengths.filter((row, rowIndex) => table.getChild(rowIndex).is('element', 'tableRow'));
|
|
303
|
+
// Verify if all the rows have the same number of columns.
|
|
304
|
+
const tableSize = rowsLengths[0];
|
|
305
|
+
const isValid = rowsLengths.every(length => length === tableSize);
|
|
306
|
+
if (!isValid) {
|
|
307
|
+
// @if CK_DEBUG_TABLE // console.log( 'Post-fixing table: adding missing cells.' );
|
|
308
|
+
// Find the maximum number of columns.
|
|
309
|
+
const maxColumns = rowsLengths.reduce((prev, current) => current > prev ? current : prev, 0);
|
|
310
|
+
for (const [rowIndex, size] of rowsLengths.entries()) {
|
|
311
|
+
const columnsToInsert = maxColumns - size;
|
|
312
|
+
if (columnsToInsert) {
|
|
313
|
+
for (let i = 0; i < columnsToInsert; i++) {
|
|
314
|
+
createEmptyTableCell(writer, writer.createPositionAt(table.getChild(rowIndex), 'end'));
|
|
315
|
+
}
|
|
316
|
+
wasFixed = true;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return wasFixed;
|
|
344
321
|
}
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
// If table cell expands over its limit reduce it height to proper value.
|
|
370
|
-
if ( row + cellHeight > rowLimit ) {
|
|
371
|
-
const newRowspan = rowLimit - row;
|
|
372
|
-
|
|
373
|
-
cellsToTrim.push( { cell, rowspan: newRowspan } );
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
return cellsToTrim;
|
|
322
|
+
/**
|
|
323
|
+
* Searches for table cells that extend beyond the table section to which they belong to. It will return an array of objects
|
|
324
|
+
* that stores table cells to be trimmed and the correct value of the `rowspan` attribute to set.
|
|
325
|
+
*/
|
|
326
|
+
function findCellsToTrim(table) {
|
|
327
|
+
const headingRows = parseInt(table.getAttribute('headingRows') || '0');
|
|
328
|
+
const maxRows = Array.from(table.getChildren())
|
|
329
|
+
.reduce((count, row) => row.is('element', 'tableRow') ? count + 1 : count, 0);
|
|
330
|
+
const cellsToTrim = [];
|
|
331
|
+
for (const { row, cell, cellHeight } of new TableWalker(table)) {
|
|
332
|
+
// Skip cells that do not expand over its row.
|
|
333
|
+
if (cellHeight < 2) {
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
const isInHeader = row < headingRows;
|
|
337
|
+
// Row limit is either end of header section or whole table as table body is after the header.
|
|
338
|
+
const rowLimit = isInHeader ? headingRows : maxRows;
|
|
339
|
+
// If table cell expands over its limit reduce it height to proper value.
|
|
340
|
+
if (row + cellHeight > rowLimit) {
|
|
341
|
+
const newRowspan = rowLimit - row;
|
|
342
|
+
cellsToTrim.push({ cell, rowspan: newRowspan });
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return cellsToTrim;
|
|
378
346
|
}
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
//
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
lengths[ rowIndex ]++;
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
return lengths;
|
|
347
|
+
/**
|
|
348
|
+
* Returns an array with lengths of rows assigned to the corresponding row index.
|
|
349
|
+
*/
|
|
350
|
+
function getChildrenLengths(table) {
|
|
351
|
+
// TableWalker will not provide items for the empty rows, we need to pre-fill this array.
|
|
352
|
+
const lengths = new Array(table.childCount).fill(0);
|
|
353
|
+
for (const { rowIndex } of new TableWalker(table, { includeAllSlots: true })) {
|
|
354
|
+
lengths[rowIndex]++;
|
|
355
|
+
}
|
|
356
|
+
return lengths;
|
|
393
357
|
}
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
return isAttributeType && ( key === 'headingRows' || key === 'colspan' || key === 'rowspan' );
|
|
358
|
+
/**
|
|
359
|
+
* Checks if the differ entry for an attribute change is one of the table's attributes.
|
|
360
|
+
*/
|
|
361
|
+
function isTableAttributeEntry(entry) {
|
|
362
|
+
if (entry.type !== 'attribute') {
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
const key = entry.attributeKey;
|
|
366
|
+
return key === 'headingRows' || key === 'colspan' || key === 'rowspan';
|
|
404
367
|
}
|