上一篇文章web.py源码分析: 模板(1)说明了web.py的模板的大致工作原理。本文重点讲述web.py模板支持的语法是如何转换生成__template__函数的。
web.py模板语法和__template__()函数的对应关系
本章会列出模板内容以及转换之后的__template__()函数的内容,以及必要的文字说明。模板的名称统一是hello.html。
纯字符串
模板内容
1 2 |
hello, world |
函数内容
1 2 3 4 5 6 7 8 |
def __template__(): __lineoffset__ = -5 loop = ForLoop() self = TemplateResult(); extend_ = self.extend extend_([u'hello, world\n']) return self |
def with
模板内容
1 2 3 |
$def with (name, value=[], *args, **kargs) hello, $name |
函数内容
1 2 3 4 5 6 7 8 |
def __template__ (name, value=[], *args, **kargs): __lineoffset__ = -4 loop = ForLoop() self = TemplateResult(); extend_ = self.extend extend_([u'hello, ', escape_(name, True), u'\n']) return self |
从生成的函数可以看出,def with语法所生成的就是__template__()函数的参数列表。
表达式替换
模板内容
1 2 3 4 5 6 |
$def with (name, value) $name ${name + value} $(name + value)ing. $name[value].function() |
函数内容
1 2 3 4 5 6 7 8 9 10 11 |
def __template__ (name, value): __lineoffset__ = -4 loop = ForLoop() self = TemplateResult(); extend_ = self.extend extend_([escape_(name, True), u'\n']) extend_([escape_((name + value), True), u'\n']) extend_([escape_((name + value), True), u'ing.\n']) extend_([escape_(name[value].function(), True), u'\n']) return self |
表达式的替换就是执行表达式(表达式对应的代码),得到的结果添加到TemplateResult实例中。
赋值
模板内容