kiss纯无逻辑模板引擎
TemplateRex的Python项目详细描述
templaterex是一个纯模板引擎,没有嵌入的逻辑,用python编写-小而快。
哲学
----
第一个顺序是亲吻-保持简单。第二个是在逻辑域中努力保持逻辑
,逻辑域由一级脚本语言
和表示域中的内容/表示(html、xml)处理。
在html中嵌入逻辑/代码的模板引擎将继续添加功能,使其本身成为一个复杂的编程环境,比底层python语言本身功能更少,但更复杂,更神秘-violati运用接吻原理,提高学习曲线。
templaterex模板在浏览器或所见即所得编辑器中完全可见。这通过允许前端
设计人员和后端开发人员单独工作而不引入
安全问题来促进劳动分工。
由于域的分离,这种方法通常会导致干涸的代码。
例如,一个通用的核心代码库可以通过使用不同的模板(不使用单个for循环或if子句重复)来提供完全不同的外观表示和数据范围。
还有其他好处,请参阅旧金山特伦斯帕尔大学的论文"在
模板引擎中实施严格的模型-视图分离"。
----
从templaterex导入templaterex
trex=templaterex(fname='t-mytemplate.html')
row=[{cellid:'a123','volt':1.21},{cellid:'b321','volt':1.52}]
bl',{category':'用户名列表'})
doctype html>;
<;html>;
<;head>;…<;head>;
<;body>;
<;table>;
<;tr>;<;th>;单元格id<;/th>;<;th>;电压<;/th>;
<;!--begin=行-->;
<;tr>;<;td>;$cellid<;/td>;<;td>;$volt<;/td>;<;/tr>;
<;!--end=row-->;
<;/table>;
<;/body>;
<;/html>;
-
如图所示,文本块用begin=name/end=name分隔符括在html注释内。注意,结束分隔符的命名有助于快速理解复杂模板。
这些块(或节)中的文本通过调用
render_sec(块名,上下文)呈现。整体或基本模板
通过调用render()来呈现。例如,可以按层次结构指定这些块。
python代码::
淡薄电池组{{'cellid''celliid''321,'volt''volt''1.5},{'celliid''101,'volt''1.7}}
bat'hi'u'hi'bat'hi'u电池组{'celliid''102,'volt''2.5},{'celliid''141,'volt''2.7}}
br/>
trex.rendu sec.rendu secx.rendusec('tbl',{'caption''':'1.7''1.7}}}
低单元格'})
对于bat_hi_单元格中的行:
trex.render_sec('row',row)
render_str=trex.render()
-
template t-mytemplate.html---
…环绕HTML…
<;!--开始=tbl-->;
<;table>;
<;caption>;$caption<;/caption>;
<;tr>;<;th>;单元格id<;/th>;<;th>;电压<;/th>;<;/tr>;
<;!--begin=行-->;
<;tr>;<;td>;$cellid<;/td>;<;td>;$volt<;/td>;<;/tr>;
<;!--结束=行-->;
<;/表>;
<;!--结束=待定-->;
…环绕HTML…
当然,这可以通过嵌套for循环来完成,但为了清楚起见,可以给出
。
模板继承
~~~~~~~~~~~~~~~~~~~~~~~~~~
您可以指定基模板或布局模板。如果模板调用中的第一行包含基说明符,如
<;!--base=t-layout.html-->;
调用模板文本::
--base=t-layout.html-->;
<;!--开始=内容-->;
<;div class="conent">;
…这里的内容…
<;div>;
<;!--结束=内容-->;
…环绕HTML…
基础模板文本:
模板t-layout.html--
<;!doctype html>;
<;html>;
<;head>;…<;head>;
<;script type="text/javascript" src="../static/jquery.js">;
<;link rel="stylesheet"href="../static/style.css"type="text/css"/>;
<;body>;
<;header>;…标题东西…<;/header>;
$content
<;footer>;…基脚材料…<;/footer>;
<;/body>;
<;/html>;
..
rendered_str=trex.render()
---
template includes
~~~~~~~~~~~~~~~~~~~~~~
如果在处理include语句时遇到
<;!-include=t-header.html-->;
以下语法::
&function_to_be called($args1,'arg2',kwarg1=true,kwarg2='test')
&br/>函数名(在&;后面)必须是内置函数之一或自定义注册的函数调用。如果函数没有参数,则需要
以下匹配括号。
参数可以是用引号标识的字符串文本,true或false
布尔值、整数或浮点数或上下文变量。context
变量可以用前导$或仅仅是一个简单的单词来标识—使用
$分隔符更快,而且为了清晰起见,鼓励使用它。如果上下文变量
在上下文中找不到,则函数调用是静默的。
函数可以通过两种方式轻松注册。最简单的方法是在对象创建期间指定
自定义函数func_reg关键字。
例如::
func_custom庘dict={'format':format,'myfunc':myfunc}
trex=templaterex(fname=fspec庘template,func庘reg=func庘custom庘dict)
trex=templaterex()
树函数更新(func_custom_dict)
trex.get_template(fspec_template)
将注册python格式函数和您自己的自定义myfunc函数。
然后您可以在模板中使用以下内容:
voltage is:&;format($voltage,.1f')
上下文变量,需要在存在
函数的render调用(render_sec()或render())的上下文
字典中传递。
内置函数/过滤器
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tbd-查找函数.py中的代码
选项:用于指定节块的注释字符是默认的<;!--以及-->;。但是,这些是可选的。例如,
这里是一个具有不同注释前缀和后缀字符选项的对象创建:
trex=templaterex(fname='dhcpcd-template.conf',cmnt_u prefix='_-',cmnt_u postfix='-')
这将分析模板,查找分隔为::
##-begin=static_段-
…分区块…
end=static_section-
可以使用dev_mode参数选择此模式。例如::
trex=templaterex(fname='/etc/dhcpcd template.conf',cmnt_prefix='-',cmnt_postfix='-',dev_u mode=true)
plate:/etc/dhcpcd-template.conf部分:下面的静态部分-
接口eth0
静态IP_地址=10.10.80.202/24
静态路由器=10.10.80.1
静态域名_服务器=192.168.101.210
模板/etc/dhcpcd-template.conf部分:上面的静态部分-##
哲学
----
第一个顺序是亲吻-保持简单。第二个是在逻辑域中努力保持逻辑
,逻辑域由一级脚本语言
和表示域中的内容/表示(html、xml)处理。
在html中嵌入逻辑/代码的模板引擎将继续添加功能,使其本身成为一个复杂的编程环境,比底层python语言本身功能更少,但更复杂,更神秘-violati运用接吻原理,提高学习曲线。
templaterex模板在浏览器或所见即所得编辑器中完全可见。这通过允许前端
设计人员和后端开发人员单独工作而不引入
安全问题来促进劳动分工。
由于域的分离,这种方法通常会导致干涸的代码。
例如,一个通用的核心代码库可以通过使用不同的模板(不使用单个for循环或if子句重复)来提供完全不同的外观表示和数据范围。
还有其他好处,请参阅旧金山特伦斯帕尔大学的论文"在
模板引擎中实施严格的模型-视图分离"。
----
从templaterex导入templaterex
trex=templaterex(fname='t-mytemplate.html')
row=[{cellid:'a123','volt':1.21},{cellid:'b321','volt':1.52}]
bl',{category':'用户名列表'})
doctype html>;
<;html>;
<;head>;…<;head>;
<;body>;
<;table>;
<;tr>;<;th>;单元格id<;/th>;<;th>;电压<;/th>;
<;!--begin=行-->;
<;tr>;<;td>;$cellid<;/td>;<;td>;$volt<;/td>;<;/tr>;
<;!--end=row-->;
<;/table>;
<;/body>;
<;/html>;
-
如图所示,文本块用begin=name/end=name分隔符括在html注释内。注意,结束分隔符的命名有助于快速理解复杂模板。
这些块(或节)中的文本通过调用
render_sec(块名,上下文)呈现。整体或基本模板
通过调用render()来呈现。例如,可以按层次结构指定这些块。
python代码::
淡薄电池组{{'cellid''celliid''321,'volt''volt''1.5},{'celliid''101,'volt''1.7}}
bat'hi'u'hi'bat'hi'u电池组{'celliid''102,'volt''2.5},{'celliid''141,'volt''2.7}}
br/>
trex.rendu sec.rendu secx.rendusec('tbl',{'caption''':'1.7''1.7}}}
低单元格'})
对于bat_hi_单元格中的行:
trex.render_sec('row',row)
render_str=trex.render()
-
template t-mytemplate.html---
…环绕HTML…
<;!--开始=tbl-->;
<;table>;
<;caption>;$caption<;/caption>;
<;tr>;<;th>;单元格id<;/th>;<;th>;电压<;/th>;<;/tr>;
<;!--begin=行-->;
<;tr>;<;td>;$cellid<;/td>;<;td>;$volt<;/td>;<;/tr>;
<;!--结束=行-->;
<;/表>;
<;!--结束=待定-->;
…环绕HTML…
当然,这可以通过嵌套for循环来完成,但为了清楚起见,可以给出
。
模板继承
~~~~~~~~~~~~~~~~~~~~~~~~~~
您可以指定基模板或布局模板。如果模板调用中的第一行包含基说明符,如
<;!--base=t-layout.html-->;
调用模板文本::
--base=t-layout.html-->;
<;!--开始=内容-->;
<;div class="conent">;
…这里的内容…
<;div>;
<;!--结束=内容-->;
…环绕HTML…
基础模板文本:
模板t-layout.html--
<;!doctype html>;
<;html>;
<;head>;…<;head>;
<;script type="text/javascript" src="../static/jquery.js">;
<;link rel="stylesheet"href="../static/style.css"type="text/css"/>;
<;body>;
<;header>;…标题东西…<;/header>;
$content
<;footer>;…基脚材料…<;/footer>;
<;/body>;
<;/html>;
..
rendered_str=trex.render()
---
template includes
~~~~~~~~~~~~~~~~~~~~~~
如果在处理include语句时遇到
<;!-include=t-header.html-->;
以下语法::
&function_to_be called($args1,'arg2',kwarg1=true,kwarg2='test')
&br/>函数名(在&;后面)必须是内置函数之一或自定义注册的函数调用。如果函数没有参数,则需要
以下匹配括号。
参数可以是用引号标识的字符串文本,true或false
布尔值、整数或浮点数或上下文变量。context
变量可以用前导$或仅仅是一个简单的单词来标识—使用
$分隔符更快,而且为了清晰起见,鼓励使用它。如果上下文变量
在上下文中找不到,则函数调用是静默的。
函数可以通过两种方式轻松注册。最简单的方法是在对象创建期间指定
自定义函数func_reg关键字。
例如::
func_custom庘dict={'format':format,'myfunc':myfunc}
trex=templaterex(fname=fspec庘template,func庘reg=func庘custom庘dict)
trex=templaterex()
树函数更新(func_custom_dict)
trex.get_template(fspec_template)
将注册python格式函数和您自己的自定义myfunc函数。
然后您可以在模板中使用以下内容:
voltage is:&;format($voltage,.1f')
上下文变量,需要在存在
函数的render调用(render_sec()或render())的上下文
字典中传递。
内置函数/过滤器
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tbd-查找函数.py中的代码
选项:用于指定节块的注释字符是默认的<;!--以及-->;。但是,这些是可选的。例如,
这里是一个具有不同注释前缀和后缀字符选项的对象创建:
trex=templaterex(fname='dhcpcd-template.conf',cmnt_u prefix='_-',cmnt_u postfix='-')
这将分析模板,查找分隔为::
##-begin=static_段-
…分区块…
end=static_section-
可以使用dev_mode参数选择此模式。例如::
trex=templaterex(fname='/etc/dhcpcd template.conf',cmnt_prefix='-',cmnt_postfix='-',dev_u mode=true)
plate:/etc/dhcpcd-template.conf部分:下面的静态部分-
接口eth0
静态IP_地址=10.10.80.202/24
静态路由器=10.10.80.1
静态域名_服务器=192.168.101.210
模板/etc/dhcpcd-template.conf部分:上面的静态部分-##