浏览 2251 次
锁定老帖子 主题:编译期模板区域定义
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-12-18
http://www.commontemplate.org)现在的所有区域信息定义都是动态产生的,
CommmonTemplate(包括zone, block, macro,而有些功能需要不执行模板就获取它的区域块。 经常需要用到局部包含功能,如,页面包含时,经常只需包含另一页面的<body></body>里面的部分。 现在的区域定义是动态的,在执行期产生的,如: $zone{"body"} $end 这里的区域名称甚至可以是变量。 如果要做到外部获取区域,则需要在编译期确定区域位置, 然后通过:Template.getZone(String name)获取。 假设静态区域定义语法为: 使用"@"前缀识别,如: $@body ... $end 然后就可以: $inline{"xxx.ctl@body"} $include{"xxx.ctl@body"} 这里牵扯到模板继承功能,上面的静态区域也同时用于继承时覆写,如: $extends{"xxx.ctl"} $override{@body} $super ... $end $end 或者进一步简化,使用同名覆写策略: $extends{"xxx.ctl"} $@body $super ... $end $end 另一个类似的需求是: macro的定义是否可以在调用之后?就像Java中的函数,位置任意。 如: $# 先写调用 $-xxx{param:"value"} $# 后写定义 $macro{"xxx"} ... $end 这里的Macro定义也是运行期的,必需先定义再调用,而如果要做到位置任意,则也应该静态化。 这里不能重用上面的zone定义,因为macro的定义块是不显示的。 但它可以和$block指令共用块定义。block的用法如: $# block定义时不显示,需通过show显示,可多次显示。 $block{"xxx"} ... $end .... $# 在此位置显示block $show{"xxx"} 是否应该再加一个: Template.getBlock(String name) 假设用"%"作为前缀,如: $%xxx ... $end 然后可以: $show{%xxx} 而macro,怎么利用block和zone定义,还有待考虑。 是否macro另使用前缀标识?会不会太多标记? 是否使用声明?如: $using{%xxx} $using{@xxx} 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-12-20
语法上应该保持和原来一致,由编译器去决定怎么样优化调整,不要创建新的语法了。
现在ctl在getTempalte的时候会进行模版解析,相当于静态语言的编译过程,在由模版转化为指令的过程,相当于编译过程,对于某些静态指令,编译器在编译过程进行调整就够了,不必要增加新的语法,规则太多了。 比如macro指令,希望在文本的任意位置定义都可以,完全可以由编译器编译的时候重排指令的顺序,没有任何要求说,指令的编译一定是按照textual的顺序来的吗,Java编译器,就做了大量这种指令合并,指令重排序的优化工作。 |
|
返回顶楼 | |
发表时间:2007-12-20
重排序, 好主意,
DirectiveHandler接口加一个是否为静态指令的状态反馈信息, 引擎对静态指令进行编译期重排序,并且静态指令的表达式参数作字符串处理。 public boolean isStatic(); |
|
返回顶楼 | |