docs-headings.py
83 lines
| 2.6 KiB
| text/x-python
|
PythonLexer
/ scripts / docs-headings.py
Mads Kiilerich
|
r5537 | #!/usr/bin/env python2 | ||
""" | ||||
Consistent formatting of rst section titles | ||||
""" | ||||
Mads Kiilerich
|
r7750 | from __future__ import print_function | ||
Mads Kiilerich
|
r5537 | import re | ||
import subprocess | ||||
Mads Kiilerich
|
r7718 | |||
Mads Kiilerich
|
r5537 | spaces = [ | ||
(0, 1), # we assume this is a over-and-underlined header | ||||
(2, 1), | ||||
(1, 1), | ||||
(1, 0), | ||||
(1, 0), | ||||
] | ||||
Mads Kiilerich
|
r5568 | # http://sphinx-doc.org/rest.html : | ||
# for the Python documentation, this convention is used which you may follow: | ||||
# # with overline, for parts | ||||
# * with overline, for chapters | ||||
# =, for sections | ||||
# -, for subsections | ||||
# ^, for subsubsections | ||||
# ", for paragraphs | ||||
pystyles = ['#', '*', '=', '-', '^', '"'] | ||||
Mads Kiilerich
|
r5537 | # match on a header line underlined with one of the valid characters | ||
headermatch = re.compile(r'''\n*(.+)\n([][!"#$%&'()*+,./:;<=>?@\\^_`{|}~-])\2{2,}\n+''', flags=re.MULTILINE) | ||||
def main(): | ||||
Thomas De Schampheleire
|
r7419 | filenames = subprocess.check_output(['hg', 'loc', 'set:**.rst+kallithea/i18n/how_to']).splitlines() | ||
for fn in filenames: | ||||
Mads Kiilerich
|
r7750 | print('processing %s' % fn) | ||
Lars Kruse
|
r6785 | s = open(fn).read() | ||
Mads Kiilerich
|
r5537 | |||
# find levels and their styles | ||||
lastpos = 0 | ||||
styles = [] | ||||
for markup in headermatch.findall(s): | ||||
style = markup[1] | ||||
if style in styles: | ||||
stylepos = styles.index(style) | ||||
if stylepos > lastpos + 1: | ||||
Mads Kiilerich
|
r7750 | print('bad style %r with level %s - was at %s' % (style, stylepos, lastpos)) | ||
Mads Kiilerich
|
r5537 | else: | ||
stylepos = len(styles) | ||||
if stylepos > lastpos + 1: | ||||
Mads Kiilerich
|
r7750 | print('bad new style %r - expected %r' % (style, styles[lastpos + 1])) | ||
Mads Kiilerich
|
r5537 | else: | ||
styles.append(style) | ||||
lastpos = stylepos | ||||
# remove superfluous spacing (may however be restored by header spacing) | ||||
s = re.sub(r'''(\n\n)\n*''', r'\1', s, flags=re.MULTILINE) | ||||
Mads Kiilerich
|
r5568 | if styles: | ||
newstyles = pystyles[pystyles.index(styles[0]):] | ||||
def subf(m): | ||||
title, style = m.groups() | ||||
level = styles.index(style) | ||||
before, after = spaces[level] | ||||
newstyle = newstyles[level] | ||||
return '\n' * (before + 1) + title + '\n' + newstyle * len(title) + '\n' * (after + 1) | ||||
s = headermatch.sub(subf, s) | ||||
Mads Kiilerich
|
r5537 | |||
# remove superfluous spacing when headers are adjacent | ||||
s = re.sub(r'''(\n.+\n([][!"#$%&'()*+,./:;<=>?@\\^_`{|}~-])\2{2,}\n\n\n)\n*''', r'\1', s, flags=re.MULTILINE) | ||||
# fix trailing space and spacing before link sections | ||||
s = s.strip() + '\n' | ||||
s = re.sub(r'''\n+((?:\.\. _[^\n]*\n)+)$''', r'\n\n\n\1', s) | ||||
Lars Kruse
|
r6785 | open(fn, 'w').write(s) | ||
Thomas De Schampheleire
|
r7419 | |||
Mads Kiilerich
|
r7750 | print(subprocess.check_output(['hg', 'diff'] + filenames)) | ||
Mads Kiilerich
|
r5537 | |||
if __name__ == '__main__': | ||||
main() | ||||