aboutsummaryrefslogtreecommitdiff

Unja

A template engine for C, inspired by Jinja and Liquid.

Forked from https://github.com/dannyvankooten/unja

Example

File base.tmpl:

<html>
    <head><title>{% block title %}Default title{% endblock %}</title></head>
    <body>
        {% block content %}
        {% endblock %}
    </body>
</html>

File child.tmpl:

{% extends "base.html" %}

{% block title %}Users{% endblock %}

{% block content %}
    <ul>
    {% for user in users %}
        <li><a href="{{ user.url }}">{{ user.username | lower }}</a></li>
    {% endfor %}
    </ul>
{% endblock %}

File: example.c

int main() {
    // parse all templates in the given directory
    struct env *env = env_new("./");

    // create a hashmap for storing template variables
    struct hashmap *vars = hashmap_new();
    hashmap_insert(vars, "name", "John Doe");

    // execute the template
    char *output = template(env, "child.tmpl", vars);
    printf("%s", output);

    // clean-up allocated memory
    free(output);
    hashmap_free(vars);
    env_free(env);
}

Changes from upstream

Done

  • Use FNV1a as hashmap hashing algorithm.
  • Hashmap capacity can be set programmatically and it grows/shrinks in size when the load increases/decreases to avoid collisions/save memory.
  • Include guards.
  • Fix heap corruption on buffer growth.
  • Define as static functions that are not used outside a TU.

TODO

  • Handle empty/non-existent variables
  • Handle non-existent templates
  • Let the library user decide how to handle errors, instead of just aborting the program.
  • Do not print anything to stdout/stderr. It should be up to the library user to decide what and when to print a message.

License

MIT