| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | #!/usr/bin/env pythonimport osimport reimport sysdirname = ""RE_CODE_BLOCK = re.compile(r'.. code-block:: (.+?)\s*$')RE_INCLUDE = re.compile(r'.. include:: (.+?)\s*$')RE_REFERENCE = re.compile(r':(.+?):`(.+?)`')def include_file(lines, pos, match):    global dirname    orig_filename = match.groups()[0]    filename = os.path.join(dirname, orig_filename)    fh = open(filename)    try:        old_dirname = dirname        dirname = os.path.dirname(orig_filename)        try:            lines[pos] = sphinx_to_rst(fh)        finally:            dirname = old_dirname    finally:        fh.close()def replace_code_block(lines, pos, match):    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``',              RE_INCLUDE: include_file}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):                match = regex.match(line)                if match:                    alt(lines, i, match)                    line = lines[i]            else:                lines[i] = regex.sub(alt, line)    return linesdef sphinx_to_rst(fh):    return "".join(_process(fh))if __name__ == "__main__":    global dirname    dirname = os.path.dirname(sys.argv[1])    fh = open(sys.argv[1])    try:        print(sphinx_to_rst(fh))    finally:        fh.close()
 |