]> rtime.felk.cvut.cz Git - socketcan-simulink.git/blob - blocks/scripts/doc_parse.py
Import of CAN support from TMS570 Rapid Prototyping Platform project.
[socketcan-simulink.git] / blocks / scripts / doc_parse.py
1 #!/usr/bin/env python3
2
3 import yaml
4 import argparse
5 import Rx
6 import sys
7 import subprocess
8 import os
9 from string import Template
10
11 parser = argparse.ArgumentParser()
12 parser.add_argument("file", help="file to process", nargs='+')
13 parser.add_argument("--html", help="output block description as HTML",
14                     action = 'store_true')
15 parser.add_argument("--latex", help="output block description as LaTeX",
16                     action = 'store_true')
17 parser.add_argument("--latex-table", help="output block status table as LaTeX",
18                     action = 'store_true')
19 args = parser.parse_args()
20
21 mydir = os.path.dirname(os.path.realpath(__file__))
22
23 def print_markdown_as(format, text):
24     sys.stdout.flush()
25     proc = subprocess.Popen(['pandoc', '-f', 'markdown', '-t', format], stdin = subprocess.PIPE)
26     proc.stdin.write(bytes(text, 'UTF-8'))
27     proc.communicate()
28     proc.stdin.close()
29     if proc.returncode:
30         raise Exception("pandoc failed: %d" % proc.returncode)
31
32 def print_latex_desc(doc):
33     def iodef_str(iodef):
34         if iodef is None: return "None"
35         str='%d\n\\begin{enumerate}\n' % len(iodef)
36         for io in iodef:
37             str += Template('\\item {\\bf $name} $type').substitute(io)
38             if 'range' in io:
39                 str += '  %s' % io['range']
40             str += '\n'
41         return str +'\end{enumerate}'
42
43     print("\\newpage\n")
44     print("\\subsubsection{%s}\n" % doc['Name'])
45     print("\\begin{description}\n")
46     print("\\item[Inputs:]     %s\n" % iodef_str(doc['Inputs']))
47     print("\\item[Outputs:]    %s\n" % iodef_str(doc['Outputs']))
48     print("\\item[Parameters:] %s\n" % iodef_str(doc['Parameters']))
49     print("\\end{description}\n")
50
51     print_markdown_as('latex', doc['Description'])
52
53     print("\n\\textbf{Status:}")
54     print("\\begin{multicols}{3}")
55     if doc['Status']['Tested']:
56         print("\\begin{compactitem}")
57         print("\\item \\textbf{Tested}:")
58         print(" \\begin{compactitem}")
59         print("\n".join(["\\item %s" % i.replace('_', '\\_') for i in doc['Status']['Tested']]))
60         print(" \\end{compactitem}")
61         print("\\end{compactitem}")
62     else:
63         print("\\ ")
64
65     print("\\vfill\\columnbreak")
66
67     if doc['Status']['Untested']:
68         print("\\begin{compactitem}")
69         print("\\item \\textbf{Untested}:")
70         print(" \\begin{compactitem}")
71         print("\n".join(["\\item %s" % i.replace('_', '\\_') for i in doc['Status']['Untested']]))
72         print(" \\end{compactitem}")
73         print("\\end{compactitem}")
74     else:
75         print("\\ ")
76
77     print("\\vfill\\columnbreak")
78
79     if doc['Status']['Not working']:
80         print("\\begin{compactitem}")
81         print("\\item \\textbf{Not working}:")
82         print(" \\begin{compactitem}")
83         print("\n".join(["\\item %s" % i.replace('_', '\\_') for i in doc['Status']['Not working']]))
84         print(" \\end{compactitem}")
85         print("\\end{compactitem}")
86     else:
87         print("\\ ")
88
89     print("\\end{multicols}\n")
90
91     if doc.get('RPP API functions used', None) is not None:
92         print("\\textbf{RPP API functions used:}")
93         print("\\begin{compactitem}")
94         print("\n".join(["\\item \\texttt{%s}" % i.replace('_', '\\_') for i in doc['RPP API functions used']]))
95         print("\\end{compactitem}")
96
97     if doc.get('Relevant demos', None) is not None:
98         print("\\textbf{Relevant demos:}")
99         print("\\begin{compactitem}")
100         print("\n".join(["\\item %s" % i.replace('_', '\\_') for i in doc['Relevant demos']]))
101         print("\\end{compactitem}")
102
103 def process_file(f):
104     yaml_doc = None
105     for line in open(f, 'r'):
106         if yaml_doc:
107             yaml_doc += line
108         elif line.startswith("%YAML"):
109             yaml_doc = line
110         if line == '...\n':
111             break
112     if yaml_doc is None:
113         raise Exception("No line starting with '%%YAML' found in %s" % f)
114
115     doc = yaml.load(yaml_doc)
116     schema = yaml.load(open(mydir+'/schema.yaml', 'r'))
117
118     rx = Rx.Factory({ "register_core_types": True })
119     rpp_block_doc_schema = rx.make_schema(schema)
120     try:
121         rpp_block_doc_schema.check(doc)
122     except Rx.ValidationError as e:
123         raise Exception("Validation error in %s: %s" % (f, e))
124         #raise
125
126     if args.html:
127         print_markdown_as('html', doc['Description'])
128     if args.latex:
129         print_latex_desc(doc)
130     if args.latex_table:
131         global last_category
132         if last_category == doc['Category']: doc['Category']=''
133         doc['Header'] = doc['Header'].replace('_', '\\_')
134         if   doc['Status']['Not working']: doc['ShortStatus'] = '$\\alpha$'
135         elif doc['Status']['Untested']:    doc['ShortStatus'] = '$\\beta$'
136         elif not doc['Status']['Tested']:  doc['ShortStatus'] = '$\\beta$'
137         else:                              doc['ShortStatus'] = 'Stable'
138         print(Template("$Category & $Name & $ShortStatus & $Mnemonic & \\texttt{$Header} \\\\").substitute(doc))
139         if doc['Category']:
140             last_category = doc['Category']
141
142 last_category = None
143 for f in args.file:
144     process_file(f)