add TagWriter
All checks were successful
NeoVim tests / plenary-tests (push) Successful in 49s

This commit is contained in:
Jonathan Apodaca 2025-02-27 22:49:32 -07:00
parent 9484f01258
commit f6c78adbcf
2 changed files with 62 additions and 16 deletions

View File

@ -1,5 +1,5 @@
local Range = require 'u.range'
local Renderer = require 'u.renderer'
local Renderer = require 'u.renderer'.Renderer
---@class Buffer
---@field buf number

View File

@ -1,10 +1,25 @@
local utils = require 'u.utils'
local M = {}
--- @alias Tag { kind: 'tag'; name: string, attributes: table<string, unknown>, children: Tree }
--- @alias Node nil | boolean | string | Tag
--- @alias Tree Node | Node[]
local TagMetaTable = {}
--- @param name string
--- @param attributes? table<string, any>
--- @param children? Node | Node[]
--- @return Tag
function M.h(name, attributes, children)
return setmetatable({
kind = 'tag',
name = name,
attributes = attributes or {},
children = children,
}, TagMetaTable)
end
--------------------------------------------------------------------------------
-- Renderer class
--------------------------------------------------------------------------------
@ -18,20 +33,7 @@ local TagMetaTable = {}
--- @field curr { lines: string[]; extmarks: RendererExtmark[] }
local Renderer = {}
Renderer.__index = Renderer
--- function h(name: string, attributes: table<string, unknown>, children: Node | Node[]): Node
--- @param name string
--- @param attributes? table<string, any>
--- @param children? Node | Node[]
--- @return Tag
function Renderer.h(name, attributes, children)
return setmetatable({
kind = 'tag',
name = name,
attributes = attributes or {},
children = children,
}, TagMetaTable)
end
M.Renderer = Renderer
--- @param x any
--- @return boolean
@ -383,4 +385,48 @@ function Renderer:get_pos_infos(pos0)
return matching_tags
end
return Renderer
--------------------------------------------------------------------------------
-- TagWriter class
--------------------------------------------------------------------------------
--- @class TagWriter
--- @field private nodes Node[]
local TagWriter = {}
TagWriter.__index = TagWriter
M.TagWriter = TagWriter
function TagWriter.new()
local self = setmetatable({ nodes = {} }, TagWriter)
return self
end
--- @param nodes Tree
--- @return TagWriter
function TagWriter:put(nodes)
table.insert(self.nodes, nodes)
return self
end
--- @param name string
--- @param attributes? table<string, any>
--- @param children? Node | Node[]
--- @return TagWriter
function TagWriter:put_h(name, attributes, children)
local tag = M.h(name, attributes, children)
table.insert(self.nodes, tag)
return self
end
--- @param fn fun(TagWriter): any
--- @return TagWriter
function TagWriter:nest(fn)
local nested_writer = TagWriter.new()
fn(nested_writer)
table.insert(self.nodes, nested_writer.nodes)
return self
end
--- @return Tree
function TagWriter:tree() return self.nodes end
return M