forked from cztomczak/cefpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapidocs.py
More file actions
138 lines (119 loc) · 5.23 KB
/
apidocs.py
File metadata and controls
138 lines (119 loc) · 5.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# Copyright (c) 2016 CEF Python, see the Authors file.
# All rights reserved. Licensed under BSD 3-clause license.
# Project website: https://github.com/cztomczak/cefpython
"""Generate API reference index in api/ directory and in root/README.md.
TODO:
- generate api/ docs from Cython sources
- generate API-index.md, a list of all modules/functions/classes/methods
and constants/global module variables
- generate API-categories.md: objects, handlers, settings, types
(eg. TerminationStatus, KeyEvent, KeyEventFlags)
"""
from common import *
import glob
import os
import re
def main():
"""Main entry point."""
api_links = generate_api_links()
update_api_index_file(api_links)
update_readme_file(api_links)
def update_api_index_file(api_links):
"""Create or update API-index.md file."""
contents = ("[API categories](API-categories.md#api-categories) | " +
"[API index](API-index.md#api-index)\n\n" +
"# API index\n\n")
contents += api_links
index_file = os.path.join(API_DIR, "API-index.md")
with open(index_file, "rb") as fo:
current_contents = fo.read().decode("utf-8")
if contents == current_contents:
print("No changes: %s/%s" % (os.path.basename(API_DIR),
os.path.basename(index_file)))
return
with open(index_file, "wb") as fo:
fo.write(contents.encode("utf-8"))
print("Updated: %s/%s" % (os.path.basename(API_DIR),
os.path.basename(index_file)))
def update_readme_file(api_links):
"""Update root/README.md with API categories and index links.
API categories are copied from API-categories.md which is
generated manually. """
api_links = api_links.replace("](", "](api/")
readme_file = os.path.join(ROOT_DIR, "README.md")
with open(readme_file, "rb") as fo:
readme_contents = fo.read().decode("utf-8")
contents = readme_contents
# Update API categories
categories_file = os.path.join(API_DIR, "API-categories.md")
with open(categories_file, "rb") as fo:
categories_contents = fo.read().decode("utf-8")
match = re.search(r"# API categories\s+(###[\s\S]+)",
categories_contents)
assert match and match.group(1), "Failed to parse API categories"
categories_contents = match.group(1)
categories_contents = categories_contents.replace("###", "####")
categories_contents = categories_contents.replace("](", "](api/")
re_find = r"### API categories[\s\S]+### API index"
assert re.search(re_find, readme_contents), ("API categories not found"
" in README")
contents = re.sub(re_find,
("### API categories\r\n\r\n{categories_contents}"
"\r\n### API index"
.format(categories_contents=categories_contents)),
contents)
# Update API index
re_find = (r"### API index\s+"
r"(\s*\*[ ]\[[^\r\n\[\]]+\]\([^\r\n()]+\)\s+)*")
assert re.search(re_find, readme_contents), ("API index not found"
" in README")
contents = re.sub(re_find,
("### API index\r\n\r\n{api_links}"
.format(api_links=api_links)),
contents)
if contents == readme_contents:
print("No changes: /%s" % (os.path.basename(readme_file)))
return
with open(readme_file, "wb") as fo:
fo.write(contents.encode("utf-8"))
print("Updated: /%s" % (os.path.basename(readme_file)))
def generate_api_links():
"""Generate API index with all modules / classes / functions."""
contents = ""
files = glob.glob(os.path.join(API_DIR, "*.md"))
files = sorted(files, key=lambda s: s.lower())
for file_ in files:
# Ignore API-index.md and API-categories.md files
if "API-" in file_:
continue
with open(file_, "rb") as fo:
md_contents = fo.read().decode("utf-8")
md_contents = re.sub(r"```[\s\S]+?```", "", md_contents)
matches = re.findall(r"^(#|###)\s+(.*)", md_contents,
re.MULTILINE)
for match in matches:
heading_level = match[0].strip()
title = match[1].strip()
title = title.strip()
if heading_level == "#":
indent = ""
link = os.path.basename(file_) + "#" + get_heading_hash(title)
elif heading_level == "###":
indent = " "
link = os.path.basename(file_) + "#" + get_heading_hash(title)
# hash generation needs complete title. Now we can strip some.
title = re.sub(r"\(.*", r"", title)
else:
assert False, "Heading level unsupported"
contents += (indent + "* " + "[%s](%s)\n" % (title, link))
return contents
def get_heading_hash(title):
"""Get a link hash for headings H1, H2, H3."""
hash_ = title.lower()
hash_ = re.sub(r"[^a-z0-9_\- ]+", r"", hash_)
hash_ = hash_.replace(" ", "-")
hash_ = re.sub(r"[-]+", r"-", hash_)
hash_ = re.sub(r"-$", r"", hash_)
return hash_
if __name__ == "__main__":
main()