forked from Akuli/python-tutorial
-
Notifications
You must be signed in to change notification settings - Fork 1
/
update-readmes.py
executable file
·116 lines (89 loc) · 3.79 KB
/
update-readmes.py
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
#!/usr/bin/env python3
# This is free and unencumbered software released into the public
# domain.
# Anyone is free to copy, modify, publish, use, compile, sell, or
# distribute this software, either in source code form or as a
# compiled binary, for any purpose, commercial or non-commercial, and
# by any means.
# In jurisdictions that recognize copyright laws, the author or
# authors of this software dedicate any and all copyright interest in
# the software to the public domain. We make this dedication for the
# benefit of the public at large and to the detriment of our heirs
# and successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to
# this software under copyright law.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# For more information, please refer to <http://unlicense.org>
"""Generate basics/README.md and advanced/README.md."""
import os
import posixpath
import common
BEGINNING = """\
[comment]: # (This file is automatically generated. Don't edit this)
[comment]: # (file manually, run update-readmes.py instead.)
"""
def get_contents():
"""Read descriptions and contents lists from README.
Return a {chaptername: content} dictionary.
"""
result = {}
current_section = None
with open('README.md', 'r') as f:
# move to where the content list starts
while f.readline().strip() != "## List of contents":
pass
for line in f:
if line.startswith('### '):
# new section
current_section = common.header_link(line.lstrip('#').strip())
result[current_section] = line[2:] # one # instead of 3
elif line.startswith('## '):
# end of content lists
break
elif current_section is not None:
# we are currently in a section
result[current_section] += line
return result
def update_file(filename, content):
"""Make sure that a file contains the content.
Return True if the file changed and False if it didn't.
"""
try:
with open(filename, 'r') as f:
# ignore the end
old_content = f.read().split('\n***\n')[0].rstrip()
if old_content == content:
print("Has correct content:", filename)
return False
except FileNotFoundError:
# the file doesn't exist yet, we'll create it
pass
print("Writing new content:", filename)
with open(filename, 'w') as f:
print(content, file=f)
return True
def main():
something_changed = False
for directory, content in sorted(get_contents().items()):
if not os.path.exists(directory):
# something else under the list of contents than a chapter
# list, doesn't have a separate subdirectory
print("Not a directory:", directory)
continue
# the links that point to the subdir must now point to the
# current directory, so we fix that
content = BEGINNING + content.replace(directory + '/', '').rstrip()
path = os.path.join(directory, 'README.md')
this_changed = update_file(path, content)
something_changed = something_changed or this_changed
if something_changed:
print()
print("Run update-ends.py now so the files will have correct ends.")
if __name__ == '__main__':
main()