(renderer) add h.<Highlight>(..) shorthand
All checks were successful
NeoVim tests / plenary-tests (push) Successful in 10s
All checks were successful
NeoVim tests / plenary-tests (push) Successful in 10s
This commit is contained in:
parent
f8056fe2e6
commit
7ad3d941f4
@ -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
|
||||||
|
@ -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
|
return {
|
||||||
function M.h(name, attributes, children)
|
kind = 'tag',
|
||||||
return {
|
name = name,
|
||||||
kind = 'tag',
|
attributes = attributes or {},
|
||||||
name = name,
|
children = children,
|
||||||
attributes = attributes or {},
|
}
|
||||||
children = children,
|
end,
|
||||||
}
|
__index = function(_, name)
|
||||||
end
|
-- 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
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user