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