架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Dvbbs V8.2.0 RC1模板驱动机制

Posted on 2009-04-15 15:42  chen eric  阅读(455)  评论(0编辑  收藏  举报
Dvbbs V8.2.0 RC1号称采用全新的模板驱动机制,在其发布之际,我们来看看它的模板驱动机制,也学习学习。在Dvbbs V8.2.0 RC1中标签大体可分成两类,和模板驱动相关的函数主要有四个,下边我们先来说说标签和函数,最后举一个例子实际应用一下。

一、标签种类

1.单标签,格式如{$name.value}
2.区域标签,格式如{$name.begin}  {$name.end}

二、模板驱动相关主要函数(4个)

1.TPL_Scan函数
功能:扫描模板,输出非标签的内容,遇到标签就交给TPL_Parse函数处理。

2.TPL_Parse函数
功能:对标签进行分析,当为单标签时交给TPL_ParseNode函数处理,当为区域标签时分析出标签中的内容再交给TPL_ParseArea函数处理,最终返回新的起始位置给TPL_Scan。

3.TPL_ParseNode函数
功能:处理(替换)单标签并输出内容。

4.TPL_ParseArea函数
功能:调用TPL_Scan函数处理区域标签中的内容。

函数位置说明:TPL_Scan和TPL_Parse函数放在inc
/dv_template.inc文件中供其他页面调用,其他页面中必须包含自己的TPL_ParseNode和TPL_ParseArea函数来处理标签,因为不同页面不同模板中的标签不尽相同!

三、举例应用
akC
>s8tqlA  

<%
'第一部分:我们定义一个变量Template存放模板内容
Dim Template
Template 
= "标题:{$aaa.title}(日期:{$aaa.date})<br/><br/>内容:{$bbslist.begin}不错哈,{$bbb.content}{$bbslist.end}"

'第二部分:和模板驱动相关的四个重要函数
Sub TPL_Scan(sTemplate)
    
Dim iPosLast, iPosCur
    iPosLast    
= 1
    
While True 
        iPosCur    
= InStr(iPosLast, sTemplate, "{$")
        
If iPosCur>0 Then
            TPL_Echo    
Mid(sTemplate, iPosLast, iPosCur-iPosLast)
            iPosLast    
= TPL_Parse(sTemplate, iPosCur+2)
        
Else
            TPL_Echo    
Mid(sTemplate, iPosLast)
            
Exit Sub  
        
End If 
     
Wend 
End Sub 

Function TPL_Parse(sTemplate, iPosBegin)
    
Dim iPosCur, sToken, sValue, sTemp
    iPosCur        
= InStr(iPosBegin, sTemplate, "}")
    sTemp        
= Mid(sTemplate,iPosBegin,iPosCur-iPosBegin)
    iPosBegin    
= iPosCur+1
    iPosCur        
= InStr(sTemp, ".")
    sToken        
= Left(sTemp, iPosCur-1)
    sValue        
= Mid(sTemp, iPosCur+1)
    
Select Case sValue
        
Case "begin"
            sTemp            
= "{$" & ( sToken & ".end}" )
            iPosCur            
= InStr(iPosBegin, sTemplate, sTemp)
            TPL_ParseArea      sToken, 
Mid(sTemplate, iPosBegin, iPosCur-iPosBegin)
            iPosBegin        
= iPosCur+Len(sTemp)
        
Case Else
            TPL_ParseNode sToken, sValue
    
End Select 
    TPL_Parse    
= iPosBegin
End Function 

Sub TPL_ParseNode(sTokenType, sTokenName)
    
Select Case sTokenType
        
Case "aaa"
            
'细化给ParseAaaNode处理
            ParseAaaNode sTokenName
        
Case "bbb"
            
'细化给ParseBbbNode处理
            ParseBbbNode sTokenName
    
End Select 
End Sub 

Sub TPL_ParseArea(sTokenName, sTemplate)
    
Select Case sTokenName
        
Case "bbslist"
            
For i=0 To 4 '根据实际情况设置循环次数
                TPL_Scan sTemplate
            
Next 
        
Case "other"
             
'省略
        Case "other2"
            
'省略
    End Select 
End Sub 

'第三部分:其他相关函数
TPL_Immediate = True
Sub TPL_Echo(sStr)
    
If TPL_Immediate Then
        Response.Write    sStr
    
Else
        TPL_Memo    
= TPL_Memo&sStr
    
End If 
End Sub 

Sub ParseAaaNode(sToken)
    
Select Case sToken
        
Case "title"
            Response.Write(
"这是贴子标题")
        
Case "date"
            Response.Write(
"2008-01-31")
        
Case "other"
            
'省略
    End Select
End Sub

Sub ParseBbbNode(sToken)
    
Select Case sToken
        
Case "content"
            Response.Write(
"网页教学网:http://www.webjx.com/")
        
Case "other"
            
'省略
    End Select
End Sub

'第四部分:该调用TPL_Scan输出内容了
TPL_Scan Template
%
>