1# mako/cmd.py
2# Copyright 2006-2019 the Mako authors and contributors <see AUTHORS file>
3#
4# This module is part of Mako and is released under
5# the MIT License: http://www.opensource.org/licenses/mit-license.php
6from argparse import ArgumentParser
7from os.path import dirname
8from os.path import isfile
9import sys
10
11from mako import exceptions
12from mako.lookup import TemplateLookup
13from mako.template import Template
14
15
16def varsplit(var):
17    if "=" not in var:
18        return (var, "")
19    return var.split("=", 1)
20
21
22def _exit():
23    sys.stderr.write(exceptions.text_error_template().render())
24    sys.exit(1)
25
26
27def cmdline(argv=None):
28
29    parser = ArgumentParser()
30    parser.add_argument(
31        "--var",
32        default=[],
33        action="append",
34        help="variable (can be used multiple times, use name=value)",
35    )
36    parser.add_argument(
37        "--template-dir",
38        default=[],
39        action="append",
40        help="Directory to use for template lookup (multiple "
41        "directories may be provided). If not given then if the "
42        "template is read from stdin, the value defaults to be "
43        "the current directory, otherwise it defaults to be the "
44        "parent directory of the file provided.",
45    )
46    parser.add_argument(
47        "--output-encoding", default=None, help="force output encoding"
48    )
49    parser.add_argument("input", nargs="?", default="-")
50
51    options = parser.parse_args(argv)
52
53    output_encoding = options.output_encoding
54
55    if options.input == "-":
56        lookup_dirs = options.template_dir or ["."]
57        lookup = TemplateLookup(lookup_dirs)
58        try:
59            template = Template(
60                sys.stdin.read(),
61                lookup=lookup,
62                output_encoding=output_encoding,
63            )
64        except:
65            _exit()
66    else:
67        filename = options.input
68        if not isfile(filename):
69            raise SystemExit("error: can't find %s" % filename)
70        lookup_dirs = options.template_dir or [dirname(filename)]
71        lookup = TemplateLookup(lookup_dirs)
72        try:
73            template = Template(
74                filename=filename,
75                lookup=lookup,
76                output_encoding=output_encoding,
77            )
78        except:
79            _exit()
80
81    kw = dict([varsplit(var) for var in options.var])
82    try:
83        sys.stdout.write(template.render(**kw))
84    except:
85        _exit()
86
87
88if __name__ == "__main__":
89    cmdline()
90