Mercurial > kallithea
view scripts/docs-headings.py @ 6226:590d5b7a2b26
db: do case-insensitive explicit sorting of RepoGroup names
This does not change the implicit sorting enabled via __mapper_args__,
which is a bad idea anyway (and now deprecated), and will have to be
dealt with in a later changeset.
The use of __mapper_args__ implicitly adds sorting to every query of
RepoGroup objects throughout the code (including implicit queries via
relationships). For the relationships, __mapper_args can be replaced
with "order_by" on each individual relationship, and it's reasonably
straight-forward to identify every RepoGroup query throughout the code,
and add explicit sorting. But we don't really need that sorting most
of the time, so a better way forward may be to identify all the places
that actually needs the sorting, make it explicit there, and then kill
the __mapper_args__. (Anyway, future work.)
author | Søren Løvborg <sorenl@unity3d.com> |
---|---|
date | Thu, 15 Sep 2016 15:13:27 +0200 |
parents | ed2fb6e84a02 |
children | 665dfa112f2c |
line wrap: on
line source
#!/usr/bin/env python2 """ Consistent formatting of rst section titles """ import re import subprocess spaces = [ (0, 1), # we assume this is a over-and-underlined header (2, 1), (1, 1), (1, 0), (1, 0), ] # 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 = ['#', '*', '=', '-', '^', '"'] # 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(): for fn in subprocess.check_output(['hg', 'loc', 'set:**.rst+kallithea/i18n/how_to']).splitlines(): print 'processing %s:' % fn s = file(fn).read() # 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: print 'bad style %r with level %s - was at %s' % (style, stylepos, lastpos) else: stylepos = len(styles) if stylepos > lastpos + 1: print 'bad new style %r - expected %r' % (style, styles[lastpos + 1]) 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) 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) # 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) file(fn, 'w').write(s) print subprocess.check_output(['hg', 'diff', fn]) print if __name__ == '__main__': main()