From c99eaf2b2d9f7b70df550b2918bd66b711e41c3f Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 27 Jan 2022 14:11:08 +0100 Subject: [PATCH] Add parse_template.py --- parse_template.py | 100 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100755 parse_template.py diff --git a/parse_template.py b/parse_template.py new file mode 100755 index 0000000..b7f0711 --- /dev/null +++ b/parse_template.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 + +import os +import sys +import json +import argparse + +from jinja2 import Environment, FileSystemLoader, select_autoescape + + +def parse_args(): + parser = argparse.ArgumentParser( + prog='parse_template', + description='a jinja template parser', + add_help=False + ) + + parser.add_argument( + '-h', '--help', + action='help', + help='display help message', + ) + + parser.add_argument( + '-D', '--define', + action='append', + nargs=2, + type=str, + metavar=('key', 'value'), + help='define data with key-value pairs', + ) + + parser.add_argument( + '-o', '--output', + nargs='?', + type=str, + metavar='file', + help='output file or "-" for stdout', + ) + + parser.add_argument( + 'docdir', + type=str, + metavar='docdir', + help='Full documentation directory path', + ) + + parser.add_argument( + 'template', + type=str, + metavar='template', + help='template file path relative to docdir', + ) + + return parser.parse_args() + + +def parse_value(value): + try: + return json.loads(value) + except ValueError: + return value + + +def main(): + args = parse_args() + + doc_dir = args.docdir + template_path = args.template + output = args.output or os.path.join(doc_dir, template_path) + data = {k: parse_value(v) for k, v in args.define or []} + + env = Environment( + loader=FileSystemLoader(doc_dir), + autoescape=False, + block_start_string='', + variable_start_string='', + comment_start_string='', + auto_reload=True, + trim_blocks=True, + lstrip_blocks=True + ) + template = env.get_template(template_path) + + if output == '-': + print(template.render(**data)) + else: + fout = open(output, 'w') + try: + fout.write(template.render(**data)) + finally: + fout.close() + + +if __name__ == '__main__': + main() +