Skip to content

Commit fa92c30

Browse files
chore(refactor): move component tables out of context
## Details Rather than storing the callouts, checkboxes, & offsets tables directly in Context, take a similar approach as Conceal and move these into their own modules and store an instance of each in Context. Makes them easier to change in isolation without adding more overhead to the Context. Store the node associated with checkboxes & callouts, currently unused but will be in a follow up. Other changes: - make base `render` parent call `setup` on each instance as part of the call to `new`, return `nil` if false, handle `nil` where these are used, make `setup` protected, rename main `render` method to `run` - add more general `query` method to `View` module, allows us to avoid exposing any state directly by removing `for_each` - move `percent` calculation out of `Context` and into `Env`, since it only depends on the window, remove `width` method - update `Conceal` node range logic to return 4 ints instead of a table - fix overload return types for `Env.buf.get` - `renderers` -> `modules`, `renderer` -> `module` - rename list_item capture `bullet` -> `list` - update CHANGELOG
1 parent 3484e3e commit fa92c30

31 files changed

+291
-215
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
- use conceal lines for setext heading underline [78ffe3b](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/78ffe3b0500bbc7e37fabde723d96661538e8b32)
1919
- improve debug command [40fff90](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/40fff90caccb4a1c902681f0440806ee9ae95d0b)
2020
- use selene to prevent accidental print statements [7f81e9d](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/7f81e9dcc15504c044f20df39d28a590cd5c6ca5)
21+
- configurable indent for first line of paragraph [#417](https://github.com/MeanderingProgrammer/render-markdown.nvim/issues/417)
22+
[57c7f33](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/57c7f33f276876c994898683680da9e3a3590d0d)
2123

2224
### Bug Fixes
2325

doc/render-markdown.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*render-markdown.txt* For NVIM v0.11.1 Last change: 2025 May 03
1+
*render-markdown.txt* For NVIM v0.11.1 Last change: 2025 May 04
22

33
==============================================================================
44
Table of Contents *render-markdown-table-of-contents*

lua/render-markdown/handler/html.lua

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ local ts = require('render-markdown.core.ts')
44

55
---@class render.md.handler.buf.Html
66
---@field private query vim.treesitter.Query
7-
---@field private renderers table<string, render.md.Render>
7+
---@field private modules table<string, render.md.Render>
88
---@field private context render.md.request.Context
99
local Handler = {}
1010
Handler.__index = Handler
@@ -20,7 +20,7 @@ function Handler.new(buf)
2020
(element) @tag
2121
]]
2222
)
23-
self.renderers = {
23+
self.modules = {
2424
comment = require('render-markdown.render.html_comment'),
2525
tag = require('render-markdown.render.html_tag'),
2626
}
@@ -35,12 +35,12 @@ function Handler:parse(root)
3535
return {}
3636
end
3737
local marks = Marks.new(self.context, true)
38-
self.context.view:query(root, self.query, function(capture, node)
39-
local renderer = self.renderers[capture]
40-
assert(renderer ~= nil, 'unhandled html capture: ' .. capture)
41-
local render = renderer:new(self.context, marks, node)
42-
if render:setup() then
43-
render:render()
38+
self.context.view:nodes(root, self.query, function(capture, node)
39+
local module = self.modules[capture]
40+
assert(module ~= nil, 'unhandled html capture: ' .. capture)
41+
local render = module:new(self.context, marks, node)
42+
if render then
43+
render:run()
4444
end
4545
end)
4646
return marks:get()

lua/render-markdown/handler/markdown.lua

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ local ts = require('render-markdown.core.ts')
44

55
---@class render.md.handler.buf.Markdown
66
---@field private query vim.treesitter.Query
7-
---@field private renderers table<string, render.md.Render>
7+
---@field private modules table<string, render.md.Render>
88
---@field private context render.md.request.Context
99
local Handler = {}
1010
Handler.__index = Handler
@@ -35,7 +35,7 @@ function Handler.new(buf)
3535
(plus_metadata)
3636
] @dash
3737
38-
(list_item) @bullet
38+
(list_item) @list
3939
4040
[
4141
(task_list_marker_unchecked)
@@ -47,13 +47,13 @@ function Handler.new(buf)
4747
(pipe_table) @table
4848
]]
4949
)
50-
self.renderers = {
51-
bullet = require('render-markdown.render.bullet'),
50+
self.modules = {
5251
checkbox = require('render-markdown.render.checkbox'),
5352
code = require('render-markdown.render.code'),
5453
dash = require('render-markdown.render.dash'),
5554
document = require('render-markdown.render.document'),
5655
heading = require('render-markdown.render.heading'),
56+
list = require('render-markdown.render.bullet'),
5757
paragraph = require('render-markdown.render.paragraph'),
5858
quote = require('render-markdown.render.quote'),
5959
section = require('render-markdown.render.section'),
@@ -67,12 +67,12 @@ end
6767
---@return render.md.Mark[]
6868
function Handler:parse(root)
6969
local marks = Marks.new(self.context, false)
70-
self.context.view:query(root, self.query, function(capture, node)
71-
local renderer = self.renderers[capture]
72-
assert(renderer ~= nil, 'unhandled markdown capture: ' .. capture)
73-
local render = renderer:new(self.context, marks, node)
74-
if render:setup() then
75-
render:render()
70+
self.context.view:nodes(root, self.query, function(capture, node)
71+
local module = self.modules[capture]
72+
assert(module ~= nil, 'unhandled markdown capture: ' .. capture)
73+
local render = module:new(self.context, marks, node)
74+
if render then
75+
render:run()
7676
end
7777
end)
7878
return marks:get()

lua/render-markdown/handler/markdown_inline.lua

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ local ts = require('render-markdown.core.ts')
44

55
---@class render.md.handler.buf.MarkdownInline
66
---@field private query vim.treesitter.Query
7-
---@field private renderers table<string, render.md.Render>
7+
---@field private modules table<string, render.md.Render>
88
---@field private context render.md.request.Context
99
local Handler = {}
1010
Handler.__index = Handler
@@ -32,7 +32,7 @@ function Handler.new(buf)
3232
(#lua-match? @inline_highlight "==[^=]+=="))
3333
]]
3434
)
35-
self.renderers = {
35+
self.modules = {
3636
code_inline = require('render-markdown.render.code_inline'),
3737
inline_highlight = require('render-markdown.render.inline_highlight'),
3838
link = require('render-markdown.render.link'),
@@ -46,12 +46,12 @@ end
4646
---@return render.md.Mark[]
4747
function Handler:parse(root)
4848
local marks = Marks.new(self.context, true)
49-
self.context.view:query(root, self.query, function(capture, node)
50-
local renderer = self.renderers[capture]
51-
assert(renderer ~= nil, 'unhandled inline capture: ' .. capture)
52-
local render = renderer:new(self.context, marks, node)
53-
if render:setup() then
54-
render:render()
49+
self.context.view:nodes(root, self.query, function(capture, node)
50+
local module = self.modules[capture]
51+
assert(module ~= nil, 'unhandled inline capture: ' .. capture)
52+
local render = module:new(self.context, marks, node)
53+
if render then
54+
render:run()
5555
end
5656
end)
5757
return marks:get()

lua/render-markdown/health.lua

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

77
---@private
8-
M.version = '8.3.25'
8+
M.version = '8.3.26'
99

1010
function M.check()
1111
M.start('version')

lua/render-markdown/lib/env.lua

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ end
133133
---@param name string
134134
---@return render.md.option.Value
135135
---@overload fun(buf: integer, name: 'buflisted'): boolean
136-
---@overload fun(buf: integer, name: 'buftype'): integer
137-
---@overload fun(buf: integer, name: 'filetype'): integer
136+
---@overload fun(buf: integer, name: 'buftype'): string
137+
---@overload fun(buf: integer, name: 'filetype'): string
138138
---@overload fun(buf: integer, name: 'tabstop'): integer
139139
function M.buf.get(buf, name)
140140
return vim.api.nvim_get_option_value(name, { buf = buf })
@@ -202,18 +202,27 @@ function M.win.buf(win)
202202
return vim.fn.winbufnr(win)
203203
end
204204

205-
---@param win integer
206-
---@return integer
207-
function M.win.width(win)
208-
local infos = vim.fn.getwininfo(win)
209-
local textoff = #infos == 1 and infos[1].textoff or 0
210-
return vim.api.nvim_win_get_width(win) - textoff
211-
end
212-
213205
---@param win integer
214206
---@return vim.fn.winsaveview.ret
215207
function M.win.view(win)
216208
return vim.api.nvim_win_call(win, vim.fn.winsaveview)
217209
end
218210

211+
---@param win integer
212+
---@param value number
213+
---@param used integer
214+
---@return integer
215+
function M.win.percent(win, value, used)
216+
if value <= 0 then
217+
return 0
218+
elseif value >= 1 then
219+
return value
220+
else
221+
local infos = vim.fn.getwininfo(win)
222+
local textoff = #infos == 1 and infos[1].textoff or 0
223+
local width = vim.api.nvim_win_get_width(win) - textoff - used
224+
return math.floor((width * value) + 0.5)
225+
end
226+
end
227+
219228
return M

lua/render-markdown/lib/marks.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ function Marks:run_update(mark)
147147
})
148148
end
149149
if mark.opts.virt_text_pos == 'inline' then
150-
self.context:add_offset(row, {
150+
self.context.offset:add(row, {
151151
col = start_col,
152152
width = Str.line_width(mark.opts.virt_text),
153153
})

lua/render-markdown/render/base.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,22 @@ local colors = require('render-markdown.core.colors')
77
---@field protected config render.md.main.Config
88
---@field protected marks render.md.Marks
99
---@field protected node render.md.Node
10-
---@field setup fun(self: render.md.Render): boolean
11-
---@field render fun(self: render.md.Render)
10+
---@field protected setup fun(self: render.md.Render): boolean
11+
---@field run fun(self: render.md.Render)
1212
local Base = {}
1313
Base.__index = Base
1414

1515
---@param context render.md.request.Context
1616
---@param marks render.md.Marks
1717
---@param node render.md.Node
18-
---@return render.md.Render
18+
---@return render.md.Render?
1919
function Base:new(context, marks, node)
2020
local instance = setmetatable({}, self)
2121
instance.context = context
2222
instance.config = context.config
2323
instance.marks = marks
2424
instance.node = node
25-
return instance
25+
return instance:setup() and instance or nil
2626
end
2727

2828
---@protected

lua/render-markdown/render/bullet.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,24 @@ local Str = require('render-markdown.lib.str')
1212
local Render = setmetatable({}, Base)
1313
Render.__index = Render
1414

15+
---@protected
1516
---@return boolean
1617
function Render:setup()
1718
local marker = self.node:child_at(0)
1819
if not marker then
1920
return false
2021
end
22+
local checkbox = self.context.checkbox:get(self.node)
2123
self.data = {
2224
marker = marker,
2325
-- https://github.com/tree-sitter-grammars/tree-sitter-markdown/issues/127
2426
spaces = Str.spaces('start', marker.text),
25-
checkbox = self.context:get_checkbox(self.node.start_row),
27+
checkbox = checkbox and checkbox.config,
2628
}
2729
return true
2830
end
2931

30-
function Render:render()
32+
function Render:run()
3133
if self:has_checkbox() then
3234
-- Hide the list marker for checkboxes rather than replacing with a bullet point
3335
self:hide_marker()

0 commit comments

Comments
 (0)