xref: /btstack/doc/manual/markdown_create_apis.py (revision 367b47cf6e9c34814b4b65bd34cd20513415ea78)
1c8c342a6SMilanka Ringwald#!/usr/bin/env python3
2c8c342a6SMilanka Ringwaldimport os, sys, getopt, re, pickle
3c8c342a6SMilanka Ringwaldimport subprocess
4c8c342a6SMilanka Ringwald
5c8c342a6SMilanka Ringwaldclass State:
6d7ef0676SMilanka Ringwald    SearchTitle = 0
7d7ef0676SMilanka Ringwald    SearchEndTitle = 1
8d7ef0676SMilanka Ringwald    SearchStartAPI = 2
9d7ef0676SMilanka Ringwald    SearchEndAPI = 3
10d7ef0676SMilanka Ringwald    DoneAPI = 4
11c8c342a6SMilanka Ringwald
124a400a05SMilanka Ringwaldheader_files = {}
13c8c342a6SMilanka Ringwaldfunctions = {}
14c8c342a6SMilanka Ringwaldtypedefs = {}
15c8c342a6SMilanka Ringwald
164a400a05SMilanka Ringwaldlinenr = 0
174a400a05SMilanka RingwaldtypedefFound = 0
184a400a05SMilanka Ringwaldmultiline_function_def = 0
194a400a05SMilanka Ringwaldstate = State.SearchStartAPI
20c8c342a6SMilanka Ringwald
214a400a05SMilanka Ringwald# if dash is used in api_header, the windmill theme will repeat the same API_TITLE twice in the menu (i.e: APIs/API_TITLE/API_TITLE)
224a400a05SMilanka Ringwald# if <h2> is used, this is avoided (i.e: APIs/API_TITLE), but reference {...} is not translated to HTML
234a400a05SMilanka Ringwaldapi_header = """
244a400a05SMilanka Ringwald# API_TITLE API {#sec:API_LABEL_api}
25c8c342a6SMilanka Ringwald
26c8c342a6SMilanka Ringwald"""
272ea56b0cSMilanka Ringwald
2878fab72eSMilanka Ringwaldapi_subheader = """
2978fab72eSMilanka Ringwald## API_TITLE API {#sec:API_LABEL_api}
3078fab72eSMilanka Ringwald
3178fab72eSMilanka Ringwald"""
32c8c342a6SMilanka Ringwald
332ea56b0cSMilanka Ringwaldapi_description = """
342ea56b0cSMilanka Ringwald**FILENAME** DESCRIPTION
352ea56b0cSMilanka Ringwald
36c8c342a6SMilanka Ringwald"""
37c8c342a6SMilanka Ringwald
382d21ec19SMilanka Ringwaldcode_ref = """GITHUB/FPATH#LLINENR"""
39c8c342a6SMilanka Ringwald
40d7ef0676SMilanka Ringwalddef isEndOfComment(line):
41*367b47cfSMilanka Ringwald    parts = re.match(r'\s*\*\/.*', line)
42*367b47cfSMilanka Ringwald    if parts:
43*367b47cfSMilanka Ringwald        return True
44*367b47cfSMilanka Ringwald    return False
45d7ef0676SMilanka Ringwald
46d7ef0676SMilanka Ringwalddef isStartOfComment(line):
47*367b47cfSMilanka Ringwald    parts = re.match(r'\s*\/\*\*.*', line)
48*367b47cfSMilanka Ringwald    if parts:
49*367b47cfSMilanka Ringwald        return True
50*367b47cfSMilanka Ringwald    return False
51*367b47cfSMilanka Ringwald
52*367b47cfSMilanka Ringwalddef isComment(line):
53*367b47cfSMilanka Ringwald    parts = re.match(r'\s*\/\/.*', line)
54*367b47cfSMilanka Ringwald    if parts:
55*367b47cfSMilanka Ringwald        return True
56*367b47cfSMilanka Ringwald    parts = re.match(r'\s*\*.*', line)
57*367b47cfSMilanka Ringwald    if parts:
58*367b47cfSMilanka Ringwald        return True
59*367b47cfSMilanka Ringwald
60*367b47cfSMilanka Ringwald    return isStartOfComment(line) or isEndOfComment(line)
61d7ef0676SMilanka Ringwald
62d7ef0676SMilanka Ringwalddef isTypedefStart(line):
63755a206fSMatthias Ringwald    return re.match(r'.*typedef\s+struct.*', line)
64d7ef0676SMilanka Ringwald
652d21ec19SMilanka Ringwalddef codeReference(fname, githuburl, filename_without_extension, filepath, linenr):
66c8c342a6SMilanka Ringwald    global code_ref
67c8c342a6SMilanka Ringwald    ref = code_ref.replace("GITHUB", githuburl)
682d21ec19SMilanka Ringwald    ref = ref.replace("FPATH", filename_without_extension)
69c8c342a6SMilanka Ringwald    ref = ref.replace("LINENR", str(linenr))
70c8c342a6SMilanka Ringwald    return ref
71c8c342a6SMilanka Ringwald
724a400a05SMilanka Ringwalddef isTagAPI(line):
73755a206fSMatthias Ringwald    return re.match(r'(.*)(-\s*\')(APIs).*',line)
744a400a05SMilanka Ringwald
754a400a05SMilanka Ringwalddef getSecondLevelIdentation(line):
764a400a05SMilanka Ringwald    indentation = ""
77755a206fSMatthias Ringwald    parts = re.match(r'(.*)(-\s*\')(APIs).*',line)
784a400a05SMilanka Ringwald    if parts:
794a400a05SMilanka Ringwald        # return double identation for the submenu
804a400a05SMilanka Ringwald        indentation = parts.group(1) + parts.group(1) + "- "
814a400a05SMilanka Ringwald    return indentation
824a400a05SMilanka Ringwald
834a400a05SMilanka Ringwalddef filename_stem(filepath):
844a400a05SMilanka Ringwald    return os.path.splitext(os.path.basename(filepath))[0]
85c8c342a6SMilanka Ringwald
86d7ef0676SMilanka Ringwalddef writeAPI(fout, fin, mk_codeidentation):
87c8c342a6SMilanka Ringwald    state = State.SearchStartAPI
88d7ef0676SMilanka Ringwald
89c8c342a6SMilanka Ringwald    for line in fin:
90c8c342a6SMilanka Ringwald        if state == State.SearchStartAPI:
91c8c342a6SMilanka Ringwald            parts = re.match('.*API_START.*',line)
92c8c342a6SMilanka Ringwald            if parts:
93c8c342a6SMilanka Ringwald                state = State.SearchEndAPI
94c8c342a6SMilanka Ringwald            continue
95c8c342a6SMilanka Ringwald
96c8c342a6SMilanka Ringwald        if state == State.SearchEndAPI:
97c8c342a6SMilanka Ringwald            parts = re.match('.*API_END.*',line)
98c8c342a6SMilanka Ringwald            if parts:
99c8c342a6SMilanka Ringwald                state = State.DoneAPI
100c8c342a6SMilanka Ringwald                continue
101c8c342a6SMilanka Ringwald            fout.write(mk_codeidentation + line)
102c8c342a6SMilanka Ringwald            continue
103c8c342a6SMilanka Ringwald
104c8c342a6SMilanka Ringwald
105c8c342a6SMilanka Ringwald
1062d21ec19SMilanka Ringwalddef createIndex(fin, filename, api_filepath, api_title, api_label, githuburl):
107d7ef0676SMilanka Ringwald    global typedefs, functions
108d7ef0676SMilanka Ringwald    global linenr, multiline_function_def, typedefFound, state
109d7ef0676SMilanka Ringwald
110d7ef0676SMilanka Ringwald
111c8c342a6SMilanka Ringwald    for line in fin:
112c8c342a6SMilanka Ringwald        if state == State.DoneAPI:
113c8c342a6SMilanka Ringwald            continue
114c8c342a6SMilanka Ringwald
115c8c342a6SMilanka Ringwald        linenr = linenr + 1
116c8c342a6SMilanka Ringwald
117c8c342a6SMilanka Ringwald        if state == State.SearchStartAPI:
118c8c342a6SMilanka Ringwald            parts = re.match('.*API_START.*',line)
119c8c342a6SMilanka Ringwald            if parts:
120c8c342a6SMilanka Ringwald                state = State.SearchEndAPI
121c8c342a6SMilanka Ringwald            continue
122c8c342a6SMilanka Ringwald
123c8c342a6SMilanka Ringwald        if state == State.SearchEndAPI:
124c8c342a6SMilanka Ringwald            parts = re.match('.*API_END.*',line)
125c8c342a6SMilanka Ringwald            if parts:
126c8c342a6SMilanka Ringwald                state = State.DoneAPI
127c8c342a6SMilanka Ringwald                continue
128c8c342a6SMilanka Ringwald
129*367b47cfSMilanka Ringwald        if isComment(line):
130c8c342a6SMilanka Ringwald            continue
131c8c342a6SMilanka Ringwald
132c8c342a6SMilanka Ringwald        param = re.match(".*@brief.*", line)
133c8c342a6SMilanka Ringwald        if param:
134c8c342a6SMilanka Ringwald            continue
135c8c342a6SMilanka Ringwald        param = re.match(".*@param.*", line)
136c8c342a6SMilanka Ringwald        if param:
137c8c342a6SMilanka Ringwald            continue
138c8c342a6SMilanka Ringwald        param = re.match(".*@return.*", line)
139c8c342a6SMilanka Ringwald        if param:
140c8c342a6SMilanka Ringwald            continue
14102d4336aSMilanka Ringwald        param = re.match(".*@result.*", line)
14202d4336aSMilanka Ringwald        if param:
14302d4336aSMilanka Ringwald            continue
14402d4336aSMilanka Ringwald        param = re.match(".*@note.*", line)
14502d4336aSMilanka Ringwald        if param:
14602d4336aSMilanka Ringwald            continue
147*367b47cfSMilanka Ringwald        param = re.match(".*return.*", line)
148*367b47cfSMilanka Ringwald        if param:
149*367b47cfSMilanka Ringwald            continue
150c8c342a6SMilanka Ringwald
151c8c342a6SMilanka Ringwald        # search typedef struct begin
152d7ef0676SMilanka Ringwald        if isTypedefStart(line):
153c8c342a6SMilanka Ringwald            typedefFound = 1
154c8c342a6SMilanka Ringwald
155c8c342a6SMilanka Ringwald        # search typedef struct end
156c8c342a6SMilanka Ringwald        if typedefFound:
157755a206fSMatthias Ringwald            typedef = re.match(r'}\s*(.*);\n', line)
158c8c342a6SMilanka Ringwald            if typedef:
159c8c342a6SMilanka Ringwald                typedefFound = 0
1602d21ec19SMilanka Ringwald                typedefs[typedef.group(1)] = codeReference(typedef.group(1), githuburl, filename, api_filepath, linenr)
161c8c342a6SMilanka Ringwald            continue
162c8c342a6SMilanka Ringwald
163755a206fSMatthias Ringwald        ref_function =  re.match(r'.*typedef\s+void\s+\(\s*\*\s*(.*?)\)\(.*', line)
164c8c342a6SMilanka Ringwald        if ref_function:
1652d21ec19SMilanka Ringwald            functions[ref_function.group(1)] = codeReference(ref_function.group(1), githuburl, filename, api_filepath, linenr)
166c8c342a6SMilanka Ringwald            continue
167c8c342a6SMilanka Ringwald
16802d4336aSMilanka Ringwald        # filter callback
16902d4336aSMilanka Ringwald        callback_function_definition = re.match(r'(.*?)\s*\(\s*\*.*\(*.*;\n', line)
17002d4336aSMilanka Ringwald        if callback_function_definition:
17102d4336aSMilanka Ringwald            continue
172d7ef0676SMilanka Ringwald
173755a206fSMatthias Ringwald        one_line_function_definition = re.match(r'(.*?)\s*\(.*\(*.*;\n', line)
174d7ef0676SMilanka Ringwald        if one_line_function_definition:
175d7ef0676SMilanka Ringwald            parts = one_line_function_definition.group(1).split(" ");
176c8c342a6SMilanka Ringwald            name = parts[len(parts)-1]
177c8c342a6SMilanka Ringwald            if len(name) == 0:
178c8c342a6SMilanka Ringwald                print(parts);
179c8c342a6SMilanka Ringwald                sys.exit(10)
180e4b84d01SMatthias Ringwald            # ignore typedef for callbacks
181e4b84d01SMatthias Ringwald            if parts[0] == 'typedef':
182e4b84d01SMatthias Ringwald                continue
1832d21ec19SMilanka Ringwald            functions[name] = codeReference( name, githuburl, filename, api_filepath, linenr)
184c8c342a6SMilanka Ringwald            continue
185c8c342a6SMilanka Ringwald
186755a206fSMatthias Ringwald        multi_line_function_definition = re.match(r'.(.*?)\s*\(.*\(*.*', line)
187d7ef0676SMilanka Ringwald        if multi_line_function_definition:
188d7ef0676SMilanka Ringwald            parts = multi_line_function_definition.group(1).split(" ");
189d7ef0676SMilanka Ringwald
190d7ef0676SMilanka Ringwald            name = parts[len(parts)-1]
191c8c342a6SMilanka Ringwald            if len(name) == 0:
192c8c342a6SMilanka Ringwald                print(parts);
193c8c342a6SMilanka Ringwald                sys.exit(10)
194c8c342a6SMilanka Ringwald            multiline_function_def = 1
1952d21ec19SMilanka Ringwald            functions[name] = codeReference(name, githuburl, filename, api_filepath, linenr)
196c8c342a6SMilanka Ringwald
197c8c342a6SMilanka Ringwald
198d7ef0676SMilanka Ringwalddef findTitle(fin):
199d7ef0676SMilanka Ringwald    title = None
200d7ef0676SMilanka Ringwald    desc = ""
201d7ef0676SMilanka Ringwald    state = State.SearchTitle
202d7ef0676SMilanka Ringwald
203d7ef0676SMilanka Ringwald    for line in fin:
204d7ef0676SMilanka Ringwald        if state == State.SearchTitle:
205d7ef0676SMilanka Ringwald            if isStartOfComment(line):
206d7ef0676SMilanka Ringwald                continue
207d7ef0676SMilanka Ringwald
208755a206fSMatthias Ringwald            parts = re.match(r'.*(@title)(.*)', line)
209d7ef0676SMilanka Ringwald            if parts:
210d7ef0676SMilanka Ringwald                title = parts.group(2).strip()
211d7ef0676SMilanka Ringwald                state = State.SearchEndTitle
212d7ef0676SMilanka Ringwald                continue
213d7ef0676SMilanka Ringwald
214d7ef0676SMilanka Ringwald        if state == State.SearchEndTitle:
215d7ef0676SMilanka Ringwald            if (isEndOfComment(line)):
216d7ef0676SMilanka Ringwald                state = State.DoneAPI
217d7ef0676SMilanka Ringwald                break
218d7ef0676SMilanka Ringwald
219755a206fSMatthias Ringwald            parts = re.match(r'(\s*\*\s*)(.*\n)',line)
220d7ef0676SMilanka Ringwald            if parts:
221d7ef0676SMilanka Ringwald                desc = desc + parts.group(2)
2224a400a05SMilanka Ringwald    return [title, desc]
223d7ef0676SMilanka Ringwald
224c8c342a6SMilanka Ringwalddef main(argv):
225d7ef0676SMilanka Ringwald    global linenr, multiline_function_def, typedefFound, state
226d7ef0676SMilanka Ringwald
227c8c342a6SMilanka Ringwald    mk_codeidentation = "    "
228c8c342a6SMilanka Ringwald    git_branch_name = "master"
229c8c342a6SMilanka Ringwald    btstackfolder = "../../"
2302d21ec19SMilanka Ringwald    githuburl_template  = "https://github.com/bluekitchen/btstack/blob/"
2312d21ec19SMilanka Ringwald    githuburl = "master/src/"
232c8c342a6SMilanka Ringwald    markdownfolder = "docs-markdown/"
233c8c342a6SMilanka Ringwald
234c8c342a6SMilanka Ringwald    cmd = 'markdown_create_apis.py [-r <root_btstackfolder>] [-g <githuburl>] [-o <output_markdownfolder>]'
235c8c342a6SMilanka Ringwald    try:
236c8c342a6SMilanka Ringwald        opts, args = getopt.getopt(argv,"r:g:o:",["rfolder=","github=","ofolder="])
237c8c342a6SMilanka Ringwald    except getopt.GetoptError:
238c8c342a6SMilanka Ringwald        print (cmd)
239c8c342a6SMilanka Ringwald        sys.exit(2)
240c8c342a6SMilanka Ringwald    for opt, arg in opts:
241c8c342a6SMilanka Ringwald        if opt == '-h':
242c8c342a6SMilanka Ringwald            print (cmd)
243c8c342a6SMilanka Ringwald            sys.exit()
244c8c342a6SMilanka Ringwald        elif opt in ("-r", "--rfolder"):
245c8c342a6SMilanka Ringwald            btstackfolder = arg
246c8c342a6SMilanka Ringwald        elif opt in ("-g", "--github"):
247c8c342a6SMilanka Ringwald            githuburl = arg
248c8c342a6SMilanka Ringwald        elif opt in ("-o", "--ofolder"):
249c8c342a6SMilanka Ringwald            markdownfolder = arg
250c8c342a6SMilanka Ringwald
251c8c342a6SMilanka Ringwald    apifile   = markdownfolder + "appendix/apis.md"
252c8c342a6SMilanka Ringwald    # indexfile = markdownfolder + "api_index.md"
253d7ef0676SMilanka Ringwald    btstack_srcfolder = btstackfolder + "src/"
254c8c342a6SMilanka Ringwald
255c8c342a6SMilanka Ringwald    try:
256c8c342a6SMilanka Ringwald        output = subprocess.check_output("git symbolic-ref --short HEAD", stderr=subprocess.STDOUT, timeout=3, shell=True)
257c8c342a6SMilanka Ringwald        git_branch_name = output.decode().rstrip()
258c8c342a6SMilanka Ringwald    except subprocess.CalledProcessError as exc:
259c8c342a6SMilanka Ringwald        print('GIT branch name: failed to get, use default value \"%s\""  ', git_branch_name, exc.returncode, exc.output)
260c8c342a6SMilanka Ringwald    else:
261c8c342a6SMilanka Ringwald        print ('GIT branch name :  %s' % git_branch_name)
262c8c342a6SMilanka Ringwald
2632d21ec19SMilanka Ringwald    githuburl = githuburl_template + git_branch_name
264c8c342a6SMilanka Ringwald
265d7ef0676SMilanka Ringwald    print ('BTstack src folder is : ' + btstack_srcfolder)
266c8c342a6SMilanka Ringwald    print ('API file is       : ' + apifile)
267c8c342a6SMilanka Ringwald    print ('Github URL is    : ' +  githuburl)
268c8c342a6SMilanka Ringwald
2694a400a05SMilanka Ringwald    # create a dictionary of header files {file_path : [title, description]}
2704a400a05SMilanka Ringwald    # title and desctiption are extracted from the file
271d7ef0676SMilanka Ringwald    for root, dirs, files in os.walk(btstack_srcfolder, topdown=True):
272d7ef0676SMilanka Ringwald        for f in files:
273d7ef0676SMilanka Ringwald            if not f.endswith(".h"):
274d7ef0676SMilanka Ringwald                continue
275d7ef0676SMilanka Ringwald
2764a400a05SMilanka Ringwald            if not root.endswith("/"):
2774a400a05SMilanka Ringwald                root = root + "/"
278d7ef0676SMilanka Ringwald
2794a400a05SMilanka Ringwald            header_filepath = root + f
280d7ef0676SMilanka Ringwald
2814a400a05SMilanka Ringwald            with open(header_filepath, 'rt') as fin:
2824a400a05SMilanka Ringwald                [header_title, header_desc] = findTitle(fin)
283d7ef0676SMilanka Ringwald
2844a400a05SMilanka Ringwald            if header_title:
2854a400a05SMilanka Ringwald                header_files[header_filepath] = [header_title, header_desc]
2864a400a05SMilanka Ringwald            else:
2874a400a05SMilanka Ringwald                print("No @title flag found. Skip %s" % header_filepath)
288d7ef0676SMilanka Ringwald
2892ea56b0cSMilanka Ringwald    # create an >md file, for each header file in header_files dictionary
2904a400a05SMilanka Ringwald    for header_filepath in sorted(header_files.keys()):
2912d21ec19SMilanka Ringwald        filename = str(header_filepath)
2922d21ec19SMilanka Ringwald        filename = filename.split("../../")[1]
2932d21ec19SMilanka Ringwald
2942ea56b0cSMilanka Ringwald        filename_without_extension = filename_stem(header_filepath) # file name without .h
2952ea56b0cSMilanka Ringwald        filetitle = header_files[header_filepath][0]
2962ea56b0cSMilanka Ringwald        description = header_files[header_filepath][1]
2972ea56b0cSMilanka Ringwald
2982ea56b0cSMilanka Ringwald        if len(description) > 1:
2992ea56b0cSMilanka Ringwald            description = ": " + description
3002ea56b0cSMilanka Ringwald
3012ea56b0cSMilanka Ringwald        header_description = api_description.replace("FILENAME", filename).replace("DESCRIPTION", description)
3022ea56b0cSMilanka Ringwald
3032ea56b0cSMilanka Ringwald        header_title = api_header.replace("API_TITLE", filetitle).replace("API_LABEL", filename_without_extension)
3042ea56b0cSMilanka Ringwald        markdown_filepath = markdownfolder + "appendix/" + filename_without_extension + ".md"
305d7ef0676SMilanka Ringwald
3064a400a05SMilanka Ringwald        with open(header_filepath, 'rt') as fin:
3074a400a05SMilanka Ringwald            with open(markdown_filepath, 'wt') as fout:
3084a400a05SMilanka Ringwald                fout.write(header_title)
3094a400a05SMilanka Ringwald                fout.write(header_description)
310d7ef0676SMilanka Ringwald                writeAPI(fout, fin, mk_codeidentation)
311d7ef0676SMilanka Ringwald
3124a400a05SMilanka Ringwald        with open(header_filepath, 'rt') as fin:
313d7ef0676SMilanka Ringwald            linenr = 0
314d7ef0676SMilanka Ringwald            typedefFound = 0
315d7ef0676SMilanka Ringwald            multiline_function_def = 0
316d7ef0676SMilanka Ringwald            state = State.SearchStartAPI
3172d21ec19SMilanka Ringwald            createIndex(fin, filename, markdown_filepath, header_title, filename_without_extension, githuburl)
318d7ef0676SMilanka Ringwald
3194a400a05SMilanka Ringwald    # add API list to the navigation menu
3204a400a05SMilanka Ringwald    with open("mkdocs-temp.yml", 'rt') as fin:
3214a400a05SMilanka Ringwald        with open("mkdocs.yml", 'wt') as fout:
3224a400a05SMilanka Ringwald            for line in fin:
3234a400a05SMilanka Ringwald                fout.write(line)
3244a400a05SMilanka Ringwald
3254a400a05SMilanka Ringwald                if not isTagAPI(line):
3264a400a05SMilanka Ringwald                    continue
3274a400a05SMilanka Ringwald
3284a400a05SMilanka Ringwald                identation = getSecondLevelIdentation(line)
3294a400a05SMilanka Ringwald
3304a400a05SMilanka Ringwald                for header_filepath in sorted(header_files.keys()):
3312ea56b0cSMilanka Ringwald                    header_title = os.path.basename(header_filepath)
3324a400a05SMilanka Ringwald                    markdown_reference = "appendix/" + filename_stem(header_filepath) + ".md"
3334a400a05SMilanka Ringwald
3344a400a05SMilanka Ringwald                    fout.write(identation + "'" + header_title + "': " + markdown_reference + "\n")
335c8c342a6SMilanka Ringwald
33678fab72eSMilanka Ringwald
3372ea56b0cSMilanka Ringwald    # create mkdocs-latex.yml with single appendix/apis.md reference for pdf generation
33878fab72eSMilanka Ringwald    with open("mkdocs-temp.yml", 'rt') as fin:
33978fab72eSMilanka Ringwald        with open("mkdocs-latex.yml", 'wt') as fout:
34078fab72eSMilanka Ringwald            for line in fin:
34178fab72eSMilanka Ringwald                if not isTagAPI(line):
34278fab72eSMilanka Ringwald                    fout.write(line)
34378fab72eSMilanka Ringwald                    continue
34478fab72eSMilanka Ringwald
34578fab72eSMilanka Ringwald                fout.write("  - 'APIs': appendix/apis.md\n")
34678fab72eSMilanka Ringwald
3472ea56b0cSMilanka Ringwald    # create single appendix/apis.md file for pdf generation
34878fab72eSMilanka Ringwald    markdown_filepath = markdownfolder + "appendix/apis.md"
34978fab72eSMilanka Ringwald    with open(markdown_filepath, 'wt') as fout:
35078fab72eSMilanka Ringwald        fout.write("\n# APIs\n\n")
35178fab72eSMilanka Ringwald        for header_filepath in sorted(header_files.keys()):
3522ea56b0cSMilanka Ringwald            filename = os.path.basename(header_filepath)
3532ea56b0cSMilanka Ringwald            filename_without_extension = filename_stem(header_filepath) # file name without
3542ea56b0cSMilanka Ringwald            filetitle = header_files[header_filepath][0]
35578fab72eSMilanka Ringwald
3562ea56b0cSMilanka Ringwald            description = header_files[header_filepath][1]
3572ea56b0cSMilanka Ringwald
3582ea56b0cSMilanka Ringwald            if len(description) > 1:
3592ea56b0cSMilanka Ringwald                description = ": " + description
3602ea56b0cSMilanka Ringwald
3612ea56b0cSMilanka Ringwald            header_description = api_description.replace("FILENAME", filename).replace("DESCRIPTION", description)
3622ea56b0cSMilanka Ringwald
3632ea56b0cSMilanka Ringwald            subheader_title = api_subheader.replace("API_TITLE", filetitle).replace("API_LABEL", filename_without_extension)
36478fab72eSMilanka Ringwald            with open(header_filepath, 'rt') as fin:
36578fab72eSMilanka Ringwald                    fout.write(subheader_title)
36678fab72eSMilanka Ringwald                    fout.write(header_description)
36778fab72eSMilanka Ringwald                    writeAPI(fout, fin, mk_codeidentation)
36878fab72eSMilanka Ringwald
369c8c342a6SMilanka Ringwald
370c8c342a6SMilanka Ringwald    references = functions.copy()
371c8c342a6SMilanka Ringwald    references.update(typedefs)
372c8c342a6SMilanka Ringwald
373*367b47cfSMilanka Ringwald    for function_name, url in references.items():
374*367b47cfSMilanka Ringwald        print(function_name, url)
375*367b47cfSMilanka Ringwald
376c8c342a6SMilanka Ringwald    # with open(indexfile, 'w') as fout:
377c8c342a6SMilanka Ringwald    #     for function, reference in references.items():
378c8c342a6SMilanka Ringwald    #         fout.write("[" + function + "](" + reference + ")\n")
379c8c342a6SMilanka Ringwald
380c8c342a6SMilanka Ringwald    pickle.dump(references, open("references.p", "wb" ) )
381c8c342a6SMilanka Ringwald
382c8c342a6SMilanka Ringwaldif __name__ == "__main__":
383c8c342a6SMilanka Ringwald   main(sys.argv[1:])
384