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