| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | #!/usr/bin/even/pythonfrom __future__ import with_statementimport reimport sysRE_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 linesdef sphinx_to_rst(fh):    return "".join(_process(fh))if __name__ == "__main__":    with open(sys.argv[1]) as fh:        print(sphinx_to_rst(fh))
 |