Using jinja2 outside of the web.

I may be the last person out there to do that, but i hadn't actually gotten to that yet.

So here is the thing, sometime you want to produce a text file, with some complex structure, and string.format is not really up to the task, so you scratch your head and wonder what could be useful to… template an output.

Then a nice lib like jinja2 totally makes sense.

For my use case, i want to generate java source code, using info parsed from other java source code (thanks to the awesome plyj lib), so it's easy to give the general form of the output file, and to pass the content after that.

{% if package %}package {{ package }};{% endif %}
import {{ }}.*;
{{ imports }}\

public class {{ }}{{ suffix }} extends {{ }} {
    public interface I{{ }} {\
    {% for method in methods %}
    {{ method.return_type | get_type }} {{ }}({{ method.parameters | render_params }});\
    {% endfor %}

    private I{{ }} implem = null;

    public void setImplem(I{{ }} implem) {
    this.implem = implem;

    {% for method in methods %}
    {{ method.return_type | get_type }} {{ }}({{ method.parameters | render_params }}) {
    if (this.implem)
        return this.implem.{{ }}({{ method.parameters | render_params_values }});
    }{% endfor %}

One problem i had, though, was when it turned out it would be convenient to use custom filters inside my template, it took me some time to find the relevant documentation about how to register functions as filters in this situation (since people usually use jinja2 in a framework, they document how to do so using the environment used by this framework).

So the answer was not to use jinja2.Template directly, but to build an environment before.

env = jinja2.Environment()

then to setup my filters in this environment:

env.filters['render_params'] = render_params
env.filters['render_params_values'] = render_params_values
env.filters['get_type'] = get_type

and to use env.template_from_string(template_string) to create a Template object from my string.