当前位置: 首页 > 图文教程 > 网络编程 > ASP > ASP 高级模板引擎实现类

ASP
对连串英文自动换行的解决方法 IE5.5
怎样写你自己的EMAIL组件(原理)
ASP中有关timeout超时的体会
用ASP实现从SQL Server导出数据到Access
ASP向NT域中加一个用户
ASP乱码的解决方法
关于 aspsmartupload 注册问题
利用XML不离开页面刷新数据
IIS 处理 SEARCH 请求漏洞
不用组件实现上载功能(1)
不用组件实现上载功能(2)
在网页中实现OICQ里的头像选择的下拉框
仅用xsl和asp实现分页功能
如何使用context()方法将数据置入表格(XML)
利用ASP从远程服务器上接收XML数据
将数据库里面的内容生成EXCEL
怎样在ASP里面创建统计图表
加密你的Access数据库
利用global.asp定时执行ASP
加密QueryString数据

ASP 高级模板引擎实现类


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 91 ::
收藏到网摘: n/a

这个模板引擎比较方便,跟HTML结合了
复制代码 代码如下:

Class template
Private c_Char, c_Path, c_FileName, c_Content, c_PageUrl, c_CurrentPage, c_PageStr, ReplacePageStr
Private TagName
' ***************************************
' 设置编码
' ***************************************
Public Property Let Char(ByVal Str)
c_Char = Str
End Property
Public Property Get Char
Char = c_Char
End Property
' ***************************************
' 设置模板文件夹路径
' ***************************************
Public Property Let Path(ByVal Str)
c_Path = Str
End Property
Public Property Get Path
Path = c_Path
End Property
' ***************************************
' 设置模板文件名
' ***************************************
Public Property Let FileName(ByVal Str)
c_FileName = Str
End Property
Public Property Get FileName
FileName = c_FileName
End Property
' ***************************************
' 获得模板文件具体路径
' ***************************************
Public Property Get FilePath
If Len(Path) > 0 Then Path = Replace(Path, "\", "/")
If Right(Path, 1) <> "/" Then Path = Path & "/"
FilePath = Path & FileName
End Property
' ***************************************
' 设置分页URL
' ***************************************
Public Property Let PageUrl(ByVal Str)
c_PageUrl = Str
End Property
Public Property Get PageUrl
PageUrl = c_PageUrl
End Property
' ***************************************
' 设置分页 当前页
' ***************************************
Public Property Let CurrentPage(ByVal Str)
c_CurrentPage = Str
End Property
Public Property Get CurrentPage
CurrentPage = c_CurrentPage
End Property
' ***************************************
' 输出内容
' ***************************************
Public Property Get Flush
Response.Write(c_Content)
End Property
' ***************************************
' 类初始化
' ***************************************
Private Sub Class_Initialize
TagName = "pjblog"
c_Char = "UTF-8"
ReplacePageStr = Array("", "")
End Sub
' ***************************************
' 过滤冲突字符
' ***************************************
Private Function doQuote(ByVal Str)
doQuote = Replace(Str, Chr(34), """)
End Function
' ***************************************
' 类终结
' ***************************************
Private Sub Class_Terminate
End Sub
' ***************************************
' 加载文件方法
' ***************************************
Private Function LoadFromFile(ByVal cPath)
Dim obj
Set obj = Server.CreateObject("ADODB.Stream")
With obj
.Type = 2
.Mode = 3
.Open
.Charset = Char
.Position = .Size
.LoadFromFile Server.MapPath(cPath)
LoadFromFile = .ReadText
.close
End With
Set obj = Nothing
End Function
' ***********************************************
' 获取正则匹配对象
' ***********************************************
Public Function GetMatch(ByVal Str, ByVal Rex)
Dim Reg, Mag
Set Reg = New RegExp
With Reg
.IgnoreCase = True
.Global = True
.Pattern = Rex
Set Mag = .Execute(Str)
If Mag.Count > 0 Then
Set GetMatch = Mag
Else
Set GetMatch = Server.CreateObject("Scripting.Dictionary")
End If
End With
Set Reg = nothing
End Function
' ***************************************
' 打开文档
' ***************************************
Public Sub open
c_Content = LoadFromFile(FilePath)
End Sub
' ***************************************
' 缓冲执行
' ***************************************
Public Sub Buffer
c_Content = GridView(c_Content)
Call ExecuteFunction
End Sub
' ***************************************
' GridView
' ***************************************
Private Function GridView(ByVal o_Content)
Dim Matches, SubMatches, SubText
Dim Attribute, Content
Set Matches = GetMatch(o_Content, "\<" & TagName & "\:(\d+?)(.+?)\>([\s\S]+?)<\/" & TagName & "\:\1\>")
If Matches.Count > 0 Then
For Each SubMatches In Matches
Attribute = SubMatches.SubMatches(1) ' kocms
Content = SubMatches.SubMatches(2) ' <Columns>...</Columns>
SubText = Process(Attribute, Content) ' 返回所有过程执行后的结果
o_Content = Replace(o_Content, SubMatches.value, "<" & SubText(2) & SubText(0) & ">" & SubText(1) & "</" & SubText(2) & ">", 1, -1, 1) ' 替换标签变量
Next
End If
Set Matches = Nothing
If Len(ReplacePageStr(0)) > 0 Then ' 判断是否标签变量有值,如果有就替换掉.
o_Content = Replace(o_Content, ReplacePageStr(0), ReplacePageStr(1), 1, -1, 1)
ReplacePageStr = Array("", "") ' 替换后清空该数组变量
End If
GridView = o_Content
End Function
' ***************************************
' 确定属性
' ***************************************
Private Function Process(ByVal Attribute, ByVal Content)
Dim Matches, SubMatches, Text
Dim MatchTag, MatchContent
Dim datasource, Name, Element, page, id
datasource = "" : Name = "" : Element = "" : page = 0 : id = ""
Set Matches = GetMatch(Attribute, "\s(.+?)\=\""(.+?)\""")
If Matches.Count > 0 Then
For Each SubMatches In Matches
MatchTag = SubMatches.SubMatches(0) ' 取得属性名
MatchContent = SubMatches.SubMatches(1) ' 取得属性值
If Lcase(MatchTag) = "name" Then Name = MatchContent ' 取得name属性值
If Lcase(MatchTag) = "datasource" Then datasource = MatchContent' 取得datasource属性值
If Lcase(MatchTag) = "element" Then Element = MatchContent ' 取得element属性值
If Lcase(MatchTag) = "page" Then page = MatchContent ' 取得page属性值
If Lcase(MatchTag) = "id" Then id = MatchContent ' 取得id属性值
Next
If Len(Name) > 0 And Len(MatchContent) > 0 Then
Text = Analysis(datasource, Name, Content, page, id) ' 执行解析属性
If Len(datasource) > 0 Then Attribute = Replace(Attribute, "datasource=""" & datasource & """", "")
If page > 0 Then Attribute = Replace(Attribute, "page=""" & page & """", "")
Attribute = Replace(Attribute, "name=""" & Name & """", "", 1, -1, 1)
Attribute = Replace(Attribute, "element=""" & Element & """", "", 1, -1, 1)
Process = Array(Attribute, Text, Element)
Else
Process = Array(Attribute, "", "div")
End If
Else
Process = Array(Attribute, "", "div")
End If
Set Matches = Nothing
End Function
' ***************************************
' 解析
' ***************************************
Private Function Analysis(ByVal id, ByVal Name, ByVal Content, ByVal page, ByVal PageID)
Dim Data
Select Case Lcase(Name) ' 选择数据源
Case "loop" Data = DataBind(id, Content, page, PageID)
Case "for" Data = DataFor(id, Content, page, PageID)
End Select
Analysis = Data
End Function
' ***************************************
' 绑定数据源
' ***************************************
Private Function DataBind(ByVal id, ByVal Content, ByVal page, ByVal PageID)
Dim Text, Matches, SubMatches, SubText
Execute "Text = " & id & "(1)" ' 加载数据源
Set Matches = GetMatch(Content, "\<Columns\>([\s\S]+)\<\/Columns\>")
If Matches.Count > 0 Then
For Each SubMatches In Matches
SubText = ItemTemplate(SubMatches.SubMatches(0), Text, page, PageID)' 执行模块替换
Content = Replace(Content, SubMatches.value, SubText, 1, -1, 1)
Next
DataBind = Content
Else
DataBind = ""
End If
Set Matches = Nothing
End Function
' ***************************************
' 匹配模板实例
' ***************************************
Private Function ItemTemplate(ByVal TextTag, ByVal Text, ByVal page, ByVal PageID)
Dim Matches, SubMatches, SubMatchText
Dim SecMatch, SecSubMatch
Dim i, TempText
Dim TextLen, TextLeft, TextRight
Set Matches = GetMatch(TextTag, "\<ItemTemplate\>([\s\S]+)\<\/ItemTemplate\>")
If Matches.Count > 0 Then
For Each SubMatches In Matches
SubMatchText = SubMatches.SubMatches(0)
' ---------------------------------------------
' 循环嵌套开始
' ---------------------------------------------
SubMatchText = GridView(SubMatchText)
' ---------------------------------------------
' 循环嵌套结束
' ---------------------------------------------
If UBound(Text, 1) = 0 Then
TempText = ""
Else
TempText = ""
' -----------------------------------------------
' 开始分页
' -----------------------------------------------
If Len(page) > 0 And page > 0 Then
If Len(CurrentPage) = 0 Or CurrentPage = 0 Then CurrentPage = 1
TextLen = UBound(Text, 2)
TextLeft = (CurrentPage - 1) * page
TextRight = CurrentPage * page - 1
If TextLeft < 0 Then TextLeft = 0
If TextRight > TextLen Then TextRight = TextLen
c_PageStr = MultiPage(TextLen + 1, page, CurrentPage, PageUrl, "float:right", "", False)
If Int(Len(c_PageStr)) > 0 Then
ReplacePageStr = Array("<page:" & Trim(PageID) & "/>", c_PageStr)
Else
ReplacePageStr = Array("<page:" & Trim(PageID) & "/>", "")
End If
Else
TextLeft = 0
TextRight = UBound(Text, 2)
End If
For i = TextLeft To TextRight
TempText = TempText & ItemReSec(i, SubMatchText, Text) ' 加载模板内容
Next
End If
Next
ItemTemplate = TempText
Else
ItemTemplate = ""
End If
Set Matches = Nothing
End Function
' ***************************************
' 替换模板字符串
' ***************************************
Private Function ItemReSec(ByVal i, ByVal Text, ByVal Arrays)
Dim Matches, SubMatches
Set Matches = GetMatch(Text, "\$(\d+?)")
If Matches.Count > 0 Then
For Each SubMatches In Matches
Text = Replace(Text, SubMatches.value, doQuote(Arrays(SubMatches.SubMatches(0), i)), 1, -1, 1) '执行替换
Next
ItemReSec = Text
Else
ItemReSec = ""
End If
Set Matches = Nothing
End Function
' ***************************************
' 全局变量函数
' ***************************************
Private Sub ExecuteFunction
Dim Matches, SubMatches, Text, ExeText
Set Matches = GetMatch(c_Content, "\<function\:([0-9a-zA-Z_\.]*?)\((.*?)\""(.+?)\""(.*?)\)\/\>")
If Matches.Count > 0 Then
For Each SubMatches In Matches
Text = SubMatches.SubMatches(0) & "(" & SubMatches.SubMatches(1) & """" & SubMatches.SubMatches(2) & """" & SubMatches.SubMatches(3) & ")"
Execute "ExeText=" & Text
c_Content = Replace(c_Content, SubMatches.value, ExeText, 1, -1, 1)
Next
End If
Set Matches = Nothing
End Sub
' ***************************************
' 普通替换全局标签
' ***************************************
Public Property Let Sets(ByVal t, ByVal s)
Dim SetMatch, Bstr, SetSubMatch
Set SetMatch = GetMatch(c_Content, "(\<Set\:([0-9a-zA-Z_\.]*?)\(((.*?)" & t & "(.*?))?\)\/\>)")
If SetMatch.Count > 0 Then
For Each SetSubMatch In SetMatch
Execute "Bstr = " & SetSubMatch.SubMatches(1) & "(" & SetSubMatch.SubMatches(3) & """" & s & """" & SetSubMatch.SubMatches(4) & ")"
c_Content = Replace(c_Content, SetSubMatch.Value, Bstr, 1, -1, 1)
Next
End If
Set SetMatch = Nothing
Set SetMatch = GetMatch(c_Content, "(\<Set\:" & t & "\/\>)")
If SetMatch.Count > 0 Then
For Each SetSubMatch In SetMatch
c_Content = Replace(c_Content, SetSubMatch.Value, s, 1, -1, 1)
Next
End If
Set SetMatch = Nothing
End Property
End Class