|
@@ -0,0 +1,49 @@
|
|
|
+#!/usr/bin/even/python
|
|
|
+from __future__ import with_statement
|
|
|
+import re
|
|
|
+import sys
|
|
|
+
|
|
|
+RE_CODE_BLOCK = re.compile(r'.. code-block:: (.+?)\s*$')
|
|
|
+RE_REFERENCE = re.compile(r':(.+?):`(.+?)`')
|
|
|
+
|
|
|
+
|
|
|
+def replace_code_block(lines, pos):
|
|
|
+ lines[pos] = ""
|
|
|
+ curpos = pos - 1
|
|
|
+ # Find the first previous line with text to append "::" to it.
|
|
|
+ while True:
|
|
|
+ prev_line = lines[curpos]
|
|
|
+ if not prev_line.isspace():
|
|
|
+ prev_line_with_text = curpos
|
|
|
+ break
|
|
|
+ curpos -= 1
|
|
|
+
|
|
|
+ if lines[prev_line_with_text].endswith(":"):
|
|
|
+ lines[prev_line_with_text] += ":"
|
|
|
+ else:
|
|
|
+ lines[prev_line_with_text] += "::"
|
|
|
+
|
|
|
+TO_RST_MAP = {RE_CODE_BLOCK: replace_code_block,
|
|
|
+ RE_REFERENCE: r'``\2``'}
|
|
|
+
|
|
|
+
|
|
|
+def _process(lines):
|
|
|
+ lines = list(lines) # non-destructive
|
|
|
+ for i, line in enumerate(lines):
|
|
|
+ for regex, alt in TO_RST_MAP.items():
|
|
|
+ if callable(alt):
|
|
|
+ if regex.match(line):
|
|
|
+ alt(lines, i)
|
|
|
+ line = lines[i]
|
|
|
+ else:
|
|
|
+ lines[i] = regex.sub(alt, line)
|
|
|
+ return lines
|
|
|
+
|
|
|
+
|
|
|
+def sphinx_to_rst(fh):
|
|
|
+ return "".join(_process(fh))
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ with open(sys.argv[1]) as fh:
|
|
|
+ print(sphinx_to_rst(fh))
|