paul@84 | 1 | #!/usr/bin/env python |
paul@84 | 2 | |
paul@104 | 3 | from moinformat import make_input, make_linker, make_output, make_parser, \ |
paul@104 | 4 | make_serialiser, 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@104 | 12 | # Option values. |
paul@104 | 13 | |
paul@84 | 14 | l = filenames = [] |
paul@84 | 15 | formats = [] |
paul@104 | 16 | input_encodings = [] |
paul@97 | 17 | mappings = [] |
paul@104 | 18 | output_dirs = [] |
paul@104 | 19 | output_encodings = [] |
paul@104 | 20 | pagenames = [] |
paul@104 | 21 | |
paul@104 | 22 | # Flags. |
paul@104 | 23 | |
paul@104 | 24 | macros = False |
paul@84 | 25 | tree = False |
paul@84 | 26 | |
paul@84 | 27 | for arg in args: |
paul@84 | 28 | |
paul@84 | 29 | # Detect tree output. |
paul@84 | 30 | |
paul@84 | 31 | if arg == "--tree": |
paul@84 | 32 | tree = True |
paul@84 | 33 | |
paul@89 | 34 | # Detect macro evaluation. |
paul@89 | 35 | |
paul@89 | 36 | elif arg == "--macros": |
paul@89 | 37 | macros = True |
paul@89 | 38 | |
paul@91 | 39 | # Switch to collecting formats. |
paul@84 | 40 | |
paul@84 | 41 | elif arg == "--format": |
paul@84 | 42 | l = formats |
paul@84 | 43 | continue |
paul@84 | 44 | |
paul@104 | 45 | # Switch to collecting input encodings. |
paul@104 | 46 | |
paul@104 | 47 | elif arg == "--input-encoding": |
paul@104 | 48 | l = input_encodings |
paul@104 | 49 | continue |
paul@104 | 50 | |
paul@97 | 51 | # Switch to collecting mappings. |
paul@97 | 52 | |
paul@97 | 53 | elif arg == "--mapping": |
paul@97 | 54 | l = mappings |
paul@97 | 55 | continue |
paul@97 | 56 | |
paul@100 | 57 | # Switch to collecting output locations. |
paul@100 | 58 | |
paul@104 | 59 | elif arg == "--output-dir": |
paul@104 | 60 | l = output_dirs |
paul@104 | 61 | continue |
paul@104 | 62 | |
paul@104 | 63 | # Switch to collecting output encodings. |
paul@104 | 64 | |
paul@104 | 65 | elif arg == "--output-encoding": |
paul@104 | 66 | l = output_encodings |
paul@100 | 67 | continue |
paul@100 | 68 | |
paul@91 | 69 | # Switch to collecting page names. |
paul@91 | 70 | |
paul@91 | 71 | elif arg == "--pagename": |
paul@91 | 72 | l = pagenames |
paul@91 | 73 | continue |
paul@91 | 74 | |
paul@84 | 75 | # Collect options and arguments. |
paul@84 | 76 | |
paul@84 | 77 | else: |
paul@84 | 78 | l.append(arg) |
paul@84 | 79 | |
paul@100 | 80 | # Collect multiple mappings. |
paul@100 | 81 | |
paul@97 | 82 | if l is mappings: |
paul@97 | 83 | continue |
paul@97 | 84 | |
paul@84 | 85 | # Collect filenames normally. |
paul@84 | 86 | |
paul@84 | 87 | l = filenames |
paul@84 | 88 | |
paul@91 | 89 | format = formats and formats[0] or "html" |
paul@91 | 90 | |
paul@91 | 91 | # Derive the page name from the filename if not specified. |
paul@91 | 92 | |
paul@84 | 93 | filename = filenames[0] |
paul@91 | 94 | pagename = pagenames and pagenames[0] or split(filename)[-1] |
paul@84 | 95 | |
paul@97 | 96 | # Derive a proper mapping from the given list of values. |
paul@97 | 97 | |
paul@97 | 98 | mapping = {} |
paul@97 | 99 | key = None |
paul@97 | 100 | |
paul@97 | 101 | for arg in mappings: |
paul@97 | 102 | if key is None: |
paul@97 | 103 | key = arg |
paul@97 | 104 | else: |
paul@97 | 105 | mapping[key] = arg |
paul@97 | 106 | key = None |
paul@97 | 107 | |
paul@104 | 108 | # Obtain output location. |
paul@104 | 109 | |
paul@104 | 110 | output_dir = output_dirs and output_dirs[0] or None |
paul@104 | 111 | |
paul@104 | 112 | # Obtain encodings. |
paul@104 | 113 | |
paul@104 | 114 | input_encoding = input_encodings and input_encodings[0] or None |
paul@104 | 115 | output_encoding = output_encodings and output_encodings[0] or None |
paul@104 | 116 | |
paul@97 | 117 | # Open the file, parse the content, serialise the document. |
paul@97 | 118 | |
paul@104 | 119 | input = make_input("standalone", {"encoding" : input_encoding}) |
paul@104 | 120 | |
paul@104 | 121 | p = make_parser() |
paul@104 | 122 | d = parse(input.readfile(filename), p) |
paul@89 | 123 | |
paul@104 | 124 | if macros: |
paul@104 | 125 | p.evaluate_macros() |
paul@104 | 126 | |
paul@104 | 127 | # Show a document tree for debugging purposes, if requested. |
paul@104 | 128 | |
paul@104 | 129 | if tree: |
paul@104 | 130 | print d.prettyprint() |
paul@104 | 131 | |
paul@104 | 132 | # Otherwise, serialise the document. |
paul@89 | 133 | |
paul@104 | 134 | else: |
paul@104 | 135 | # Obtain an output context from any specified output details. |
paul@104 | 136 | |
paul@104 | 137 | output_context = output_dir and "directory" or "standalone" |
paul@104 | 138 | |
paul@104 | 139 | output = make_output(output_context, {"encoding" : output_encoding, |
paul@104 | 140 | "filename" : output_dir}) |
paul@104 | 141 | |
paul@104 | 142 | # Obtain a linker using format and pagename details. |
paul@104 | 143 | |
paul@104 | 144 | linker = make_linker(format, pagename, mapping) |
paul@104 | 145 | |
paul@104 | 146 | # Obtain a serialiser using the configuration. |
paul@104 | 147 | |
paul@104 | 148 | serialiser = make_serialiser(format, output, linker) |
paul@104 | 149 | print serialise(d, serialiser) |
paul@84 | 150 | |
paul@84 | 151 | if __name__ == "__main__": |
paul@84 | 152 | main() |
paul@84 | 153 | |
paul@84 | 154 | # vim: tabstop=4 expandtab shiftwidth=4 |