mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
Fix toc.py line endings (for travis-ci)
This commit is contained in:
parent
d6c44f0ca4
commit
850ef245f3
178
tools/toc.py
178
tools/toc.py
@ -1,89 +1,89 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Usage: python3 toc.py [-n] files.md...
|
Usage: python3 toc.py [-n] files.md...
|
||||||
Replace a "## TOC" heading in a Markdown file with a table of contents,
|
Replace a "## TOC" heading in a Markdown file with a table of contents,
|
||||||
generated from the other headings in the file. Supports multiple files.
|
generated from the other headings in the file. Supports multiple files.
|
||||||
Headings must start with "##" signs to be detected.
|
Headings must start with "##" signs to be detected.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
toc_name = 'Contents'
|
toc_name = 'Contents'
|
||||||
valid_toc_headings = {'## TOC', '##TOC'}
|
valid_toc_headings = {'## TOC', '##TOC'}
|
||||||
|
|
||||||
TocItem = namedtuple('TocItem', ['name', 'anchor', 'level'])
|
TocItem = namedtuple('TocItem', ['name', 'anchor', 'level'])
|
||||||
punctuation_regexp = re.compile(r'[^\w\- ]+')
|
punctuation_regexp = re.compile(r'[^\w\- ]+')
|
||||||
|
|
||||||
def name_to_anchor(name):
|
def name_to_anchor(name):
|
||||||
# GitHub's algorithm for generating anchors from headings
|
# GitHub's algorithm for generating anchors from headings
|
||||||
# https://github.com/jch/html-pipeline/blob/master/lib/html/pipeline/toc_filter.rb
|
# https://github.com/jch/html-pipeline/blob/master/lib/html/pipeline/toc_filter.rb
|
||||||
anchor = name.strip().lower() # lowercase
|
anchor = name.strip().lower() # lowercase
|
||||||
anchor = re.sub(punctuation_regexp, '', anchor) # remove punctuation
|
anchor = re.sub(punctuation_regexp, '', anchor) # remove punctuation
|
||||||
anchor = anchor.replace(' ', '-') # replace spaces with dash
|
anchor = anchor.replace(' ', '-') # replace spaces with dash
|
||||||
return anchor
|
return anchor
|
||||||
|
|
||||||
def get_toc_index(lines):
|
def get_toc_index(lines):
|
||||||
toc_index = None
|
toc_index = None
|
||||||
for i, line in enumerate(lines):
|
for i, line in enumerate(lines):
|
||||||
if line.rstrip() in valid_toc_headings:
|
if line.rstrip() in valid_toc_headings:
|
||||||
toc_index = i
|
toc_index = i
|
||||||
break
|
break
|
||||||
return toc_index
|
return toc_index
|
||||||
|
|
||||||
def get_toc_items(lines, toc_index):
|
def get_toc_items(lines, toc_index):
|
||||||
for i, line in enumerate(lines):
|
for i, line in enumerate(lines):
|
||||||
if i <= toc_index:
|
if i <= toc_index:
|
||||||
continue
|
continue
|
||||||
if line.startswith('##'):
|
if line.startswith('##'):
|
||||||
name = line.lstrip('#')
|
name = line.lstrip('#')
|
||||||
level = len(line) - len(name) - len('##')
|
level = len(line) - len(name) - len('##')
|
||||||
name = name.strip()
|
name = name.strip()
|
||||||
anchor = name_to_anchor(name)
|
anchor = name_to_anchor(name)
|
||||||
yield TocItem(name, anchor, level)
|
yield TocItem(name, anchor, level)
|
||||||
|
|
||||||
def toc_string(toc_items):
|
def toc_string(toc_items):
|
||||||
lines = ['## %s' % toc_name, '']
|
lines = ['## %s' % toc_name, '']
|
||||||
for name, anchor, level in toc_items:
|
for name, anchor, level in toc_items:
|
||||||
padding = ' ' * level
|
padding = ' ' * level
|
||||||
line = '%s- [%s](#%s)' % (padding, name, anchor)
|
line = '%s- [%s](#%s)' % (padding, name, anchor)
|
||||||
lines.append(line)
|
lines.append(line)
|
||||||
return '\n'.join(lines) + '\n'
|
return '\n'.join(lines) + '\n'
|
||||||
|
|
||||||
def add_toc(filename):
|
def add_toc(filename):
|
||||||
with open(filename, 'r', encoding='utf-8') as f:
|
with open(filename, 'r', encoding='utf-8') as f:
|
||||||
lines = f.readlines()
|
lines = f.readlines()
|
||||||
toc_index = get_toc_index(lines)
|
toc_index = get_toc_index(lines)
|
||||||
if toc_index is None:
|
if toc_index is None:
|
||||||
return None # no TOC heading
|
return None # no TOC heading
|
||||||
toc_items = list(get_toc_items(lines, toc_index))
|
toc_items = list(get_toc_items(lines, toc_index))
|
||||||
if not toc_items:
|
if not toc_items:
|
||||||
return False # no content headings
|
return False # no content headings
|
||||||
with open(filename, 'w', encoding='utf-8') as f:
|
with open(filename, 'w', encoding='utf-8') as f:
|
||||||
for i, line in enumerate(lines):
|
for i, line in enumerate(lines):
|
||||||
if i == toc_index:
|
if i == toc_index:
|
||||||
f.write(toc_string(toc_items))
|
f.write(toc_string(toc_items))
|
||||||
else:
|
else:
|
||||||
f.write(line)
|
f.write(line)
|
||||||
return True # OK
|
return True # OK
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
if len(sys.argv) < 2:
|
if len(sys.argv) < 2:
|
||||||
print('*** ERROR: No filenames specified')
|
print('*** ERROR: No filenames specified')
|
||||||
print(__doc__)
|
print(__doc__)
|
||||||
exit(1)
|
exit(1)
|
||||||
for filename in sys.argv[1:]:
|
for filename in sys.argv[1:]:
|
||||||
print(filename)
|
print(filename)
|
||||||
result = add_toc(filename)
|
result = add_toc(filename)
|
||||||
if result is None:
|
if result is None:
|
||||||
print('*** WARNING: No "## TOC" heading found')
|
print('*** WARNING: No "## TOC" heading found')
|
||||||
elif result is False:
|
elif result is False:
|
||||||
print('*** WARNING: No content headings found')
|
print('*** WARNING: No content headings found')
|
||||||
else:
|
else:
|
||||||
print('OK')
|
print('OK')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
Loading…
Reference in New Issue
Block a user