论坛首页 Java企业应用论坛

编译期模板区域定义

浏览 2251 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-18  
CommmonTemplate(http://www.commontemplate.org)现在的所有区域信息定义都是动态产生的,
包括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}



   发表时间:2007-12-20  
语法上应该保持和原来一致,由编译器去决定怎么样优化调整,不要创建新的语法了。

现在ctl在getTempalte的时候会进行模版解析,相当于静态语言的编译过程,在由模版转化为指令的过程,相当于编译过程,对于某些静态指令,编译器在编译过程进行调整就够了,不必要增加新的语法,规则太多了。

比如macro指令,希望在文本的任意位置定义都可以,完全可以由编译器编译的时候重排指令的顺序,没有任何要求说,指令的编译一定是按照textual的顺序来的吗,Java编译器,就做了大量这种指令合并,指令重排序的优化工作。
0 请登录后投票
   发表时间:2007-12-20  
重排序, 好主意,
DirectiveHandler接口加一个是否为静态指令的状态反馈信息, 引擎对静态指令进行编译期重排序,并且静态指令的表达式参数作字符串处理。
public boolean isStatic();
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics