mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
135 lines
3.4 KiB
Python
135 lines
3.4 KiB
Python
#!/usr/bin/env python3
|
|||
|
|
# coding: utf-8
|
||
|
|
|
||
|
|
import sys, os
|
||
|
|
import ruamel.yaml
|
||
|
|
yaml = ruamel.yaml.YAML(typ="rt")
|
||
|
|
yaml.width = 4096
|
||
|
|
yaml.indent(mapping=2, sequence=4, offset=2)
|
||
|
|
|
||
|
|
functions_yaml = sys.argv[1]
|
||
|
|
hooks_yaml = sys.argv[2]
|
||
|
|
md_dir = sys.argv[3]
|
||
|
|
|
||
|
|
# template for functions pages
|
||
|
|
function_header_template = '''---
|
||
|
|
layout: page
|
||
|
|
title: '{name}' # quote just in case
|
||
|
|
nav_order: 6
|
||
|
|
{has_children}
|
||
|
|
# parent - could be empty
|
||
|
|
{parent}
|
||
|
|
has_toc: false
|
||
|
|
permalink: {permalink}
|
||
|
|
---
|
||
|
|
|
||
|
|
# {name}
|
||
|
|
{{: .no_toc}}
|
||
|
|
'''
|
||
|
|
|
||
|
|
# template for hooks types page - hardcoded
|
||
|
|
hooks_header = '''---
|
||
|
|
layout: page
|
||
|
|
title: Hook types
|
||
|
|
nav_order: 6
|
||
|
|
parent: Hooks
|
||
|
|
permalink: /hook-types/
|
||
|
|
---
|
||
|
|
|
||
|
|
# Hook types
|
||
|
|
{: .no_toc}
|
||
|
|
|
||
|
|
* TOC
|
||
|
|
{:toc}
|
||
|
|
---
|
||
|
|
'''
|
||
|
|
|
||
|
|
def get_slug(string):
|
||
|
|
return string.lower().replace(' ','-').replace(':','-').replace('/','-').replace('--','-')
|
||
|
|
|
||
|
|
# functions pages
|
||
|
|
with open(functions_yaml) as yf:
|
||
|
|
data = yaml.load(yf)
|
||
|
|
for cat in data: # list categories
|
||
|
|
text = ""
|
||
|
|
|
||
|
|
# check for childre
|
||
|
|
has_children = ""
|
||
|
|
children = [x for x in data if "parent" in x and x["parent"] == cat["name"]]
|
||
|
|
if len(children) > 0:
|
||
|
|
has_children = "has_children: true"
|
||
|
|
|
||
|
|
# used in filename and permalink
|
||
|
|
slug = get_slug(cat['name'])
|
||
|
|
|
||
|
|
# if parent is present, this is a subcategory
|
||
|
|
parent = ""
|
||
|
|
if 'parent' in cat:
|
||
|
|
parent = "parent: " + cat['parent']
|
||
|
|
header = function_header_template.format(name=cat['name'], parent=parent, has_children=has_children, permalink="/{}/".format(slug))
|
||
|
|
text += header
|
||
|
|
|
||
|
|
# common doc for category
|
||
|
|
if 'doc' in cat:
|
||
|
|
text = text + '\n' + cat['doc'] + '\n'
|
||
|
|
|
||
|
|
if len(children) > 0:
|
||
|
|
text += "\n## Subcategories\n{: .no_toc}\n\n"
|
||
|
|
for c in children:
|
||
|
|
text += "- [**{}**](/{}/)\n".format(c["name"], get_slug(c["name"]))
|
||
|
|
text += "\n"
|
||
|
|
|
||
|
|
if 'items' in cat: # allow parent pages with no immediate items
|
||
|
|
text += "## Functions\n{: .no_toc}\n\n"
|
||
|
|
text += "* TOC\n{: toc}\n"
|
||
|
|
# individual functions
|
||
|
|
items = cat['items']
|
||
|
|
items = sorted(items, key=lambda k: k['name'])
|
||
|
|
|
||
|
|
for i in items:
|
||
|
|
# header
|
||
|
|
text += "\n---\n\n### **{}**\n".format(i['name'])
|
||
|
|
# macro label
|
||
|
|
if 'macro' in i:
|
||
|
|
text += "{: .d-inline-block }\n" + format(i['macro']) + "\n{: .label .label-green }\n"
|
||
|
|
# unsafe label
|
||
|
|
if 'unsafe' in i and i['unsafe'] is True:
|
||
|
|
text += '{: .d-inline-block }\nUNSAFE\n{: .label .label-red }\n'
|
||
|
|
# usage
|
||
|
|
text += "```c++\n{}\n```\n".format(i['detail'])
|
||
|
|
# doc, if present
|
||
|
|
if 'doc' in i:
|
||
|
|
text += i['doc'] + '\n'
|
||
|
|
|
||
|
|
md_path = os.path.join(md_dir, slug + ".md")
|
||
|
|
with open(md_path, 'w') as f:
|
||
|
|
f.write(text)
|
||
|
|
|
||
|
|
|
||
|
|
# hook types page
|
||
|
|
with open(hooks_yaml) as yf:
|
||
|
|
hooks = yaml.load(yf)
|
||
|
|
hooks = sorted(hooks, key=lambda k: k['name']) # alphabetical sort
|
||
|
|
text = hooks_header
|
||
|
|
|
||
|
|
for h in hooks:
|
||
|
|
name = h['name']
|
||
|
|
doc = h['doc']
|
||
|
|
try:
|
||
|
|
hid = h['id']
|
||
|
|
except:
|
||
|
|
hid = "HOOK_" + name.upper()
|
||
|
|
if 'filename' in h: # overriden filename?
|
||
|
|
filename = h['filename']
|
||
|
|
else:
|
||
|
|
filename = "hs_" + name.lower() + ".int"
|
||
|
|
|
||
|
|
text += "\n## {}\n\n".format(name) # header
|
||
|
|
if filename != "": # if not skip
|
||
|
|
text += "`{}` ({})\n\n".format(hid, filename) # `HOOK_SETLIGHTING` (hs_setlighting.int)
|
||
|
|
text += doc # actual documentation
|
||
|
|
|
||
|
|
md_path = os.path.join(md_dir, "hook-types.md")
|
||
|
|
with open(md_path, 'w') as f:
|
||
|
|
f.write(text)
|