2021-05-19 07:55:26 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
import os, sys, getopt, re
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
class State:
|
|
|
|
SearchIntro = 0
|
|
|
|
IntroFound = 1
|
|
|
|
SearchAPI = 2
|
|
|
|
|
|
|
|
mdfiles = {
|
|
|
|
# source file sufix : docu file, [white list od source files]
|
|
|
|
"_server.h" : ["gatt_services.md", ["hids_device.h"]],
|
|
|
|
"_client.h" : ["gatt_clients.md", []]
|
|
|
|
}
|
|
|
|
|
|
|
|
abrevations = {
|
|
|
|
"Ancs" : "ANCS",
|
|
|
|
"Hids" : "HIDS",
|
|
|
|
"Ublox": "u-blox",
|
|
|
|
"Spp" : "SPP",
|
|
|
|
"And" : "and"
|
|
|
|
}
|
|
|
|
|
|
|
|
description_template = """
|
2021-05-21 15:53:16 +00:00
|
|
|
## NAME {#sec:REFERENCE}
|
2021-05-19 07:55:26 +00:00
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
description_api = """
|
|
|
|
|
2023-03-03 10:19:29 +00:00
|
|
|
See [NAME API](../appendix/apis/#REFERENCE).
|
2021-05-19 07:55:26 +00:00
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
def isEmptyCommentLine(line):
|
2024-03-28 21:57:38 +00:00
|
|
|
return re.match(r'(\s*\*\s*)\n',line)
|
2021-05-19 07:55:26 +00:00
|
|
|
|
|
|
|
def isCommentLine(line):
|
2024-03-28 21:57:38 +00:00
|
|
|
return re.match(r'(\s*\*\s*).*',line)
|
2021-05-19 07:55:26 +00:00
|
|
|
|
|
|
|
def isEndOfComment(line):
|
2024-03-28 21:57:38 +00:00
|
|
|
return re.match(r'\s*\*/.*', line)
|
2021-05-19 07:55:26 +00:00
|
|
|
|
|
|
|
def isNewItem(line):
|
2024-03-28 21:57:38 +00:00
|
|
|
return re.match(r'(\s*\*\s*\-\s*)(.*)',line)
|
2021-05-19 07:55:26 +00:00
|
|
|
|
|
|
|
def isTextTag(line):
|
2024-03-28 21:57:38 +00:00
|
|
|
return re.match(r'.*(@text).*', line)
|
2021-05-19 07:55:26 +00:00
|
|
|
|
|
|
|
def isItemizeTag(line):
|
2024-03-28 21:57:38 +00:00
|
|
|
return re.match(r'(\s+\*\s+)(-\s)(.*)', line)
|
2021-05-19 07:55:26 +00:00
|
|
|
|
|
|
|
def processTextLine(line):
|
|
|
|
if isEmptyCommentLine(line):
|
|
|
|
return "\n\n"
|
|
|
|
|
|
|
|
line.rstrip()
|
|
|
|
|
2024-03-28 22:22:53 +00:00
|
|
|
# add missing https://
|
|
|
|
line = line.replace("developer.apple.com","https://developer.apple.com")
|
|
|
|
|
2021-05-19 07:55:26 +00:00
|
|
|
if isTextTag(line):
|
2024-03-28 21:57:38 +00:00
|
|
|
text_line_parts = re.match(r'.*(@text\s*)(.*)', line)
|
2021-05-19 07:55:26 +00:00
|
|
|
return text_line_parts.group(2).lstrip() + " "
|
|
|
|
|
|
|
|
if isItemizeTag(line):
|
2024-03-28 21:57:38 +00:00
|
|
|
text_line_parts = re.match(r'(\s*\*\s*\-\s*)(.*)', line)
|
2021-05-19 07:55:26 +00:00
|
|
|
return "- " + text_line_parts.group(2)
|
|
|
|
|
|
|
|
if isEmptyCommentLine(line):
|
|
|
|
return "\n"
|
|
|
|
|
2024-03-28 21:57:38 +00:00
|
|
|
text_line_parts = re.match(r'(\s+\*\s+)(.*)', line)
|
2021-05-19 07:55:26 +00:00
|
|
|
if text_line_parts:
|
|
|
|
return text_line_parts.group(2) + " "
|
|
|
|
return ""
|
|
|
|
|
|
|
|
def handle_abrevations(basename):
|
|
|
|
name_parts = [item.capitalize() for item in basename.split("_")]
|
|
|
|
for i in range(len(name_parts)):
|
|
|
|
try:
|
|
|
|
name_parts[i] = abrevations[name_parts[i]]
|
|
|
|
except KeyError:
|
|
|
|
continue
|
|
|
|
|
|
|
|
return " ".join(name_parts)
|
|
|
|
|
|
|
|
|
|
|
|
def process_file(basename, inputfile_path, outputfile_path):
|
|
|
|
reference = basename.replace("_", "-")
|
|
|
|
name = handle_abrevations(basename)
|
|
|
|
|
|
|
|
title = description_template.replace("NAME", name).replace("REFERENCE", reference)
|
|
|
|
api = description_api.replace("NAME", name).replace("REFERENCE", reference)
|
|
|
|
|
|
|
|
text_block = ""
|
|
|
|
with open(inputfile_path, 'r') as fin:
|
|
|
|
state = State.SearchIntro
|
|
|
|
for line in fin:
|
|
|
|
if state == State.SearchIntro:
|
|
|
|
if isTextTag(line):
|
|
|
|
state = State.IntroFound
|
|
|
|
text_block = text_block + processTextLine(line)
|
|
|
|
continue
|
|
|
|
|
|
|
|
if state == State.IntroFound:
|
|
|
|
text_block = text_block + processTextLine(line)
|
|
|
|
|
|
|
|
if isEndOfComment(line):
|
|
|
|
state = State.SearchIntro
|
|
|
|
fin.close()
|
|
|
|
|
|
|
|
with open(outputfile_path, 'a+') as fout:
|
|
|
|
fout.write(title)
|
|
|
|
fout.write(text_block)
|
|
|
|
fout.write(api)
|
|
|
|
fout.close()
|
|
|
|
|
|
|
|
def main(argv):
|
2021-05-27 12:45:58 +00:00
|
|
|
btstackfolder = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../../')
|
|
|
|
inputfolder = btstackfolder + "/src/ble/gatt-service/"
|
|
|
|
|
|
|
|
markdownfolder = "docs-markdown/"
|
|
|
|
templatefolder = "docs-intro/"
|
|
|
|
|
2021-05-27 13:01:29 +00:00
|
|
|
cmd = 'markdown_create_gatt_services_and_clients.py [-r <root_btstackfolder>] [-t <templatefolder>] [-o <output_markdownfolder>]'
|
2021-05-27 12:45:58 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
opts, args = getopt.getopt(argv,"r:t:o:",["rfolder=","tfolder=","ofolder="])
|
|
|
|
except getopt.GetoptError:
|
|
|
|
print (cmd)
|
|
|
|
sys.exit(2)
|
|
|
|
for opt, arg in opts:
|
|
|
|
if opt == '-h':
|
|
|
|
print (cmd)
|
|
|
|
sys.exit()
|
|
|
|
elif opt in ("-r", "--rfolder"):
|
|
|
|
btstackfolder = arg
|
|
|
|
elif opt in ("-t", "--tfolder"):
|
|
|
|
templatefolder = arg
|
|
|
|
elif opt in ("-o", "--ofolder"):
|
|
|
|
markdownfolder = arg
|
|
|
|
|
|
|
|
|
2021-05-19 07:55:26 +00:00
|
|
|
for source_filename_sufix, [outputfile, white_list] in mdfiles.items():
|
2021-05-27 12:45:58 +00:00
|
|
|
outputfile_path = markdownfolder + outputfile
|
|
|
|
introfile_path = templatefolder + outputfile[:-3] + "_intro.md"
|
2021-05-19 07:55:26 +00:00
|
|
|
|
|
|
|
with open(outputfile_path, 'w') as fout:
|
|
|
|
with open(introfile_path, 'r') as fin:
|
|
|
|
for line in fin:
|
|
|
|
fout.write(line)
|
|
|
|
|
|
|
|
fin.close()
|
|
|
|
fout.close()
|
|
|
|
|
|
|
|
files_to_process = []
|
|
|
|
for root, dirs, files in os.walk(inputfolder, topdown=True):
|
|
|
|
for f in files:
|
|
|
|
if not f.endswith(source_filename_sufix):
|
|
|
|
if f not in white_list:
|
|
|
|
continue
|
|
|
|
files_to_process.append(root + "/"+ f)
|
|
|
|
|
|
|
|
files_to_process.sort()
|
|
|
|
|
|
|
|
for inputfile_path in files_to_process:
|
|
|
|
basename = os.path.basename(inputfile_path)[:-2]
|
|
|
|
process_file(basename, inputfile_path, outputfile_path)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main(sys.argv[1:])
|