diff --git a/utils/docdump.py b/utils/docdump.py new file mode 100644 index 0000000..11293ac --- /dev/null +++ b/utils/docdump.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +"""Dump .NET XML doc members (with summaries) for a namespace prefix.""" +import sys, re, xml.etree.ElementTree as ET + +XML = ("/Users/rasyidanakbar/Library/Application Support/Steam/steamapps/common/" + "Slay the Spire 2/SlayTheSpire2.app/Contents/Resources/" + "data_sts2_macos_arm64/sts2.xml") + +def clean(el): + if el is None: return "" + txt = "".join(el.itertext()) + return re.sub(r"\s+", " ", txt).strip() + +def main(): + prefix = sys.argv[1] if len(sys.argv) > 1 else "" + show_docs = "--docs" in sys.argv + types_only = "--types" in sys.argv + members_only = "--members" in sys.argv + + tree = ET.parse(XML) + root = tree.getroot() + members = root.find("members") + if members is None: + print("no members"); return + + types, mem = {}, [] + for m in members.findall("member"): + name = m.get("name", "") + body = name[2:] if len(name) > 1 else name + kind = name[0] + if not body.startswith(prefix) and prefix: + continue + if kind == "T": + types[body] = m + elif kind in ("M", "P", "F"): + mem.append((body, m)) + + if not members_only: + for tname in sorted(types): + m = types[tname] + if types_only: + print("T: " + tname) + else: + print("=" * 78) + print("TYPE " + tname) + s = clean(m.find("summary")) + if s: print(" summary: " + s) + for tag in ("remarks", "example"): + v = clean(m.find(tag)) + if v: print(f" {tag}: {v}") + if not types_only: + for body, m in sorted(mem): + s = clean(m.find("summary")) + params = [(p.get("name"), clean(p)) for p in m.findall("param")] + ret = clean(m.find("returns")) + print("-" * 78) + print(body) + if s: print(" " + s) + for pn, pd in params: + print(f" param {pn}: {pd}") + if ret: print(" returns: " + ret) + +main()