diff --git a/docgen/docgen.lua b/docgen/docgen.lua index db2880762..536e9a1d3 100644 --- a/docgen/docgen.lua +++ b/docgen/docgen.lua @@ -161,12 +161,14 @@ end ---@param callback function ---@param parents string[]? #Used internally to track nesting levels docgen.map_config = function(buffer, start_node, callback, parents) + parents = parents or {} + local comments = {} local query = vim.treesitter.parse_query( "lua", [[ - ((comment)+ @comment + ((comment)* @comment . (field) @field) ]] @@ -177,25 +179,35 @@ docgen.map_config = function(buffer, start_node, callback, parents) if capture == "comment" then table.insert(comments, ts.get_node_text(node, buffer)) - elseif capture == "field" and node:parent():id() == start_node:id() then - local name = ts.get_node_text(node:named_child(0), buffer) - local value = node:named_child(1) + elseif capture == "field" then + local name_node = node:field("name")[1] + local name = name_node and ts.get_node_text(name_node, buffer) or nil + local value = node:field("value")[1] + + -- TODO: REVISIST + if node:parent():id() ~= start_node:id() then + return + end if value:type() == "table_constructor" then callback({ node = node, name = name, value = value, - parent = parents or {}, + parents = parents, }, comments) - docgen.map_config(buffer, node, callback) + if name then + local copy = vim.deepcopy(parents) + table.insert(copy, name) + docgen.map_config(buffer, value, callback, copy) + end else callback({ node = node, name = name, value = value, - parents = parents or {}, + parents = parents, }, comments) end @@ -448,25 +460,28 @@ end ---@alias ConfigOptionData { node: userdata, name: string, value: userdata, parents: string[] } --- Converts a lua object to a html node in the resulting HTML document +---@param buffer number ---@param data ConfigOptionData #The data as returned by `map_config` ---@param comments string[] #The comments attached to the object ---@param object any #The lua object to render -docgen.render = function(data, comments, object) +docgen.render = function(buffer, data, comments, object) local basis = { "
", "", - table.concat({ "", data.parents[#data.parents] or data.name, "" }), + table.concat({ "", data.name, "" }), "", "
", + "", } vim.list_extend(basis, comments) vim.list_extend(basis, { + "", "
", "", - table.concat({ "Default Value:", type(object) == "number" and table.concat({ " `", tostring(object), "1" }) or nil }), + table.concat({ "Default Value:", (type(object) == "number" or type(object) == "nil") and table.concat({ " `", tostring(object), "1" }) or nil }), }) - vim.list_extend(basis, docgen.htmlify(data,object)) + vim.list_extend(basis, docgen.htmlify(buffer, data, object)) vim.list_extend(basis, { "", "
", @@ -476,12 +491,42 @@ docgen.render = function(data, comments, object) end --- Converts a lua object into HTML +---@param buffer number ---@param data ConfigOptionData ---@param object any -docgen.htmlify = function(data, object) +docgen.htmlify = function(buffer, data, object) local result = {} + local code_block = true + + neorg.lib.match(type(object)) { + string = function() + table.insert(result, table.concat({ '"', object, '"' })) + end, + table = function() + result = { + "", + "
", + "", + "table (click to expand)", + "", + "
", + "", + } + + code_block = false + end, + ["function"] = {}, + _ = function() + table.insert(result, ts.get_node_text(data.value, buffer)) + end, + } + + if code_block then + table.insert(result, 1, "```lua") + table.insert(result, "```") + end - -- TODO: Continue + return result end return docgen