日期:2014-05-17  浏览次数:21050 次

ASP模板引擎实现
模板引擎说明:
1.此模板引擎由个人独立完成,转载或使用请联系
2.引擎内部使用了其它函数及操作类,暂时不能直接使用
3.发出来是想分享一下自己的解析思路,希望有兴趣的朋友点评一下
以下是说明

==============================沧桑的分隔线====================================

模板对象属性
bHtm //是否生成静态
filePath //指定静态文件路径,包括文件名,生成静态时必须指定
相对于htmPath的路径
iche //缓存时间,以秒计,不指定时从常量内取值,0时不缓存
sChr //模板文件的编码,默认gb2312

全局变量
//开始替换一次,最后替换一次
{$变量名}
{$apppath} /程序根目录
{$filepath} /上传文件目录
{$template} /当前模板目录
{$source} /当前模板资源目录
{$SiteName}
{$SiteTitle}
{$SiteDesc}
{$SiteKeyWords}
{$siteurl}
{$lang} //当前语言
在标签内使用 $变量名

//系统变量
{$query.}
{$form.}
{$cookie.}
{$server.}
{$session.}

以上变量不区分大小写
{$obj.key} /注册的obj变量的key值.

变量格式
{var:} //直接注册的变量
{$obj.key} //注册的obj的属性
{@} //循环内变量
支持变量格式化,以|分割每一个参数,不需使用引号,函数名不区分大小写
fmtdate 格式化日期 kindly/YYYY-MM-DD HH:NN:SS WWW,不是日期格式将原样输出
cutstr 截取化字符串 长度|尾符
lcase
ucase
nohtml 去除html标签
html 输出html格式
ubb 将ubb转为html
escape 编码
jscode js编码
replace 要替换的字符|替换的字符
trip 去除多余空格
fmtnum 格式化数字 类型|长度|是否截短  1.填充整型,前补0,2.填充小数,后补0,3.转化16进制格式,4.十六进制转换十进制

url 1.内容页url,2.列表页url  | 类别|id/page

default 默认值.字符串为空时

iif 真|假  /会先强制转换布尔

filesize将数值转换为磁盘空间计量



以下标签名小写
自定义变量(通过assign注册的字符串或数字)
{var:}

//开始读取包含
包含文件,相对于当前模板文件夹,可包含子目录
{include(fiename)}

以下标签带有属性,属性必须使用"或'包括,属性内的'使用%27,"使用%22代替
属性名最好使用小写
有[]或[的地方表示该属性可有可无,没有则表示该属性必须指定值

函数 用于对标签内容使用指定函数解析
{fn: func="" [args="" [argtype=""]]}{/fn}
函数必须为自定义函数,必须返回字符串,不能使用系统函数
函数参数个数必须符合要求,最多5个参数
第一个参数为标签内容
如果需要其它的参数,使用args=""属性.
参数用,隔开,参数内的,使用%2C表示,%使用%25表示
argtype指定对应位置的参数格式,可使用s-字符串,i-整型,f-浮点型,b-布尔型, ,分隔
不指定时默认全部以字符串传递

判断 //可嵌套
{if:}{elseif:}{else}{/if}

循环 //可嵌套
{for:}{/for}
{@var}
var=
[from= //省略时为1
to=
[step= //省略时为1

{foreach:}{/foreach}
{@var.name}
{@var.value}
var=
name= //注册的obj

{loop:}{loopelse}{/loop}
{@name.}
name= /已注册的,recordset
[count= /与limit同用时优先级较高
[limit= /a,b表示从recordset的第a行开始显示b条,只有一个值则等同于count

{sql:}{sqlelse}{/sql}
{@name.}
{@name.@index} /当前索引
name=
table=
[count= /显示数量,最多100行
[where= /不含where,完整的条件语句,字段名以$p$开头
[field= /以,分割字段名
[limit= /a,b 起始,长度,必须是数值,如果只有一个值,则表示查询前N条
[order= /以,分割排序值


局部不缓存
<nocache>
</nocache>
该标不可嵌套,不可用在其它标签内部

局部长缓存,不受全局缓存时间影响,但当全局缓存未过期时不会更新
该功能针对需要复杂解析或多次读取数据但一般不会更新的部分进行缓存
<cache name="" [time=""]>
</cache>
name属性必须,且所有局部缓存不能同名
time以小时计,省略时永久缓存,除非清除缓存

==============================沧桑的分隔线====================================

以下是解析类的源码
'**********************************
'ASP模板引擎
'用法:	Set var=new sTemplate
'		[var.prop=vars]
'		[var.assign name,value]
'		var.display tplpath
'作者:	shirne
'日期:	2011/9/10
'**********************************
Class sTemplate
	Private oData, oType, oReg, oSql, oStm, oFso
	Private sApp, sTpl, sExt, sHtm, sFmt
	Private iStart,iQuery		'开始运行时间
	
	Private	htmPath,aCache,chePath
	Public  bHtm,filePath,iChe,sChr
	
	Private Sub Class_Initialize
		iStart	= Timer()
		sApp	= AppPath
		sTpl	= AppPath & TEMPLATE_PATH & "default/"
		sExt	= ".html"
		sChr	= "gb2312"				'编码
		sFmt	= "\w\d\/\\\-\[\]\.\u00A1-\uFFFF"		'变量格式化允许的字符,不能有}
		iChe	= CACHE_TIME		'缓存时间以秒计
		
		bHtm	= HTML_OPEN		'是否生成静态,生成静态时必须指定filepath
		iQuery	= 0				'自定义的sql查询次数
		
		htmPath	= AppPath&"html/"		'静态文件路径
		chePath	= AppPath&"cache/"		'缓存文件路径
		
		Set oData	= Server.CreateObject("Scripting.Dictionary")	'存放注册数据
		Set oType	= Server.CreateObject("Scripting.Dictionary")	'存放数据类型