""" Vala's generated gir does not contain comments, so we use valadoc to generate them. However, they are formatted for valadoc and not gi-docgen so we need to fix it. """ import xml.etree.ElementTree as ET import html import sys import subprocess import re import os # valac fails on gi-docgen compliant markdown # gi-docgen removes valac compliant ulink # so we use vala notation and turn it into markdown def ulink_to_markdown(text: str): pattern = r'(.*?)' return re.sub(pattern, r"[\2](\1)", text) def fix_gir(name: str, gir: str, out: str): namespaces = { "": "http://www.gtk.org/introspection/core/1.0", "c": "http://www.gtk.org/introspection/c/1.0", "glib": "http://www.gtk.org/introspection/glib/1.0", } for prefix, uri in namespaces.items(): ET.register_namespace(prefix, uri) tree = ET.parse(gir) root = tree.getroot() for doc in root.findall(".//doc", namespaces): if doc.text: doc.text = ulink_to_markdown( html.unescape(doc.text).replace("", "").replace("", "") ) if (inc := root.find("c:include", namespaces)) is not None: inc.set("name", f"{name}.h") else: print("no c:include tag found", file=sys.stderr) exit(1) tree.write(out, encoding="utf-8", xml_declaration=True) def valadoc(name: str, gir: str, args: list[str]): cmd = [os.getenv("VALADOC", "valadoc"), "-o", "docs", "--package-name", name, "--gir", gir, *args] try: subprocess.run(cmd, check=True, text=True, capture_output=True) except subprocess.CalledProcessError as e: print(e.stderr, file=sys.stderr) exit(1) if __name__ == "__main__": name = sys.argv[1] in_out = sys.argv[2].split(":") args = sys.argv[3:] gir = in_out[0] out = in_out[1] if len(in_out) > 1 else gir valadoc(name, gir, args) fix_gir(name, gir, out)