Skip to content

Commit 99bfa5d

Browse files
feat: center code language position
## Details Request: #591 `code.position` now supports `center` value in addition to the existing `left` and `right` values. Behavior is what you would expect.
1 parent 8314d14 commit 99bfa5d

8 files changed

Lines changed: 88 additions & 31 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
## Pre-release
44

5+
### Features
6+
7+
- link.highlight_title option [#583](https://github.com/MeanderingProgrammer/render-markdown.nvim/issues/583)
8+
[ae89236](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/ae89236e2389836cf1c3787b2b80d5d8685cc13f)
9+
- toggle WikiLink rendering via enabled flag [8314d14](https://github.com/MeanderingProgrammer/render-markdown.nvim/commit/8314d14b9f56306bc876fb3b386f31dc8c5a2711)
10+
511
## 8.11.0 (2026-01-07)
612

713
### Features

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -450,8 +450,9 @@ require('render-markdown').setup({
450450
-- Turn on / off language heading related rendering.
451451
language = true,
452452
-- Determines where language icon is rendered.
453-
-- | right | right side of code block |
454-
-- | left | left side of code block |
453+
-- | center | center of code block |
454+
-- | right | right of code block |
455+
-- | left | left of code block |
455456
position = 'left',
456457
-- Whether to include the language icon above code blocks.
457458
language_icon = true,
@@ -1138,8 +1139,9 @@ require('render-markdown').setup({
11381139
-- Turn on / off language heading related rendering.
11391140
language = true,
11401141
-- Determines where language icon is rendered.
1141-
-- | right | right side of code block |
1142-
-- | left | left side of code block |
1142+
-- | center | center of code block |
1143+
-- | right | right of code block |
1144+
-- | left | left of code block |
11431145
position = 'left',
11441146
-- Whether to include the language icon above code blocks.
11451147
language_icon = true,

doc/render-markdown.txt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -516,8 +516,9 @@ Default Configuration ~
516516
-- Turn on / off language heading related rendering.
517517
language = true,
518518
-- Determines where language icon is rendered.
519-
-- | right | right side of code block |
520-
-- | left | left side of code block |
519+
-- | center | center of code block |
520+
-- | right | right of code block |
521+
-- | left | left of code block |
521522
position = 'left',
522523
-- Whether to include the language icon above code blocks.
523524
language_icon = true,
@@ -1198,8 +1199,9 @@ Code Block Configuration ~
11981199
-- Turn on / off language heading related rendering.
11991200
language = true,
12001201
-- Determines where language icon is rendered.
1201-
-- | right | right side of code block |
1202-
-- | left | left side of code block |
1202+
-- | center | center of code block |
1203+
-- | right | right of code block |
1204+
-- | left | left of code block |
12031205
position = 'left',
12041206
-- Whether to include the language icon above code blocks.
12051207
language_icon = true,

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.2'
9+
M.version = '8.11.3'
1010

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

lua/render-markdown/render/markdown/code.lua

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -145,25 +145,32 @@ function Render:language(info, language, delim)
145145
:extend(text)
146146
:text(self.config.language_right, border_hl)
147147

148-
local border = border_hl and self.config.language_border or ' '
149-
local width = self.data.body - delim.start_col
150-
151-
local prefix = self:line()
152148
-- code blocks can pick up varying amounts of leading white space
153149
-- this is lumped into the delimiter node and needs to be handled
154-
prefix:rep(border, str.spaces('start', delim.text), border_hl)
150+
local prefix = str.spaces('start', delim.text)
151+
local suffix = 0
152+
-- space within block after accounting for white space and padding
153+
local width = self.data.body - delim.start_col
154+
local extra = width - prefix - body:width() - suffix - self.data.language ---@type integer
155155
if self.config.position == 'left' then
156-
prefix:rep(border, self.data.language, border_hl)
157-
body:rep(border, width - prefix:width() - body:width(), border_hl)
156+
prefix = prefix + self.data.language
157+
suffix = suffix + extra
158+
elseif self.config.position == 'right' then
159+
prefix = prefix + extra
160+
suffix = suffix + self.data.language
158161
else
159-
body:rep(border, self.data.language, border_hl)
160-
prefix:rep(border, width - prefix:width() - body:width(), border_hl)
162+
prefix = prefix + self.data.language + math.floor(extra / 2)
163+
suffix = suffix + math.ceil(extra / 2)
161164
end
162-
163-
local line = prefix:extend(body)
164165
if self.config.width == 'full' then
165-
line:rep(border, vim.o.columns, border_hl)
166+
suffix = suffix + vim.o.columns
166167
end
168+
169+
local border = border_hl and self.config.language_border or ' '
170+
local line = self:line()
171+
:rep(border, prefix, border_hl)
172+
:extend(body)
173+
:rep(border, suffix, border_hl)
167174
return self.marks:start(self.config, 'code_language', delim, {
168175
virt_text = line:get(),
169176
virt_text_pos = 'overlay',

lua/render-markdown/settings.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ M.code = {}
417417
M.code.position = {
418418
left = 'left',
419419
right = 'right',
420+
center = 'center',
420421
}
421422

422423
---@enum render.md.code.Width
@@ -454,8 +455,9 @@ M.code.default = {
454455
-- Turn on / off language heading related rendering.
455456
language = true,
456457
-- Determines where language icon is rendered.
457-
-- | right | right side of code block |
458-
-- | left | left side of code block |
458+
-- | center | center of code block |
459+
-- | right | right of code block |
460+
-- | left | left of code block |
459461
position = 'left',
460462
-- Whether to include the language icon above code blocks.
461463
language_icon = true,

tests/code_spec.lua

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,40 @@ describe('code', function()
254254
})
255255
end)
256256

257+
it('block center', function()
258+
util.setup.text(lines, {
259+
code = {
260+
width = 'block',
261+
position = 'center',
262+
language_border = '',
263+
},
264+
})
265+
util.assert_screen({
266+
'󱘗 ▁▁▁▁▁▁▁▁▁▁▁▁󱘗 rust▁▁▁▁▁▁▁▁▁▁▁▁',
267+
' fn main() {',
268+
' println!("Hello, World!");',
269+
' }',
270+
'',
271+
' ● List Divider',
272+
'',
273+
'󰌠 ▁▁▁▁▁󰌠 py▁▁▁▁▁',
274+
' print("hello")',
275+
'',
276+
' print("world")',
277+
'',
278+
' Paragraph Divider',
279+
'',
280+
'󰢱 ▁▁▁▁▁▁󰢱 lua▁▁▁▁▁',
281+
" print('hello')",
282+
'',
283+
" print('world')",
284+
'',
285+
' ● List Divider',
286+
'',
287+
" print('Hello, World!')",
288+
})
289+
end)
290+
257291
it('quarto executable', function()
258292
util.setup.text({ '``` {{rust} info', '```' })
259293
util.assert_screen({

tests/util.lua

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,10 @@ end
262262
---@return vim.api.keyset.set_extmark
263263
function M.code.border(border, full, ...)
264264
local parts = { ... }
265-
parts[#parts + 1] = full and vim.o.columns or nil
265+
if full then
266+
assert(type(parts[#parts]) == 'number', 'invalid full border')
267+
parts[#parts] = parts[#parts] + vim.o.columns
268+
end
266269

267270
local line = {} ---@type render.md.mark.Line
268271
for _, part in ipairs(parts) do
@@ -278,17 +281,18 @@ function M.code.border(border, full, ...)
278281
elseif type(part) == 'number' then
279282
line[#line + 1] = { border:rep(part), 'Rm_RmCodeBorder_bg_as_fg' }
280283
else
281-
error(('invalid border part type: %s'):format(type(part)))
284+
error(('invalid border type: %s'):format(type(part)))
282285
end
283286
end
287+
284288
---@type vim.api.keyset.set_extmark
285289
return {
286290
virt_text = line,
287291
virt_text_pos = 'overlay',
288292
}
289293
end
290294

291-
---@alias render.md.test.Language 'python'|'py'|'rust'|'rs'|'lua'
295+
---@alias render.md.test.Language 'lua'|'py'|'python'|'rs'|'rust'
292296

293297
---@class render.md.test.Icon
294298
---@field [1] string
@@ -298,15 +302,15 @@ end
298302
---@param name render.md.test.Language
299303
---@return render.md.test.Icon?
300304
function M.code.icon(name)
301-
if name == 'python' or name == 'py' then
305+
if name == 'lua' then
306+
---@type render.md.test.Icon
307+
return { '󰢱 ', 'MiniIconsAzure' }
308+
elseif name == 'py' or name == 'python' then
302309
---@type render.md.test.Icon
303310
return { '󰌠 ', 'MiniIconsYellow' }
304-
elseif name == 'rust' or name == 'rs' then
311+
elseif name == 'rs' or name == 'rust' then
305312
---@type render.md.test.Icon
306313
return { '󱘗 ', 'MiniIconsOrange' }
307-
elseif name == 'lua' then
308-
---@type render.md.test.Icon
309-
return { '󰢱 ', 'MiniIconsAzure' }
310314
else
311315
return nil
312316
end

0 commit comments

Comments
 (0)