diff --git a/docs/build-manual.py b/docs/build-manual.py index 979df64..bf4dfc2 100644 --- a/docs/build-manual.py +++ b/docs/build-manual.py @@ -314,6 +314,26 @@ def _as_ruled_table(para: list[str]) -> str | None: return "\n".join(out) +TREE_ROOT_RE = re.compile(r"^[~$][\w./{}-]*/$") +TREE_BRANCH_RE = re.compile(r"^[├└]──\s*(\S+)\s*(.*)$") + + +def _as_file_tree(para: list[str]) -> str | None: + """Render a hand-drawn box-drawing tree as a Starlight , else None.""" + if len(para) < 2 or not TREE_ROOT_RE.match(para[0].strip()): + return None + branches = [] + for line in para[1:]: + m = TREE_BRANCH_RE.match(line) + if not m: + return None + branches.append(m.groups()) + out = ["", f"- {para[0].strip()}"] + out += [f" - {name} {desc}".rstrip() for name, desc in branches] + out.append("") + return "\n".join(out) + + def _render_para(para: list[str], entry_name: str | None, deeper: bool) -> str: """Render one paragraph of a former indented block. @@ -335,7 +355,7 @@ def _render_para(para: list[str], entry_name: str | None, deeper: bool) -> str: title, body = m.group(1), para[1:] info = f'fish title="{title}"' if title else "fish" return f"```{info}\n" + "\n".join(body) + "\n```" - table = _as_ruled_table(para) or _as_table(para) + table = _as_ruled_table(para) or _as_table(para) or _as_file_tree(para) if table is not None: return table return "\n".join(INDENT + line for line in para) @@ -385,20 +405,54 @@ def _prettify_block(block: list[str], entry_name: str | None) -> str: return "\n\n".join(chunk for chunk in out if chunk.strip()) +ASIDE_LABELS: dict[str, tuple[str, str, str | None]] = { + "NOTE": ("note", "Note", None), + "IMPORTANT": ("note", "Important", "star"), + "TIP": ("tip", "Tip", None), + "HINT": ("tip", "Hint", "question-circle"), + "WARNING": ("caution", "Warning", "warning"), + "CAUTION": ("caution", "Caution", None), + "DANGER": ("danger", "Danger", None), +} +ASIDE_RE = re.compile(rf"^({'|'.join(ASIDE_LABELS)}):\s*(.*)$") + + +def _as_aside(para: list[str]) -> str | None: + """Render a `LABEL: ...` flat paragraph as a Starlight