ClearSilver templates入门-1
Clearsilver是what?
快速的和编程语言无关的html模板系统。不管是在静态的还是动态的web站点中,都能够提供视图和逻辑分离的功能实现。
1999年开始开发的,在很多的项目中都有使用。
为什么用它:
高性能和语言无关性 因为它是用c写的,然后在那些Python,Perl,Java,还有Ruby脚本语言中以模块的形式存在。所以非常之快!
修改方便 有一套很强大的模板,一次能够实现很多的效果。
国际化支持
高级特色 内建很多高级特性,例如gzip压缩传输,在线调试,去空格,宏编程,URL和JavaScript字符串转义等.
怎么用:
基础:
要想从数据库里取出数据然后动态的显示在页面上,就需要2个对象。一个就是模板文件,另外一个就是hdf数据集。hdf数据集有点和json是差不多的。这2个东西作用在一起,就能够形成一个动态数据的展示了。
分离应用逻辑和模板:当在处理程序逻辑的时候,我们只需要关注怎么在最后生成一个正确的hdf数据库。然后在模板中,我们就是通过点操作符来取各自对应的值。如果在展示数据个数和类别不变的情况下,是不要再去改动模板文件的。而只是去处理生成的hdf数据集就行了。
下面来说说hdf dataset是什么东西:
hdf文件很好解析的。它有2种格式的。一种就是像字典那样。
Page.Name = My Index Page.URL = /myindex.html Page.Menu.0 = Home Page.Menu.1 = Preferences Page.Menu.2 = Help Page.Menu.3 = Support
另一种就是和xml差不多,以各种包含关系存在。
Page { Name = My Index URL = /myindex.html Menu { 0 = Home 1 = Preferences 2 = Help 3 = Support } }
第二种格式的完全能够像xml那样,包含多种关系。
Page { Menu { 0 { Name = Home URL = / } 1 { Name = Preferences URL = /prefs } 2 { Name = Help URL = /help.html } 3 { Name = Support URL = /feedback/ } } }
因为HFD的api完全能够读写这种格式的文件。所以它完全可以成为一个强大的可配置和持久化的语言。但是,主要的目的还是能够把数据放到hdf文件中,然后
在模板文件中使用。
在我们解析模板文件的时候,模板文件能够指向到hdf文件中的具体的变量,能够遍历特定节点的所有变量。例如,一个cs模板在解析上面的hdf文件中的Page。Menu的时候,
它就能够去遍历所有的menu.返回所有的Menu。name和Url元素。
这里要说2个比较重要的hdf写法的语法:
1. Page.Name : Page.Menu.0.Name 通过冒号能够替代等号来拷贝某一个元素的值。不过在拷贝前被拷贝元素必须存在。
2. 元素能够设置一个多行字符串值,这个语法和标准的unix脚本或者perl的语法类似。例如:
Page.Name << EOM This is my multi-line page name. Isn't it spiffy? EOM
来说说模板文件:
模板文件的后缀可以是.cst或者.cs,由文本和嵌入的clearsilver命令构成。嵌入的语法就跟别的嵌入到html中的模板系统是差不多的。例如。
clearsilver的嵌入方式是以结束。
有下面的一些命令:
替换: var, evar, lvar, include, linclude, set, name
控制流: if, else, elif, alt
遍历: each, loop, with
宏: def, call
所有的控制流语句,遍历语句还有def语句都有结束语句,和html是一样的,比如if就对应着/if
大多数的命令有一个或者多个参数表达式。
另外cs语法也支持注释,就是在标签里 添加#作为注释开始。
<?cs # this is a comment ?>
替换(应该不是替换,或者说是取值比较好): 简单的变量替换用
<? var:Page.Name ?>
就能够实现。
evar和var是一样的,除了对应的节点的值也是解析为cs命令。在加载和解析cs模板的时候会发生evar解析。结果就是,在展示之前语法将会报错,就是说evar不能够用在cs命令里面。比如说each循环中,就不能够
使用evar来展现数据。
lvar和evar有点像,不能够在响应的时候解析数据集的变量,而应该是在解析的时候,要不然会报语法错误,如果不是缓冲输出的话,将会得到一个不完整的页面,这个CGI工具总是以缓冲的形式将数据输出.
name将会返回当前节点的键名.比如<?cs name:Page.Name ?> 将会返回Name.这个在遍历和宏表达中比较有作用.别名的变量的真实名称能够拥有特殊的意义.(下面的例子中会讲到),这个和内置的另外一个表达式是同样的作用<?cs var:name(Page.Name) ?>.