diff --git a/lua/lazy/docs.lua b/lua/lazy/docs.lua new file mode 100644 index 0000000..1d20f69 --- /dev/null +++ b/lua/lazy/docs.lua @@ -0,0 +1,76 @@ +local M = {} + +function M.read(file) + local fd = assert(io.open(file, "r")) + local data = fd:read("*a") ---@type string + fd:close() + return data +end + +function M.indent(str, indent) + local lines = vim.split(str, "\n") + for l, line in ipairs(lines) do + lines[l] = (" "):rep(indent) .. line + end + return table.concat(lines, "\n") +end + +---@param str string +function M.fix_indent(str) + local lines = vim.split(str, "\n") + + local width = 120 + for _, line in ipairs(lines) do + width = math.min(width, #line:match("^%s*")) + end + + for l, line in ipairs(lines) do + lines[l] = line:sub(width) + end + return table.concat(lines, "\n") +end + +---@param contents table +function M.save(contents) + local readme = M.read("README.md") + 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 %-%->)" + 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") + end + + local fd = assert(io.open("README.md", "w+")) + fd:write(readme) + fd:close() +end + +---@return string +function M.extract(file, pattern) + local init = M.read(file) + return assert(init:match(pattern)) +end + +function M.update() + local cache_config = M.extract("lua/lazy/core/cache.lua", "\nM%.config = ({.-\n})") + local config = M.extract("lua/lazy/core/config.lua", "\nM%.defaults = ({.-\n})") + config = config:gsub( + "\n%s*%-%-%-@type LazyCacheConfig.*cache = nil,", + "\n" .. M.indent("cache = " .. cache_config .. ",", 4) + ) + config = config:gsub("%s*debug = false.\n", "\n") + M.save({ + bootstrap = M.extract("lua/lazy/init.lua", "function M%.bootstrap%(%)\n(.-)\nend"), + config = config, + spec = M.read("lua/lazy/example.lua"), + }) + vim.cmd.checktime() +end + +M.update() + +return M