File: script_docs_to_cpp.py

package info (click to toggle)
copyq 3.7.3-1~bpo9+1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 10,480 kB
  • sloc: cpp: 51,894; sh: 734; python: 211; xml: 57; makefile: 34
file content (72 lines) | stat: -rwxr-xr-x 1,951 bytes parent folder | download | duplicates (2)
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
#!/usr/bin/python
'''
Parses API for C++ from Scriptable API documentation.
'''

import re

readme_path = 'docs/scripting-api.rst'
output_path = 'src/gui/commandcompleterdocumentation.h'

header = '''// Generated by "utils/script_docs_to_cpp.py" from "%s".
template <typename AddDocumentationCallback>
void addDocumentation(AddDocumentationCallback addDocumentation)
{
'''

footer = '}'

# Regex for function/variable/type name in documentation
re_title = re.compile(r'''
  (?:
    ^\.\.\s*js:function::\s*
    (?P<function_api>
      # function return value
      .*?
      # function name
      (?P<function_name>\w+)
      # arguments
      \(.*
    )

    |

    ^\.\.\s*js:data::\s*
    # variable name
    (?P<variable_name>\w+)
    \s*
    # followed by opening parenthesis
    (?P<variable_api>\(.*)

    |

    ^\.\.\s*js:class::\s*
    # type name
    (?P<type_name>\w+)$
  )
  ''', re.VERBOSE)

def main():
    with open(output_path, mode='w', encoding='utf-8') as output_file:
        output_file.write((header % readme_path) + '\n')

        with open(readme_path, mode='r', encoding='utf-8') as readme_file:
            match = None
            for line in readme_file:
                line = line.strip().replace('``', '`')
                if line:
                    if match:
                        name = match.group('function_name') or match.group('variable_name') or match.group('type_name')
                        api = match.group('function_api') or match.group('variable_api') or name
                        description = line.strip()
                        output = '    addDocumentation("{}", "{}", "{}");\n'\
                            .format(name, api, description)
                        output_file.write(output)
                        match = None
                    else:
                        match = re.match(re_title, line)

        output_file.write(footer + '\n')

if __name__ == "__main__":
    main()