(renderer) add h.<Highlight>(..) shorthand
All checks were successful
NeoVim tests / plenary-tests (push) Successful in 10s

This commit is contained in:
Jonathan Apodaca 2025-04-20 22:27:58 -06:00
parent f8056fe2e6
commit 7ad3d941f4
2 changed files with 33 additions and 28 deletions

View File

@ -75,7 +75,7 @@ function Buffer:autocmd(event, opts)
vim.api.nvim_create_autocmd(event, vim.tbl_extend('force', opts, { buffer = self.bufnr })) vim.api.nvim_create_autocmd(event, vim.tbl_extend('force', opts, { buffer = self.bufnr }))
end end
--- @param tree Tree --- @param tree u.renderer.Tree
function Buffer:render(tree) return self.renderer:render(tree) end function Buffer:render(tree) return self.renderer:render(tree) end
return Buffer return Buffer

View File

@ -1,22 +1,27 @@
local M = {} local M = {}
local H = {} local H = {}
--- @alias Tag { kind: 'tag'; name: string, attributes: table<string, unknown>, children: Tree } --- @alias u.renderer.Tag { kind: 'tag'; name: string, attributes: table<string, unknown>, children: u.renderer.Tree }
--- @alias Node nil | boolean | string | Tag --- @alias u.renderer.Node nil | boolean | string | u.renderer.Tag
--- @alias Tree Node | Node[] --- @alias u.renderer.Tree u.renderer.Node | u.renderer.Node[]
--- @param name string --- @type table<string, fun(attributes: table<string, any>, children: u.renderer.Tree): u.renderer.Tag> & fun(name: string, attributes: table<string, any>, children: u.renderer.Tree): u.renderer.Tag>
--- @param attributes? table<string, any> M.h = setmetatable({}, {
--- @param children? Node | Node[] __call = function(_, name, attributes, children)
--- @return Tag
function M.h(name, attributes, children)
return { return {
kind = 'tag', kind = 'tag',
name = name, name = name,
attributes = attributes or {}, attributes = attributes or {},
children = children, children = children,
} }
end end,
__index = function(_, name)
-- vim.print('dynamic hl ' .. name)
return function(attributes, children)
return M.h('text', vim.tbl_deep_extend('force', { hl = name }, attributes), children)
end
end,
})
-- Renderer {{{ -- Renderer {{{
--- @alias RendererExtmark { id?: number; start: [number, number]; stop: [number, number]; opts: any; tag: any } --- @alias RendererExtmark { id?: number; start: [number, number]; stop: [number, number]; opts: any; tag: any }
@ -62,8 +67,8 @@ function Renderer.new(bufnr) -- {{{
end -- }}} end -- }}}
--- @param opts { --- @param opts {
--- tree: Tree; --- tree: u.renderer.Tree;
--- on_tag?: fun(tag: Tag, start0: [number, number], stop0: [number, number]): any; --- on_tag?: fun(tag: u.renderer.Tag, start0: [number, number], stop0: [number, number]): any;
--- } --- }
function Renderer.markup_to_lines(opts) -- {{{ function Renderer.markup_to_lines(opts) -- {{{
--- @type string[] --- @type string[]
@ -82,7 +87,7 @@ function Renderer.markup_to_lines(opts) -- {{{
curr_col1 = 1 curr_col1 = 1
end end
--- @param node Node --- @param node u.renderer.Node
local function visit(node) -- {{{ local function visit(node) -- {{{
if node == nil or type(node) == 'boolean' then return end if node == nil or type(node) == 'boolean' then return end
@ -98,7 +103,7 @@ function Renderer.markup_to_lines(opts) -- {{{
-- visit the children: -- visit the children:
if Renderer.is_tag_arr(node.children) then if Renderer.is_tag_arr(node.children) then
for _, child in for _, child in
ipairs(node.children --[[@as Node[] ]]) ipairs(node.children --[[@as u.renderer.Node[] ]])
do do
-- newlines are not controlled by array entries, do NOT output a line here: -- newlines are not controlled by array entries, do NOT output a line here:
visit(child) visit(child)
@ -123,11 +128,11 @@ end -- }}}
--- @param opts { --- @param opts {
--- tree: string; --- tree: string;
--- format_tag?: fun(tag: Tag): string; --- format_tag?: fun(tag: u.renderer.Tag): string;
--- } --- }
function Renderer.markup_to_string(opts) return table.concat(Renderer.markup_to_lines(opts), '\n') end function Renderer.markup_to_string(opts) return table.concat(Renderer.markup_to_lines(opts), '\n') end
--- @param tree Tree --- @param tree u.renderer.Tree
function Renderer:render(tree) -- {{{ function Renderer:render(tree) -- {{{
local changedtick = vim.b[self.bufnr].changedtick local changedtick = vim.b[self.bufnr].changedtick
if changedtick ~= self.changedtick then if changedtick ~= self.changedtick then
@ -302,7 +307,7 @@ end -- }}}
--- ---
--- @private (private for now) --- @private (private for now)
--- @param pos0 [number; number] --- @param pos0 [number; number]
--- @return { extmark: RendererExtmark; tag: Tag; }[] --- @return { extmark: RendererExtmark; tag: u.renderer.Tag; }[]
function Renderer:get_pos_infos(pos0) -- {{{ function Renderer:get_pos_infos(pos0) -- {{{
local cursor_line0, cursor_col0 = pos0[1], pos0[2] local cursor_line0, cursor_col0 = pos0[1], pos0[2]
@ -370,7 +375,7 @@ function Renderer:get_pos_infos(pos0) -- {{{
-- created extmarks in self.curr.extmarks, which also has which tag each -- created extmarks in self.curr.extmarks, which also has which tag each
-- extmark is associated with. Cross-reference with that list to get a list -- extmark is associated with. Cross-reference with that list to get a list
-- of tags that we need to fire events for: -- of tags that we need to fire events for:
--- @type { extmark: RendererExtmark; tag: Tag }[] --- @type { extmark: RendererExtmark; tag: u.renderer.Tag }[]
local matching_tags = vim local matching_tags = vim
.iter(intersecting_extmarks) .iter(intersecting_extmarks)
--- @param ext RendererExtmark --- @param ext RendererExtmark
@ -387,7 +392,7 @@ end -- }}}
-- TreeBuilder {{{ -- TreeBuilder {{{
--- @class u.TreeBuilder --- @class u.TreeBuilder
--- @field private nodes Node[] --- @field private nodes u.renderer.Node[]
local TreeBuilder = {} local TreeBuilder = {}
TreeBuilder.__index = TreeBuilder TreeBuilder.__index = TreeBuilder
M.TreeBuilder = TreeBuilder M.TreeBuilder = TreeBuilder
@ -397,7 +402,7 @@ function TreeBuilder.new()
return self return self
end end
--- @param nodes Tree --- @param nodes u.renderer.Tree
--- @return u.TreeBuilder --- @return u.TreeBuilder
function TreeBuilder:put(nodes) function TreeBuilder:put(nodes)
table.insert(self.nodes, nodes) table.insert(self.nodes, nodes)
@ -406,7 +411,7 @@ end
--- @param name string --- @param name string
--- @param attributes? table<string, any> --- @param attributes? table<string, any>
--- @param children? Node | Node[] --- @param children? u.renderer.Node | u.renderer.Node[]
--- @return u.TreeBuilder --- @return u.TreeBuilder
function TreeBuilder:put_h(name, attributes, children) function TreeBuilder:put_h(name, attributes, children)
local tag = M.h(name, attributes, children) local tag = M.h(name, attributes, children)
@ -423,7 +428,7 @@ function TreeBuilder:nest(fn)
return self return self
end end
--- @return Tree --- @return u.renderer.Tree
function TreeBuilder:tree() return self.nodes end function TreeBuilder:tree() return self.nodes end
-- }}} -- }}}