#!/usr/bin/env python

def render(data, kw, lookup_dirs):
    from mako.template import Template
    from mako.lookup import TemplateLookup

    lookup = TemplateLookup(lookup_dirs)
    return Template(data, lookup=lookup).render(**kw)

def varsplit(var):
    if "=" not in var:
        return (var, "")
    return var.split("=", 1)

def main(argv=None):
    from os.path import isfile, dirname
    from sys import stdin

    if argv is None:
        import sys
        argv = sys.argv

    from optparse import OptionParser

    parser = OptionParser("usage: %prog [FILENAME]")
    parser.add_option("--var", default=[], action="append",
                  help="variable (can be used multiple times, use name=value)")
    parser.add_option("--template-dir", default=[], action="append",
                  help="Directory to use for template lookup (multiple "
                       "directories may be provided). If not given then if the "
                       "template is read from stdin, the value defaults to be "
                       "the current directory, otherwise it defaults to be the "
                       "parent directory of the file provided.")

    opts, args = parser.parse_args(argv[1:])
    if len(args) not in (0, 1):
        parser.error("wrong number of arguments")  # Will exit

    if (len(args) == 0) or (args[0] == "-"):
        fo = stdin
        lookup_dirs = opts.template_dir or ["."]
    else:
        filename = args[0]
        if not isfile(filename):
            raise SystemExit("error: can't find %s" % filename)
        fo = open(filename)
        lookup_dirs = opts.template_dir or [dirname(filename)]

    kw = dict([varsplit(var) for var in opts.var])
    data = fo.read()
    print(render(data, kw, lookup_dirs=lookup_dirs))

if __name__ == "__main__":
    main()
