模板引擎开发(一)
我自己写了一套建站系统,关于为什么我要自己写一套建站系统,而不是用网上开源的(将来我的也会开源),个人原由很多人都问过我,当然是有原因的,回头再作解释。今天就说说建站系统中的模板引擎的开发。
建站系统是基于.net的,为了方便使用,我也编写了模版处理的功能,当然也需要通过一些标签化语言将模板生成静态网页。我采用了类似于织梦的语言标签,当然也有自己的特色,真正实现功能时,与织梦已经有了很大差别。我大致把实现的思路给大家讲解一下,今天写头一篇,先介绍一下我的模板标签,后续逐步讲解如何实现其功能的。
标签分为三大类:值标签、组件标签、自定义标签
一、 值标签
没有任何属性,可以出现在HTML的任何位置,类似于.net中的public值输出。
例如:
{%=SiteName%} 输出网站名称
值标签分为全局值标签与局部值标签,二者使用方法相同。
1. 全局值标签
全局值标签,指在网站所有页面都可以引用的值。
如上例中的网站名称{%=SiteName%}
2. 局部值标签
局部值标签,指出现某特定环境下的引用值;如新闻栏目的页面,系统已知当前页面是某个新闻的栏目,可直接引用{%=NewsColumnName%},显示当前栏目的名称。支持格式化化。
例如:
{%=NaTitle%}输出新闻文章的标题
{%=NaCrtTime:yyyy年M月d日%}输出新闻文章的创建时间,并格式化为年月日
一、 组件标签
组件标签主要用在页面body主体之内,表现较为复杂的内容。可以带有属性。类似于.net中的组件。本来打算是<尖括号的,为了保持与html标签的一致,后来考虑到检索的效率问题,采用了中括号。
如新闻列表,
[ list:NewsArticle count="10" sort="1" class="news" title="新闻列表" ]
<a href="news_{%#newsId%}.html">{%#newsTitle%}</a>
[/ list:NewsArticle ]
实际生成的HTML代码如下
<dl count="10" sort="1" class="news">
<dt>新闻列表</dt>
<dd><a href="news_1.html">北方沙尘天气将持续</a></dd>
……
</dl>
上述标签中,属性为选填项;
组件按具体使用况,分为以下几类:
1. 列表标签
如:
List:NewsArticle,循环显示文章列表,并生成dl、dd的HTML标签,支持分页
可以设置属性,显示多少条信息,哪个栏目下的文章等;
组件标签内的html代码将会被循环输出。
2. 循环标签
循环标签与List功能相近,但不支持分页
repeat:NewsArticle,循环显示文章列表,纯输出,不生成多余HTML标签
3. 单项信息标签
内容标签,如下例,输出id为2的新闻文章
[Details:NewsArticle id=”2”]
……
[/ Details:NewsArticle];
组件标签内的Html代码会同步输出,由于不是列表组件,不会循环输出。
4. 标签的简写
标签前缀支持简写
List简写l、li
Repeat简写r、rp
Details简写d、de
标签后缀同样支持简单,例如newsArticle,可以简写为na;
具体查看模板系统配置文件Template.config
二、 值绑定标签
用于在组件标签中显示当前记录的相关属性
如前面实例如中的{%#newsTitle%}。支持格式化
如:{%#crtTime:yyyy年M月d日%}输出 2013年3月1日
如:{%#index:00%}输出01
类似于.net中的<%# Eval("crtTime","{0:yyyy年M月d日}")%>
三、 自定义标签
主要用于展现一些通用内容,如页面顶部与底部。类似于.net的组件引用。
如展示页面顶部
{%@PageTop%}
自定义标签中的超链接、图片链接等所有的链接地址,会根据自定义标签当前所有的页面路径自动转换。