Files

89 lines
3.0 KiB
Python

import os
import re
PROJECT_ROOT = r'd:\\Programme\\Steam\\steamapps\\common\\The Binding of Isaac Rebirth\\mods\\External-Item-Descriptions'
OUTPUT_MD = 'EID_Function_Documentation.md'
eid_func_pattern = re.compile(r'^\s*function\s+EID:([a-zA-Z0-9_]+)\s*\(')
comment_pattern = re.compile(r'^\s*--[-]*\s?(.*)')
def find_lua_files(root):
for dirpath, _, filenames in os.walk(root):
for fname in filenames:
if fname.endswith('.lua'):
yield os.path.join(dirpath, fname)
def format_docstring(doc):
"""Format the docstring to be Markdown compatible."""
doc = doc.strip()
if '@' in doc:
words = doc.split()
if len(words) >= 2:
words[0] = f'*{words[0]}*\t'
words[1] = f'__{words[1]}__\t'
doc = ' '.join(words)
return doc
def extract_functions_with_docs(lua_path):
with open(lua_path, encoding='utf-8') as f:
lines = f.readlines()
docs = []
undocumented = []
i = 0
while i < len(lines):
match = eid_func_pattern.match(lines[i])
if match:
func_name = lines[i].split("function")[1].split("--")[0].strip()
# Look for comment block above
doc_lines = []
j = i - 1
while j >= 0:
comment_match = comment_pattern.match(lines[j])
if lines[j].strip() == '':
break
elif comment_match and "@diagnostic" not in comment_match.group(1):
doc_lines.insert(0, format_docstring(comment_match.group(1)))
j -= 1
else:
break
doc = '\n'.join(doc_lines).strip()
if doc:
docs.append({
'name': func_name,
'doc': doc,
'file': lua_path
})
else:
undocumented.append({
'name': func_name,
'file': lua_path
})
i += 1
return docs, undocumented
def main():
all_docs = []
all_undocumented = []
for lua_file in find_lua_files(PROJECT_ROOT):
docs, undocumented = extract_functions_with_docs(lua_file)
all_docs.extend(docs)
all_undocumented.extend(undocumented)
with open(OUTPUT_MD, 'w', encoding='utf-8') as md:
md.write('# EID Function Documentation\n\n')
md.write('## Documented Functions\n\n')
all_docs.sort(key=lambda x: x['name'])
for entry in all_docs:
md.write(f'### `{entry["name"]}`\n')
md.write(f'*Defined in*: `{os.path.relpath(entry["file"], PROJECT_ROOT)}`\n\n')
md.write(f'{entry["doc"]}\n\n---\n\n')
md.write(f'\n## Undocumented Functions ({len(all_undocumented)})\n\n')
all_undocumented.sort(key=lambda x: x['name'])
for entry in all_undocumented:
md.write(f'- `{entry["name"]}` (in `{os.path.relpath(entry["file"], PROJECT_ROOT)}`)\n')
if __name__ == '__main__':
main()