Genshi笔记

正式决定从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不同。

列简表如下:

  KIDGenshi 
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()')"/> 

基本上就是这样,更多的东东还在研究中。