Jinjava
Jinja template engine for Java
Install / Use
/learn @HubSpot/JinjavaREADME
jinjava
<img src="https://github.com/HubSpot/jinjava/raw/master/jinjava.png" width="250" height="250" alt="jinjava">Java-based template engine based on django template syntax, adapted to render jinja templates (at least the subset of jinja in use in HubSpot content). Currently used in production to render thousands of websites with hundreds of millions of page views per month on the HubSpot CMS.
Note: Requires Java >= 8. Originally forked from jangod.
Get it:
<dependency>
<groupId>com.hubspot.jinjava</groupId>
<artifactId>jinjava</artifactId>
<version>{ LATEST_VERSION }</version>
</dependency>
where LATEST_VERSION is the latest version from CHANGES.
or if you're stuck on java 7:
<dependency>
<groupId>com.hubspot.jinjava</groupId>
<artifactId>jinjava</artifactId>
<version>2.0.11-java7</version>
</dependency>
Example usage:
my-template.html:
<div>Hello, {{ name }}!</div>
java code:
Jinjava jinjava = new Jinjava();
Map<String, Object> context = Maps.newHashMap();
context.put("name", "Jared");
String template = Resources.toString(Resources.getResource("my-template.html"), Charsets.UTF_8);
String renderedTemplate = jinjava.render(template, context);
result:
<div>Hello, Jared!</div>
Voila!
Advanced Topics
Template loading
Jinjava needs to know how to interpret template paths, so it can properly handle tags like:
{% extends "foo/bar/base.html" %}
By default, it will load only a ClasspathResourceLocator which will allow loading from ANY file in the classpath inclusing class files. If you want to allow Jinjava to load any file from the
file system, you can add a FileResourceLocator. Be aware the security risks of allowing user input to prevent a user
from adding code such as {% include '/etc/password' %}.
You will likely want to provide your own implementation of
ResourceLoader to hook into your application's template repository, and then tell jinjava about it:
JinjavaConfig config = JinjavaConfig.builder().build();
Jinjava jinjava = new Jinjava(config);
jinjava.setResourceLocator(new MyCustomResourceLocator());
To use more than one ResourceLocator, use a CascadingResourceLocator.
JinjavaConfig config = JinjavaConfig.builder().build();
Jinjava jinjava = new Jinjava(config);
jinjava.setResourceLocator(new MyCustomResourceLocator(), new FileResourceLocator());
Custom tags, filters and functions
You can provide custom jinja tags, filters, and static functions to the template engine.
// define a custom tag implementing com.hubspot.jinjava.lib.Tag
jinjava.getGlobalContext().registerTag(new MyCustomTag());
// define a custom filter implementing com.hubspot.jinjava.lib.Filter
jinjava.getGlobalContext().registerFilter(new MyAwesomeFilter());
// define a custom public static function (this one will bind to myfn:my_func('foo', 42))
jinjava.getGlobalContext().registerFunction(new ELFunctionDefinition("myfn", "my_func",
MyFuncsClass.class, "myFunc", String.class, Integer.class);
// define any number of classes which extend Importable
jinjava.getGlobalContext().registerClasses(Class<? extends Importable>... classes);
See also
Related Skills
node-connect
344.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
99.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
344.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
344.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
