`
javatar
  • 浏览: 1701121 次
  • 性别: Icon_minigender_1
  • 来自: 杭州699号
社区版块
存档分类
最新评论

编译期模板区域定义

    博客分类:
  • HTTL
阅读更多
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}



分享到:
评论
2 楼 javatar 2007-12-20  
重排序, 好主意,
DirectiveHandler接口加一个是否为静态指令的状态反馈信息, 引擎对静态指令进行编译期重排序,并且静态指令的表达式参数作字符串处理。
public boolean isStatic();
1 楼 leadyu 2007-12-20  
语法上应该保持和原来一致,由编译器去决定怎么样优化调整,不要创建新的语法了。

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

比如macro指令,希望在文本的任意位置定义都可以,完全可以由编译器编译的时候重排指令的顺序,没有任何要求说,指令的编译一定是按照textual的顺序来的吗,Java编译器,就做了大量这种指令合并,指令重排序的优化工作。

相关推荐

    PHP100视频教程30:PHP模板引擎Smarty缓存应用.rar

    3. **模板继承**:Smarty支持模板继承,允许创建基础模板,子模板可以通过继承并覆盖部分区域来实现页面布局的复用。 4. **函数和控制结构**:Smarty 提供了一系列内建的函数和控制结构,如循环(foreach)、条件...

    smarty课件

    3. **模板继承与块**:Smarty支持模板继承,允许一个基础模板定义布局,而其他模板可以通过`{extends}`标签继承并覆盖特定区域。`{block}`标签用于定义可重用的模板段落,比如页眉和页脚。 4. **缓存机制**:Smarty...

    深度探索C++的总结

    7. **模板与类型推断**:模板是C++中实现泛型编程的关键,但模板值参数必须是编译期常量。编译器的类型推断规则在非模板函数和模板实例化中有所不同。模板的隐式类型转换能力在某些情况下会减弱。 8. **访问控制与...

    Smarty完全中文手册

    同时,可以使用`block`标签定义可重用的页面区域。 8. **预处理和后处理**:Smarty允许在渲染模板前和后添加自定义函数,进行数据的预处理和后处理,这增强了其灵活性。 9. **分隔符自定义**: Smarty允许用户...

    销售合同模板集锦九篇_1.docx

    - **合作期限**:合同有效期为一定期限(如文中所述的几个月),到期后如无异议则自动延续;一方提出终止时,则合同终止。 2. **代理产品及价格** - 文中虽然没有具体列出产品的名称和价格,但在实际合同中应明确...

    vc++2005微软讲师讲解

    - **编译期模板**:C++/CLI特有的功能之一,允许在编译期间执行某些任务,提高运行时性能。 #### 资源管理 - **资源清理**:确保在对象不再需要时正确释放资源的过程。在C++/CLI中,可以通过析构函数、finalizer等...

    smarty 帮助文档

    Smarty支持模板继承,通过`extends`关键字指定父模板,然后使用`block`定义可覆盖的区域。这有助于保持设计一致性并减少代码重复。 6. **缓存机制** Smarty提供了一个强大的缓存系统,可以提高动态页面的加载速度...

    C++中的函数(2013级-C++程序设计)

    函数模板使用模板参数作为类型标识,编译时根据实际的类型进行实例化。 有默认参数的函数允许函数调用时可以省略某些参数,只需提供剩余参数。这样可以使得函数调用更加灵活,提供默认值的参数应该位于参数列表的...

    Inside C++ Object Model

    3. **内存管理**:C++提供了堆栈和堆两种内存区域,分别用于存放局部变量和动态分配的对象。书中会讨论内存分配策略、对象的生存期以及如何避免内存泄漏。 4. **构造与析构**:构造函数用于初始化新创建的对象,而...

    C++ 笔试面试题大解析

    编译期常量与数组定义 在C++中,数组的大小必须在编译时确定。因此,使用运行时确定的变量(如`temp`)作为数组`char str2[size2];`的大小是不允许的。`size2`必须是一个编译期常量表达式。 ### 7. 反向遍历数组 ...

    C++ 标准 ISO 14882-2011

    - 一般规定(General)、头文件概述(Header &lt;locale&gt; synopsis)、区域设置(Locales)、标准区域设置类别(Standard locale categories)、标准代码转换面(Standard code conversion facets)、C库区域设置(C ...

    CC++电话面试

    - **类型检查**:`const`变量支持类型检查,可以在编译期发现类型不匹配的问题;`#define`则不具备类型检查功能,可能导致运行时错误。 - **作用域**:`const`变量具有局部作用域或文件作用域,可以根据需要控制其...

    smarty完全中文手册

    `block`指令用于定义可重用的区域,子模板可以覆盖父模板中的块。 7. **函数和插件**:Smarty提供了一系列内置函数,如`date_format`、`escape`等,也可以自定义插件扩展其功能。通过`{function name="myFunction" ...

    java面试题库 面试用的

    2. 注解:了解注解的使用,理解元注解和自定义注解,掌握注解在编译期和运行期的应用。 七、JVM内存模型 1. 内存区域:理解堆、栈、方法区、本地方法栈、程序计数器等区域的划分和作用。 2. 垃圾收集:掌握GC的基本...

    MQL5语言参考手册中文版.pdf

    变量初始化是分配初值给变量的过程,而可见范围和变量使用期则决定了变量在程序中作用的区域和时间。 预处理程序在MQL5中用于改善代码的可维护性和可重用性,包括常量声明、程序属性、包含文件以及条件编译等。例如...

    Cpp面经200问.pdf

    堆是动态分配内存的区域,由程序员手动申请和释放,分配和回收速度相对较慢,但使用灵活。 #### 5. 指针类型区别 包括指向指针的指针、指针的指针、指向函数的指针、指向成员的指针等等。每种指针类型用于不同场景...

    C++笔试题以及答案

    ### 编译期类型检查 **知识点6:** 编译期间的类型检查。 - **问题描述:** - 尝试输出一个三元表达式的值,该表达式包含不同类型。 - **解析:** - C++ 编译器在编译阶段会进行严格的类型检查。在表达式 `(true...

    沿正弦曲线移动的实心圆

    在本文中,我们将深入探讨如何使用MFC(Microsoft Foundation Classes)框架来实现一个Windows应用程序,该程序能够在客户端区域绘制一个实心圆,并使其沿着正弦曲线移动。每隔四分之一周期,圆的填充颜色和线条颜色...

    SimpleJava.pdf

    - **类型安全**:确保程序在编译期就能检测到类型错误,提高代码的安全性。 - **编译器作用**:编译器在编译过程中对类型进行验证,确保变量和表达式的类型正确无误。 - **泛型擦除**:尽管Java支持泛型,但实际执行...

Global site tag (gtag.js) - Google Analytics