#!/usr/bin/env python3 import sys, re, os from argparse import ArgumentParser from argparse import RawTextHelpFormatter def setup_options(): parser = ArgumentParser( description="""Template Filler === Template example: === Hello [[name]]! [[letter]] == Value file/Value pair example: == [[name]]=John [[letter]]=@letter.txt """, formatter_class=RawTextHelpFormatter, ) parser.add_argument( "-e", action="store_true", dest="env", default=False, help="Use the environment to replace ${env} style variables.", ) parser.add_argument( "-f", action="store", dest="file", help="File name to read keys/values." ) parser.add_argument( "-p", action="append", dest="values", default=[], help="key=value pairs. This option may be issued several times.", ) parser.add_argument( "template", action="store", nargs="?", help="Template file to be filled. If not defined, stdin used.", ) options = parser.parse_args() return options def parse_file(filename): pairs = [] with open(filename, "r") as reader: for i, l in enumerate(reader): l = l.rstrip("\n\r") if len(l) == 0: continue tokens = l.split("=", 1) if len(tokens) != 2: print( "File %s:%i key=value pair '%s' does not parse" % ( filename, i + 1, l, ) ) sys.exit(1) pairs.append((tokens[0], tokens[1])) return pairs def parse_arguments(args): pairs = [] for p in args: tokens = p.split("=", 1) if len(tokens) != 2: print("Argument key=value pair '%s' does not parse" % (p,)) sys.exit(1) pairs.append((tokens[0], tokens[1])) return pairs if __name__ == "__main__": options = setup_options() pairs = [] if options.file != None: pairs.extend(parse_file(options.file)) pairs.extend(parse_arguments(options.values)) if options.template == None: in_reader = sys.stdin else: in_reader = open(options.template, "rb") for l in in_reader: for p in pairs: value = p[1] if len(value) > 0: if value[0] == "@": value = open(value[1:], "rt").read() elif value[0:2] == "\\@": value = value[1:] l = l.replace(p[0].encode("utf-8"), value.encode("utf-8")) if options.env: var_list = [m.group(0) for m in re.finditer("\${[^ ]+}", l)] for v in var_list: l = l.replace(v, os.environ.get(v[:-1][2:], "")) sys.stdout.write(l.decode("utf-8"))