"serialization/vscode:/vscode.git/clone" did not exist on "46c5f78feeaa2f18389fb94e68f078418e31302b"
render.py 2.11 KB
Newer Older
Robert T. McGibbon's avatar
Robert T. McGibbon committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import os
import sys
from functools import reduce
from os.path import basename, dirname, join, splitext
from glob import glob

import jinja2
import lxml.etree as ET


def load_doxygen_xml(doxygen_xml):
    files = [os.path.join(doxygen_xml, f)
             for f in os.listdir(doxygen_xml)
             if f.lower().endswith('.xml') and not f.startswith('._')]
    if len(files) == 0:
        raise err

    document = ET.ElementTree(ET.Element('root')).getroot()
    for file in files:
        root = ET.parse(file).getroot()
        for node in root:
            document.append(node)
    return document


def subclasses(root, parent):
    xp_query = ('.//compounddef/basecompoundref[text()="%s"]'
                '/../compoundname') % parent
    return [parent] + [n.text.strip() for n in root.xpath(xp_query)]


def allclasses(root):
    xp_query = './/compounddef[@kind="class" and @prot="public"]/compoundname'
    return [e.text for e in root.xpath(xp_query)]


def template_data(root):
    data = {
        'core': ('OpenMM::System', 'OpenMM::Context', 'OpenMM::State', 'OpenMM::State'),
        'forces': sorted(subclasses(root, 'OpenMM::Force')),
        'integrators': sorted(subclasses(root, 'OpenMM::Integrator')),

    }
    data['extras'] = sorted(set(allclasses(root)) -
                            reduce(set.union, map(set, data.values())))
    return data


def main():
    if len(sys.argv) == 1:
        print('usage: %s <doxygen_xml_path>' % sys.argv[0], file=sys.stderr)
        exit(1)
    doxygen_xml_path = sys.argv[1]

    root = load_doxygen_xml(doxygen_xml_path)
    data = template_data(root)

    here = dirname(__file__)
    templateLoader = jinja2.FileSystemLoader(here)
    templateEnv = jinja2.Environment(loader=templateLoader)

    for template_fn in map(basename, glob(join(here, '*.jinja2'))):
        output_fn = splitext(template_fn)[0]
        print('Rendering %s to %s...' % (template_fn, output_fn))

        template = templateEnv.get_template(template_fn)
        output_text = template.render(data)
        with open(output_fn, 'w') as f:
            f.write(output_text)


if __name__ == '__main__':
    main()