跳转到主要内容

Python模板引擎 - 一站式解决方案

项目描述

Tonnikala

Tonnikala 是一种基于 Kid 启发的 XML 语法构建的 Python 模板语言中的最新版本。它摒弃了 Kid 和 Genshi 的标签流和树的概念,并效仿 Chameleon 和 Kajiki,将模板直接编译成 Python 字节码。语法非常接近 Kajiki,但内部结构非常不同:Tonnikala 将代码编写为抽象语法树,并对生成的树进行了广泛的优化。此外,还有一个可选的加速模块(目前仅支持 Python 3),提供用于输出缓存的专用类。

示例

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))

模板继承

base.tk

<html>
<title><py:block name="title_block">I am ${title}</py:block></title>
<py:def function="foo()">I can be overridden too!</py:def>
<h1>${title_block()}</h1>
${foo()}
</html>

child.tk

<py:extends href="base.tk">
<py:block name="title_block">But I am ${title} instead</py:block>
<py:def function="foo()">I have overridden the function in parent template</py:def>
</py:extends>

模板导入

importable.tk

<html>
<py:def function="foo()">I am an importable function</py:def>
</html>

importer.tk

<html>
<py:import href="importable.tk" alias="imp" />
${imp.foo()}
</html>

FileLoader

要从文件加载模板,请使用 tonnikala.FileLoader

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

目前 FileLoader 会隐式地将所有加载的模板缓存到内存中。

模板

要渲染模板

result = template.render(ctx)

您可以指定一个块,或无参数的 def 来显式渲染

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

Pyramid 集成

‘tonnikala.pyramid’ 包含到您的配置中以启用 Tonnikala。当包含后,Tonnikala 会添加以下配置指令

add_tonnikala_extensions(*extensions)

注册 Tonnikala 渲染器以用于这些模板扩展。默认情况下,Tonnikala 不会被注册为任何扩展的渲染器。例如: config.add_tonnikala_extensions(‘.html’,‘.tk’) 将使 Tonnikala 渲染器对具有这些扩展之一的模板有效。

add_tonnikala_search_paths(*paths)

将给定的路径添加到 Tonnikala 搜索路径的末尾,以搜索模板。这些可以是绝对路径,也可以是 package.module:directory/subdirectory 风格的资产规范。默认情况下,不会显式搜索任何路径(但您始终可以使用资产规范来指定模板)。

set_tonnikala_reload(reload)

如果设置为 True,则使 Tonnikala 不缓存模板。默认为 False

这三个也可以通过 .ini 设置中的 tonnikala.extensionstonnikala.search_pathstonnikala.reload 来控制。

状态

Alpha,工作功能包括

  • 结构元素 py:ifpy:unlesspy:defpy:forpy:replacepy:content

  • 基本的模板继承:py:extendspy:block;子模板也会继承父模板中的顶级函数声明,并且子模板可以覆盖父模板定义并使用的全局函数。

  • 使用 $simple_identifier${complex + python + "expression"} 进行表达式插值

  • 布尔属性:<tag attr="${False}"><tag attr="$True">

  • 隐式转义

  • 禁用隐式转义(literal()

  • 为 Python 2 和 Python 3 提供的 C 语言速度优化

  • 从另一个模板导入 def 块:py:import

  • 使用 gettext 的基本 I18N

  • Pyramid 集成

即将推出的功能

  • 结构元素:py:varspy:switchpy:casepy:else 用于 forifswitch

  • 覆盖属性,从字典中设置 attrs:py:attrs

  • 将自定义标签映射到 py:def

  • 可选的解析树本地化 I18N(部分完成)

  • 将 JavaScript 作为目标语言

  • 可插拔的前端语法引擎(部分完成)

  • METAL 类型的宏

  • 类似于 Chameleon 的可插拔表达式语言

  • 更好的模板继承

  • 更好的文档

贡献者

Antti Haapala

项目详情


下载文件

下载适合您平台的项目文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

tonnikala-0.16.tar.gz (30.6 kB 查看哈希值)

上传时间 源代码

支持者