mirror of
https://github.com/nix-community/nixvim.git
synced 2026-08-24 02:34:15 -05:00
Replace the generated bash+jq rendering pipeline with a Python implementation. This avoids repeatedly parsing large JSON blobs during page rendering and significantly reduces documentation build time.
98 lines
2.4 KiB
Python
98 lines
2.4 KiB
Python
import json
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
# TODO: add a Page class (with target and sections fields)
|
|
|
|
# TODO: add a Section class (with id, type, and value fields)
|
|
# -- or better yet, have sub-classes for each section type
|
|
|
|
|
|
def render_functions(file, loc, function_locations):
|
|
category = ".".join(loc)
|
|
|
|
markdown = subprocess.check_output(
|
|
[
|
|
"nixdoc",
|
|
"--file",
|
|
file,
|
|
"--locs",
|
|
function_locations,
|
|
"--category",
|
|
category,
|
|
"--description",
|
|
"REMOVED LATER",
|
|
"--prefix",
|
|
"lib",
|
|
"--anchor-prefix",
|
|
"",
|
|
],
|
|
stderr=sys.stderr,
|
|
text=True,
|
|
)
|
|
|
|
# Drop first two lines (description)
|
|
return "".join(markdown.splitlines(keepends=True)[2:])
|
|
|
|
|
|
def render_page(page, function_locations):
|
|
output = []
|
|
|
|
for section in page["sections"]:
|
|
id = section["id"]
|
|
kind = section["type"]
|
|
value = section.get("value")
|
|
print(f"Section {id} ({kind})", file=sys.stderr)
|
|
|
|
match kind:
|
|
case "file":
|
|
output.append(Path(value).read_text())
|
|
|
|
case "text":
|
|
output.append(value)
|
|
|
|
case "functions":
|
|
output.append(
|
|
render_functions(
|
|
file=Path(value["file"]),
|
|
loc=value["loc"],
|
|
function_locations=function_locations,
|
|
)
|
|
)
|
|
|
|
case _:
|
|
raise RuntimeError(f"Unsupported section type {kind}")
|
|
|
|
return "\n\n".join(output)
|
|
|
|
|
|
def main():
|
|
with open(os.environ["NIX_ATTRS_JSON_FILE"]) as f:
|
|
attrs = json.load(f)
|
|
|
|
out_dir = Path(os.environ["out"])
|
|
out_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
with tempfile.NamedTemporaryFile(
|
|
mode="w", suffix=".json", delete_on_close=False
|
|
) as f:
|
|
json.dump(attrs["functionLocations"], f, indent=2)
|
|
f.close()
|
|
function_locations = Path(f.name)
|
|
|
|
for page in attrs["pageModel"].values():
|
|
markdown = render_page(
|
|
page,
|
|
function_locations=function_locations,
|
|
)
|
|
target = out_dir / page["target"]
|
|
target.parent.mkdir(parents=True, exist_ok=True)
|
|
target.write_text(markdown)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|