正式决定从KID改到Genshi。虽然Jinja的性能的确好,但是Script风格的Web template毕竟还是不如XML风格的好看和规范。试了一下发现,Genshi与KID的差别也不是很大,迁移过来还是很方便的。
Genshi是一个日文词汇“原糸(げんし)”——咋又是日本人整出来的捏?啥时国人能整出点像样的东东来,别只会弄些烧香的熊猫之类,一点建设性都木有——它的设计目标就是修改KID以提供更好的性能。
不过试用Genshi还是碰到一些困难,最主要的是因为我对KID也不熟,而Genshi的资料又太少,除了一个并不详尽的Guide以外,就是一个Example。研究了一阵才理出一点头绪,这里就拿Example来说明一下吧。
把下载的Genshi压缩包解开后,在examples/turbogears下是一个完整的例子,它的创建方法与标准的project(使用KID)是完全一样的。不同之处主要有两个:
1、需要修改config/app.cfg
2、修改templates下的模板文件
app.cfg的修改很简单,把其中kid.xxx的项目都注释掉,再增加如下一行内容:
tg.defaultview = "genshi"
修改模板文件则要麻烦一些。主要是几个方面:
1、TG默认的KID基本模板sitetemplate不能用了,需要把Genshi的Example里的那个sitetemplate.html拿来用。
2、模板的xmlns不同,模板的继承方式不同(详见Example);注意:在Genshi里,最终要用于显示的模板,在include标记中不能包含fallback标记。
3、其它XML tag不同。
列简表如下:
KID | Genshi | |
xmlns | xmlns:py="http://purl.org/kid/ns#" | xmlns:py="http://genshi.edgewall.org/" xmlns:xi="http://www.w3.org/2001/XInclude" |
继承 | py:extends="sitetemplate" | <xi:include href="sitetemplate.html"><xi:fallback/></xi:include> 不过在最终显示页面的模板(即不是用于被继承的模板)是这样的: <xi:include href="master.html" /> |
其它XML tag (如在master模板中包含 welcome模板内容的部分位置) |
<div py:replace="[item.text]+item[:]"/> | <div py:replace="select('*|text()')"/> |
基本上就是这样,更多的东东还在研究中。