diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/template.c | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/src/template.c b/src/template.c index cb2ad7b..4a893b8 100644 --- a/src/template.c +++ b/src/template.c @@ -376,35 +376,44 @@ int eval(struct buffer *buf, mpc_ast_t* t, struct context *ctx) { static int trim_whitespace = 0; // maybe eat whitespace going backward - if (t->children_num > 0 && strstr(t->children[0]->contents, "{{-")) { + if (t->children_num > 0 && strstr(t->children[0]->contents, "-")) { buf->string = trim_trailing_whitespace(buf->string); } + if (strstr(t->tag, "content|text")) { + char *str = t->contents; + if (trim_whitespace) { + str = trim_leading_whitespace(str); + trim_whitespace = 0; + } + + buffer_reserve(buf, strlen(str)); + strcat(buf->string, str); + return 0; + } + if (strstr(t->tag, "content|statement|block")) { + trim_whitespace = strstr(t->children[3]->contents, "-") ? 1 : 0; char *block_name = t->children[2]->contents; // find block in "lowest" template struct template *templ = ctx->current_template; mpc_ast_t *block = hashmap_get(templ->blocks, block_name); if (block) { - return eval(buf, block->children[4], ctx); + eval(buf, block->children[4], ctx); + } else { + /* TODO: Keep looking for block in parent templates */ + // just render this block if it wasn't found in any of the lower templates + eval(buf, t->children[4], ctx); } - /* TODO: Keep looking for block in parent templates */ - - // just render this block if it wasn't found in any of the lower templates - return eval(buf, t->children[4], ctx); + trim_whitespace = strstr(t->children[7]->contents, "-") ? 1 : 0; + return 0; } // eval print statement if (strstr(t->tag, "content|print")) { - - - /* set flag for next eval() to trim leading whitespace from text */ - if (strstr(t->children[2]->contents, "-}}")) { - trim_whitespace = 1; - } - + trim_whitespace = strstr(t->children[2]->contents, "-") ? 1 : 0; mpc_ast_t *expr = t->children[1]; struct unja_object *obj = eval_expression(expr, ctx); eval_object(buf, obj); @@ -413,6 +422,7 @@ int eval(struct buffer *buf, mpc_ast_t* t, struct context *ctx) { } if (strstr(t->tag, "content|statement|for")) { + trim_whitespace = strstr(t->children[5]->contents, "-") ? 1 : 0; char *tmp_key = t->children[2]->contents; char *iterator_key = t->children[4]->contents; struct vector *list = hashmap_resolve(ctx->vars, iterator_key); @@ -424,6 +434,7 @@ int eval(struct buffer *buf, mpc_ast_t* t, struct context *ctx) { } if (strstr(t->tag, "content|statement|if")) { + trim_whitespace = strstr(t->children[3]->contents, "-") ? 1 : 0; mpc_ast_t *expr = t->children[2]; struct unja_object *result = eval_expression(expr, ctx); @@ -439,18 +450,6 @@ int eval(struct buffer *buf, mpc_ast_t* t, struct context *ctx) { return 0; } - if (strstr(t->tag, "content|text")) { - char *str = t->contents; - if (trim_whitespace) { - str = trim_leading_whitespace(str); - trim_whitespace = 0; - } - - buffer_reserve(buf, strlen(str)); - strcat(buf->string, str); - return 0; - } - for (int i=0; i < t->children_num; i++) { eval(buf, t->children[i], ctx); } |