xref: /btstack/doc/manual/markdown_create_ports.py (revision 47f34e0cffc2da3ae0dfdf6cba95f7f9d992eb2f)
1#!/usr/bin/env python3
2
3import sys, os, shutil, re,  getopt
4
5blacklist = []
6
7port_item = """
8- [PORT_TITLE](#sec:PORT_LABELPort)"""
9
10def get_readme_title(example_path):
11    title = ''
12    with open(example_path, 'r') as fin:
13        for line in fin:
14            parts = re.match(r'(##\s)(.*)\n',line)
15            if parts:
16                title = parts.group(2)
17                continue
18    return title
19
20# write list of examples
21def process_readmes(intro_file, port_folder, ports_file, ports_folder):
22    matches = {}
23    images  = {}
24
25    # iterate over port folders
26    ports = os.listdir(port_folder)
27    for port in ports:
28        if port not in blacklist:
29            readme_file = port_folder + "/" + port + "/" + "README.md"
30            if os.path.exists(readme_file):
31                matches[port] = readme_file
32                for file in os.listdir(port_folder + "/" + port):
33                    if file.endswith('.jpg') or file.endswith('.png'):
34                        images[file] =  port_folder + "/" + port + "/" + file
35
36    with open(ports_file, 'w') as ports:
37        with open(intro_file, 'r') as fin:
38            for line in fin:
39                ports.write(line)
40        fin.close()
41
42        for readme_dir, readme_file in sorted(matches.items()):
43            with open(readme_file, 'r') as fin:
44                for line in fin:
45                    # find title, add reference
46                    title_parts = re.match(r'(#\s+)(.*)\n',line)
47                    if title_parts:
48                        title = title_parts.group(2)
49                        ports.write(port_item.replace("PORT_TITLE", title).replace("PORT_LABEL", readme_dir))
50                        break
51        fin.close()
52        ports.write("\n\n")
53
54        for readme_dir, readme_file in sorted(matches.items()):
55            with open(readme_file, 'r') as fin:
56                for line in fin:
57                    #increase level of indentation
58                    parts = re.match(r'#(.*)\n',line)
59
60                    title_parts_level1 = re.match(r'(#\s+)(.*)\n',line)
61                    title_parts_level2 = re.match(r'(##\s+)(.*)\n',line)
62
63                    if parts and title_parts_level1:
64                        ports.write("## " + title_parts_level1.group(2) + " {" + "#sec:" + readme_dir + "Port}\n" )
65                    elif parts and title_parts_level2:
66                        ports.write("### " + title_parts_level2.group(2)+ "\n" )
67                    else:
68                        ports.write(line)
69
70        # copy images
71        for image_filename, image_path in images.items():
72            print('copy %s as %s' % (image_path, ports_folder + image_filename))
73            shutil.copy(image_path, ports_folder + image_filename)
74
75        fin.close()
76        ports.close()
77
78def main(argv):
79    btstackfolder = "../../"
80    markdownfolder = "docs-markdown/"
81    templatefolder    = "docs-intro/"
82
83    cmd = 'markdown_create_ports.py [-r <root_btstackfolder>] [-t <templatefolder>] [-o <output_markdownfolder>]'
84
85    try:
86        opts, args = getopt.getopt(argv,"r:t:o:",["rfolder=","tfolder=","ofolder="])
87    except getopt.GetoptError:
88        print (cmd)
89        sys.exit(2)
90    for opt, arg in opts:
91        if opt == '-h':
92            print (cmd)
93            sys.exit()
94        elif opt in ("-r", "--rfolder"):
95            btstackfolder = arg
96        elif opt in ("-t", "--tfolder"):
97            templatefolder = arg
98        elif opt in ("-o", "--ofolder"):
99            markdownfolder = arg
100
101
102    inputfolder = btstackfolder   + "port/"
103    portsfolder = markdownfolder      + "ports/"
104    introfile   = templatefolder + "ports_intro.md"
105    outputfile  = portsfolder     + "existing_ports.md"
106
107    print ('Input folder: ', inputfolder)
108    print ('Intro file:   ', introfile)
109    print ('Output file:  ', outputfile)
110
111    process_readmes(introfile, inputfolder, outputfile, portsfolder)
112
113if __name__ == "__main__":
114   main(sys.argv[1:])
115