@@ -4,14 +4,14 @@ local log = require('render-markdown.core.log')
44local str = require (' render-markdown.lib.str' )
55
66--- @class render.md.table.Data
7- --- @field delim render.md.table.DelimRow
8- --- @field rows render.md.table.Row[]
7+ --- @field delim render.md.table.delim.Row
8+ --- @field rows render.md.table.body. Row[]
99
10- --- @class render.md.table.DelimRow
10+ --- @class render.md.table.delim.Row
1111--- @field node render.md.Node
12- --- @field cols render.md.table.DelimCol []
12+ --- @field cols render.md.table.delim.Col []
1313
14- --- @class render.md.table.DelimCol
14+ --- @class render.md.table.delim.Col
1515--- @field width integer
1616--- @field alignment render.md.table.Alignment
1717
@@ -23,12 +23,12 @@ local Alignment = {
2323 default = ' default' ,
2424}
2525
26- --- @class render.md.table.Row
26+ --- @class render.md.table.body. Row
2727--- @field node render.md.Node
2828--- @field pipes render.md.Node[]
29- --- @field cols render.md.table.Col[]
29+ --- @field cols render.md.table.body. Col[]
3030
31- --- @class render.md.table.Col
31+ --- @class render.md.table.body. Col
3232--- @field row integer
3333--- @field start_col integer
3434--- @field end_col integer
@@ -39,6 +39,10 @@ local Alignment = {
3939--- @field left integer
4040--- @field right integer
4141
42+ --- @class render.md.table.Row
43+ --- @field pipes render.md.Node[]
44+ --- @field cells render.md.Node[]
45+
4246--- @class render.md.render.Table : render.md.Render
4347--- @field private config render.md.table.Config
4448--- @field private data render.md.table.Data
@@ -77,16 +81,16 @@ function Render:setup()
7781 end
7882
7983 -- double check delimiter exists after parsing
80- local delim = self :parse_delim (delim_node )
84+ local delim = self :parse_delim_row (delim_node )
8185 if not delim then
8286 return false
8387 end
8488
8589 -- double check rows exist after parsing
86- local rows = {} --- @type render.md.table.Row[]
90+ local rows = {} --- @type render.md.table.body. Row[]
8791 table.sort (row_nodes )
8892 for _ , row_node in ipairs (row_nodes ) do
89- local row = self :parse_row (row_node , # delim .cols )
93+ local row = self :parse_body_row (row_node , # delim .cols )
9094 if row then
9195 rows [# rows + 1 ] = row
9296 end
@@ -120,15 +124,16 @@ end
120124
121125--- @private
122126--- @param node render.md.Node
123- --- @return render.md.table.DelimRow ?
124- function Render :parse_delim (node )
125- local pipes , cells = self :parse_cells (node , ' pipe_table_delimiter_cell' )
126- if not pipes or not cells then
127+ --- @return render.md.table.delim.Row ?
128+ function Render :parse_delim_row (node )
129+ local row = self :parse_row (node , ' pipe_table_delimiter_cell' )
130+ if not row then
127131 return nil
128132 end
129- local cols = {} --- @type render.md.table.DelimCol[]
130- for i , cell in ipairs (cells ) do
131- local start_col , end_col = pipes [i ].end_col , pipes [i + 1 ].start_col
133+ local cols = {} --- @type render.md.table.delim.Col[]
134+ for i , cell in ipairs (row .cells ) do
135+ local start_col = row .pipes [i ].end_col
136+ local end_col = row .pipes [i + 1 ].start_col
132137 local width = end_col - start_col
133138 assert (width >= 0 , ' invalid table layout' )
134139 if self .config .cell == ' padded' then
@@ -141,7 +146,7 @@ function Render:parse_delim(node)
141146 alignment = Render .alignment (cell ),
142147 }
143148 end
144- --- @type render.md.table.DelimRow
149+ --- @type render.md.table.delim.Row
145150 return { node = node , cols = cols }
146151end
147152
@@ -165,16 +170,17 @@ end
165170--- @private
166171--- @param node render.md.Node
167172--- @param num_cols integer
168- --- @return render.md.table.Row ?
169- function Render :parse_row (node , num_cols )
170- local pipes , cells = self :parse_cells (node , ' pipe_table_cell' )
171- if not pipes or not cells or # cells ~= num_cols then
173+ --- @return render.md.table.body. Row ?
174+ function Render :parse_body_row (node , num_cols )
175+ local row = self :parse_row (node , ' pipe_table_cell' )
176+ if not row or # row . cells ~= num_cols then
172177 return nil
173178 end
174- local cols = {} --- @type render.md.table.Col[]
175- for i , cell in ipairs (cells ) do
179+ local cols = {} --- @type render.md.table.body. Col[]
180+ for i , cell in ipairs (row . cells ) do
176181 -- account for double width glyphs by replacing cell range with width
177- local start_col , end_col = pipes [i ].end_col , pipes [i + 1 ].start_col
182+ local start_col = row .pipes [i ].end_col
183+ local end_col = row .pipes [i + 1 ].start_col
178184 local width = (end_col - start_col )
179185 - (cell .end_col - cell .start_col )
180186 + self .context :width (cell )
@@ -193,32 +199,33 @@ function Render:parse_row(node, num_cols)
193199 },
194200 }
195201 end
196- --- @type render.md.table.Row
197- return { node = node , pipes = pipes , cols = cols }
202+ --- @type render.md.table.body. Row
203+ return { node = node , pipes = row . pipes , cols = cols }
198204end
199205
200206--- @private
201207--- @param node render.md.Node
202- --- @param cell string
203- --- @return render.md.Node[] ?, render.md.Node[] ?
204- function Render :parse_cells (node , cell )
208+ --- @param cell_type string
209+ --- @return render.md.table.Row ?
210+ function Render :parse_row (node , cell_type )
205211 local pipes = {} --- @type render.md.Node[]
206212 local cells = {} --- @type render.md.Node[]
207213 node :for_each_child (function (child )
208214 if child .type == ' |' then
209215 pipes [# pipes + 1 ] = child
210- elseif child .type == cell then
216+ elseif child .type == cell_type then
211217 cells [# cells + 1 ] = child
212218 else
213219 log .unhandled (self .context .buf , ' markdown' , ' cell' , child .type )
214220 end
215221 end )
216222 if # pipes == 0 or # cells == 0 or # pipes ~= # cells + 1 then
217- return nil , nil
223+ return nil
218224 end
219225 table.sort (pipes )
220226 table.sort (cells )
221- return pipes , cells
227+ --- @type render.md.table.Row
228+ return { pipes = pipes , cells = cells }
222229end
223230
224231--- @protected
@@ -268,7 +275,7 @@ function Render:delimiter()
268275end
269276
270277--- @private
271- --- @param row render.md.table.Row
278+ --- @param row render.md.table.body. Row
272279function Render :row (row )
273280 local icon = self .config .border [10 ]
274281 local header = row .node .type == ' pipe_table_header'
325332
326333--- Use low priority to include pipe marks
327334--- @private
328- --- @param col render.md.table.Col
335+ --- @param col render.md.table.body. Col
329336--- @param side ' left' | ' right'
330337--- @param amount integer
331338function Render :shift (col , side , amount )
@@ -352,7 +359,7 @@ function Render:border()
352359 local rows = self .data .rows
353360 local border = self .config .border
354361
355- --- @param row render.md.table.Row
362+ --- @param row render.md.table.body. Row
356363 --- @return boolean
357364 local function width_equal (row )
358365 if vim .tbl_contains ({ ' trimmed' , ' padded' }, self .config .cell ) then
@@ -399,7 +406,7 @@ function Render:border()
399406
400407 --- @param node render.md.Node
401408 --- @param above boolean
402- --- @param chars { [1] : string , [2] : string , [3] : string }
409+ --- @param chars [ string, string , string]
403410 local function table_border (node , above , chars )
404411 local text = chars [1 ] .. table.concat (sections , chars [2 ]) .. chars [3 ]
405412 local highlight = above and self .config .head or self .config .row
0 commit comments