From f4720ee9f745c0b77366f1e5e6ea7fc7bfaf8010 Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 15 Dec 2022 08:46:25 +0100 Subject: [PATCH] feat(docs): added toc generator --- lua/lazy/docs.lua | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua index 1d20f69a..78ad63b3 100644 --- a/lua/lazy/docs.lua +++ b/lua/lazy/docs.lua @@ -15,6 +15,26 @@ function M.indent(str, indent) return table.concat(lines, "\n") end +function M.toc(md) + local toc = {} + local lines = vim.split(md, "\n") + local toc_found = false + for _, line in ipairs(lines) do + local hash, title = line:match("^(#+)%s*(.*)") + if hash then + if toc_found then + local anchor = string.gsub(title:lower(), "[^\32-\126]", "") + anchor = string.gsub(anchor, " ", "-") + toc[#toc + 1] = string.rep(" ", #hash - 1) .. "- [" .. title .. "](#" .. anchor .. ")" + end + if title:find("Table of Contents") then + toc_found = true + end + end + end + return M.fix_indent(table.concat(toc, "\n")) +end + ---@param str string function M.fix_indent(str) local lines = vim.split(str, "\n") @@ -33,15 +53,20 @@ end ---@param contents table function M.save(contents) local readme = M.read("README.md") + contents.toc = M.toc(readme) for tag, content in pairs(contents) do content = M.fix_indent(content) content = content:gsub("%%", "%%%%") content = vim.trim(content) - local pattern = "(<%!%-%- " .. tag .. "_start %-%->).*(<%!%-%- " .. tag .. "_end %-%->)" + local pattern = "(<%!%-%- " .. tag .. ":start %-%->).*(<%!%-%- " .. tag .. ":end %-%->)" if not readme:find(pattern) then error("tag " .. tag .. " not found") end - readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") + if tag == "toc" then + readme = readme:gsub(pattern, "%1\n\n" .. content .. "\n\n%2") + else + readme = readme:gsub(pattern, "%1\n\n```lua\n" .. content .. "\n```\n\n%2") + end end local fd = assert(io.open("README.md", "w+"))