Skip to content

Commit 8103a88

Browse files
chore(refactor): store config inside context
## Details Stores the main configuration inside of the context since the 2 are largely used together anyway, offers more flexibility, hopefully fewer hacks whenever we need information from one in the other. Reduces the number of places we need access to `state` module. Pass `context` to `marks` directly instead of getting via a buffer.
1 parent 080104e commit 8103a88

File tree

11 files changed

+70
-101
lines changed

11 files changed

+70
-101
lines changed

lua/render-markdown/config.lua

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,35 @@
11
local Env = require('render-markdown.lib.env')
22
local Range = require('render-markdown.core.range')
33

4-
---@class render.md.main.Components
4+
---@class render.md.main.Full
5+
---@field modes render.md.Modes
56
---@field callout table<string, render.md.callout.Config>
67
---@field checkbox table<string, render.md.checkbox.custom.Config>
78

89
---@class render.md.main.Config: render.md.buffer.Config
9-
---@field private modes render.md.Modes
10-
---@field private components render.md.main.Components
10+
---@field private full render.md.main.Full
1111
local Config = {}
1212
Config.__index = Config
1313

1414
---@param config render.md.buffer.Config
1515
---@return render.md.main.Config
1616
function Config.new(config)
17-
-- Super set of render modes across top level and individual components
17+
-- super set of render modes across top level and individual components
1818
local modes = config.render_modes
1919
for _, component in pairs(config) do
2020
if type(component) == 'table' then
21-
modes = Config.fold_modes(modes, component['render_modes'])
21+
modes = Config.fold(modes, component['render_modes'])
2222
end
2323
end
2424

25-
---@type render.md.main.Components
26-
local components = {
25+
---@type render.md.main.Full
26+
local full = {
27+
modes = modes,
2728
callout = Config.normalize(config.callout),
2829
checkbox = Config.normalize(config.checkbox.custom),
2930
}
3031

31-
local instance = vim.tbl_deep_extend(
32-
'force',
33-
{ modes = modes, components = components },
34-
config
35-
)
32+
local instance = vim.tbl_deep_extend('force', { full = full }, config)
3633
return setmetatable(instance, Config)
3734
end
3835

@@ -63,25 +60,25 @@ function Config.validate(spec)
6360
end
6461

6562
---@private
66-
---@param current render.md.Modes
63+
---@param acc render.md.Modes
6764
---@param new? render.md.Modes
6865
---@return render.md.Modes
69-
function Config.fold_modes(current, new)
70-
if type(current) == 'boolean' and type(new) == 'boolean' then
71-
return current or new
72-
elseif type(current) == 'boolean' and type(new) == 'table' then
73-
return current or new
74-
elseif type(current) == 'table' and type(new) == 'boolean' then
75-
return new or current
76-
elseif type(current) == 'table' and type(new) == 'table' then
77-
-- Copy to avoid modifying inputs
66+
function Config.fold(acc, new)
67+
if type(acc) == 'boolean' and type(new) == 'boolean' then
68+
return acc or new
69+
elseif type(acc) == 'boolean' and type(new) == 'table' then
70+
return acc or new
71+
elseif type(acc) == 'table' and type(new) == 'boolean' then
72+
return new or acc
73+
elseif type(acc) == 'table' and type(new) == 'table' then
74+
-- copy to avoid modifying inputs
7875
local result = {}
79-
vim.list_extend(result, current)
76+
vim.list_extend(result, acc)
8077
vim.list_extend(result, new)
8178
return result
8279
else
83-
-- Should only occur if new is nil, keep current value
84-
return current
80+
-- should only occur if new is nil, keep current value
81+
return acc
8582
end
8683
end
8784

@@ -100,19 +97,19 @@ end
10097
---@param mode string
10198
---@return boolean
10299
function Config:render(mode)
103-
return Env.mode.is(mode, self.modes)
100+
return Env.mode.is(mode, self.full.modes)
104101
end
105102

106103
---@param node render.md.Node
107104
---@return render.md.callout.Config?
108105
function Config:get_callout(node)
109-
return self.components.callout[node.text:lower()]
106+
return self.full.callout[node.text:lower()]
110107
end
111108

112109
---@param node render.md.Node
113110
---@return render.md.checkbox.custom.Config?
114111
function Config:get_checkbox(node)
115-
return self.components.checkbox[node.text:lower()]
112+
return self.full.checkbox[node.text:lower()]
116113
end
117114

118115
---@param mode string

lua/render-markdown/core/context.lua

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,18 @@ local log = require('render-markdown.core.log')
88
---@class render.md.context.Props
99
---@field buf integer
1010
---@field win integer
11+
---@field config render.md.main.Config
1112
---@field mode string
12-
---@field top_level_mode boolean
1313

1414
---@class render.md.context.Offset
1515
---@field col integer
1616
---@field width integer
1717

18-
---@class render.md.Context
18+
---@class render.md.Context: render.md.context.Props
1919
---@field private ranges render.md.Range[]
2020
---@field private callouts table<integer, render.md.callout.Config>
2121
---@field private checkboxes table<integer, render.md.checkbox.custom.Config>
2222
---@field private offsets table<integer, render.md.context.Offset[]>
23-
---@field buf integer
24-
---@field win integer
25-
---@field mode string
26-
---@field top_level_mode boolean
2723
---@field conceal render.md.Conceal
2824
---@field last_heading? integer
2925
local Context = {}
@@ -47,8 +43,9 @@ function Context.new(props, offset)
4743

4844
self.buf = props.buf
4945
self.win = props.win
46+
self.config = props.config
5047
self.mode = props.mode
51-
self.top_level_mode = props.top_level_mode
48+
5249
self.conceal = Conceal.new(self)
5350
self.last_heading = nil
5451

@@ -63,7 +60,7 @@ function Context:skip(config)
6360
return true
6461
end
6562
-- Enabled config in top level modes should not be skipped
66-
if self.top_level_mode then
63+
if Env.mode.is(self.mode, self.config.render_modes) then
6764
return false
6865
end
6966
-- Enabled config in config modes should not be skipped

lua/render-markdown/core/ui.lua

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -151,14 +151,14 @@ function M.run_update(buf, win, change)
151151
buffer:set_marks(M.parse_buffer({
152152
buf = buf,
153153
win = win,
154+
config = config,
154155
mode = mode,
155-
top_level_mode = Env.mode.is(mode, config.render_modes),
156156
}))
157157
end
158158
local hidden = config:hidden(mode, row)
159159
local extmarks = buffer:get_marks()
160160
if initial then
161-
Compat.lsp_window_height(buf, win, extmarks)
161+
Compat.fix_lsp_window(buf, win, extmarks)
162162
state.on.initial({ buf = buf, win = win })
163163
end
164164
for _, extmark in ipairs(extmarks) do
@@ -181,22 +181,12 @@ end
181181
---@param mode string
182182
---@return 'default'|'rendered'
183183
function M.next_state(config, win, mode)
184-
if not state.enabled then
185-
return 'default'
186-
end
187-
if not config.enabled then
188-
return 'default'
189-
end
190-
if not config:render(mode) then
191-
return 'default'
192-
end
193-
if Env.win.get(win, 'diff') then
194-
return 'default'
195-
end
196-
if Env.win.view(win).leftcol ~= 0 then
197-
return 'default'
198-
end
199-
return 'rendered'
184+
local render = state.enabled
185+
and config.enabled
186+
and config:render(mode)
187+
and not Env.win.get(win, 'diff')
188+
and Env.win.view(win).leftcol == 0
189+
return render and 'rendered' or 'default'
200190
end
201191

202192
---@private

lua/render-markdown/handler/html.lua

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
local Context = require('render-markdown.core.context')
22
local Marks = require('render-markdown.lib.marks')
3-
local state = require('render-markdown.state')
43
local ts = require('render-markdown.integ.ts')
54

65
---@class render.md.handler.buf.Html
7-
---@field private config render.md.main.Config
8-
---@field private context render.md.Context
9-
---@field private marks render.md.Marks
106
---@field private query vim.treesitter.Query
117
---@field private renderers table<string, render.md.Render>
8+
---@field private context render.md.Context
129
local Handler = {}
1310
Handler.__index = Handler
1411

1512
---@param buf integer
1613
---@return render.md.handler.buf.Html
1714
function Handler.new(buf)
1815
local self = setmetatable({}, Handler)
19-
self.config = state.get(buf)
20-
self.context = Context.get(buf)
21-
self.marks = Marks.new(buf, true)
2216
self.query = ts.parse(
2317
'html',
2418
[[
@@ -30,24 +24,26 @@ function Handler.new(buf)
3024
comment = require('render-markdown.render.html_comment'),
3125
tag = require('render-markdown.render.html_tag'),
3226
}
27+
self.context = Context.get(buf)
3328
return self
3429
end
3530

3631
---@param root TSNode
3732
---@return render.md.Mark[]
3833
function Handler:parse(root)
39-
if self.context:skip(self.config.html) then
34+
if self.context:skip(self.context.config.html) then
4035
return {}
4136
end
37+
local marks = Marks.new(self.context, true)
4238
self.context:query(root, self.query, function(capture, node)
4339
local renderer = self.renderers[capture]
4440
assert(renderer ~= nil, 'Unhandled html capture: ' .. capture)
45-
local render = renderer:new(self.marks, self.config, self.context, node)
41+
local render = renderer:new(self.context, marks, node)
4642
if render:setup() then
4743
render:render()
4844
end
4945
end)
50-
return self.marks:get()
46+
return marks:get()
5147
end
5248

5349
---@class render.md.handler.Html: render.md.Handler

lua/render-markdown/handler/latex.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ local Marks = require('render-markdown.lib.marks')
44
local Node = require('render-markdown.lib.node')
55
local Str = require('render-markdown.lib.str')
66
local log = require('render-markdown.core.log')
7-
local state = require('render-markdown.state')
87

98
---@class render.md.latex.Cache: { [string]: string }
109
local Cache = {}
@@ -15,8 +14,9 @@ local M = {}
1514
---@param ctx render.md.handler.Context
1615
---@return render.md.Mark[]
1716
function M.parse(ctx)
18-
local latex = state.get(ctx.buf).latex
19-
if Context.get(ctx.buf):skip(latex) then
17+
local context = Context.get(ctx.buf)
18+
local latex = context.config.latex
19+
if context:skip(latex) then
2020
return {}
2121
end
2222
if vim.fn.executable(latex.converter) ~= 1 then
@@ -55,7 +55,7 @@ function M.parse(ctx)
5555
local above = latex.position == 'above'
5656
local row = above and node.start_row or node.end_row
5757

58-
local marks = Marks.new(ctx.buf, true)
58+
local marks = Marks.new(context, true)
5959
marks:add(false, row, 0, {
6060
virt_lines = lines,
6161
virt_lines_above = above,

lua/render-markdown/handler/markdown.lua

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
local Context = require('render-markdown.core.context')
22
local Marks = require('render-markdown.lib.marks')
3-
local state = require('render-markdown.state')
43
local ts = require('render-markdown.integ.ts')
54

65
---@class render.md.handler.buf.Markdown
7-
---@field private config render.md.main.Config
8-
---@field private context render.md.Context
9-
---@field private marks render.md.Marks
106
---@field private query vim.treesitter.Query
117
---@field private renderers table<string, render.md.Render>
8+
---@field private context render.md.Context
129
local Handler = {}
1310
Handler.__index = Handler
1411

1512
---@param buf integer
1613
---@return render.md.handler.buf.Markdown
1714
function Handler.new(buf)
1815
local self = setmetatable({}, Handler)
19-
self.config = state.get(buf)
20-
self.context = Context.get(buf)
21-
self.marks = Marks.new(buf, false)
2216
self.query = ts.parse(
2317
'markdown',
2418
[[
@@ -65,21 +59,23 @@ function Handler.new(buf)
6559
section = require('render-markdown.render.section'),
6660
table = require('render-markdown.render.table'),
6761
}
62+
self.context = Context.get(buf)
6863
return self
6964
end
7065

7166
---@param root TSNode
7267
---@return render.md.Mark[]
7368
function Handler:parse(root)
69+
local marks = Marks.new(self.context, false)
7470
self.context:query(root, self.query, function(capture, node)
7571
local renderer = self.renderers[capture]
7672
assert(renderer ~= nil, 'Unhandled markdown capture: ' .. capture)
77-
local render = renderer:new(self.marks, self.config, self.context, node)
73+
local render = renderer:new(self.context, marks, node)
7874
if render:setup() then
7975
render:render()
8076
end
8177
end)
82-
return self.marks:get()
78+
return marks:get()
8379
end
8480

8581
---@class render.md.handler.Markdown: render.md.Handler

lua/render-markdown/handler/markdown_inline.lua

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
local Context = require('render-markdown.core.context')
22
local Marks = require('render-markdown.lib.marks')
3-
local state = require('render-markdown.state')
43
local ts = require('render-markdown.integ.ts')
54

65
---@class render.md.handler.buf.MarkdownInline
7-
---@field private config render.md.main.Config
8-
---@field private context render.md.Context
9-
---@field private marks render.md.Marks
106
---@field private query vim.treesitter.Query
117
---@field private renderers table<string, render.md.Render>
8+
---@field private context render.md.Context
129
local Handler = {}
1310
Handler.__index = Handler
1411

1512
---@param buf integer
1613
---@return render.md.handler.buf.MarkdownInline
1714
function Handler.new(buf)
1815
local self = setmetatable({}, Handler)
19-
self.config = state.get(buf)
20-
self.context = Context.get(buf)
21-
self.marks = Marks.new(buf, true)
2216
self.query = ts.parse(
2317
'markdown_inline',
2418
[[
@@ -44,21 +38,23 @@ function Handler.new(buf)
4438
link = require('render-markdown.render.link'),
4539
shortcut = require('render-markdown.render.shortcut'),
4640
}
41+
self.context = Context.get(buf)
4742
return self
4843
end
4944

5045
---@param root TSNode
5146
---@return render.md.Mark[]
5247
function Handler:parse(root)
48+
local marks = Marks.new(self.context, true)
5349
self.context:query(root, self.query, function(capture, node)
5450
local renderer = self.renderers[capture]
5551
assert(renderer ~= nil, 'Unhandled inline capture: ' .. capture)
56-
local render = renderer:new(self.marks, self.config, self.context, node)
52+
local render = renderer:new(self.context, marks, node)
5753
if render:setup() then
5854
render:render()
5955
end
6056
end)
61-
return self.marks:get()
57+
return marks:get()
6258
end
6359

6460
---@class render.md.handler.MarkdownInline: render.md.Handler

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.7'
8+
M.version = '8.3.8'
99

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

0 commit comments

Comments
 (0)