xref: /btstack/doc/manual/markdown2tex.py (revision 26a2227cfdfb8761fa28ae3e147fd17cefe40bff)
13789dc73SMatthias Ringwald#!/usr/bin/env python3
24f9c2a86SMatthias Ringwald
34f9c2a86SMatthias Ringwaldimport sys, yaml
478fab72eSMilanka Ringwaldimport os, re, getopt
578fab72eSMilanka Ringwald
678fab72eSMilanka Ringwaldpandoc_cmd_template = """
778fab72eSMilanka Ringwaldpandoc -f markdown -t latex --filter pandoc-fignos --filter pandoc-tablenos --listings LATEX_FOLDERbtstack_generated.md -o LATEX_FOLDERbtstack_generated.tex
878fab72eSMilanka Ringwald
978fab72eSMilanka Ringwald"""
104f9c2a86SMatthias Ringwald
114f9c2a86SMatthias Ringwaldfigures = {
124f9c2a86SMatthias Ringwald    'btstack-architecture'     : '1',
134f9c2a86SMatthias Ringwald    'singlethreading-btstack'  : '0.3',
144f9c2a86SMatthias Ringwald    'multithreading-monolithic': '0.8',
154f9c2a86SMatthias Ringwald    'multithreading-btdaemon'  : '0.8',
164f9c2a86SMatthias Ringwald    'btstack-protocols'        : '0.8'
174f9c2a86SMatthias Ringwald}
184f9c2a86SMatthias Ringwald
194f9c2a86SMatthias Ringwald
204f9c2a86SMatthias Ringwalddef fix_empty_href(line):
21755a206fSMatthias Ringwald    corr = re.match(r'.*(href{}).*',line)
224f9c2a86SMatthias Ringwald    if corr:
234f9c2a86SMatthias Ringwald        line = line.replace(corr.group(1), "path")
244f9c2a86SMatthias Ringwald    return line
254f9c2a86SMatthias Ringwald
264f9c2a86SMatthias Ringwald
274f9c2a86SMatthias Ringwalddef fix_listing_after_section(line):
28755a206fSMatthias Ringwald    corr = re.match(r'.*begin{lstlisting}',line)
294f9c2a86SMatthias Ringwald    if corr:
304f9c2a86SMatthias Ringwald        line = "\leavevmode" + line
314f9c2a86SMatthias Ringwald    return line
324f9c2a86SMatthias Ringwald
334f9c2a86SMatthias Ringwalddef fix_listing_hyperref_into_ref(line):
34*26a2227cSMatthias Ringwald    corr = re.match(r'(.*\\)hyperref\[(lst:.*)\]{.*}(.*)',line)
354f9c2a86SMatthias Ringwald    if corr:
364f9c2a86SMatthias Ringwald        line = corr.group(1)+"ref{" + corr.group(2) +"} " + corr.group(3)
374f9c2a86SMatthias Ringwald    return line
384f9c2a86SMatthias Ringwald
394f9c2a86SMatthias Ringwald
404f9c2a86SMatthias Ringwalddef fix_figure_width_and_type(line):
414f9c2a86SMatthias Ringwald    global figures
424f9c2a86SMatthias Ringwald    for name, width in figures.items():
43755a206fSMatthias Ringwald        corr = re.match(r'(.*includegraphics)(.*'+name+'.*)',line)
444f9c2a86SMatthias Ringwald        if corr:
454f9c2a86SMatthias Ringwald            line = corr.group(1) + '[width='+width+'\\textwidth]' + corr.group(2).replace('png','pdf')
464f9c2a86SMatthias Ringwald    return line
474f9c2a86SMatthias Ringwald
484f9c2a86SMatthias Ringwald
494f9c2a86SMatthias Ringwalddef fix_appendix_pagebreak(line):
50755a206fSMatthias Ringwald    corr = re.match(r'.*section{APIs}.*',line)
514f9c2a86SMatthias Ringwald    if corr:
524f9c2a86SMatthias Ringwald        line = "\leavevmode\pagebreak\n" + line
534f9c2a86SMatthias Ringwald    return line
544f9c2a86SMatthias Ringwald
554f9c2a86SMatthias Ringwalddef fix_tightlist(line):
564f9c2a86SMatthias Ringwald    if 'tightlist' in line:
574f9c2a86SMatthias Ringwald        return ''
584f9c2a86SMatthias Ringwald    else:
594f9c2a86SMatthias Ringwald        return line
604f9c2a86SMatthias Ringwald
6178fab72eSMilanka Ringwalddef postprocess_file(markdown_filepath, fout, title):
6278fab72eSMilanka Ringwald    with open(markdown_filepath, 'r') as fin:
6378fab72eSMilanka Ringwald        for line in fin:
640db2ac53SMilanka Ringwald            if line == "#\n":
6578fab72eSMilanka Ringwald                fout.write("\n\n#"+ title +"\n\n")
660db2ac53SMilanka Ringwald                continue
674f9c2a86SMatthias Ringwald            # remove path from section reference
684f9c2a86SMatthias Ringwald            # e.g. [the SPP Counter example](examples/generated/#sec:sppcounterExample)
694f9c2a86SMatthias Ringwald            # replace with [the SPP Counter example](#sec:sppcounterExample)
70755a206fSMatthias Ringwald            section_ref = re.match(r'.*\(((.*)(#sec:.*))\).*',line)
714f9c2a86SMatthias Ringwald            if section_ref:
724f9c2a86SMatthias Ringwald                line = line.replace(section_ref.group(2),"")
7378fab72eSMilanka Ringwald            fout.write(line)
744f9c2a86SMatthias Ringwald
7578fab72eSMilanka Ringwalddef main(argv):
7678fab72eSMilanka Ringwald    yml_file = "mkdocs.yml"
7778fab72eSMilanka Ringwald    latexfolder = "latex/"
7878fab72eSMilanka Ringwald    mkdocsfolder = "docs/"
7978fab72eSMilanka Ringwald
8078fab72eSMilanka Ringwald    cmd = 'markdown2tex.py [-i <mkdocsfolder>] [-o <latexfolder>] '
8178fab72eSMilanka Ringwald
8278fab72eSMilanka Ringwald    try:
8378fab72eSMilanka Ringwald        opts, args = getopt.getopt(argv,"i:o:",["ifolder=","ofolder="])
8478fab72eSMilanka Ringwald    except getopt.GetoptError:
8578fab72eSMilanka Ringwald        print (cmd)
8678fab72eSMilanka Ringwald        sys.exit(2)
8778fab72eSMilanka Ringwald    for opt, arg in opts:
8878fab72eSMilanka Ringwald        if opt == '-h':
8978fab72eSMilanka Ringwald            print (cmd)
9078fab72eSMilanka Ringwald            sys.exit()
9178fab72eSMilanka Ringwald        elif opt in ("-i", "--ifolder"):
9278fab72eSMilanka Ringwald            mkdocsfolder = arg
9378fab72eSMilanka Ringwald        elif opt in ("-o", "--ofolder"):
9478fab72eSMilanka Ringwald            latexfolder = arg
9578fab72eSMilanka Ringwald
9678fab72eSMilanka Ringwald    latex_filepath = latexfolder + "btstack_generated.md"
9778fab72eSMilanka Ringwald
9878fab72eSMilanka Ringwald    with open(latex_filepath, 'wt') as fout:
9978fab72eSMilanka Ringwald        with open(yml_file, 'rt') as yin:
10078fab72eSMilanka Ringwald            doc = yaml.load(yin, Loader=yaml.SafeLoader)
10178fab72eSMilanka Ringwald            for page in doc["nav"]:
10278fab72eSMilanka Ringwald                navigation_group_filepath = list(page.values())[0]
10378fab72eSMilanka Ringwald                navigation_group_title = list(page.keys())[0]
10478fab72eSMilanka Ringwald                markdown_filepath = mkdocsfolder + navigation_group_filepath
10578fab72eSMilanka Ringwald                postprocess_file(markdown_filepath, fout, navigation_group_title)
10678fab72eSMilanka Ringwald
10778fab72eSMilanka Ringwald    pandoc_cmd = pandoc_cmd_template.replace("LATEX_FOLDER", latexfolder)
10878fab72eSMilanka Ringwald
1094f9c2a86SMatthias Ringwald    p = os.popen(pandoc_cmd,"r")
1104f9c2a86SMatthias Ringwald    while 1:
1114f9c2a86SMatthias Ringwald        line = p.readline()
1124f9c2a86SMatthias Ringwald        if not line: break
1133789dc73SMatthias Ringwald        print (line)
1144f9c2a86SMatthias Ringwald
1154f9c2a86SMatthias Ringwald
1164f9c2a86SMatthias Ringwald    # btstatck_root_file = "latex/btstack_gettingstarted.tex"
11778fab72eSMilanka Ringwald    btstack_generated_file = latexfolder + "btstack_generated.tex"
11878fab72eSMilanka Ringwald    btstack_final_file = latexfolder + "btstack_final.tex"
1194f9c2a86SMatthias Ringwald
1204f9c2a86SMatthias Ringwald    with open(btstack_final_file, 'w') as aout:
1214f9c2a86SMatthias Ringwald        aout.write("% !TEX root = btstack_gettingstarted.tex\n\n")
1224f9c2a86SMatthias Ringwald
1234f9c2a86SMatthias Ringwald        with open(btstack_generated_file, 'r') as fin:
1244f9c2a86SMatthias Ringwald            for line in fin:
1254f9c2a86SMatthias Ringwald                line = fix_empty_href(line)
1264f9c2a86SMatthias Ringwald                line = fix_listing_after_section(line)
1274f9c2a86SMatthias Ringwald                line = fix_listing_hyperref_into_ref(line)
1284f9c2a86SMatthias Ringwald                line = fix_figure_width_and_type(line)
1294f9c2a86SMatthias Ringwald                line = fix_appendix_pagebreak(line)
1304f9c2a86SMatthias Ringwald                line = fix_tightlist(line)
1314f9c2a86SMatthias Ringwald                aout.write(line)
1324f9c2a86SMatthias Ringwald
1334f9c2a86SMatthias Ringwald
1344f9c2a86SMatthias Ringwaldif __name__ == "__main__":
1354f9c2a86SMatthias Ringwald    main(sys.argv[1:])
136