Skip to content

Commit a6a982d

Browse files
chore(refactor): width calculations & version updates
## Details - Add `widths` method to `Node` class to get width of all lines - For code blocks always round padding / margin to nearest `tab` if the text contains a tab, regardless of which side is being calculated - Make `buf` & `win` fields public in `Context` class - Remove cache around window width and compute as needed - Simplify state of `code` renderer by moving logic to where fields are used, only keep around the width information in `self.data` - Update help doc neovim version to `0.11.0` - Set the recommended version to `0.11.0`, minimum remains `0.9.0` - Other minor internal naming changes
1 parent a020c88 commit a6a982d

File tree

14 files changed

+101
-130
lines changed

14 files changed

+101
-130
lines changed

Diff for: doc/render-markdown.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*render-markdown.txt* For 0.10.0 Last change: 2025 March 30
1+
*render-markdown.txt* For 0.11.0 Last change: 2025 March 31
22

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

Diff for: justfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ update:
1010
../../open-source/panvimdoc/panvimdoc.sh \
1111
--project-name render-markdown \
1212
--input-file README.md \
13-
--vim-version 0.10.0
13+
--vim-version 0.11.0
1414

1515
test:
1616
just busted "tests"

Diff for: lua/render-markdown/core/conceal.lua

+3-5
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,12 @@ local Conceal = {}
2121
Conceal.__index = Conceal
2222

2323
---@param context render.md.Context
24-
---@param buf integer
25-
---@param win integer
2624
---@return render.md.Conceal
27-
function Conceal.new(context, buf, win)
25+
function Conceal.new(context)
2826
local self = setmetatable({}, Conceal)
2927
self.context = context
30-
self.buf = buf
31-
self.level = Env.win.get(win, 'conceallevel')
28+
self.buf = context.buf
29+
self.level = Env.win.get(context.win, 'conceallevel')
3230
self.computed = false
3331
self.lines = {}
3432
return self

Diff for: lua/render-markdown/core/context.lua

+15-31
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@ local log = require('render-markdown.core.log')
1616
---@field width integer
1717

1818
---@class render.md.Context
19-
---@field private buf integer
20-
---@field private win integer
2119
---@field private ranges render.md.Range[]
2220
---@field private callouts table<integer, render.md.CustomCallout>
2321
---@field private checkboxes table<integer, render.md.CustomCheckbox>
2422
---@field private offsets table<integer, render.md.context.Offset[]>
25-
---@field private window_width? integer
23+
---@field buf integer
24+
---@field win integer
2625
---@field mode string
2726
---@field top_level_mode boolean
2827
---@field conceal render.md.Conceal
@@ -35,23 +34,21 @@ Context.__index = Context
3534
---@return render.md.Context
3635
function Context.new(props, offset)
3736
local self = setmetatable({}, Context)
38-
self.buf = props.buf
39-
self.win = props.win
4037

4138
local ranges = {}
42-
for _, window in ipairs(Env.buf.windows(self.buf)) do
43-
table.insert(ranges, Context.compute_range(self.buf, window, offset))
39+
for _, window in ipairs(Env.buf.windows(props.buf)) do
40+
table.insert(ranges, Context.compute_range(props.buf, window, offset))
4441
end
4542
self.ranges = Range.coalesce(ranges)
46-
4743
self.callouts = {}
4844
self.checkboxes = {}
4945
self.offsets = {}
50-
self.window_width = nil
5146

47+
self.buf = props.buf
48+
self.win = props.win
5249
self.mode = props.mode
5350
self.top_level_mode = props.top_level_mode
54-
self.conceal = Conceal.new(self, self.buf, self.win)
51+
self.conceal = Conceal.new(self)
5552
self.last_heading = nil
5653

5754
return self
@@ -93,11 +90,6 @@ function Context:skip(component)
9390
return not Env.mode.is(self.mode, component.render_modes)
9491
end
9592

96-
---@return integer
97-
function Context:get_buf()
98-
return self.buf
99-
end
100-
10193
---@param row integer
10294
---@return render.md.CustomCallout?
10395
function Context:get_callout(row)
@@ -162,26 +154,18 @@ function Context:get_offset(node)
162154
return result
163155
end
164156

165-
---@param offset number
166-
---@param width integer
157+
---@param value number
158+
---@param used integer
167159
---@return integer
168-
function Context:to_width(offset, width)
169-
if offset <= 0 then
160+
function Context:percent(value, used)
161+
if value <= 0 then
170162
return 0
171-
elseif offset < 1 then
172-
return math.floor(((self:get_width() - width) * offset) + 0.5)
163+
elseif value < 1 then
164+
local available = Env.win.width(self.win) - used
165+
return math.floor((available * value) + 0.5)
173166
else
174-
return offset
175-
end
176-
end
177-
178-
---@private
179-
---@return integer
180-
function Context:get_width()
181-
if self.window_width == nil then
182-
self.window_width = Env.win.width(self.win)
167+
return value
183168
end
184-
return self.window_width
185169
end
186170

187171
---@param win integer

Diff for: lua/render-markdown/core/ui.lua

+2-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ function M.run_update(buf, win, change)
132132
end
133133

134134
if next_state == 'rendered' then
135-
if not buffer:has_marks() or parse then
135+
local initial = not buffer:has_marks()
136+
if initial or parse then
136137
M.clear(buf, buffer)
137138
buffer:set_marks(M.parse_buffer({
138139
buf = buf,

Diff for: lua/render-markdown/health.lua

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ local state = require('render-markdown.state')
55
local M = {}
66

77
---@private
8-
M.version = '8.1.23'
8+
M.version = '8.1.24'
99

1010
function M.check()
1111
M.start('version')
1212
vim.health.ok('plugin ' .. M.version)
13-
M.neovim('0.9', '0.10')
13+
M.neovim('0.9', '0.11')
1414

1515
M.start('configuration')
1616
local errors = state.validate()

Diff for: lua/render-markdown/lib/node.lua

+20-21
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
local Iter = require('render-markdown.lib.iter')
2+
local Str = require('render-markdown.lib.str')
3+
14
---@class render.md.Node
25
---@field private buf integer
36
---@field private node TSNode
@@ -27,13 +30,6 @@ function Node.new(buf, node)
2730
return self
2831
end
2932

30-
---@private
31-
---@param node TSNode
32-
---@return render.md.Node
33-
function Node:create(node)
34-
return Node.new(self.buf, node)
35-
end
36-
3733
---@param a render.md.Node
3834
---@param b render.md.Node
3935
---@return boolean
@@ -45,16 +41,18 @@ function Node.__lt(a, b)
4541
end
4642
end
4743

44+
---@private
45+
---@param node TSNode
46+
---@return render.md.Node
47+
function Node:create(node)
48+
return Node.new(self.buf, node)
49+
end
50+
4851
---@return TSNode
4952
function Node:get()
5053
return self.node
5154
end
5255

53-
---@return boolean
54-
function Node:has_error()
55-
return self.node:has_error()
56-
end
57-
5856
---@return integer[]
5957
function Node:sections()
6058
local result, levels, section = {}, 0, self:parent('section')
@@ -169,6 +167,12 @@ function Node:for_each_child(callback)
169167
end
170168
end
171169

170+
---@return string?
171+
function Node:after()
172+
local row, col = self.end_row, self.end_col
173+
return vim.api.nvim_buf_get_text(self.buf, row, col, row, col + 1, {})[1]
174+
end
175+
172176
---@param position 'above'|'first'|'below'|'last'
173177
---@param by integer
174178
---@return string?
@@ -186,15 +190,10 @@ function Node:line(position, by)
186190
return row ~= nil and vim.api.nvim_buf_get_lines(self.buf, row, row + 1, false)[1] or nil
187191
end
188192

189-
---@return string[]
190-
function Node:lines()
191-
return vim.api.nvim_buf_get_lines(self.buf, self.start_row, self.end_row, false)
192-
end
193-
194-
---@return string?
195-
function Node:after()
196-
local row, col = self.end_row, self.end_col
197-
return vim.api.nvim_buf_get_text(self.buf, row, col, row, col + 1, {})[1]
193+
---@return integer[]
194+
function Node:widths()
195+
local lines = vim.api.nvim_buf_get_lines(self.buf, self.start_row, self.end_row, false)
196+
return Iter.list.map(lines, Str.width)
198197
end
199198

200199
return Node

0 commit comments

Comments
 (0)