Mercurial > kallithea
view scripts/docs-headings.py @ 8588:210e76d69b62
mysql: bump charset to to 'utf8mb4' to get full UTF-8 support
We used to use 'utf8', but in MySQL, this is just an alias for 'utf8mb3' which
isn't full unicode. 'utf8mb4' has less surprises (especially if used with the
'utf8mb4_unicode_ci' collation).
MySQL character sets for server, database, tables, and connection are set
independently. Until now, we have specified 'utf8' when creating tables to
overrule the database charset and in the default MySQL connection URL.
For existing databases, it is recommended to change encoding (and collation) by
altering the each of the tables inside it as described on
https://stackoverflow.com/questions/6115612/how-to-convert-an-entire-mysql-database-characterset-and-collation-to-utf-8 .
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Mon, 15 Jun 2020 16:57:20 +0200 |
parents | 4b68fbe195b6 |
children | 0a84ef075575 |
line wrap: on
line source
#!/usr/bin/env python3 """ 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(): filenames = subprocess.check_output(['hg', 'loc', 'set:**.rst+kallithea/i18n/how_to']).splitlines() for fn in filenames: fn = fn.decode() print('processing %s' % fn) s = open(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) open(fn, 'w').write(s) print(subprocess.check_output(['hg', 'diff'] + filenames)) if __name__ == '__main__': main()