diff --git a/lua/u/buffer.lua b/lua/u/buffer.lua index e70306a..41cb645 100644 --- a/lua/u/buffer.lua +++ b/lua/u/buffer.lua @@ -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 diff --git a/lua/u/renderer.lua b/lua/u/renderer.lua index 17a90b6..cd11bc2 100644 --- a/lua/u/renderer.lua +++ b/lua/u/renderer.lua @@ -1,10 +1,25 @@ local utils = require 'u.utils' +local M = {} + --- @alias Tag { kind: 'tag'; name: string, attributes: table, children: Tree } --- @alias Node nil | boolean | string | Tag --- @alias Tree Node | Node[] local TagMetaTable = {} +--- @param name string +--- @param attributes? table +--- @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, children: Node | Node[]): Node ---- @param name string ---- @param attributes? table ---- @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 +--- @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