@@ -114,29 +114,35 @@ function renderNode(createElement, references) {
114
114
))
115
115
));
116
116
117
- const renderTableChildren = (rows , headerStyle = TableHeaderStyle .none ) => {
117
+ const renderTableCell = (
118
+ element, attrs, data, cellIndex, rowIndex, extendedData,
119
+ ) => {
120
+ const { colspan , rowspan } = extendedData[` ${ rowIndex} _${ cellIndex} ` ] || {};
121
+ // if either is `0`, then its spanned over and should not be rendered
122
+ if (colspan === 0 || rowspan === 0 ) return null ;
123
+ return createElement (element, { attrs: { ... attrs, colspan, rowspan } }, (
124
+ renderChildren (data)
125
+ ));
126
+ };
127
+
128
+ const renderTableChildren = (rows , headerStyle = TableHeaderStyle .none , extendedData = {}) => {
129
+ // build the matrix for the array
118
130
switch (headerStyle) {
119
131
// thead with first row and th for each first row cell
120
132
// tbody with rows where first cell in each row is th, others are td
121
133
case TableHeaderStyle .both : {
122
134
const [firstRow , ... otherRows ] = rows;
123
135
return [
124
136
createElement (' thead' , {}, [
125
- createElement (' tr' , {}, firstRow .map (cell => (
126
- createElement (' th' , { attrs: { scope: ' col' } }, (
127
- renderChildren (cell)
128
- ))
137
+ createElement (' tr' , {}, firstRow .map ((cell , cellIndex ) => (
138
+ renderTableCell (' th' , { scope: ' col' }, cell, cellIndex, 0 , extendedData)
129
139
))),
130
140
]),
131
- createElement (' tbody' , {}, otherRows .map (([firstCell , ... otherCells ]) => (
141
+ createElement (' tbody' , {}, otherRows .map (([firstCell , ... otherCells ], rowIndex ) => (
132
142
createElement (' tr' , {}, [
133
- createElement (' th' , { attrs: { scope: ' row' } }, (
134
- renderChildren (firstCell)
135
- )),
136
- ... otherCells .map (cell => (
137
- createElement (' td' , {}, (
138
- renderChildren (cell)
139
- ))
143
+ renderTableCell (' th' , { scope: ' row' }, firstCell, 0 , rowIndex + 1 , extendedData),
144
+ ... otherCells .map ((cell , cellIndex ) => (
145
+ renderTableCell (' td' , {}, cell, cellIndex + 1 , rowIndex + 1 , extendedData)
140
146
)),
141
147
])
142
148
))),
@@ -145,15 +151,11 @@ function renderNode(createElement, references) {
145
151
// tbody with rows, th for first cell of each row, td for other cells
146
152
case TableHeaderStyle .column :
147
153
return [
148
- createElement (' tbody' , {}, rows .map (([firstCell , ... otherCells ]) => (
154
+ createElement (' tbody' , {}, rows .map (([firstCell , ... otherCells ], rowIndex ) => (
149
155
createElement (' tr' , {}, [
150
- createElement (' th' , { attrs: { scope: ' row' } }, (
151
- renderChildren (firstCell)
152
- )),
153
- ... otherCells .map (cell => (
154
- createElement (' td' , {}, (
155
- renderChildren (cell)
156
- ))
156
+ renderTableCell (' th' , { scope: ' row' }, firstCell, 0 , rowIndex, extendedData),
157
+ ... otherCells .map ((cell , cellIndex ) => (
158
+ renderTableCell (' td' , {}, cell, cellIndex + 1 , rowIndex, extendedData)
157
159
)),
158
160
])
159
161
))),
@@ -164,17 +166,13 @@ function renderNode(createElement, references) {
164
166
const [firstRow , ... otherRows ] = rows;
165
167
return [
166
168
createElement (' thead' , {}, [
167
- createElement (' tr' , {}, firstRow .map (cell => (
168
- createElement (' th' , { attrs: { scope: ' col' } }, (
169
- renderChildren (cell)
170
- ))
169
+ createElement (' tr' , {}, firstRow .map ((cell , cellIndex ) => renderTableCell (
170
+ ' th' , { scope: ' col' }, cell, cellIndex, 0 , extendedData,
171
171
))),
172
172
]),
173
- createElement (' tbody' , {}, otherRows .map (row => (
174
- createElement (' tr' , {}, row .map (cell => (
175
- createElement (' td' , {}, (
176
- renderChildren (cell)
177
- ))
173
+ createElement (' tbody' , {}, otherRows .map ((row , rowIndex ) => (
174
+ createElement (' tr' , {}, row .map ((cell , cellIndex ) => (
175
+ renderTableCell (' td' , {}, cell, cellIndex, rowIndex + 1 , extendedData)
178
176
)))
179
177
))),
180
178
];
@@ -183,12 +181,10 @@ function renderNode(createElement, references) {
183
181
// tbody with all rows and every cell is td
184
182
return [
185
183
createElement (' tbody' , {}, (
186
- rows .map (row => (
184
+ rows .map (( row , rowIndex ) => (
187
185
createElement (' tr' , {}, (
188
- row .map (cell => (
189
- createElement (' td' , {}, (
190
- renderChildren (cell)
191
- ))
186
+ row .map ((cell , cellIndex ) => (
187
+ renderTableCell (' td' , {}, cell, cellIndex, rowIndex, extendedData)
192
188
))
193
189
))
194
190
))
@@ -268,8 +264,12 @@ function renderNode(createElement, references) {
268
264
return renderFigure (node);
269
265
}
270
266
271
- return createElement (Table, {}, (
272
- renderTableChildren (node .rows , node .header )
267
+ return createElement (Table, {
268
+ props: {
269
+ spanned: !! node .extendedData ,
270
+ },
271
+ }, (
272
+ renderTableChildren (node .rows , node .header , node .extendedData )
273
273
));
274
274
case BlockType .termList :
275
275
return createElement (' dl' , {}, node .items .map (({ term, definition }) => [
0 commit comments