@@ -114,29 +114,35 @@ function renderNode(createElement, references) {
114114 ))
115115 ));
116116
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
118130 switch (headerStyle) {
119131 // thead with first row and th for each first row cell
120132 // tbody with rows where first cell in each row is th, others are td
121133 case TableHeaderStyle .both : {
122134 const [firstRow , ... otherRows ] = rows;
123135 return [
124136 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)
129139 ))),
130140 ]),
131- createElement (' tbody' , {}, otherRows .map (([firstCell , ... otherCells ]) => (
141+ createElement (' tbody' , {}, otherRows .map (([firstCell , ... otherCells ], rowIndex ) => (
132142 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)
140146 )),
141147 ])
142148 ))),
@@ -145,15 +151,11 @@ function renderNode(createElement, references) {
145151 // tbody with rows, th for first cell of each row, td for other cells
146152 case TableHeaderStyle .column :
147153 return [
148- createElement (' tbody' , {}, rows .map (([firstCell , ... otherCells ]) => (
154+ createElement (' tbody' , {}, rows .map (([firstCell , ... otherCells ], rowIndex ) => (
149155 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)
157159 )),
158160 ])
159161 ))),
@@ -164,17 +166,13 @@ function renderNode(createElement, references) {
164166 const [firstRow , ... otherRows ] = rows;
165167 return [
166168 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,
171171 ))),
172172 ]),
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)
178176 )))
179177 ))),
180178 ];
@@ -183,12 +181,10 @@ function renderNode(createElement, references) {
183181 // tbody with all rows and every cell is td
184182 return [
185183 createElement (' tbody' , {}, (
186- rows .map (row => (
184+ rows .map (( row , rowIndex ) => (
187185 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)
192188 ))
193189 ))
194190 ))
@@ -268,8 +264,12 @@ function renderNode(createElement, references) {
268264 return renderFigure (node);
269265 }
270266
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 )
273273 ));
274274 case BlockType .termList :
275275 return createElement (' dl' , {}, node .items .map (({ term, definition }) => [
0 commit comments