Skip to content

Commit 4e14c0e

Browse files
chore: refactor classes used for table parsing
1 parent 477997f commit 4e14c0e

3 files changed

Lines changed: 51 additions & 39 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,20 @@
1212
- add priority to sign configuration [#601](https://github.com/MeanderingProgrammer/render-markdown.nvim/issues/601)
1313
[996ec12](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/996ec12e1164e56401babf236c56cb2d9321d923)
1414
- support math superscript characters and body transformer for footnotes [48934b4](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/48934b49a2363b49ae1d698ed4cb30fb79d7efe8)
15+
- disable code based on languages [#596](https://github.com/MeanderingProgrammer/render-markdown.nvim/pull/596)
16+
[477997f](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/477997fc95432e9241e8cabaebfcda998863b2d6)
1517

1618
### Bug Fixes
1719

1820
- separate twitter and x link icons [#604](https://github.com/MeanderingProgrammer/render-markdown.nvim/pull/604)
1921
[b3efd64](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/b3efd6408e4e4d66d6caaee0579e72b579bc0884)
22+
- handle rendering empty buffers [#597](https://github.com/MeanderingProgrammer/render-markdown.nvim/pull/597)
23+
[1c95813](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/1c958131c083c8557ea499fdb08c88b8afb05c4e)
2024

2125
### Collaborator Shoutouts
2226

2327
- @calebdw
28+
- @bezlant
2429

2530
## 8.11.0 (2026-01-07)
2631

lua/render-markdown/health.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ local state = require('render-markdown.state')
66
local M = {}
77

88
---@private
9-
M.version = '8.11.9'
9+
M.version = '8.11.10'
1010

1111
function M.check()
1212
M.start('versions')

lua/render-markdown/render/markdown/table.lua

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ local log = require('render-markdown.core.log')
44
local 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 }
146151
end
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 }
198204
end
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 }
222229
end
223230

224231
---@protected
@@ -268,7 +275,7 @@ function Render:delimiter()
268275
end
269276

270277
---@private
271-
---@param row render.md.table.Row
278+
---@param row render.md.table.body.Row
272279
function Render:row(row)
273280
local icon = self.config.border[10]
274281
local header = row.node.type == 'pipe_table_header'
@@ -325,7 +332,7 @@ end
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
331338
function 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

Comments
 (0)