1c8c342a6SMilanka Ringwald#!/usr/bin/env python3 2c8c342a6SMilanka Ringwald 3c8c342a6SMilanka Ringwaldimport sys, os, shutil, getopt 4c8c342a6SMilanka Ringwaldimport re, yaml 594286028SMilanka Ringwaldimport subprocess 694286028SMilanka Ringwald 794286028SMilanka Ringwaldgithuburl = "https://github.com/bluekitchen/btstack/tree/" 894286028SMilanka Ringwaldgitbranchname = "master" 9c8c342a6SMilanka Ringwald 10c8c342a6SMilanka Ringwald# helper to write anchors and references 11c8c342a6SMilanka Ringwalddef insert_anchor(mdout, reference): 12c8c342a6SMilanka Ringwald anchor = "<a name=\"" + reference + "\"></a>\n\n" 13c8c342a6SMilanka Ringwald mdout.write(anchor) 14c8c342a6SMilanka Ringwald 15c8c342a6SMilanka Ringwalddef insert_reference(mdout, text, link): 16c8c342a6SMilanka Ringwald mdout.write("") 17c8c342a6SMilanka Ringwald 1894286028SMilanka Ringwalddef process_source_file_link(mdin, mdout, githuburl, line): 19*755a206fSMatthias Ringwald parts = re.match(r'.*(GITHUB_URL).*\n',line) 2094286028SMilanka Ringwald if parts: 2194286028SMilanka Ringwald line_with_source_file_link = line.replace("GITHUB_URL", githuburl) 2294286028SMilanka Ringwald mdout.write(line_with_source_file_link) 2394286028SMilanka Ringwald line = '' 2494286028SMilanka Ringwald return line 2594286028SMilanka Ringwald 26c8c342a6SMilanka Ringwald# handlers for various elements 27c8c342a6SMilanka Ringwalddef process_section(mdin, mdout, line): 28*755a206fSMatthias Ringwald section = re.match(r'(#+.*){#(sec:.*)}',line) 29c8c342a6SMilanka Ringwald if section: 30c8c342a6SMilanka Ringwald insert_anchor(mdout, section.group(2)) 31c8c342a6SMilanka Ringwald mdout.write(section.group(1)+"\n") 32c8c342a6SMilanka Ringwald line = '' 33c8c342a6SMilanka Ringwald return line 34c8c342a6SMilanka Ringwald 35c8c342a6SMilanka Ringwalddef process_figure(mdin, mdout, line): 36c8c342a6SMilanka Ringwald # detect figure 37*755a206fSMatthias Ringwald figure = re.match(r'\s*(\!.*)({#(fig:.*)})',line) 38c8c342a6SMilanka Ringwald if figure: 39c8c342a6SMilanka Ringwald insert_anchor(mdout, figure.group(3)) 40c8c342a6SMilanka Ringwald mdout.write(figure.group(1)+"\n") 41c8c342a6SMilanka Ringwald line = '' 42c8c342a6SMilanka Ringwald return line 43c8c342a6SMilanka Ringwald 44c8c342a6SMilanka Ringwalddef process_fig_ref(mdin, mdout, line): 45c8c342a6SMilanka Ringwald # detect figure reference 46*755a206fSMatthias Ringwald figure_ref = re.match(r'.*({@(fig:.*)})',line) 47c8c342a6SMilanka Ringwald if figure_ref: 48c8c342a6SMilanka Ringwald md_reference = "[below](#"+figure_ref.group(2)+")" 49c8c342a6SMilanka Ringwald line = line.replace(figure_ref.group(1), md_reference) 50c8c342a6SMilanka Ringwald mdout.write(line) 51c8c342a6SMilanka Ringwald line = '' 52c8c342a6SMilanka Ringwald return line 53c8c342a6SMilanka Ringwald 54c8c342a6SMilanka Ringwalddef process_table(mdin, mdout, line): 55c8c342a6SMilanka Ringwald # detect table 56*755a206fSMatthias Ringwald table = re.match(r'\s*(Table:.*)({#(tbl:.*)})',line) 57c8c342a6SMilanka Ringwald if table: 58c8c342a6SMilanka Ringwald insert_anchor(mdout, table.group(3)) 59c8c342a6SMilanka Ringwald mdout.write(table.group(1)+"\n") 60c8c342a6SMilanka Ringwald line = '' 61c8c342a6SMilanka Ringwald return line 62c8c342a6SMilanka Ringwald 63c8c342a6SMilanka Ringwalddef process_tbl_ref(mdin, mdout, line): 64*755a206fSMatthias Ringwald table_ref = re.match(r'.*({@(tbl:.*)})',line) 65c8c342a6SMilanka Ringwald if table_ref: 66c8c342a6SMilanka Ringwald md_reference = "[below](#"+table_ref.group(2)+")" 67c8c342a6SMilanka Ringwald line = line.replace(table_ref.group(1), md_reference) 68c8c342a6SMilanka Ringwald mdout.write(line) 69c8c342a6SMilanka Ringwald line = '' 70c8c342a6SMilanka Ringwald return line 71c8c342a6SMilanka Ringwald 72c8c342a6SMilanka Ringwalddef process_listing(mdin, mdout, line): 73*755a206fSMatthias Ringwald listing_start = re.match(r'.*{#(lst:.*)\s+.c\s+.*',line) 74*755a206fSMatthias Ringwald listing_end = re.match(r'\s*~~~~\s*\n',line) 75c8c342a6SMilanka Ringwald if listing_start: 76c8c342a6SMilanka Ringwald insert_anchor(mdout, listing_start.group(1)) 77c8c342a6SMilanka Ringwald line = '' 78c8c342a6SMilanka Ringwald elif listing_end: 79c8c342a6SMilanka Ringwald mdout.write("\n") 80c8c342a6SMilanka Ringwald line = '' 81c8c342a6SMilanka Ringwald return line 82c8c342a6SMilanka Ringwald 8394286028SMilanka Ringwalddef process_file(mk_file, markdownfolder, mkdocsfolder, githuburl): 846ec408b5SMilanka Ringwald source_file = markdownfolder +"/"+ mk_file 856ec408b5SMilanka Ringwald dest_file = mkdocsfolder +"/"+ mk_file 866ec408b5SMilanka Ringwald # print("Processing %s -> %s" % (source_file, dest_file)) 876ec408b5SMilanka Ringwald 886ec408b5SMilanka Ringwald with open(dest_file, 'wt') as mdout: 896ec408b5SMilanka Ringwald with open(source_file, 'rt') as mdin: 906ec408b5SMilanka Ringwald for line in mdin: 916ec408b5SMilanka Ringwald line = process_section(mdin, mdout, line) 926ec408b5SMilanka Ringwald if len(line) == 0: 936ec408b5SMilanka Ringwald continue 9494286028SMilanka Ringwald line = process_source_file_link(mdin, mdout, githuburl, line) 9594286028SMilanka Ringwald if len(line) == 0: 9694286028SMilanka Ringwald continue 976ec408b5SMilanka Ringwald line = process_figure(mdin, mdout, line) 986ec408b5SMilanka Ringwald if len(line) == 0: 996ec408b5SMilanka Ringwald continue 1006ec408b5SMilanka Ringwald line = process_fig_ref(mdin, mdout, line) 1016ec408b5SMilanka Ringwald if len(line) == 0: 1026ec408b5SMilanka Ringwald continue 1036ec408b5SMilanka Ringwald line = process_table(mdin, mdout, line) 1046ec408b5SMilanka Ringwald if len(line) == 0: 1056ec408b5SMilanka Ringwald continue 1066ec408b5SMilanka Ringwald line = process_tbl_ref(mdin, mdout, line) 1076ec408b5SMilanka Ringwald if len(line) == 0: 1086ec408b5SMilanka Ringwald continue 1096ec408b5SMilanka Ringwald line = process_listing(mdin, mdout, line) 1106ec408b5SMilanka Ringwald if len(line) == 0: 1116ec408b5SMilanka Ringwald continue 1126ec408b5SMilanka Ringwald mdout.write(line) 1136ec408b5SMilanka Ringwald 114c8c342a6SMilanka Ringwalddef main(argv): 115c8c342a6SMilanka Ringwald markdownfolder = "docs-markdown/" 116c8c342a6SMilanka Ringwald mkdocsfolder = "docs/" 117c8c342a6SMilanka Ringwald 11894286028SMilanka Ringwald cmd = 'markdown_update_references.py [-i <markdownfolder>] [-o <mkdocsfolder>] [-g <githuburl>]' 119c8c342a6SMilanka Ringwald 120c8c342a6SMilanka Ringwald try: 12194286028SMilanka Ringwald opts, args = getopt.getopt(argv,"i:o:g:",["ifolder=","ofolder=","github="]) 122c8c342a6SMilanka Ringwald except getopt.GetoptError: 123c8c342a6SMilanka Ringwald print (cmd) 124c8c342a6SMilanka Ringwald sys.exit(2) 125c8c342a6SMilanka Ringwald for opt, arg in opts: 126c8c342a6SMilanka Ringwald if opt == '-h': 127c8c342a6SMilanka Ringwald print (cmd) 128c8c342a6SMilanka Ringwald sys.exit() 129c8c342a6SMilanka Ringwald elif opt in ("-i", "--ifolder"): 130c8c342a6SMilanka Ringwald markdownfolder = arg 131c8c342a6SMilanka Ringwald elif opt in ("-o", "--ofolder"): 132c8c342a6SMilanka Ringwald mkdocsfolder = arg 13394286028SMilanka Ringwald elif opt in ("-g", "--github"): 13494286028SMilanka Ringwald githuburl = arg 13594286028SMilanka Ringwald 13694286028SMilanka Ringwald try: 13794286028SMilanka Ringwald output = subprocess.check_output("git symbolic-ref --short HEAD", stderr=subprocess.STDOUT, timeout=3, shell=True) 13894286028SMilanka Ringwald gitbranchname = output.decode().rstrip() 13994286028SMilanka Ringwald except subprocess.CalledProcessError as exc: 14094286028SMilanka Ringwald print('GIT branch name: failed to get, use default value \"%s\"" ', gitbranchname, exc.returncode, exc.output) 14194286028SMilanka Ringwald else: 14294286028SMilanka Ringwald print('GIT branch name: %s' % gitbranchname) 14394286028SMilanka Ringwald 14494286028SMilanka Ringwald githuburl = githuburl + gitbranchname 14594286028SMilanka Ringwald print('GITHUB URL: %s\n' % githuburl) 146c8c342a6SMilanka Ringwald 147c8c342a6SMilanka Ringwald yml_file = "mkdocs.yml" 148c8c342a6SMilanka Ringwald 149c8c342a6SMilanka Ringwald with open(yml_file, 'r') as yin: 150c8c342a6SMilanka Ringwald doc = yaml.load(yin, Loader=yaml.SafeLoader) 1516ec408b5SMilanka Ringwald 15278fab72eSMilanka Ringwald # page is either: 15378fab72eSMilanka Ringwald # - {title: filepath} dictionary for a direcr yml reference (e.g. - 'Welcome': index.md), or 15478fab72eSMilanka Ringwald # - {navigation_group_title: [{title: filepath}, ...] } dictionary for a navigation group 155c8c342a6SMilanka Ringwald for page in doc["nav"]: 1566ec408b5SMilanka Ringwald 15778fab72eSMilanka Ringwald # navigation_group_filepath is either: 15878fab72eSMilanka Ringwald # - filepath string for a direcr yml reference (e.g. - 'Welcome': index.md), or 15978fab72eSMilanka Ringwald # - list of [{title: filepath}, ...] dictionaries for each item in navigation group 16078fab72eSMilanka Ringwald navigation_group_filepath = list(page.values())[0] 16178fab72eSMilanka Ringwald 16278fab72eSMilanka Ringwald if type(navigation_group_filepath) == str: 16394286028SMilanka Ringwald process_file(navigation_group_filepath, markdownfolder, mkdocsfolder, githuburl) 164c8c342a6SMilanka Ringwald continue 1656ec408b5SMilanka Ringwald 16678fab72eSMilanka Ringwald if type(navigation_group_filepath) == list: 16778fab72eSMilanka Ringwald for file_description_dict in navigation_group_filepath: 16878fab72eSMilanka Ringwald filepath = list(file_description_dict.values())[0] 16994286028SMilanka Ringwald process_file(filepath, markdownfolder, mkdocsfolder, githuburl) 170c8c342a6SMilanka Ringwald continue 1716ec408b5SMilanka Ringwald 172c8c342a6SMilanka Ringwald 173c8c342a6SMilanka Ringwaldif __name__ == "__main__": 174c8c342a6SMilanka Ringwald main(sys.argv[1:]) 175