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): 41755a206fSMatthias Ringwald return re.match(r'\s*\*/.*', line) 42d7ef0676SMilanka Ringwald 43d7ef0676SMilanka Ringwalddef isStartOfComment(line): 44755a206fSMatthias Ringwald return re.match(r'\s*\/\*/.*', line) 45d7ef0676SMilanka Ringwald 46d7ef0676SMilanka Ringwalddef isTypedefStart(line): 47755a206fSMatthias Ringwald return re.match(r'.*typedef\s+struct.*', line) 48d7ef0676SMilanka Ringwald 492d21ec19SMilanka Ringwalddef codeReference(fname, githuburl, filename_without_extension, filepath, linenr): 50c8c342a6SMilanka Ringwald global code_ref 51c8c342a6SMilanka Ringwald ref = code_ref.replace("GITHUB", githuburl) 522d21ec19SMilanka Ringwald ref = ref.replace("FPATH", filename_without_extension) 53c8c342a6SMilanka Ringwald ref = ref.replace("LINENR", str(linenr)) 54c8c342a6SMilanka Ringwald return ref 55c8c342a6SMilanka Ringwald 564a400a05SMilanka Ringwalddef isTagAPI(line): 57755a206fSMatthias Ringwald return re.match(r'(.*)(-\s*\')(APIs).*',line) 584a400a05SMilanka Ringwald 594a400a05SMilanka Ringwalddef getSecondLevelIdentation(line): 604a400a05SMilanka Ringwald indentation = "" 61755a206fSMatthias Ringwald parts = re.match(r'(.*)(-\s*\')(APIs).*',line) 624a400a05SMilanka Ringwald if parts: 634a400a05SMilanka Ringwald # return double identation for the submenu 644a400a05SMilanka Ringwald indentation = parts.group(1) + parts.group(1) + "- " 654a400a05SMilanka Ringwald return indentation 664a400a05SMilanka Ringwald 674a400a05SMilanka Ringwalddef filename_stem(filepath): 684a400a05SMilanka Ringwald return os.path.splitext(os.path.basename(filepath))[0] 69c8c342a6SMilanka Ringwald 70d7ef0676SMilanka Ringwalddef writeAPI(fout, fin, mk_codeidentation): 71c8c342a6SMilanka Ringwald state = State.SearchStartAPI 72d7ef0676SMilanka Ringwald 73c8c342a6SMilanka Ringwald for line in fin: 74c8c342a6SMilanka Ringwald if state == State.SearchStartAPI: 75c8c342a6SMilanka Ringwald parts = re.match('.*API_START.*',line) 76c8c342a6SMilanka Ringwald if parts: 77c8c342a6SMilanka Ringwald state = State.SearchEndAPI 78c8c342a6SMilanka Ringwald continue 79c8c342a6SMilanka Ringwald 80c8c342a6SMilanka Ringwald if state == State.SearchEndAPI: 81c8c342a6SMilanka Ringwald parts = re.match('.*API_END.*',line) 82c8c342a6SMilanka Ringwald if parts: 83c8c342a6SMilanka Ringwald state = State.DoneAPI 84c8c342a6SMilanka Ringwald continue 85c8c342a6SMilanka Ringwald fout.write(mk_codeidentation + line) 86c8c342a6SMilanka Ringwald continue 87c8c342a6SMilanka Ringwald 88c8c342a6SMilanka Ringwald 89c8c342a6SMilanka Ringwald 902d21ec19SMilanka Ringwalddef createIndex(fin, filename, api_filepath, api_title, api_label, githuburl): 91d7ef0676SMilanka Ringwald global typedefs, functions 92d7ef0676SMilanka Ringwald global linenr, multiline_function_def, typedefFound, state 93d7ef0676SMilanka Ringwald 94d7ef0676SMilanka Ringwald 95c8c342a6SMilanka Ringwald for line in fin: 96c8c342a6SMilanka Ringwald if state == State.DoneAPI: 97c8c342a6SMilanka Ringwald continue 98c8c342a6SMilanka Ringwald 99c8c342a6SMilanka Ringwald linenr = linenr + 1 100c8c342a6SMilanka Ringwald 101c8c342a6SMilanka Ringwald if state == State.SearchStartAPI: 102c8c342a6SMilanka Ringwald parts = re.match('.*API_START.*',line) 103c8c342a6SMilanka Ringwald if parts: 104c8c342a6SMilanka Ringwald state = State.SearchEndAPI 105c8c342a6SMilanka Ringwald continue 106c8c342a6SMilanka Ringwald 107c8c342a6SMilanka Ringwald if state == State.SearchEndAPI: 108c8c342a6SMilanka Ringwald parts = re.match('.*API_END.*',line) 109c8c342a6SMilanka Ringwald if parts: 110c8c342a6SMilanka Ringwald state = State.DoneAPI 111c8c342a6SMilanka Ringwald continue 112c8c342a6SMilanka Ringwald 113c8c342a6SMilanka Ringwald if multiline_function_def: 114c8c342a6SMilanka Ringwald function_end = re.match('.*;\n', line) 115c8c342a6SMilanka Ringwald if function_end: 116c8c342a6SMilanka Ringwald multiline_function_def = 0 117c8c342a6SMilanka Ringwald continue 118c8c342a6SMilanka Ringwald 119c8c342a6SMilanka Ringwald param = re.match(".*@brief.*", line) 120c8c342a6SMilanka Ringwald if param: 121c8c342a6SMilanka Ringwald continue 122c8c342a6SMilanka Ringwald param = re.match(".*@param.*", line) 123c8c342a6SMilanka Ringwald if param: 124c8c342a6SMilanka Ringwald continue 125c8c342a6SMilanka Ringwald param = re.match(".*@return.*", line) 126c8c342a6SMilanka Ringwald if param: 127c8c342a6SMilanka Ringwald continue 128*02d4336aSMilanka Ringwald param = re.match(".*@result.*", line) 129*02d4336aSMilanka Ringwald if param: 130*02d4336aSMilanka Ringwald continue 131*02d4336aSMilanka Ringwald param = re.match(".*@note.*", line) 132*02d4336aSMilanka Ringwald if param: 133*02d4336aSMilanka Ringwald continue 134c8c342a6SMilanka Ringwald 135c8c342a6SMilanka Ringwald # search typedef struct begin 136d7ef0676SMilanka Ringwald if isTypedefStart(line): 137c8c342a6SMilanka Ringwald typedefFound = 1 138c8c342a6SMilanka Ringwald 139c8c342a6SMilanka Ringwald # search typedef struct end 140c8c342a6SMilanka Ringwald if typedefFound: 141755a206fSMatthias Ringwald typedef = re.match(r'}\s*(.*);\n', line) 142c8c342a6SMilanka Ringwald if typedef: 143c8c342a6SMilanka Ringwald typedefFound = 0 1442d21ec19SMilanka Ringwald typedefs[typedef.group(1)] = codeReference(typedef.group(1), githuburl, filename, api_filepath, linenr) 145c8c342a6SMilanka Ringwald continue 146c8c342a6SMilanka Ringwald 147755a206fSMatthias Ringwald ref_function = re.match(r'.*typedef\s+void\s+\(\s*\*\s*(.*?)\)\(.*', line) 148c8c342a6SMilanka Ringwald if ref_function: 1492d21ec19SMilanka Ringwald functions[ref_function.group(1)] = codeReference(ref_function.group(1), githuburl, filename, api_filepath, linenr) 150c8c342a6SMilanka Ringwald continue 151c8c342a6SMilanka Ringwald 152*02d4336aSMilanka Ringwald # filter callback 153*02d4336aSMilanka Ringwald callback_function_definition = re.match(r'(.*?)\s*\(\s*\*.*\(*.*;\n', line) 154*02d4336aSMilanka Ringwald if callback_function_definition: 155*02d4336aSMilanka Ringwald continue 156d7ef0676SMilanka Ringwald 157755a206fSMatthias Ringwald one_line_function_definition = re.match(r'(.*?)\s*\(.*\(*.*;\n', line) 158d7ef0676SMilanka Ringwald if one_line_function_definition: 159d7ef0676SMilanka Ringwald parts = one_line_function_definition.group(1).split(" "); 160c8c342a6SMilanka Ringwald name = parts[len(parts)-1] 161c8c342a6SMilanka Ringwald if len(name) == 0: 162c8c342a6SMilanka Ringwald print(parts); 163c8c342a6SMilanka Ringwald sys.exit(10) 164e4b84d01SMatthias Ringwald # ignore typedef for callbacks 165e4b84d01SMatthias Ringwald if parts[0] == 'typedef': 166e4b84d01SMatthias Ringwald continue 1672d21ec19SMilanka Ringwald functions[name] = codeReference( name, githuburl, filename, api_filepath, linenr) 168c8c342a6SMilanka Ringwald continue 169c8c342a6SMilanka Ringwald 170755a206fSMatthias Ringwald multi_line_function_definition = re.match(r'.(.*?)\s*\(.*\(*.*', line) 171d7ef0676SMilanka Ringwald if multi_line_function_definition: 172d7ef0676SMilanka Ringwald parts = multi_line_function_definition.group(1).split(" "); 173d7ef0676SMilanka Ringwald 174d7ef0676SMilanka Ringwald name = parts[len(parts)-1] 175c8c342a6SMilanka Ringwald if len(name) == 0: 176c8c342a6SMilanka Ringwald print(parts); 177c8c342a6SMilanka Ringwald sys.exit(10) 178c8c342a6SMilanka Ringwald multiline_function_def = 1 1792d21ec19SMilanka Ringwald functions[name] = codeReference(name, githuburl, filename, api_filepath, linenr) 180c8c342a6SMilanka Ringwald 181c8c342a6SMilanka Ringwald 182d7ef0676SMilanka Ringwalddef findTitle(fin): 183d7ef0676SMilanka Ringwald title = None 184d7ef0676SMilanka Ringwald desc = "" 185d7ef0676SMilanka Ringwald state = State.SearchTitle 186d7ef0676SMilanka Ringwald 187d7ef0676SMilanka Ringwald for line in fin: 188d7ef0676SMilanka Ringwald if state == State.SearchTitle: 189d7ef0676SMilanka Ringwald if isStartOfComment(line): 190d7ef0676SMilanka Ringwald continue 191d7ef0676SMilanka Ringwald 192755a206fSMatthias Ringwald parts = re.match(r'.*(@title)(.*)', line) 193d7ef0676SMilanka Ringwald if parts: 194d7ef0676SMilanka Ringwald title = parts.group(2).strip() 195d7ef0676SMilanka Ringwald state = State.SearchEndTitle 196d7ef0676SMilanka Ringwald continue 197d7ef0676SMilanka Ringwald 198d7ef0676SMilanka Ringwald if state == State.SearchEndTitle: 199d7ef0676SMilanka Ringwald if (isEndOfComment(line)): 200d7ef0676SMilanka Ringwald state = State.DoneAPI 201d7ef0676SMilanka Ringwald break 202d7ef0676SMilanka Ringwald 203755a206fSMatthias Ringwald parts = re.match(r'(\s*\*\s*)(.*\n)',line) 204d7ef0676SMilanka Ringwald if parts: 205d7ef0676SMilanka Ringwald desc = desc + parts.group(2) 2064a400a05SMilanka Ringwald return [title, desc] 207d7ef0676SMilanka Ringwald 208c8c342a6SMilanka Ringwalddef main(argv): 209d7ef0676SMilanka Ringwald global linenr, multiline_function_def, typedefFound, state 210d7ef0676SMilanka Ringwald 211c8c342a6SMilanka Ringwald mk_codeidentation = " " 212c8c342a6SMilanka Ringwald git_branch_name = "master" 213c8c342a6SMilanka Ringwald btstackfolder = "../../" 2142d21ec19SMilanka Ringwald githuburl_template = "https://github.com/bluekitchen/btstack/blob/" 2152d21ec19SMilanka Ringwald githuburl = "master/src/" 216c8c342a6SMilanka Ringwald markdownfolder = "docs-markdown/" 217c8c342a6SMilanka Ringwald 218c8c342a6SMilanka Ringwald cmd = 'markdown_create_apis.py [-r <root_btstackfolder>] [-g <githuburl>] [-o <output_markdownfolder>]' 219c8c342a6SMilanka Ringwald try: 220c8c342a6SMilanka Ringwald opts, args = getopt.getopt(argv,"r:g:o:",["rfolder=","github=","ofolder="]) 221c8c342a6SMilanka Ringwald except getopt.GetoptError: 222c8c342a6SMilanka Ringwald print (cmd) 223c8c342a6SMilanka Ringwald sys.exit(2) 224c8c342a6SMilanka Ringwald for opt, arg in opts: 225c8c342a6SMilanka Ringwald if opt == '-h': 226c8c342a6SMilanka Ringwald print (cmd) 227c8c342a6SMilanka Ringwald sys.exit() 228c8c342a6SMilanka Ringwald elif opt in ("-r", "--rfolder"): 229c8c342a6SMilanka Ringwald btstackfolder = arg 230c8c342a6SMilanka Ringwald elif opt in ("-g", "--github"): 231c8c342a6SMilanka Ringwald githuburl = arg 232c8c342a6SMilanka Ringwald elif opt in ("-o", "--ofolder"): 233c8c342a6SMilanka Ringwald markdownfolder = arg 234c8c342a6SMilanka Ringwald 235c8c342a6SMilanka Ringwald apifile = markdownfolder + "appendix/apis.md" 236c8c342a6SMilanka Ringwald # indexfile = markdownfolder + "api_index.md" 237d7ef0676SMilanka Ringwald btstack_srcfolder = btstackfolder + "src/" 238c8c342a6SMilanka Ringwald 239c8c342a6SMilanka Ringwald try: 240c8c342a6SMilanka Ringwald output = subprocess.check_output("git symbolic-ref --short HEAD", stderr=subprocess.STDOUT, timeout=3, shell=True) 241c8c342a6SMilanka Ringwald git_branch_name = output.decode().rstrip() 242c8c342a6SMilanka Ringwald except subprocess.CalledProcessError as exc: 243c8c342a6SMilanka Ringwald print('GIT branch name: failed to get, use default value \"%s\"" ', git_branch_name, exc.returncode, exc.output) 244c8c342a6SMilanka Ringwald else: 245c8c342a6SMilanka Ringwald print ('GIT branch name : %s' % git_branch_name) 246c8c342a6SMilanka Ringwald 2472d21ec19SMilanka Ringwald githuburl = githuburl_template + git_branch_name 248c8c342a6SMilanka Ringwald 249d7ef0676SMilanka Ringwald print ('BTstack src folder is : ' + btstack_srcfolder) 250c8c342a6SMilanka Ringwald print ('API file is : ' + apifile) 251c8c342a6SMilanka Ringwald print ('Github URL is : ' + githuburl) 252c8c342a6SMilanka Ringwald 2534a400a05SMilanka Ringwald # create a dictionary of header files {file_path : [title, description]} 2544a400a05SMilanka Ringwald # title and desctiption are extracted from the file 255d7ef0676SMilanka Ringwald for root, dirs, files in os.walk(btstack_srcfolder, topdown=True): 256d7ef0676SMilanka Ringwald for f in files: 257d7ef0676SMilanka Ringwald if not f.endswith(".h"): 258d7ef0676SMilanka Ringwald continue 259d7ef0676SMilanka Ringwald 2604a400a05SMilanka Ringwald if not root.endswith("/"): 2614a400a05SMilanka Ringwald root = root + "/" 262d7ef0676SMilanka Ringwald 2634a400a05SMilanka Ringwald header_filepath = root + f 264d7ef0676SMilanka Ringwald 2654a400a05SMilanka Ringwald with open(header_filepath, 'rt') as fin: 2664a400a05SMilanka Ringwald [header_title, header_desc] = findTitle(fin) 267d7ef0676SMilanka Ringwald 2684a400a05SMilanka Ringwald if header_title: 2694a400a05SMilanka Ringwald header_files[header_filepath] = [header_title, header_desc] 2704a400a05SMilanka Ringwald else: 2714a400a05SMilanka Ringwald print("No @title flag found. Skip %s" % header_filepath) 272d7ef0676SMilanka Ringwald 2732ea56b0cSMilanka Ringwald # create an >md file, for each header file in header_files dictionary 2744a400a05SMilanka Ringwald for header_filepath in sorted(header_files.keys()): 2752d21ec19SMilanka Ringwald filename = str(header_filepath) 2762d21ec19SMilanka Ringwald filename = filename.split("../../")[1] 2772d21ec19SMilanka Ringwald 2782ea56b0cSMilanka Ringwald filename_without_extension = filename_stem(header_filepath) # file name without .h 2792ea56b0cSMilanka Ringwald filetitle = header_files[header_filepath][0] 2802ea56b0cSMilanka Ringwald description = header_files[header_filepath][1] 2812ea56b0cSMilanka Ringwald 2822ea56b0cSMilanka Ringwald if len(description) > 1: 2832ea56b0cSMilanka Ringwald description = ": " + description 2842ea56b0cSMilanka Ringwald 2852ea56b0cSMilanka Ringwald header_description = api_description.replace("FILENAME", filename).replace("DESCRIPTION", description) 2862ea56b0cSMilanka Ringwald 2872ea56b0cSMilanka Ringwald header_title = api_header.replace("API_TITLE", filetitle).replace("API_LABEL", filename_without_extension) 2882ea56b0cSMilanka Ringwald markdown_filepath = markdownfolder + "appendix/" + filename_without_extension + ".md" 289d7ef0676SMilanka Ringwald 2904a400a05SMilanka Ringwald with open(header_filepath, 'rt') as fin: 2914a400a05SMilanka Ringwald with open(markdown_filepath, 'wt') as fout: 2924a400a05SMilanka Ringwald fout.write(header_title) 2934a400a05SMilanka Ringwald fout.write(header_description) 294d7ef0676SMilanka Ringwald writeAPI(fout, fin, mk_codeidentation) 295d7ef0676SMilanka Ringwald 2964a400a05SMilanka Ringwald with open(header_filepath, 'rt') as fin: 297d7ef0676SMilanka Ringwald linenr = 0 298d7ef0676SMilanka Ringwald typedefFound = 0 299d7ef0676SMilanka Ringwald multiline_function_def = 0 300d7ef0676SMilanka Ringwald state = State.SearchStartAPI 3012d21ec19SMilanka Ringwald createIndex(fin, filename, markdown_filepath, header_title, filename_without_extension, githuburl) 302d7ef0676SMilanka Ringwald 3034a400a05SMilanka Ringwald # add API list to the navigation menu 3044a400a05SMilanka Ringwald with open("mkdocs-temp.yml", 'rt') as fin: 3054a400a05SMilanka Ringwald with open("mkdocs.yml", 'wt') as fout: 3064a400a05SMilanka Ringwald for line in fin: 3074a400a05SMilanka Ringwald fout.write(line) 3084a400a05SMilanka Ringwald 3094a400a05SMilanka Ringwald if not isTagAPI(line): 3104a400a05SMilanka Ringwald continue 3114a400a05SMilanka Ringwald 3124a400a05SMilanka Ringwald identation = getSecondLevelIdentation(line) 3134a400a05SMilanka Ringwald 3144a400a05SMilanka Ringwald for header_filepath in sorted(header_files.keys()): 3152ea56b0cSMilanka Ringwald header_title = os.path.basename(header_filepath) 3164a400a05SMilanka Ringwald markdown_reference = "appendix/" + filename_stem(header_filepath) + ".md" 3174a400a05SMilanka Ringwald 3184a400a05SMilanka Ringwald fout.write(identation + "'" + header_title + "': " + markdown_reference + "\n") 319c8c342a6SMilanka Ringwald 32078fab72eSMilanka Ringwald 3212ea56b0cSMilanka Ringwald # create mkdocs-latex.yml with single appendix/apis.md reference for pdf generation 32278fab72eSMilanka Ringwald with open("mkdocs-temp.yml", 'rt') as fin: 32378fab72eSMilanka Ringwald with open("mkdocs-latex.yml", 'wt') as fout: 32478fab72eSMilanka Ringwald for line in fin: 32578fab72eSMilanka Ringwald if not isTagAPI(line): 32678fab72eSMilanka Ringwald fout.write(line) 32778fab72eSMilanka Ringwald continue 32878fab72eSMilanka Ringwald 32978fab72eSMilanka Ringwald fout.write(" - 'APIs': appendix/apis.md\n") 33078fab72eSMilanka Ringwald 3312ea56b0cSMilanka Ringwald # create single appendix/apis.md file for pdf generation 33278fab72eSMilanka Ringwald markdown_filepath = markdownfolder + "appendix/apis.md" 33378fab72eSMilanka Ringwald with open(markdown_filepath, 'wt') as fout: 33478fab72eSMilanka Ringwald fout.write("\n# APIs\n\n") 33578fab72eSMilanka Ringwald for header_filepath in sorted(header_files.keys()): 3362ea56b0cSMilanka Ringwald filename = os.path.basename(header_filepath) 3372ea56b0cSMilanka Ringwald filename_without_extension = filename_stem(header_filepath) # file name without 3382ea56b0cSMilanka Ringwald filetitle = header_files[header_filepath][0] 33978fab72eSMilanka Ringwald 3402ea56b0cSMilanka Ringwald description = header_files[header_filepath][1] 3412ea56b0cSMilanka Ringwald 3422ea56b0cSMilanka Ringwald if len(description) > 1: 3432ea56b0cSMilanka Ringwald description = ": " + description 3442ea56b0cSMilanka Ringwald 3452ea56b0cSMilanka Ringwald header_description = api_description.replace("FILENAME", filename).replace("DESCRIPTION", description) 3462ea56b0cSMilanka Ringwald 3472ea56b0cSMilanka Ringwald subheader_title = api_subheader.replace("API_TITLE", filetitle).replace("API_LABEL", filename_without_extension) 34878fab72eSMilanka Ringwald with open(header_filepath, 'rt') as fin: 34978fab72eSMilanka Ringwald fout.write(subheader_title) 35078fab72eSMilanka Ringwald fout.write(header_description) 35178fab72eSMilanka Ringwald writeAPI(fout, fin, mk_codeidentation) 35278fab72eSMilanka Ringwald 353c8c342a6SMilanka Ringwald 354c8c342a6SMilanka Ringwald references = functions.copy() 355c8c342a6SMilanka Ringwald references.update(typedefs) 356c8c342a6SMilanka Ringwald 357c8c342a6SMilanka Ringwald # with open(indexfile, 'w') as fout: 358c8c342a6SMilanka Ringwald # for function, reference in references.items(): 359c8c342a6SMilanka Ringwald # fout.write("[" + function + "](" + reference + ")\n") 360c8c342a6SMilanka Ringwald 361c8c342a6SMilanka Ringwald pickle.dump(references, open("references.p", "wb" ) ) 362c8c342a6SMilanka Ringwald 363c8c342a6SMilanka Ringwaldif __name__ == "__main__": 364c8c342a6SMilanka Ringwald main(sys.argv[1:]) 365