From 7f9370a8e704dc9fda25681b2077c20fe2a3fa5f Mon Sep 17 00:00:00 2001 From: Steven Arcangeli Date: Mon, 28 Aug 2023 07:33:57 -0700 Subject: doc: move doc scripts around and eliminate submodule --- scripts/generate.py | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++ scripts/main.py | 31 ++++++++++++ 2 files changed, 165 insertions(+) create mode 100755 scripts/generate.py create mode 100755 scripts/main.py (limited to 'scripts') diff --git a/scripts/generate.py b/scripts/generate.py new file mode 100755 index 0000000..f317534 --- /dev/null +++ b/scripts/generate.py @@ -0,0 +1,134 @@ +import os +import os.path +import re +from dataclasses import dataclass +from functools import lru_cache +from typing import Dict, List + +from nvim_doc_tools import (Vimdoc, VimdocSection, generate_md_toc, indent, + parse_functions, read_nvim_json, render_md_api, + render_vimdoc_api, replace_section, wrap) + +HERE = os.path.dirname(__file__) +ROOT = os.path.abspath(os.path.join(HERE, os.path.pardir)) +README = os.path.join(ROOT, "README.md") +DOC = os.path.join(ROOT, "doc") +VIMDOC = os.path.join(DOC, "conform.txt") +OPTIONS = os.path.join(ROOT, "tests", "options_doc.lua") + + +@dataclass +class Formatter: + name: str + description: str + url: str + + +@lru_cache +def get_all_formatters() -> List[Formatter]: + names = sorted( + [ + os.path.splitext(file)[0] + for file in os.listdir(os.path.join(ROOT, "lua", "conform", "formatters")) + ] + ) + formatters = [] + for name in names: + meta = read_nvim_json(f'require("conform.formatters.{name}").meta') + formatters.append(Formatter(name, **meta)) + return formatters + + +def update_formatter_list(): + formatter_lines = ["\n"] + for formatter in get_all_formatters(): + formatter_lines.append( + f"- [{formatter.name}]({formatter.url}) - {formatter.description}\n" + ) + replace_section( + README, + r"^$", + r"^$", + formatter_lines, + ) + + +def update_options(): + option_lines = ["\n", "```lua\n"] + with open(OPTIONS, "r", encoding="utf-8") as f: + option_lines.extend(f.readlines()) + option_lines.extend(["```\n", "\n"]) + replace_section( + README, + r"^$", + r"^$", + option_lines, + ) + + +def add_md_link_path(path: str, lines: List[str]) -> List[str]: + ret = [] + for line in lines: + ret.append(re.sub(r"(\(#)", "(" + path + "#", line)) + return ret + + +def update_md_api(): + funcs = parse_functions(os.path.join(ROOT, "lua", "conform", "init.lua")) + lines = ["\n"] + render_md_api(funcs, 3)[:-1] # trim last newline + replace_section( + README, + r"^$", + r"^$", + lines, + ) + + +def update_readme_toc(): + toc = ["\n"] + generate_md_toc(README) + ["\n"] + replace_section( + README, + r"^$", + r"^$", + toc, + ) + + +def gen_options_vimdoc() -> VimdocSection: + section = VimdocSection("Options", "conform-options", ["\n", ">lua\n"]) + with open(OPTIONS, "r", encoding="utf-8") as f: + section.body.extend(indent(f.readlines(), 4)) + section.body.append("<\n") + return section + + +def gen_formatter_vimdoc() -> VimdocSection: + section = VimdocSection("Formatters", "conform-formatters", ["\n"]) + for formatter in get_all_formatters(): + line = f"`{formatter.name}` - {formatter.description}\n" + section.body.extend(wrap(line, sub_indent=len(formatter.name) + 3)) + return section + + +def generate_vimdoc(): + doc = Vimdoc("conform.txt", "conform") + funcs = parse_functions(os.path.join(ROOT, "lua", "conform", "init.lua")) + doc.sections.extend( + [ + gen_options_vimdoc(), + VimdocSection("API", "conform-api", render_vimdoc_api("conform", funcs)), + gen_formatter_vimdoc(), + ] + ) + + with open(VIMDOC, "w", encoding="utf-8") as ofile: + ofile.writelines(doc.render()) + + +def main() -> None: + """Update the README""" + update_formatter_list() + update_options() + update_md_api() + update_readme_toc() + generate_vimdoc() diff --git a/scripts/main.py b/scripts/main.py new file mode 100755 index 0000000..4dffddf --- /dev/null +++ b/scripts/main.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +import argparse +import os +import sys + +HERE = os.path.dirname(__file__) +ROOT = os.path.abspath(os.path.join(HERE, os.path.pardir)) +DOC = os.path.join(ROOT, "doc") + + +def main() -> None: + """Generate docs""" + sys.path.append(HERE) + parser = argparse.ArgumentParser(description=main.__doc__) + parser.add_argument("command", choices=["generate", "lint"]) + args = parser.parse_args() + if args.command == "generate": + import generate + + generate.main() + elif args.command == "lint": + from nvim_doc_tools import lint_md_links + + files = [os.path.join(ROOT, "README.md")] + [ + os.path.join(DOC, file) for file in os.listdir(DOC) if file.endswith(".md") + ] + lint_md_links.main(ROOT, files) + + +if __name__ == "__main__": + main() -- cgit v1.2.3-70-g09d2