blob: c4fb8b8e87d39946f67e63726c40b7e57025fe85 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Index | Jinja Template Engine</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="./static/style.css" type="text/css" />
<link rel="stylesheet" href="./static/print.css" type="text/css" media="print" />
<link rel="stylesheet" href="./static/pygments.css" type="text/css" />
</head>
<body>
<div id="header">
<h1>Jinja</h1>
</div>
<ul id="navigation">
<li class="active"><a href="./index.html">Index</a></li>
<li><a href="./faq.html">FAQ</a></li>
<li><a href="./documentation.html">Documentation</a></li>
<li><a href="./download.html">Download</a></li>
</ul>
<div id="content">
<div id="contentwrapper">
<h1>Jinja Templates</h1>
<p>
Jinja is a
<a href="http://en.wikipedia.org/wiki/Sandbox_%28computer_security%29">sandboxed</a>
template engine written in pure <a href="http://www.python.org/">Python</a>. It
provides a <a href="http://www.djangoproject.com/">Django</a>-like non-XML syntax
and compiles templates into executable python code. It's basically a combination
of Django templates and python code.
</p>
<h2>Nutshell</h2>
<div class="syntax"><pre><span class="cp">{%</span> <span class="k">extends</span> <span class="s1">&#39;base.html&#39;</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">block</span> <span class="nv">title</span> <span class="cp">%}</span>Memberlist<span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">block</span> <span class="nv">content</span> <span class="cp">%}</span>
<span class="nt">&lt;ul&gt;</span>
<span class="cp">{%</span> <span class="k">for</span> <span class="nv">user</span> <span class="k">in</span> <span class="nv">users</span> <span class="cp">%}</span>
<span class="nt">&lt;li&gt;&lt;a</span> <span class="na">href=</span><span class="s">&quot;</span><span class="cp">{{</span> <span class="nv">user.url</span><span class="o">|</span><span class="nf">e</span> <span class="cp">}}</span><span class="s">&quot;</span><span class="nt">&gt;</span><span class="cp">{{</span> <span class="nv">user.username</span><span class="o">|</span><span class="nf">e</span> <span class="cp">}}</span><span class="nt">&lt;/a&gt;&lt;/li&gt;</span>
<span class="cp">{%</span> <span class="k">endfor</span> <span class="cp">%}</span>
<span class="nt">&lt;/ul&gt;</span>
<span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span>
</pre></div>
<h2>Philosphy</h2>
<p>
Application logic is for the controller but don't try to make the live for the
template designer too hard by giving him too less functionality.
</p>
<h2>Features</h2>
<ul>
<li><strong>Simple API</strong>. For basic usage just one function is needed:
<div class="syntax"><pre><span class="k">from</span> <span class="nn">jinja</span> <span class="k">import</span> <span class="n">from_string</span>
<span class="k">print</span> <span class="n">from_string</span><span class="p">(</span><span class="s">&#39;Hello {{ data }}!&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="s">&#39;World&#39;</span><span class="p">)</span>
</pre></div>
</li>
<li><strong>Sandboxed</strong>. The whole engine is completely sandboxed. A
template designer won't be able to modify application data or execute
dangerous code.</li>
<li><strong>Python expressions</strong>. You can use nearly every python
expression. Not supported are the binary operators and list comprehensions /
generator expressions.</li>
<li><strong>Inheritance</strong>. Jinja uses the same concept for inheritance
Django uses. It's very powerful and easy to understand.</li>
<li><strong>Macros</strong>. Jinja provides so called macros that allow you to
put often used template snippets into callable blocks:
<div class="syntax"><pre><span class="cp">{%</span> <span class="k">macro</span> <span class="nv">dialog</span> <span class="nv">title</span><span class="o">,</span> <span class="nv">text</span> <span class="cp">%}</span>
<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;dialog&quot;</span><span class="nt">&gt;</span>
<span class="nt">&lt;h2</span> <span class="na">class=</span><span class="s">&quot;title&quot;</span><span class="nt">&gt;</span><span class="cp">{{</span> <span class="nv">title</span> <span class="cp">}}</span><span class="nt">&lt;/h2&gt;</span>
<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;text&quot;</span><span class="nt">&gt;</span><span class="cp">{{</span> <span class="nv">text</span> <span class="cp">}}</span><span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/div&gt;</span>
<span class="cp">{%</span> <span class="k">endmacro</span> <span class="cp">%}</span>
</pre></div>
You can then use this block by calling it:
<div class="syntax"><pre><span class="cp">{{</span> <span class="nv">dialog</span><span class="o">(</span><span class="s1">&#39;Notification&#39;</span><span class="o">,</span> <span class="s1">&#39;Here the text for the macro.&#39;</span><span class="o">)</span> <span class="cp">}}</span>
</pre></div>
</li>
<li><strong>Designer friendly</strong>. Jinja simplifies many things for a
template designer. Loops can be used in a recursive way, filters are
available to format values, loops know about their iteration etc.</li>
<li><strong>Dynamic Syntax</strong>. You don't like the Django block syntax?
You can override the syntax elements on environment initialisation. It's
no problem to use ASP/PHP/Ruby syntax, html comments for blocks etc.</li>
</ul>
</div>
</div>
<div id="footer">
&copy; Copyright 2007 by the Pocoo Team.
</div>
</body>
</html>