lazy.nvim/lua/lazy/docs.lua

142 lines
3.9 KiB
Lua
Raw Normal View History

local Util = require("lazy.util")
local M = {}
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
2022-12-15 15:46:25 +08:00
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")
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 + 1)
end
return table.concat(lines, "\n")
end
---@param contents table<string, string>
function M.save(contents)
local readme = Util.read_file("README.md")
2022-12-17 16:59:29 +08:00
-- contents.toc = M.toc(readme)
for tag, content in pairs(contents) do
content = M.fix_indent(content)
content = content:gsub("%%", "%%%%")
content = vim.trim(content)
2022-12-15 15:46:25 +08:00
local pattern = "(<%!%-%- " .. tag .. ":start %-%->).*(<%!%-%- " .. tag .. ":end %-%->)"
if not readme:find(pattern) then
error("tag " .. tag .. " not found")
end
2022-12-18 18:42:54 +08:00
if tag == "toc" or tag == "commands" then
2022-12-15 15:46:25 +08:00
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
Util.write_file("README.md", readme)
end
---@return string
function M.extract(file, pattern)
local init = Util.read_file(file)
return assert(init:match(pattern))
end
2022-12-18 18:42:54 +08:00
function M.commands()
local commands = require("lazy.view.commands").commands
---@type table<string,{desc:string, plugin:boolean, opts:boolean}>
local modes = {}
for _, mode in ipairs(require("lazy.view").modes) do
modes[mode.name] = modes[mode.name] or {}
modes[mode.name].plugin = modes[mode.name].plugin or mode.plugin
if not modes[mode.name].desc or not mode.plugin then
modes[mode.name].desc = mode.desc
end
end
modes.load.opts = true
2022-12-18 18:42:54 +08:00
local lines = {
{ "Command", "Lua", "Description" },
2022-12-18 18:42:54 +08:00
{ "---", "---", "---", "---" },
}
Util.foreach(modes, function(name, mode)
if commands[name] then
if mode.opts then
lines[#lines + 1] = {
("`:Lazy %s {plugins}`"):format(name),
([[`require("lazy").%s(opts)`]]):format(name),
mode.desc,
}
elseif mode.plugin then
lines[#lines + 1] = {
("`:Lazy %s [plugins]`"):format(name),
([[`require("lazy").%s(opts?)`]]):format(name),
mode.desc,
}
else
lines[#lines + 1] = {
("`:Lazy %s`"):format(name),
([[`require("lazy").%s()`]]):format(name),
mode.desc,
}
end
2022-12-18 18:42:54 +08:00
end
end)
2022-12-18 18:42:54 +08:00
local ret = {}
for _, line in ipairs(lines) do
ret[#ret + 1] = "| " .. table.concat(line, " | ") .. " |"
end
return table.concat(ret, "\n")
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 = Util.read_file("lua/lazy/example.lua"),
2022-12-18 18:42:54 +08:00
commands = M.commands(),
})
vim.cmd.checktime()
end
M.update()
return M