xref: /btstack/doc/manual/markdown_update_references.py (revision 755a206fbe3717216f0870fb1cf403304d39d032)
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