Size: 4719
Comment:
|
Size: 4893
Comment: 讨论
|
Deletions are marked like this. | Additions are marked like this. |
Line 124: | Line 124: |
==讨论== 可惜python比较不支持这种模板模式,因为python是和缩进有关的. 这个模板系统和noweb这种文学编程类似,只是noweb更好看. |
含有章节索引的中文 文章模板
-- limodou [DateTime(2004-08-24T22:28:53Z)] TableOfContents
meteor(流星) 模板系统说明
meteor(流星)是我给这个模板系统起的名字,因为它可能象流星一样发出耀眼的光芒,但生命却很短暂。我希望在 NewEdit 中用到它。
模板定义
meteor模板是一个真正的Python程序。它是由许多模板元素的定义组成的。一个简单的模板原型为:
{{{!#python from Template import T
hello = T("Hello, <#var#> \n") message = T("Please input yourname:") program = T("""name = input_raw("<#message#>") print <#hello#>
- """)
}}}
一个模板文件由许多的模板元素构成。模板元素是Template中T类的一个实例。每个模板元素在创建时要传入它所代表的文本。我定义一个模板元素的文本为未经过替换的原始信息,一个模板元素的值为进行了替换后的文本。文本中可以包含进行替换的模式(pattern),一个模式是形如:
<#name#>
的东西。<#和#>为前导和后导串,可以在Template中进行改变。name为此替换模式的名字,我定义它为一个引用变量。因此<#name#>定义了名为name的引用变量。引用变量最终会用实际的值进行替换:当它的名字正好是本模板中定义的其它模板元素时,此引用变量将用对应的模板元素值进行替换。如果引用变量没有对应的模板元素,则在进行此模板替换的时候应提供一个包含该名字的字典。
一个模板元素相互引用的例子如:
attachment:template_ref.gif
这个图是用Graphviz的dot生成的:
attachment:ref.gif
.dot文件内容:
digraph G { A -> B; A -> C; B -> D; B -> E; }
命令行参数为:dot -Tgif ref.dot -o ref.gif
很简单吧!
meteor模板文件有以下特点:
- 它是一个真正的Python程序。
- 由许多的模板元素组成。
- 模板元素之间可以相互引用,但不能出现循环的情况。如果按模板元素之间的引用关系生成一个图的话。应该是一个有向不连通图。
- 模板元素是一个T类的实例。它可以包含替换模式(引用变量)。
- 引用变量是在模板元素中定义的,并且它的前导和后导串可以在Template类中进行修改。
- 一个模板元素在替换时,如果它所用到的引用变量全部是其它的模板元素时,则不必提供额外的数据字典。如果它用到的引用变量在模板中不存在,即为外部变量时,需要提供一个额外的数据字典。
- 在一个复杂的模板元素相互引用的情况下,模板系统会自动根据模板元素之间的引用进行替换,替换的规则是根据有向图,从最后被引用的元素开始向后直到要处理的模板元素进行替换。这些模板元素如果都有外部引用变量,则均应提供额外的数据字典。数据字典形如:
{ 'template_element1':{'t1_var1':'t1_var1_value', 't1_var2':'t1_var2_value'}, 'template_element2':{'t2_var1':'t2_var1_value', 't2_var2':'t2_var2_value'}, }
- 从上面可以看出是,这个数据字典是以模板元素为键字(如果需要的话),其值又是一个字典。这个字典中就是此模板元素中用到的外部引用变量。如果一个模板是可以循环的,那么这个模板元素的值应该是一个字典的列表,如:
{ 'template_element1':{'t1_var1':'t1_var1_value', 't1_var2':'t1_var2_value'}, 'template_element2':[ {'t2_var1':'t2_var1_value1', 't2_var2':'t2_var2_value1'}, {'t2_var1':'t2_var1_value2', 't2_var2':'t2_var2_value2'}, ] }
- 上例中template_element2就是一个可以循环的字典定义。
- 模板元素是否循环完全是根据提供的数据来决定的。
- 模板类可以装入多个模板同时进行处理。
模板替换
一个调用模板进行转换的示例程序如下:
运行结果如:
name = input_raw("Please input yourname:") print '''Hello, var1 Hello, var2 Hello, var3 '''
名词列表
模板文件
模板元素
模板文本
模板值
替换模式(引用变量)
==讨论== 可惜python比较不支持这种模板模式,因为python是和缩进有关的.
这个模板系统和noweb这种文学编程类似,只是noweb更好看.