paul@84 | 1 | #!/usr/bin/env python |
paul@84 | 2 | |
paul@100 | 3 | from moinformat import make_linker, make_output, make_parser, make_serialiser, \ |
paul@100 | 4 | parse, serialise |
paul@84 | 5 | from os.path import split |
paul@84 | 6 | import sys |
paul@84 | 7 | |
paul@84 | 8 | def main(): |
paul@84 | 9 | dirname, progname = split(sys.argv[0]) |
paul@84 | 10 | args = sys.argv[1:] |
paul@84 | 11 | |
paul@84 | 12 | l = filenames = [] |
paul@84 | 13 | formats = [] |
paul@91 | 14 | pagenames = [] |
paul@97 | 15 | mappings = [] |
paul@100 | 16 | outputs = [] |
paul@84 | 17 | tree = False |
paul@89 | 18 | macros = False |
paul@84 | 19 | |
paul@84 | 20 | for arg in args: |
paul@84 | 21 | |
paul@84 | 22 | # Detect tree output. |
paul@84 | 23 | |
paul@84 | 24 | if arg == "--tree": |
paul@84 | 25 | tree = True |
paul@84 | 26 | |
paul@89 | 27 | # Detect macro evaluation. |
paul@89 | 28 | |
paul@89 | 29 | elif arg == "--macros": |
paul@89 | 30 | macros = True |
paul@89 | 31 | |
paul@91 | 32 | # Switch to collecting formats. |
paul@84 | 33 | |
paul@84 | 34 | elif arg == "--format": |
paul@84 | 35 | l = formats |
paul@84 | 36 | continue |
paul@84 | 37 | |
paul@97 | 38 | # Switch to collecting mappings. |
paul@97 | 39 | |
paul@97 | 40 | elif arg == "--mapping": |
paul@97 | 41 | l = mappings |
paul@97 | 42 | continue |
paul@97 | 43 | |
paul@100 | 44 | # Switch to collecting output locations. |
paul@100 | 45 | |
paul@100 | 46 | elif arg == "--output": |
paul@100 | 47 | l = outputs |
paul@100 | 48 | continue |
paul@100 | 49 | |
paul@91 | 50 | # Switch to collecting page names. |
paul@91 | 51 | |
paul@91 | 52 | elif arg == "--pagename": |
paul@91 | 53 | l = pagenames |
paul@91 | 54 | continue |
paul@91 | 55 | |
paul@84 | 56 | # Collect options and arguments. |
paul@84 | 57 | |
paul@84 | 58 | else: |
paul@84 | 59 | l.append(arg) |
paul@84 | 60 | |
paul@100 | 61 | # Collect multiple mappings. |
paul@100 | 62 | |
paul@97 | 63 | if l is mappings: |
paul@97 | 64 | continue |
paul@97 | 65 | |
paul@84 | 66 | # Collect filenames normally. |
paul@84 | 67 | |
paul@84 | 68 | l = filenames |
paul@84 | 69 | |
paul@91 | 70 | format = formats and formats[0] or "html" |
paul@91 | 71 | |
paul@91 | 72 | # Derive the page name from the filename if not specified. |
paul@91 | 73 | |
paul@84 | 74 | filename = filenames[0] |
paul@91 | 75 | pagename = pagenames and pagenames[0] or split(filename)[-1] |
paul@84 | 76 | |
paul@100 | 77 | # Obtain an output context from any specified output details. |
paul@100 | 78 | |
paul@100 | 79 | output = outputs and make_output(outputs[0]) or None |
paul@100 | 80 | |
paul@97 | 81 | # Derive a proper mapping from the given list of values. |
paul@97 | 82 | |
paul@97 | 83 | mapping = {} |
paul@97 | 84 | key = None |
paul@97 | 85 | |
paul@97 | 86 | for arg in mappings: |
paul@97 | 87 | if key is None: |
paul@97 | 88 | key = arg |
paul@97 | 89 | else: |
paul@97 | 90 | mapping[key] = arg |
paul@97 | 91 | key = None |
paul@97 | 92 | |
paul@97 | 93 | # Open the file, parse the content, serialise the document. |
paul@97 | 94 | |
paul@84 | 95 | f = open(filename) |
paul@84 | 96 | try: |
paul@89 | 97 | p = make_parser() |
paul@89 | 98 | d = parse(f.read(), p) |
paul@89 | 99 | |
paul@89 | 100 | if macros: |
paul@89 | 101 | p.evaluate_macros() |
paul@89 | 102 | |
paul@84 | 103 | if tree: |
paul@84 | 104 | print d.prettyprint() |
paul@84 | 105 | else: |
paul@97 | 106 | l = make_linker(format, pagename, mapping) |
paul@100 | 107 | s = make_serialiser(format, output, l) |
paul@94 | 108 | print serialise(d, s) |
paul@84 | 109 | finally: |
paul@84 | 110 | f.close() |
paul@84 | 111 | |
paul@84 | 112 | if __name__ == "__main__": |
paul@84 | 113 | main() |
paul@84 | 114 | |
paul@84 | 115 | # vim: tabstop=4 expandtab shiftwidth=4 |