Skip to main content

Python templating engine - the one ton solution

Project description

Tonnikala

Tonnikala is the latest reincarnation among the Python templating languages that feed on Kid-inspired XML syntax. It rejects the Kid and Genshi notions of tagstreams and trees, and follows in footsteps of Chameleon and Kajiki in making the template to compile into Python bytecode directly. The syntax is very close to that of Kajiki, but the internals are very different: Tonnikala writes code as Abstract Syntax Trees and optimizes the resulting trees extensively. In addition, there is an optional speed-up module (currently Python 3 only), that provides a specialized class used for output buffering.

Examples

from tonnikala.loader import Loader

template_source = u"""
<table>
    <tr py:for="row in table">
        <py:for each="key, value in row.items()"
            ><td>${key}</td><td>${literal(value)}</td></py:for>
    </tr>
</table>
"""

template = Loader().load_string(template_source)

ctx = {
    'table': [dict(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9,j=10)
        for x in range(1000)]
}

print(template.render(ctx))

Template inheritance

base.tk

<html>
<title><py:block name="title_block">I am ${title}</py:block></title>
<h1>${title_block()}</h1>
</html>

child.tk

<py:extends href="base.tk">
<py:block name="title_block">But I am ${title} instead</py:block>
</py:extends>

FileLoader

To load templates from files, use the tonnikala.FileLoader class:

loader = FileLoader(paths=['/path/to/templates'])
template = loader.load('child.tk')

A FileLoader currently implicitly caches all loaded templates in memory.

Template

To render the template:

result = template.render(ctx)

You can specify a block, or no-argument def to render explicitly:

result = template.render(ctx, funcname='title_block')

Status

Alpha, working features are

  • Structural elements py:if, py:unless, py:def, py:for, py:replace, py:content

  • Basic template inheritance: py:extends and py:block; the child template also inherits top level function declarations from the parent template, and the child can override global functions that the parent defines and uses.

  • Expression interpolation using $simple_identifier and ${complex + python + "expression"}

  • Boolean attributes: <tag attr="${False}">, <tag attr="$True">

  • Implicit escaping

  • Disabling implicit escaping (literal())

  • C speedups for both Python 2 and Python 3

Upcoming features:

  • Structural elements: py:vars, py:switch, py:case; py:else for for, if and switch.

  • Overriding attributes, setting attrs from dictionary: py:attrs

  • Custom tags mapping to py:def

  • I18N with optional in-parse-tree localization

  • Javascript as the target language

  • Pluggable frontend syntax engines (partially done)

  • METAL-like macros

  • Pluggable expression languages akin to Chameleon

  • Even better template inheritance

  • Importing def blocks from another template: py:import

  • Documentation (started)

  • Pyramid integration

Contributors

Antti Haapala

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tonnikala-0.15.tar.gz (4.5 kB view details)

Uploaded Source

File details

Details for the file tonnikala-0.15.tar.gz.

File metadata

  • Download URL: tonnikala-0.15.tar.gz
  • Upload date:
  • Size: 4.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for tonnikala-0.15.tar.gz
Algorithm Hash digest
SHA256 e551cc194d979c7ed49c5a117111ea6f923b7b750de65010cfd68ebdc6f66de6
MD5 c1e08d63793c24002580a3376f814ee5
BLAKE2b-256 174065f8ae1979d4d73686e047460b4774effff2bc1b313624a8dc1be5abe245

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page