diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/template.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/src/template.c b/src/template.c index 105a8c3..a92edd6 100644 --- a/src/template.c +++ b/src/template.c @@ -690,32 +690,39 @@ struct hashmap *default_filters() { return filters; } +struct context context_new(struct hashmap *vars, struct env *env, struct template *current_tmpl) { + struct context ctx; + ctx.filters = default_filters(); + ctx.vars = vars; + ctx.env = env; + ctx.current_template = current_tmpl; + return ctx; +} + +void context_free(struct context ctx) { + hashmap_free(ctx.filters); +} + char *template_string(char *tmpl, struct hashmap *vars) { #if DEBUG printf("Template: %s\n", tmpl); #endif - mpc_ast_t *ast = parse(tmpl); - struct context ctx; - ctx.filters = default_filters(); - ctx.vars = vars; - ctx.env = NULL; - ctx.current_template = NULL; + struct mpc_ast_t *ast = parse(tmpl); + struct context ctx = context_new(vars, NULL, NULL); char *output = render_ast(ast, &ctx); mpc_ast_delete(ast); + context_free(ctx); return output; } char *template(struct env *env, char *template_name, struct hashmap *vars) { struct template *t = hashmap_get(env->templates, template_name); - #if DEBUG printf("Template name: %s\n", t->name); printf("Parent: %s\n", t->parent ? t->parent : "None"); #endif - struct context ctx; - ctx.vars = vars; - ctx.env = env; - ctx.current_template = t; + + struct context ctx = context_new(vars, env, t); // find root template while (t->parent != NULL) { @@ -728,5 +735,8 @@ char *template(struct env *env, char *template_name, struct hashmap *vars) { } } - return render_ast(t->ast, &ctx); + + char *output = render_ast(t->ast, &ctx); + context_free(ctx); + return output; }
\ No newline at end of file |