仔猪模板:快速的、html感知的模板引擎
piglet的Python项目详细描述
仔猪模板
===
仔猪是kid/genshi/kajiki家族中的文本和html模板语言。
仔猪模板引擎提供:
-模板通过py:extensions/py:block(类似于jinja2)编译模板到快速python字节code.
-HTML感知模板:输出格式良好,内容
转义,防止XSS攻击。
-可重用模板函数,模板继承的深度嵌套,
灵活的翻译和嵌入的Python表达式
`文档<;http://ollycope.com/software/piglet/>;`
\`bitbucket repository<;https://bitbucket.org/ollyc/pigger>;`
这就是小猪模板的样子:
……代码::html
<;py:extends href="layout.html">;
<;py:block name="content">;
<;h1>;这是内容块。<;h1>;
<;p>;
hello$user.firstnames$user.lastname!
<;/p>;
<;!--!
下面的段落被标记为要翻译。
t;
<;p i18n:message="">;
今天是<;span i18n:name="day">;${date.strftime('%a')}<;/span>;
<;/p>;
<;p py:choose="today.weekday()">;
<;py:when test="0">;
我不比如星期一
<;/py:when>;
<;py:when test="day==4">;
我从来没法掌握星期四的窍门
<;/py:when>;
<;py:otherwise>;周末到了吗?<;/py:否则>;
<;/p>;
<;p py:for="诗中有诗">;
<;py:for each="诗中有行">;$line<;br/><;/py:for>;
<;/p>;
<;/py:block>;
也:
…代码:
hello$user.firstnames$user.lastname!
{%trans%}
今天是{%transname"day"%}${date.strftime('%a')}{%end%}
{%end%}。
{%for verse in poem%}
{%for line in verse%}$line
{%end%}
%end%}
e使用pip的最新版本(推荐):
…代码:sh
pip安装pig
安装最新源代码:
…代码::sh
hg clone https://bitbucket.org/ollyc/pigger
cd pigger
python setup.py install
/
代码::python
from pigger import htmltemplate
template=htmltemplate('<;p>;$greeting<;/p)')
打印(template.render({'greeting':'bonjour!'}))
从磁盘加载模板:
…代码::python
})
一个完全加载的示例:
…代码::python
from pigger import template loader
import gettext
loader=templateloader(
默认为false,
使用true进行开发
自动重新加载=true,
-htmlTemplate或textTemplate
Template=htmlTemplate,
函数返回gettext translations实例或兼容对象。例如,django用户可以插入
`lambda:django.utils.translation`。如果你的应用程序没有被翻译,请忽略这个参数。
translations\u factory=lambda:gettext.translation(…),
template=loader.load('mytemplate.html',encoding='utf-8')
template也可以呈现为流。这可能有助于生成您不希望同时保存在内存中的
长文档:
…代码::python
template=loader.load('huge.html',encoding='utf-8')
for s in template({'data':load_massive_dataset()}):
sys.stdout.write
inheritance
--
布局模板应该用`<;py:block>;`标记
表示定制点:
…代码::html
<;!doctype html>;
<;html>;
<;head>;
<;title py:block="title">;默认标题<;title>;
<;head>;
<;body>;
<;py:block name="content">;
content here
<;py:block>;
<;body>;
<;/html>;
代码::html
<;!--!文件:widgets.html
-->;
<;py:def function="modal(content,title='hello')">;
<;div class="modal">;
<;div class="modal dialog">;
<;div class="modal content">;
<;div class="modal header">;
<;button type="button"data dispose="modal">;x<;/button>;
<;h4 class="modal title">;$title<;/h4>;
<;/div>;
<;div class="modal body">;
${content()如果可调用(内容),则其他内容}
<;/div>;
<;div class="modal footer">;
<;button type="button">;关闭<;/button>;
<;button type="button">;保存更改<;/button>;
<;/div>;
<;/div>;
<;/div>;
<;/div>;
<;/py:def>;
>模板函数可以导入其他模板:
。代码::html
<;py:import href="widgets.html"alias="widgets"/>;
<;p>;
${widgets.modal(content="hello world!")}
<;/p>;
是否注意到函数体中的`${content()if callable content else content}`
插值?这是为了支持"py:call",它可以将模板代码块作为关键字参数传递:
。代码::html
<;py:call function="widgets.modal(fullpage=true)">;
<;py:keyword name="content">;
这是模式内容。您也可以在此处添加标记!
<;/py:keyword>;
<;/py:call>;
许可证
----
0.4.4(2017-01-08发布)
-
-py:extensions:允许contai的"ref"属性n插值,例如
``<;py:extends-ref="${template}.html>;"``
-i18n:为文本模板添加了babel提取器插件
-bugfix:whi翻译字符串中的tespace现在已正确规范化
-错误修复:修复了在使用
`{%if%}…{%else%}…{%end%}``块时文本模板中的崩溃
0.4.3(发布于2016-11-29)
ping文件扩展名
到模板类。默认情况下,`.txt``映射到
:类:`pigger.template.texttemplate`和`.html``映射到
:类:`pigger.template.htmltemplate`.
-错误修复:Unicode符号在Python 2中的模板表达式中使用时不再导致异常。
-错误修复:修复了
模板函数指令的参数列表中使用的变量名。
-``<;py:call>;``现在将其内部html作为位置参数传递,除非它
是空白。
-``<;py:call>;``现在是一个内部指令,这意味着
`<;p py:call="foo()">;>`p>;``
现在将填充`<;p>;``元素,而不是替换它。
-加载程序缓存目录可以通过``仔猪缓存`
环境变量指定。
-添加i18n:comment指令
0.4.1(2016-10-17发布)
----
-添加`{%def%}`和`{%for%}`文本模板指令
-添加``允许绝对_ paths``option to templateloader
0.4(2016-10-16发布)
----
-bugfix:确保``<;py:else>;``指令始终附加到正确的`
`<;py:if>;```
-添加了``i18n:trans``作为i18n的别名:translate
-``i18n:name``directive现在有一个较短的别名
(``i18n:s``,用于替换),并且可以接受一个可选的expr属性,
eg``<;i18n:s name="foo"expr="calculate_foo()"/>;``
-现在在不存在时,使用
插值文本作为占位符提取翻译字符串中的插值。
``i18n:name``指令的
-``py:whitespace="strip"``不再在同一行上的标记之间去除空白。
-文本模板指令现在包括`{%with%}``、
`{%extends%}`和`{%block%}``
-<;py:extend>;现在可以用来加载在模板搜索路径的其他位置使用相同的名称。
-templateloader使用的搜索算法得到了改进
-错误修复:在继承链的中间使用super()时修复重复呈现
-生成的代码在pytho支持的位置使用"yield from"n版本。
-缓存代码已经简化,将.py文件缓存到包含编译的python源代码的磁盘。
-错误修复:``py:attrs``不再引发异常
-错误修复:插值现在可以包含实体引用
0.3(2016-10-03版)
---—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-错误修复:确保语法文件包含在二进制发行版中
-错误修复:修复使用py:with重新分配
a variable
0.1(2016-10-01发布)时的未定义变量错误
===
仔猪是kid/genshi/kajiki家族中的文本和html模板语言。
仔猪模板引擎提供:
-模板通过py:extensions/py:block(类似于jinja2)编译模板到快速python字节code.
-HTML感知模板:输出格式良好,内容
转义,防止XSS攻击。
-可重用模板函数,模板继承的深度嵌套,
灵活的翻译和嵌入的Python表达式
`文档<;http://ollycope.com/software/piglet/>;`
\`bitbucket repository<;https://bitbucket.org/ollyc/pigger>;`
这就是小猪模板的样子:
……代码::html
<;py:extends href="layout.html">;
<;py:block name="content">;
<;h1>;这是内容块。<;h1>;
<;p>;
hello$user.firstnames$user.lastname!
<;/p>;
<;!--!
下面的段落被标记为要翻译。
t;
<;p i18n:message="">;
今天是<;span i18n:name="day">;${date.strftime('%a')}<;/span>;
<;/p>;
<;p py:choose="today.weekday()">;
<;py:when test="0">;
我不比如星期一
<;/py:when>;
<;py:when test="day==4">;
我从来没法掌握星期四的窍门
<;/py:when>;
<;py:otherwise>;周末到了吗?<;/py:否则>;
<;/p>;
<;p py:for="诗中有诗">;
<;py:for each="诗中有行">;$line<;br/><;/py:for>;
<;/p>;
<;/py:block>;
也:
…代码:
hello$user.firstnames$user.lastname!
{%trans%}
今天是{%transname"day"%}${date.strftime('%a')}{%end%}
{%end%}。
{%for verse in poem%}
{%for line in verse%}$line
{%end%}
%end%}
e使用pip的最新版本(推荐):
…代码:sh
pip安装pig
安装最新源代码:
…代码::sh
hg clone https://bitbucket.org/ollyc/pigger
cd pigger
python setup.py install
/
代码::python
from pigger import htmltemplate
template=htmltemplate('<;p>;$greeting<;/p)')
打印(template.render({'greeting':'bonjour!'}))
从磁盘加载模板:
…代码::python
})
一个完全加载的示例:
…代码::python
from pigger import template loader
import gettext
loader=templateloader(
默认为false,
使用true进行开发
自动重新加载=true,
-htmlTemplate或textTemplate
Template=htmlTemplate,
函数返回gettext translations实例或兼容对象。例如,django用户可以插入
`lambda:django.utils.translation`。如果你的应用程序没有被翻译,请忽略这个参数。
translations\u factory=lambda:gettext.translation(…),
template=loader.load('mytemplate.html',encoding='utf-8')
template也可以呈现为流。这可能有助于生成您不希望同时保存在内存中的
长文档:
…代码::python
template=loader.load('huge.html',encoding='utf-8')
for s in template({'data':load_massive_dataset()}):
sys.stdout.write
inheritance
--
布局模板应该用`<;py:block>;`标记
表示定制点:
…代码::html
<;!doctype html>;
<;html>;
<;head>;
<;title py:block="title">;默认标题<;title>;
<;head>;
<;body>;
<;py:block name="content">;
content here
<;py:block>;
<;body>;
<;/html>;
代码::html
<;!--!文件:widgets.html
-->;
<;py:def function="modal(content,title='hello')">;
<;div class="modal">;
<;div class="modal dialog">;
<;div class="modal content">;
<;div class="modal header">;
<;button type="button"data dispose="modal">;x<;/button>;
<;h4 class="modal title">;$title<;/h4>;
<;/div>;
<;div class="modal body">;
${content()如果可调用(内容),则其他内容}
<;/div>;
<;div class="modal footer">;
<;button type="button">;关闭<;/button>;
<;button type="button">;保存更改<;/button>;
<;/div>;
<;/div>;
<;/div>;
<;/div>;
<;/py:def>;
>模板函数可以导入其他模板:
。代码::html
<;py:import href="widgets.html"alias="widgets"/>;
<;p>;
${widgets.modal(content="hello world!")}
<;/p>;
是否注意到函数体中的`${content()if callable content else content}`
插值?这是为了支持"py:call",它可以将模板代码块作为关键字参数传递:
。代码::html
<;py:call function="widgets.modal(fullpage=true)">;
<;py:keyword name="content">;
这是模式内容。您也可以在此处添加标记!
<;/py:keyword>;
<;/py:call>;
许可证
----
0.4.4(2017-01-08发布)
-
-py:extensions:允许contai的"ref"属性n插值,例如
``<;py:extends-ref="${template}.html>;"``
-i18n:为文本模板添加了babel提取器插件
-bugfix:whi翻译字符串中的tespace现在已正确规范化
-错误修复:修复了在使用
`{%if%}…{%else%}…{%end%}``块时文本模板中的崩溃
0.4.3(发布于2016-11-29)
ping文件扩展名
到模板类。默认情况下,`.txt``映射到
:类:`pigger.template.texttemplate`和`.html``映射到
:类:`pigger.template.htmltemplate`.
-错误修复:Unicode符号在Python 2中的模板表达式中使用时不再导致异常。
-错误修复:修复了
模板函数指令的参数列表中使用的变量名。
-``<;py:call>;``现在将其内部html作为位置参数传递,除非它
是空白。
-``<;py:call>;``现在是一个内部指令,这意味着
`<;p py:call="foo()">;>`p>;``
现在将填充`<;p>;``元素,而不是替换它。
-加载程序缓存目录可以通过``仔猪缓存`
环境变量指定。
-添加i18n:comment指令
0.4.1(2016-10-17发布)
----
-添加`{%def%}`和`{%for%}`文本模板指令
-添加``允许绝对_ paths``option to templateloader
0.4(2016-10-16发布)
----
-bugfix:确保``<;py:else>;``指令始终附加到正确的`
`<;py:if>;```
-添加了``i18n:trans``作为i18n的别名:translate
-``i18n:name``directive现在有一个较短的别名
(``i18n:s``,用于替换),并且可以接受一个可选的expr属性,
eg``<;i18n:s name="foo"expr="calculate_foo()"/>;``
-现在在不存在时,使用
插值文本作为占位符提取翻译字符串中的插值。
``i18n:name``指令的
-``py:whitespace="strip"``不再在同一行上的标记之间去除空白。
-文本模板指令现在包括`{%with%}``、
`{%extends%}`和`{%block%}``
-<;py:extend>;现在可以用来加载在模板搜索路径的其他位置使用相同的名称。
-templateloader使用的搜索算法得到了改进
-错误修复:在继承链的中间使用super()时修复重复呈现
-生成的代码在pytho支持的位置使用"yield from"n版本。
-缓存代码已经简化,将.py文件缓存到包含编译的python源代码的磁盘。
-错误修复:``py:attrs``不再引发异常
-错误修复:插值现在可以包含实体引用
0.3(2016-10-03版)
---—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————-错误修复:确保语法文件包含在二进制发行版中
-错误修复:修复使用py:with重新分配
a variable
0.1(2016-10-01发布)时的未定义变量错误