|
@@ -1,22 +1,35 @@
|
|
|
#!/usr/bin/env python
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+from __future__ import print_function, unicode_literals
|
|
|
+
|
|
|
+import codecs
|
|
|
import os
|
|
|
import re
|
|
|
import sys
|
|
|
|
|
|
from collections import Callable
|
|
|
|
|
|
-dirname = ""
|
|
|
+dirname = ''
|
|
|
|
|
|
RE_CODE_BLOCK = re.compile(r'.. code-block:: (.+?)\s*$')
|
|
|
RE_INCLUDE = re.compile(r'.. include:: (.+?)\s*$')
|
|
|
RE_REFERENCE = re.compile(r':(.+?):`(.+?)`')
|
|
|
+UNITABLE = {'…': '...'}
|
|
|
+X = re.compile(re.escape('…'))
|
|
|
+HEADER = re.compile('^[\=\~\-]+$')
|
|
|
+UNIRE = re.compile('|'.join(re.escape(p) for p in UNITABLE),
|
|
|
+ re.UNICODE)
|
|
|
+
|
|
|
+
|
|
|
+def _replace_handler(match, key=UNITABLE.__getitem__):
|
|
|
+ return key(match.group(0))
|
|
|
|
|
|
|
|
|
def include_file(lines, pos, match):
|
|
|
global dirname
|
|
|
orig_filename = match.groups()[0]
|
|
|
filename = os.path.join(dirname, orig_filename)
|
|
|
- fh = open(filename)
|
|
|
+ fh = codecs.open(filename, encoding='utf-8')
|
|
|
try:
|
|
|
old_dirname = dirname
|
|
|
dirname = os.path.dirname(orig_filename)
|
|
@@ -28,8 +41,19 @@ def include_file(lines, pos, match):
|
|
|
fh.close()
|
|
|
|
|
|
|
|
|
+def asciify(lines):
|
|
|
+ prev_diff = None
|
|
|
+ for line in lines:
|
|
|
+ new_line = UNIRE.sub(_replace_handler, line)
|
|
|
+ if prev_diff and HEADER.match(new_line):
|
|
|
+ new_line = ''.join([
|
|
|
+ new_line.rstrip(), new_line[0] * prev_diff, '\n'])
|
|
|
+ prev_diff = len(new_line) - len(line)
|
|
|
+ yield new_line.encode('ascii')
|
|
|
+
|
|
|
+
|
|
|
def replace_code_block(lines, pos, match):
|
|
|
- lines[pos] = ""
|
|
|
+ lines[pos] = ''
|
|
|
curpos = pos - 1
|
|
|
# Find the first previous line with text to append "::" to it.
|
|
|
while True:
|
|
@@ -39,10 +63,10 @@ def replace_code_block(lines, pos, match):
|
|
|
break
|
|
|
curpos -= 1
|
|
|
|
|
|
- if lines[prev_line_with_text].endswith(":"):
|
|
|
- lines[prev_line_with_text] += ":"
|
|
|
+ if lines[prev_line_with_text].endswith(':'):
|
|
|
+ lines[prev_line_with_text] += ':'
|
|
|
else:
|
|
|
- lines[prev_line_with_text] += "::"
|
|
|
+ lines[prev_line_with_text] += '::'
|
|
|
|
|
|
TO_RST_MAP = {RE_CODE_BLOCK: replace_code_block,
|
|
|
RE_REFERENCE: r'``\2``',
|
|
@@ -60,17 +84,17 @@ def _process(lines):
|
|
|
line = lines[i]
|
|
|
else:
|
|
|
lines[i] = regex.sub(alt, line)
|
|
|
- return lines
|
|
|
+ return asciify(lines)
|
|
|
|
|
|
|
|
|
def sphinx_to_rst(fh):
|
|
|
- return "".join(_process(fh))
|
|
|
+ return ''.join(_process(fh))
|
|
|
|
|
|
|
|
|
-if __name__ == "__main__":
|
|
|
+if __name__ == '__main__':
|
|
|
global dirname
|
|
|
dirname = os.path.dirname(sys.argv[1])
|
|
|
- fh = open(sys.argv[1])
|
|
|
+ fh = codecs.open(sys.argv[1], encoding='utf-8')
|
|
|
try:
|
|
|
print(sphinx_to_rst(fh))
|
|
|
finally:
|