Skip to content

Commit e78a276

Browse files
chore(refactor): use setup & init pattern for treesitter and log modules
## Details - Move log runtime behavior into `log` module, store the configuration directly rather than using `state`, simplify associated wrapper - Move user config -> actual config resolution into `init` module and pass result to `state` - Store injections and patterns directly in treesitter module, call methods without relying on `state` - Use an enum for top level presets
1 parent 8103a88 commit e78a276

File tree

12 files changed

+144
-114
lines changed

12 files changed

+144
-114
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
- more robust icon provider resolution [#403](https://github.com/MeanderingProgrammer/render-markdown.nvim/issues/403)
1515
[dfffdd2](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/dfffdd221570d36ac80d1a599643140a319a36de)
16+
- disable line wrapping in LSP hover docs in some cases [#408](https://github.com/MeanderingProgrammer/render-markdown.nvim/issues/408)
17+
[080104e](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/080104e4dce26819efb4f4c83d1b7b2d82b96f7c)
1618

1719
## 8.3.0 (2025-04-15)
1820

lua/render-markdown/core/buffer.lua

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,26 @@ function Buffer:is_empty()
3434
return self.empty
3535
end
3636

37+
---@param debounce boolean
3738
---@param ms integer
3839
---@param callback fun()
39-
function Buffer:debounce(ms, callback)
40-
self.timer:start(ms, 0, function()
41-
self.running = false
42-
end)
43-
if not self.running then
44-
self.running = true
40+
function Buffer:run(debounce, ms, callback)
41+
if debounce and ms > 0 then
42+
self.timer:start(ms, 0, function()
43+
self.running = false
44+
end)
45+
if not self.running then
46+
self.running = true
47+
vim.schedule(callback)
48+
end
49+
else
4550
vim.schedule(callback)
4651
end
4752
end
4853

4954
---@return boolean
50-
function Buffer:has_marks()
51-
return self.marks ~= nil
55+
function Buffer:initial()
56+
return self.marks == nil
5257
end
5358

5459
---@return render.md.Extmark[]

lua/render-markdown/core/log.lua

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,29 @@ local Env = require('render-markdown.lib.env')
66
---@field name string
77
---@field message string
88

9+
---@class render.md.log.Config
10+
---@field level render.md.log.Level
11+
---@field runtime boolean
12+
13+
---@alias render.md.log.Level 'off'|'debug'|'info'|'error'
14+
915
---@class render.md.Log
1016
---@field private file string
11-
---@field private level render.md.config.LogLevel
1217
---@field private entries render.md.log.Entry[]
18+
---@field private config render.md.log.Config
1319
local M = {}
1420

15-
---called from plugin directory
16-
function M.init()
21+
---called from state on setup
22+
---@param config render.md.log.Config
23+
function M.setup(config)
1724
-- typically resolves to ~/.local/state/nvim/render-markdown.log
1825
M.file = vim.fn.stdpath('state') .. '/render-markdown.log'
26+
M.entries = {}
27+
M.config = config
28+
end
29+
30+
---called from plugin directory
31+
function M.init()
1932
-- clear the file contents if it is too big
2033
if Env.file_size_mb(M.file) > 5 then
2134
assert(io.open(M.file, 'w')):close()
@@ -27,11 +40,23 @@ function M.init()
2740
})
2841
end
2942

30-
---called from state on setup
31-
---@param level render.md.config.LogLevel
32-
function M.setup(level)
33-
M.level = level
34-
M.entries = {}
43+
---@param name string
44+
---@param callback fun()
45+
---@return fun()
46+
function M.runtime(name, callback)
47+
if M.config.runtime then
48+
return function()
49+
local Compat = require('render-markdown.lib.compat')
50+
local start_time = Compat.uv.hrtime()
51+
callback()
52+
local end_time = Compat.uv.hrtime()
53+
local elapsed = (end_time - start_time) / 1e+6
54+
assert(elapsed < 1000)
55+
vim.print(string.format('%8s : %5.1f ms', name:upper(), elapsed))
56+
end
57+
else
58+
return callback
59+
end
3560
end
3661

3762
function M.open()
@@ -59,7 +84,7 @@ function M.unhandled_type(language, group, value)
5984
M.add('error', 'unhandled type', message)
6085
end
6186

62-
---@param level render.md.config.LogLevel
87+
---@param level render.md.log.Level
6388
---@param name string
6489
---@param buf integer
6590
---@param ... any
@@ -79,11 +104,11 @@ function M.file_name(buf)
79104
return #name == 0 and 'EMPTY' or name
80105
end
81106

82-
---@param level render.md.config.LogLevel
107+
---@param level render.md.log.Level
83108
---@param name string
84109
---@param ... any
85110
function M.add(level, name, ...)
86-
if M.level_value(level) < M.level_value(M.level) then
111+
if M.level_value(level) < M.level_value(M.config.level) then
87112
return
88113
end
89114
local messages = {}
@@ -107,7 +132,7 @@ function M.add(level, name, ...)
107132
end
108133

109134
---@private
110-
---@param level render.md.config.LogLevel
135+
---@param level render.md.log.Level
111136
---@return integer
112137
function M.level_value(level)
113138
if level == 'debug' then

lua/render-markdown/core/ui.lua

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -97,28 +97,10 @@ function M.update(buf, win, event, change)
9797
return
9898
end
9999

100-
local update = function()
100+
local update = log.runtime('update', function()
101101
M.run_update(buf, win, change)
102-
end
103-
if parse and state.log_runtime then
104-
update = Env.runtime('update', update)
105-
end
106-
107-
if parse and config.debounce > 0 then
108-
buffer:debounce(config.debounce, update)
109-
else
110-
vim.schedule(update)
111-
end
112-
end
113-
114-
---@private
115-
---@param buf integer
116-
---@param win integer
117-
---@param change boolean
118-
---@return boolean
119-
function M.parse(buf, win, change)
120-
-- Need to parse when things change or we have not parsed the visible range yet
121-
return change or not Context.contains(buf, win)
102+
end)
103+
buffer:run(parse, config.debounce, update)
122104
end
123105

124106
---@private
@@ -145,7 +127,7 @@ function M.run_update(buf, win, change)
145127
end
146128

147129
if next_state == 'rendered' then
148-
local initial = not buffer:has_marks()
130+
local initial = buffer:initial()
149131
if initial or parse then
150132
M.clear(buf, buffer)
151133
buffer:set_marks(M.parse_buffer({
@@ -175,6 +157,16 @@ function M.run_update(buf, win, change)
175157
end
176158
end
177159

160+
---@private
161+
---@param buf integer
162+
---@param win integer
163+
---@param change boolean
164+
---@return boolean
165+
function M.parse(buf, win, change)
166+
-- need to parse when things change or we have not parsed the visible range yet
167+
return change or not Context.contains(buf, win)
168+
end
169+
178170
---@private
179171
---@param config render.md.main.Config
180172
---@param win integer

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

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

lua/render-markdown/init.lua

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ local M = {}
33

44
---@class (exact) render.md.Config: render.md.buffer.Config
55
---@field preset render.md.config.Preset
6-
---@field log_level render.md.config.LogLevel
6+
---@field log_level render.md.log.Level
77
---@field log_runtime boolean
88
---@field file_types string[]
99
---@field ignore fun(buf: integer): boolean
@@ -15,10 +15,6 @@ local M = {}
1515
---@field overrides render.md.overrides.Config
1616
---@field custom_handlers table<string, render.md.Handler>
1717

18-
---@alias render.md.config.Preset 'none'|'lazy'|'obsidian'
19-
20-
---@alias render.md.config.LogLevel 'off'|'debug'|'info'|'error'
21-
2218
---@class (exact) render.md.buffer.Config: render.md.base.Config
2319
---@field max_file_size number
2420
---@field debounce integer
@@ -714,7 +710,29 @@ function M.setup(opts)
714710
return
715711
end
716712
M.initialized = true
717-
require('render-markdown.state').setup(opts or {})
713+
local config = M.resolve_config(opts or {})
714+
require('render-markdown.state').setup(config)
715+
end
716+
717+
---@private
718+
---@param user render.md.UserConfig
719+
---@return render.md.Config
720+
function M.resolve_config(user)
721+
local preset = require('render-markdown.presets').get(user)
722+
local config = vim.tbl_deep_extend('force', M.default, preset, user)
723+
-- override settings that require neovim >= 0.10.0 and have compatible alternatives
724+
local has_10 = require('render-markdown.lib.compat').has_10
725+
if not has_10 then
726+
config.code.position = 'right'
727+
end
728+
-- use lazy.nvim file type configuration if available and no user value is specified
729+
if user.file_types == nil then
730+
local lazy_file_types = require('render-markdown.lib.env').lazy('ft')
731+
if #lazy_file_types > 0 then
732+
config.file_types = lazy_file_types
733+
end
734+
end
735+
return config
718736
end
719737

720738
return setmetatable(M, {

lua/render-markdown/integ/ts.lua

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
local Compat = require('render-markdown.lib.compat')
22

3-
---@class render.md.integ.TreeSitter
3+
---@class render.md.integ.ts.Config
4+
---@field file_types string[]
5+
---@field injections table<string, render.md.injection.Config>
6+
---@field patterns table<string, render.md.pattern.Config>
7+
8+
---@class render.md.integ.TS
9+
---@field private config render.md.integ.ts.Config
410
local M = {}
511

612
---@private
@@ -11,15 +17,23 @@ M.initialized = false
1117
---@type table<string, vim.treesitter.Query>
1218
M.queries = {}
1319

20+
---called from state on setup
21+
---@param config render.md.integ.ts.Config
22+
function M.setup(config)
23+
M.config = config
24+
for _, language in ipairs(M.config.file_types) do
25+
M.inject(language)
26+
end
27+
end
28+
1429
---called from manager on buffer attach
15-
function M.setup()
30+
function M.init()
1631
if M.initialized then
1732
return
1833
end
1934
M.initialized = true
20-
local state = require('render-markdown.state')
21-
for _, language in ipairs(state.file_types) do
22-
M.disable(language, state.patterns[language])
35+
for _, language in ipairs(M.config.file_types) do
36+
M.disable(language)
2337
end
2438
end
2539

@@ -35,9 +49,10 @@ function M.parse(language, query)
3549
return result
3650
end
3751

52+
---@private
3853
---@param language string
39-
---@param injection? render.md.injection.Config
40-
function M.inject(language, injection)
54+
function M.inject(language)
55+
local injection = M.config.injections[language]
4156
if injection == nil or not injection.enabled then
4257
return
4358
end
@@ -60,8 +75,8 @@ end
6075

6176
---@private
6277
---@param language string
63-
---@param pattern? render.md.pattern.Config
64-
function M.disable(language, pattern)
78+
function M.disable(language)
79+
local pattern = M.config.patterns[language]
6580
if pattern == nil or not pattern.disable then
6681
return
6782
end

lua/render-markdown/lib/env.lua

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,6 @@ function M.file_size_mb(file)
4444
return stats.size / (1024 * 1024)
4545
end
4646

47-
---@param name string
48-
---@param callback fun()
49-
---@return fun()
50-
function M.runtime(name, callback)
51-
return function()
52-
local start_time = Compat.uv.hrtime()
53-
callback()
54-
local end_time = Compat.uv.hrtime()
55-
local elapsed = (end_time - start_time) / 1e+6
56-
assert(elapsed < 1000)
57-
vim.print(string.format('%8s : %5.1f ms', name:upper(), elapsed))
58-
end
59-
end
60-
6147
---@param buf integer
6248
---@param win integer
6349
---@return boolean

lua/render-markdown/manager.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ function M.attach(buf)
8787

8888
local config = state.get(buf)
8989
state.on.attach({ buf = buf })
90-
require('render-markdown.integ.ts').setup()
90+
require('render-markdown.integ.ts').init()
9191
if state.completions.lsp.enabled then
9292
require('render-markdown.integ.lsp').setup()
9393
elseif state.completions.blink.enabled then

0 commit comments

Comments
 (0)