aspTemplate : 类似 phpLib::Template 的分离层实现(续)

类别:Asp 点击:0 评论:0 推荐:

这次加入了数据库模板功能 :)

<!-- METADATA TYPE="typelib" UUID="00000200-0000-0010-8000-00AA006D2EA4" NAME="ADO Type Library" -->

<%

'#######################################################################
'## NAME:  aspTemplate
'## BY:   BigHan
'## DATE:  Nov. 28, 2003
'## SITE:  http://aspTemplate.yeah.net/
'## EMAIL:  [email protected]
'##
'## (C) Copyright 2003-2004 bighan
'#######################################################################

'#######################################################################
'## Database Table: See db/aspTemplate.mdb
'#######################################################################


Class aspTemplate

 '####
 '## name of this class
 '## var string
 '## @access    Private
 '## @see       property: Name
 '####
 Private m_strName

 '####
 '## version of this class
 '## var string
 '## @access    Private
 '## @see       property: Version
 '####
 Private m_strVersion

 '####
 '## Determines how much debugging output Template will produce.
 '## This is a bitwise mask of available debug levels:
 '## 0 = no debugging
 '## 1 = debug variable assignments
 '## 2 = debug calls to get variable
 '## 3 = debug SQL
 '## 4 = debug internals (outputs all function calls with parameters).
 '##
 '## @var       int
 '## @access    Private
 '## @see       property: Debug
 '####
 Private m_intDebug

 '####
 '## Template files data type
 '##
 '## "db"   = Database
 '## "file"   = File
 '##
 '## @var       string
 '## @access    private
 '## @see       property: Mode
 '####
 Private m_strMode

 '####
 '## The base directory from which template files are loaded.
 '##
 '## @var       string
 '## @access    private
 '## @see       property: Root, Dir; method: SetRoot, set_root
 '####
 Private m_Root

 '####
 '## Determines how to output variable tags with no assigned value in templates.
 '##
 '## @var       string
 '## @access    private
 '## @see       property Unknowns; method: SetUnknowns, set_unknowns
 '####
 Private m_strUnknowns

 '####
 '## Determines how Template handles error conditions.
 '## "yes"      = the error is reported, then execution is halted
 '## "report"   = the error is reported, then execution continues by returning "false"
 '## "no"       = errors are silently ignored, and execution resumes reporting "false"
 '##
 '## @var       string
 '## @access    private
 '## @see       property IsHalt; method: halt
 '####
 Private m_strHaltError

 '####
 '## The last error message is retained in this variable.
 '##
 '## @var       string
 '## @access    private
 '## @see       property LastError
 '##
 Private m_strLastError

 '####
 '## Opening delimiter (usually "{")
 '##
 '## @var       string
 '## @access    private
 '## @see       property BeginTag
 '####
 Private m_strBeginTag

 '####
 '## Closing delimiter (usually "}")
 '##
 '## @var       string
 '## @access    private
 '## @see       private EndTag
 '####
 Private m_strEndTag

 '####
 '## A hash of strings forming a translation table which translates variable names
 '## into names of files containing the variable content.
 '## m_oFile.Item(varname) = "filename";
 '##
 '## @var       object
 '## @access    private
 '## @see       method: SetFile, SetFiles, set_file
 '####
 Private m_oFile

 '####
 '## Regular Expression Object
 '##
 '## @var       object
 '## @access    private
 '####
 Private m_oRegExp

 '####
 '## A hash of strings forming a translation table which translates variable names
 '## into regular expressions for themselves.
 '## m_oVarKeys.Item(varname) = "{varname}"
 '##
 '## @var       object
 '## @access    private
 '## @see       method: SetVar, SetVars, SetAppendVar, SetAppendVars, set_var
 '####
 Private m_oVarKeys

 '####
 '## A hash of strings forming a translation table which translates variable names
 '## into values for their respective varkeys.
 '## m_oVarVals.Item(varname) = "value"
 '##
 '## @var       object
 '## @access    private
 '## @see       method: SetVar, SetVars, SetAppendVar, SetAppendVars, set_var
 '####
 Private m_oVarVals

 '####
 '## Connection Object, if this Mode = "db" the Connection Object need.
 '##
 '## @var       object
 '## @access    private
 '## @see       property: ActiveConnection, method: OpenTemplateDatabase, CloseTemplateDatabase
 '####
 Private m_oConn

 '####
 '## Is native connection object.
 '##
 '## @var       object
 '## @access    private
 '## @see       property: ActiveConnection, method: OpenTemplateDatabase, CloseTemplateDatabase
 '####
 Private m_blnNativeConnection

 '####
 '## Is Open connection object.
 '##
 '## @var       object
 '## @access    private
 '## @see       property: ActiveConnection, method: OpenTemplateDatabase, CloseTemplateDatabase
 '####
 Private m_blnConnectionState

 '####
 '## Template database set table name.
 '##
 '## @var       string
 '## @access    private
 '## @see       property: CatTable
 '####
 Private m_strCatTable

 '####
 '## Template database data table name.
 '##
 '## @var       string
 '## @access    private
 '## @see       property: DataTable
 '####
 Private m_strDataTable

 '####
 '## get class name attribute.
 '##
 '## usage: oTemplate.Name
 '## access    public
 '##


 Public Property Get Name()
 '############################################################
  Name = m_strName
 End Property

 '####
 '## get class version property.
 '##
 '## usage: oTemplate.Version
 '## access    public
 '##
 Public Property Get Version()
 '############################################################
  Version = m_strVersion
 End Property

 '####
 '## get/set m_strMode property.
 '##
 '## usage: oTemplate.Mode = string A_strType
 '## access    public
 '##
 Public Property Let Mode(ByVal A_strType)
 '############################################################
  If Debug = 4 Then Response.Write "<p><b>Mode:</b> A_strType = " & A_strType & "</p>" & VbCrLf
  A_strType = LCase(A_strType)
  Select Case A_strType
   Case "file"
    m_strMode = "file"
   Case "db"
    m_strMode = "db"
  End Select  
 End Property

 Public Property Get Mode()
  Mode = m_strMode
 End Property

 '####
 '## set m_oConn property.
 '##
 '## usage: oTemplate.ActiveConnection = object A_oConn
 '## access    public
 '##
 Public Property Let ActiveConnection(ByRef A_oConn)
 '############################################################
  If Debug = 3 Then Response.Write "<p><b>ActiveConnection:</b> Use ActiveConnection</p>" & VbCrLf
  if IsObject(A_oConn) Then
   If A_oConn.State <> AdStateClosed Then
    Set m_oConn = A_oConn
    m_blnConnectionState = True
    m_blnNativeConnection = False
   End If
  End If
 End Property

 '####
 '## set/get m_strCatTable property.
 '##
 '## usage: oTemplate.CatTable = string A_strCatTable
 '## access    public
 '##
 Public Property Let CatTable(ByVal A_strCatTable)
 '############################################################
  If Debug = 3 Then Response.Write "<p><b>CatTable:</b> A_strCatTable = " & A_strCatTable & "</p>" & VbCrLf
  m_strCatTable = A_strCatTable
 End Property

 Public Property Get CatTable()
  CatTable = m_strCatTable
 End Property

 '####
 '## set/get m_strDataTable property.
 '##
 '## usage: oTemplate.DataTable = string A_strDataTable
 '## access    public
 '##
 Public Property Let DataTable(ByVal A_strDataTable)
 '############################################################
  If Debug = 3 Then Response.Write "<p><b>DataTable:</b> A_strDataTable = " & A_strDataTable & "</p>" & VbCrLf
  m_strDataTable = A_strDataTable
 End Property

 Public Property Get DataTable()
  DataTable = m_strDataTable
 End Property

 '####
 '## get/set m_intDebug attribute.
 '##
 '## usage: oTemplate.Debug = int A_intDebug
 '## access    public
 '##
 Public Property Let Debug(ByVal A_intDebug)
 '############################################################
  m_intDebug = CInt(A_intDebug)
 End Property

 Public Property Get Debug()
  Debug = m_intDebug
 End Property

 '####
 '## Sets the policy for dealing with unresolved variable names.
 '##
 '## unknowns defines what to do with undefined template variables
 '## "remove"   = remove undefined variables
 '## "comment"  = replace undefined variables with comments
 '## "keep"     = keep undefined variables
 '##
 '## Note: "comment" can cause unexpected results when the variable tag is embedded
 '## inside an HTML tag, for example a tag which is expected to be replaced with a URL.
 '##
 '## usage: oTemplate.Unknowns = string A_strUnknowns
 '##
 '## @param     A_strUnknowns         new value for unknowns
 '## @see       unknowns, SetUnknowns, set_unknowns
 '## @access    public
 '##
 Public Property Let Unknowns(ByVal A_strUnknowns)
 '############################################################
  If Debug = 4 Then Response.Write "<p><b>Unknowns:</b> unknowns = " & A_strUnknowns & "</p>" & VbCrLf
  A_strUnknowns = LCase(A_strUnknowns)
  Select Case A_strUnknowns
   Case "keep"
    m_strUnknowns = "keep"
   Case "remove"
    m_strUnknowns = "remove"
   Case "comment"
    m_strUnknowns = "comment"
   Case Else
    m_strUnknowns = "remove"
  End Select
 End Property

 Public Property Get Unknowns()
  Unknowns = m_strUnknowns
 End Property

 '####
 '## Checks that root is a valid directory and if so sets this directory as the
 '## base directory from which templates are loaded by storing the value in
 '## Root. Relative filenames are prepended with the path in Root.
 '##
 '## usage: oTemplate.Root = string A_strDir
 '##
 '## @param     A_root         string containing new template directory
 '## @see       m_Root, SetRoot, set_root
 '## @access    public
 '##
 Public Property Let Root(ByVal A_strDir)
 '############################################################
  Dim MM_FSO, sql, rs, MM_TempDir, num
  If Debug = 4 Then Response.Write "<p><b>Root:</b> root = " & A_strDir & "</p>" & VbCrLf
  If Len(A_strDir) > 0 Then
   If Mode = "file" Then
    Set MM_FSO = CreateObject("Scripting.FileSystemObject")
    If MM_FSO.FolderExists(Server.MapPath(A_strDir)) Then
     If Right(A_strDir, 1) <> "/" Then
      m_Root = A_strDir & "/"
     Else
      m_Root = A_strDir
     End If
    Else
     Call halt("The folder " & A_strDir & " does not exist.")
    End If
   ElseIf Mode = "db" Then
    If Right(A_strDir, 1) = "/" Then A_strDir = left(A_strDir, len(A_strDir) -1)
    If left(A_strDir, 1) = "/" Then A_strDir = Right(A_strDir, len(A_strDir) -1)
    MM_TempDir = Split(A_strDir, "/")
    num = UBound(MM_TempDir)
    If num > 0 Then A_strDir = MM_TempDir(num)
    sql = "SELECT tplcat_id FROM " & CatTable & " WHERE tplcat_name='" & A_strDir &"'"
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open sql, m_oConn, AdOpenForwardOnly, AdLockReadOnly, adCmdText
    If Not rs.EOF Then
     m_Root = rs("tplcat_id")
    Else
     Call halt("Not Find template category " & A_strDir & " from database.")
    End If
    Set rs = Nothing
    If Debug = 3 Then Response.Write "<p><b>Root:</b> sql = " & sql & "</p>" & VbCrLf
   End If
  Else
   Call halt("The folder Root does not empty.")
  End If
 End Property

 Public Property Get Root()
  Root = m_Root
 End Property

 '####
 '##
 '## alias of Root
 '##
 Public Property Let Dir(ByVal A_strDir)
 '############################################################
  Root = A_strDir
 End Property

 Public Property Get Dir()
  Dir = Root
 End Property

 '####
 '## Set/Get class m_strHaltError attribute.
 '##
 '## "yes"  = the error is reported, then execution is halted.
 '## "no"  = errors are silently ignored.
 '## "report"    = the error is reported, then execution continues.
 '##
 '## usage: oTemplate.IsHalt = string A_strHalt
 '##
 '## @param     A_strHalt         new value for m_strHaltError
 '## @see       Halt
 '## @access    public
 '##
 Public Property Let IsHalt(ByVal A_strHalt)
 '############################################################
  A_strHalt = LCase(A_strHalt)
  Select Case A_strHalt
   Case "yes"
    m_strHaltError = "yes"
   Case "no"
    m_strHaltError = "no"
   Case "report"
    m_strHaltError = "report"
  End Select
 End Property

 Public Property Get IsHalt()
  IsHalt = m_strHaltError
 End Property

 '####
 '## Set/Get class m_strBeginTag attribute.
 '##
 '## Note: Don't conflict of HTML tag
 '##
 '## usage: oTemplate.BeginTag = string A_strTag
 '##
 '## @param     A_strTag         new value for m_strBeginTag
 '## @access    public
 '##
 Public Property Let BeginTag(ByVal A_strTag)
 '############################################################
  If Debug = 4 Then Response.Write "<p><b>BeginTag:</b> BeginTag = " & A_strTag & "</p>" & VbCrLf
  m_strBeginTag = A_strTag
 End Property

 Public Property Get BeginTag()
  BeginTag = m_strBeginTag
 End Property

 '####
 '## Set/Get class m_strEndTag attribute.
 '##
 '## Note: Don't conflict of HTML tag
 '##
 '## usage: oTemplate.EndTag = string A_strTag
 '##
 '## @param     A_strTag         new value for m_strEndTag
 '## @access    public
 '##
 Public Property Let EndTag(ByVal A_strTag)
 '############################################################
  If Debug = 4 Then Response.Write "<p><b>EndTag:</b> EndTag = " & A_strTag & "</p>" & VbCrLf
  m_strEndTag = A_strTag
 End Property

 Public Property Get EndTag()
  EndTag = m_strEndTag
 End Property

 '####
 '## Get class last error messages.
 '##
 '## usage: oTemplate.LastError
 '##
 '## @access    public
 '##
 Public Property Get LastError()
 '############################################################
  LastError = m_strLastError
 End Property

 '####
 '## Open template database Connection object. if this Mode="db", need first open.
 '##
 '## usage: oTemplate.OpenTemplateDatabase string A_strConnString
 '##
 '## @access    public
 '##
 Public Sub OpenTemplateDatabase(ByVal A_strConnString)
 '############################################################
  on error resume next
  If Debug = 3 Then Response.Write "<p><b>OpenTemplateDatabase:</b> A_strConnString = " & A_strConnString & "</p>" & VbCrLf
  if IsNull(m_oConn) Or Not IsObject(m_oConn) Then
   Set m_oConn = Server.CreateObject("ADODB.Connection")
   m_oConn.ConnectionString = A_strConnString
   m_oConn.Open
   If Err Then
    err.Clear
    Set m_oConn = Nothing
    Call halt("Connection: Open Connection by string " & A_strConnString & " error.")
   Else
    m_blnConnectionState = True
    m_blnNativeConnection = True
   End If
  End If
 End Sub

 '####
 '## Close template database Connection object.
 '##
 '## usage: oTemplate.CloseTemplateDatabase
 '##
 '## @access    public
 '##
 Public Sub CloseTemplateDatabase()
 '############################################################
  if IsObject(m_oConn) Then
   If Debug = 3 Then Response.Write "<p><b>CloseTemplateDatabase:</b> Close Database ... ...</p>" & VbCrLf
   If m_blnNativeConnection = True Then
    m_oConn.Close
    Set m_oConn = Nothing
   Else
    Set m_oConn = Nothing
   End If
  End If
  m_blnConnectionState = False
 End Sub

 '####
 '##
 '## @see Root
 '##
 Public Sub SetRoot(ByVal A_strDir)
 '############################################################
  Root = A_strDir
 End Sub

 '## @same phplib::template->set_root
 Public Sub set_root(ByVal A_strDir)
  Root = A_strDir
 End Sub

 '####
 '##
 '## @see Unknown
 '##
 Public Sub SetUnknowns(ByVal A_strUnknowns)
 '############################################################
  Unknowns = A_strUnknowns
 End Sub

 '## @same phplib::template->set_root
 Public Sub set_unknowns(ByVal A_strUnknowns)
  Unknowns = A_strUnknowns
 End Sub

 '####
 '## Defines a filename for the initial value of a variable.
 '##
 '## It may be passed either a varname and a file name as two strings or
 '## a hash of strings with the key being the varname and the value
 '## being the file name.
 '##
 '## The new mappings are stored in the object m_oFile.
 '## The files are not loaded yet, but only when needed.
 '##
 '##
 '## usage: oTemplate.SetFile A_varname, A_filename
 '## or
 '## usage: oTemplate.SetFile array(A_varname1, A_filename1 _
 '##           ,A_varname2, A_filename2 _
 '##           ,.... .... , ,,,. ,,,, ) _
 '##           , ""
 '## @see    SetFiles
 '## @param     A_varname      either a string containing a varname or a hash of varname/file name pairs.
 '## @param     A_filename     if varname is a string this is the filename otherwise filename is not required
 '## @access    public
 '##
 Public Sub SetFile(ByVal A_varname, ByVal A_filename)
 '############################################################
  Dim MM_strFiles, num
  If Not IsArray(A_varname) Then
   If Debug = 4 Then Response.Write "<p><b>SetFile:</b> (with scalar) varname = "& A_varname &", filename = "& A_filename &"</p>" & VbCrLf
   If A_filename = "" Then
    Call halt("SetFile: For varname " & A_filename & " filename is empty.")
    Exit Sub
   End If
   MM_strFiles = filename(A_filename)
   m_oFile.Add A_varname, MM_strFiles
  Else
   Call SetFiles(A_varname)
  End If
 End Sub

 '####
 '## Defines a multi-filename for the initial value of a variable.
 '##
 '## usage: oTemplate.SetFiles array(A_varname1, A_filename1 _
 '##           ,A_varname2, A_filename2 _
 '##           ,.... .... , ,,,. ,,,, )
 '## @param     array A_varname
 '## @access    public
 '## @see SetFile
 '##
 Public Sub SetFiles(ByVal A_varname)
 '############################################################
  Dim i, num
  If IsArray(A_varname) Then
   num = Ubound(A_varname)
   if ((num +1) mod 2) <> 0 Then
    Call halt("SetFiles: For varname array's element not gemination.")
    Exit Sub
   Else
    For i = 0 To num Step 2
     Call SetFile(A_varname(i), A_varname(i+1))
    Next
   End If
  Else
   Call SetFile(A_varname, "")
  End If
 End Sub

 '## @same phplib::template->set_file
 Public Sub set_file(ByVal A_varname, ByVal A_filename)
  Call SetFile(A_varname, A_filename)
 End Sub

 '####
 '## A variable $parent may contain a variable block defined by:
 '## &lt;!-- BEGIN A_varname --&gt; content &lt;!-- END A_varname --&gt;. This function removes
 '## that block from $parent and replaces it with a variable reference named $name.
 '## The block is inserted into the varkeys and varvals hashes. If A_name is
 '## omitted, it is assumed to be the same as A_varname.
 '##
 '## Blocks may be nested but care must be taken to extract the blocks in order
 '## from the innermost block to the outermost block.
 '##
 '## usage: oTemplate.SetBlock string A_parent, string A_parent, string A_name
 '##
 '## @param     A_parent       a string containing the name of the parent variable
 '## @param     A_varname      a string containing the name of the block to be extracted
 '## @param     A_name         the name of the variable in which to store the block
 '## @access    public
 '##
 Public Sub SetBlock(ByVal A_parent, ByVal A_varname, ByVal A_name)
 '############################################################
  Dim MM_String, MM_MatchString
  If Debug = 4 Then Response.Write "<p><b>SetBlock:</b> parent = " & A_parent & ", varname = " & A_varname & ", name = " & A_name & "</p>" & VbCrLf
  If Not loadfile(A_parent) Then
   Call halt("SetBlock: unable to load " & A_parent & ".")
   Exit Sub
  End If
  if A_name = "" Then A_name = A_varname
  MM_String = GetVar(A_parent)
  m_oRegExp.IgnoreCase = True
  m_oRegExp.Global = True
  m_oRegExp.Pattern = "<!--\s+BEGIN\s+(" & A_varname & ")\s+-->([\s\S.]*)<!--\s+END\s+\1\s+-->"
  Set Matches = m_oRegExp.Execute(MM_String)
  For Each Match In Matches
   MM_MatchString = Match.SubMatches(1)
   MM_String = m_oRegExp.Replace(MM_String, BeginTag & A_name & EndTag)
   Call SetVar(A_varname,MM_MatchString)
   Call SetVar(A_parent,MM_String)
  Next
 End Sub

 '## @same phplib::template->set_block
 Public Sub set_block(ByVal A_parent, ByVal A_varname, ByVal A_name)
  Call SetBlock(A_parent, A_varname, A_name)
 End Sub

 '####
 '## This functions sets the value of a variable.
 '##
 '## It may be called with either a varname and a value as two strings or an
 '## an associative array with the key being the varname and the value being
 '## the new variable value.
 '##
 '## The function inserts the new value of the variable into the $varkeys and
 '## $varvals hashes. It is not necessary for a variable to exist in these hashes
 '## before calling this function.
 '##
 '## usage: oTemplate.SetVar string A_varname, string A_value
 '## or
 '## usage: oTemplate.SetVar array( A_varname1, A_value1 _
 '##          ,A_varname2, A_value2 _
 '##          ,    ...   ,    ...    ) _
 '##          , ""     
 '##
 '## @param     A_varname      either a string containing a varname or a hash of varname/value pairs.
 '## @param     A_value        if A_varname is a string this contains the new value for the variable otherwise this parameter is ignored
 '## @access    public
 '##
 Public Sub SetVar(ByVal A_varname, ByVal A_value)
 '############################################################
  Dim MM_varname
  If Not IsArray(A_varname) Then
   If A_varname <> "" Then
   If Debug = 1 Then Response.Write "<b>SetVar:</b> (with scalar) <b>" & A_varname & "</b> = " & Server.HTMLEncode(A_value) & "<br>" & VbCrLf
    MM_varname = varname(A_varname)
    if m_oVarKeys.Exists(A_varname) Then
     m_oVarKeys.Remove A_varname
     m_oVarKeys.Add A_varname, MM_varname
    Else
     m_oVarKeys.Add A_varname, MM_varname
    End If
    If m_oVarVals.Exists(A_varname) Then
     m_oVarVals.Remove A_varname
     m_oVarVals.Add A_varname, A_value
    Else
     m_oVarVals.Add A_varname, A_value
    End If
   End If
  Else
   Call SetVars(A_varname)
  End If
 End Sub

 '####
 '## usage: oTemplate.SetVar array( A_varname1, A_value1 _
 '##          ,A_varname2, A_value2 _
 '##          ,    ...   ,    ...    )
 '## @param     A_varname      a hash of varname/value pairs.
 '## @access    public
 '## @see       SetVar
 '##
 Public Sub SetVars(ByVal A_varname)
 '############################################################
  Dim i, num
   If IsArray(A_varname) Then
    num = Ubound(A_varname)
    if ((num +1) mod 2) <> 0 Then
     Call halt("SetVars: For varname array's element not gemination.")
     Exit Sub
    Else
     For i = 0 To num Step 2
      Call SetVar(A_varname(i), A_varname(i+1))
     Next
    End If
   Else
    Call SetVar(A_varname, "")
   End If
 End Sub

 '####
 '## usage: oTemplate.SetAppendVar string A_varname, string A_value
 '## or
 '## usage: oTemplate.SetAppendVar array( A_varname1, A_value1 _
 '##          ,A_varname2, A_value2 _
 '##          ,    ...   ,    ...    ) _
 '##          , ""
 '## @param     A_varname      either a string containing a varname or a hash of varname/value pairs.
 '## @param     A_value        if A_varname is a string this contains the new value for the variable otherwise this parameter is ignored
 '## @access    public
 '## @see    SetVar
 '##
 Public Sub SetAppendVar(ByVal A_varname, ByVal A_value)
 '############################################################
  Dim MM_varname, MM_string
  If Not IsArray(A_varname) Then
   If A_varname <> "" Then
    If Debug = 1 Then Response.Write "<b>SetAppendVar:</b> (with scalar) <b>" & A_varname & "</b> = " & Server.HTMLEncode(A_value) & "<br>" & VbCrLf
    MM_varname = varname(A_varname)
    if m_oVarKeys.Exists(A_varname) Then
     m_oVarKeys.Remove A_varname
     m_oVarKeys.Add A_varname, MM_varname
    Else
     m_oVarKeys.Add A_varname, MM_varname
    End If
    If m_oVarVals.Exists(A_varname) Then
     MM_string = m_oVarVals.Item(A_varname) & A_value
     m_oVarVals.Remove A_varname
     m_oVarVals.Add A_varname, MM_string
    Else
     m_oVarVals.Add A_varname, A_value
    End If
   End If
  Else
   Call SetAppendVars(A_varname)
  End If
 End Sub

 '####
 '## usage: oTemplate.SetAppendVars array( A_varname1, A_value1 _
 '##          ,A_varname2, A_value2 _
 '##          ,    ...   ,    ...    )
 '## @param     A_varname      a hash of varname/value pairs.
 '## @access    public
 '## @see       SetVar
 '##
 Public Sub SetAppendVars(ByVal A_varname)
 '############################################################
  Dim i, num
   If IsArray(A_varname) Then
    num = Ubound(A_varname)
    if ((num +1) mod 2) <> 0 Then
     Call halt("SetVars: For varname array's element not gemination.")
     Exit Sub
    Else
     For i = 0 To num Step 2
      Call SetAppendVar(A_varname(i), A_varname(i+1))
     Next
    End If
   Else
    Call SetAppendVar(A_varname, "")
   End If
 End Sub

 '####
 '##
 '## @same phplib::template->set_var
 '##
 Public Sub set_var(ByVal A_varname, ByVal A_value, ByVal A_append)
 '############################################################
  If CBool(A_append) = True Then
   If Not IsArray(A_varname) Then
    Call SetAppendVar(A_varname, A_value)
   Else
    Call SetAppendVars(A_varname, A_value)
   End If
  Else
   If Not IsArray(A_varname) Then
    Call SetVar(A_varname, A_value)
   Else
    Call SetVars(A_varname, A_value)
   End If
  End If
 End Sub

 '####
 '## This function fills in all the variables contained within the variable named
 '## A_varname. The resulting value is returned as the function result and the
 '## original value of the variable varname is not changed. The resulting string
 '## is not "finished", that is, the unresolved variable name policy has not been
 '## applied yet.
 '##
 '## Returns: the value of the variable $varname with all variables substituted.
 '##
 '## usage: SubString(string A_varname)
 '##
 '## @param     A_varname      the name of the variable within which variables are to be substituted
 '## @access    public
 '## @return    string
 '##
 Public Function SubString(ByVal A_varname)
 '############################################################
  Dim MM_String
  If Debug = 4 Then Response.Write "<p><b>SubString:</b> varname = " & A_varname & "</p>" & VbCrLf
  If Not loadfile(A_varname) Then
   Call halt("SubString: unable to load " & A_varname & ".")
  End If
  MM_String = GetVar(A_varname)
  m_oRegExp.IgnoreCase = True
  m_oRegExp.Global = True
  m_oRegExp.Pattern = "(" & BeginTag & ")([^ \t\r\n" & EndTag &"]+)" & EndTag
  Set Matches = m_oRegExp.Execute(MM_String)
  For Each Match In Matches
   if m_oVarVals.Exists(Match.SubMatches(1)) Then
    m_oRegExp.Pattern = Match.Value
    MM_String = m_oRegExp.Replace(MM_String, m_oVarVals.Item(Match.SubMatches(1)))
   End If
  Next
  SubString = MM_String
 End Function

 '####
 '##
 '## @same phplib::template->subst
 '##
 Public Function subst(ByVal A_varname)
  subst = SubString(A_varname)
 End Function

 '####
 '## This is shorthand for print SubString(A_varname). See SubString for further
 '## details.
 '##
 '## usage: oTemplate.WriteSubString string A_varname
 '##
 '## @param     A_varname      the name of the variable within which variables are to be substituted
 '## @access    public
 '## @see       SubString
 '##
 Public Sub WriteSubString(ByVal A_varname)
 '############################################################
  If Debug = 4 Then Response.Write "<p><b>WriteSubString:</b> varname = " & A_varname & "</p>" & VbCrLf
  Response.Write SubString(A_varname)
 End Sub

 '####
 '##
 '## @same phplib::template->psubst
 '##
 Public Sub psubst(ByVal A_varname)
  Call WriteSubString(A_varname)
 End Sub

 '####
 '## The function substitutes the values of all defined variables in the variable
 '## named A_varname and stores or appends the result in the variable named A_target.
 '##
 '## It may be called with either a target and a varname as two strings or a
 '## target as a string and an array of variable names in varname.
 '##
 '## The function inserts the new value of the variable into the oVarVeys and
 '## $varvals hashes. It is not necessary for a variable to exist in these hashes
 '## before calling this function.
 '##
 '## An optional third parameter allows the value for each varname to be appended
 '## to the existing target variable instead of replacing it. The default is to
 '## replace.
 '##
 '## If A_target and A_varname are both strings, the substituted value of the
 '## variable A_varname is inserted into or appended to A_target.
 '##
 '## Returns: the last value assigned to A_target.
 '##
 '## usage: oTemplate.Parse string A_target, string A_varname, boolean A_append
 '## usage: string = oTemplate.Parse( string A_target, string A_varname, boolean A_append )
 '## or
 '## usage: oTemplate.Parse string A_target, array(A_varname1, A_varname2, ...) , boolean A_append
 '## usage: string = oTemplate.Parse( string A_target, array(A_varname1, A_varname2, ...), boolean A_append)
 '##
 '## @param     A_target      a string containing the name of the variable into which substituted $varnames are to be stored
 '## @param     A_varname     if a string, the name the name of the variable to substitute or if an array a list of variables to be substituted
 '## @param     A_append      if true, the substituted variables are appended to $target otherwise the existing value of $target is replaced
 '## @access    public
 '## @return    string
 '## @see       SubString
 '##
 '## @same phplib::template->pparse
 '##
 Public Function Parse(ByVal A_target, ByVal A_varname, ByVal A_append)
 '############################################################
  Dim MM_String, i, num
  If Not IsArray(A_varname) Then
   If Debug = 4 Then Response.Write "<p><b>Parse:</b> (with scalar) target = " & A_target & ", varname = " & A_varname & ", append = " & A_append & "</p>" & VbCrLf
   MM_String = SubString(A_varname)
   if A_append = True Then
    MM_String = GetVar(A_target) & MM_String
    Call SetVar(A_target, MM_String)
   Else
    Call SetVar(A_target, MM_String)
   End If
  Else
   num = Ubound(A_varname)
   For i = 0 To num
    If Debug = 4 Then Response.Write "<p><b>Parse:</b> (with array) target = " & A_target & ", varname = " & A_varname(i) & ", append = " & A_append & "</p>" & VbCrLf
    MM_String = SubString(A_varname(i))
    if A_append = True Then
     MM_String = GetVar(A_target) & MM_String
     Call SetVar(A_target, MM_String)
    Else
     Call SetVar(A_target, MM_String)
    End If
   Next
  End If

  If Debug = 4 Then Response.Write "<p><b>Parse:</b> completed</p>" & VbCrLf
  Parse = MM_String
 End Function

 '####
 '## This is shorthand for print Parse(...) and is functionally identical.
 '## See Parse for further details.
 '##
 '## Returns: always returns void.
 '##
 '## usage: oTemplate.Write string A_target, string A_varname
 '##
 '## @param     A_target      a string containing the name of the variable into which substituted $varnames are to be stored
 '## @param     A_varname     if a string, the name the name of the variable to substitute or if an array a list of variables to be substituted
 '## @access    public
 '## @return    void
 '## @see       Parse
 '##
 Public Sub Write(ByVal A_target, ByVal A_varname)
 '############################################################
  Dim MM_string
  If Debug = 4 Then Response.Write "<p><b>Write:</b> passing parameters to parse...</p>" & VbCrLf
  MM_string = Parse(A_target, A_varname, False)
  MM_string = Finish(MM_string)
  Response.Write MM_string
 End Sub

 '####
 '##
 '## @see Write
 '##
 Public Sub AppendWrite(ByVal A_target, ByVal A_varname)
 '############################################################
  Dim MM_string
  If Debug = 4 Then Response.Write "<p><b>Write:</b> passing parameters to parse...</p>" & VbCrLf
  MM_string = Parse(A_target, A_varname, True)
  MM_string = Finish(MM_string)
  Response.Write MM_string
 End Sub

 '####
 '##
 '## @same phplib::template->pparse
 '##
 Public Sub pparse(ByVal A_target, ByVal A_varname, ByVal A_append)
 '############################################################
  If CBool(A_append) = True Then
   Call AppendWrite(A_target, A_varname)
  Else
   Call Write(A_target, A_varname)
  End If
 End Sub

 '####
 '## This function returns an associative object of all defined variables with the
 '## name as the key and the value of the variable as the value.
 '##
 '## This is mostly useful for debugging. Also note that $this->debug can be used
 '## to echo all variable assignments as they occur and to trace execution.
 '##
 '## Returns: a hash of all defined variable values keyed by their names.
 '##
 '## usage: oTemplate.get_vars()
 '##
 '## @access    public
 '## @return    object
 '##
 Public Function GetVars()
 '############################################################
  If Debug = 4 Then Response.Write "<p><b>GetVars:</b> constructing dictionary of vars...</p>" & VbCrLf
  Set GetVars = m_oVarVals
 End Function

 '####
 '##
 '## @same phplib::template->get_vars
 '##
 Public Function get_vars()
  Set get_vars = GetVars()
 End Function

 '####
 '## This function returns the value of the variable named by A_varname.
 '## If A_varname references a file and that file has not been loaded yet, the
 '## variable will be reported as empty.
 '##
 '## When called with an array of variable names this function will return a a
 '## hash of variable values keyed by their names.
 '##
 '## Returns: a string or an array containing the value of $varname.
 '##
 '## usage: GetVar(string A_varname)
 '## or
 '## usage: GetVar(array A_varname)
 '##
 '## @param     A_varname     if a string, the name the name of the variable to get the value of, or if an array a list of variables to return the value of
 '## @access    public
 '## @return    string or object
 '##
 Public Function GetVar(ByVal A_varname)
 '############################################################
  Dim MM_String, MM_oVars, i, num
  If Not IsArray(A_varname) Then
   'MM_String = ""
   if A_varname <> "" Then
    If m_oVarVals.Exists(A_varname) Then
     MM_String = m_oVarVals.Item(A_varname)
    End If
   End If
   If Debug = 2 Then Response.Write "<b>GetVar:</b> (with scalar) <b>" & A_varname & "</b> = " & Server.HTMLEncode(MM_String) & "<br>" & VbCrLf
   GetVar = MM_String
  Else
   Set MM_oVars = CreateObject("Scripting.Dictionary")
   num = UBound(A_varname)
   For i=0 To num
    If m_oVarVals.Exists(A_varname(i)) Then
     MM_String = m_oVarVals.Item(A_varname(i))
     MM_oVars.Add A_varname(i), MM_String
    End If
    If Debug = 2 Then Response.Write "<b>GetVar:</b> (with array) <b>" & A_varname(i) & "</b> = " & Server.HTMLEncode(MM_String) & "<br>" & VbCrLf
   Next
   Set GetVar = MM_oVars
  End If
 End Function

 '####
 '##
 '## @same phplib::template->get_var
 '##
 Public Function get_var(ByVal A_varname)
  If Not IsArray(A_varname) Then
   get_var = GetVar(A_varname)
  Else
   Set get_var = GetVar(A_varname)
  End If
 End Function

 '####
 '## This functions clears the value of a variable.
 '##
 '## It may be called with either a varname as a string or an array with the
 '## values being the varnames to be cleared.
 '##
 '## The function sets the value of the variable in the oVarKeys and oVarVals
 '## hashes to "". It is not necessary for a variable to exist in these hashes
 '## before calling this function.
 '##
 '##
 '## usage: oTemplate.ClearVar string A_varname
 '## or
 '## usage: oTemplate.ClearVar array (A_varname1, A_varname2, ...)
 '##
 '## @param     $varname      either a string containing a varname or an array of varnames.
 '## @access    public
 '## @return    void
 '##
 Public Sub ClearVar(ByVal A_varname)
 '############################################################
  Dim i, num
  If Not IsArray(A_varname) Then
   If A_varname <> "" Then
    If Debug = 1 Then Response.Write "<b>clear_var:</b> (with scalar) <b>" & A_varname & "</b><br>" & VbCrLf
    Call SetVar(A_varname, "")
   End If
  Else
   num = UBound(A_varname)
   For i=0 To num
    If Debug = 1 Then Response.Write "<b>clear_var:</b> (with array) <b>" & A_varname(i) & "</b><br>" & VbCrLf
    Call SetVar(A_varname(i), "")
   Next
  End If
 End Sub

 '####
 '##
 '## @same phplib::template->clear_var
 '##
 Public Sub clear_var(ByVal A_varname)
  Call ClearVar(A_varname)
 End Sub

 '####
 '## This functions unsets a variable completely.
 '##
 '## It may be called with either a varname as a string or an array with the
 '## values being the varnames to be cleared.
 '##
 '## The function removes the variable from the oVarKeys and oVarVals hashes.
 '## It is not necessary for a variable to exist in these hashes before calling
 '## this function.
 '##
 '##
 '## usage: oTemplate.unSetVar string A_varname
 '## or
 '## usage: oTemplate.unSetVar array(A_varname1, A_varname2, ...)
 '##
 '## @param     A_varname      either a string containing a varname or an array of varnames.
 '## @access    public
 '##
 Public Sub unSetVar(ByVal A_varname)
 '############################################################
  Dim i, num
  If Not IsArray(A_varname) Then
   If A_varname <> "" Then
    If Debug = 1 Then Response.Write "<b>unSetVar:</b> (with scalar) <b>" & A_varname & "</b><br>" & VbCrLf
    If m_oVarKeys.Exists(A_varname) Then
     m_oVarKeys.Remove A_varname
    End If
    If m_oVarVals.Exists(A_varname) Then
     m_oVarVals.Remove A_varname
    End If
   End If
  Else
   num = UBound(A_varname)
   For i=0 To num
    If A_varname(i) <> "" Then
     If Debug = 1 Then Response.Write "<b>unSetVar:</b> (with array) <b>" & A_varname & "</b><br>" & VbCrLf
     If m_oVarKeys.Exists(A_varname(i)) Then
      m_oVarKeys.Remove A_varname(i)
     End If
     If m_oVarVals.Exists(A_varname(i)) Then
      m_oVarVals.Remove A_varname(i)
     End If
    End If
   Next
  End If
 End Sub

 '####
 '##
 '## @same phplib::template->unset_var
 '##
 Public Sub unset_var(ByVal A_varname)
  Call unSetVar(A_varname)
 End Sub


 '####
 '## This function returns a hash of unresolved variable names in A_varname, keyed
 '## by their names.
 '##
 '## Returns: a hash of varname/varname pairs or false on error.
 '##
 '## usage: GetUndefined(string A_varname)
 '##
 '## @param     A_varname     a string containing the name the name of the variable to scan for unresolved variables
 '## @access    public
 '## @return    array
 '##
 Public Function GetUndefined(ByVal A_varname)
 '############################################################
  Dim MM_String, MM_result
  If Debug = 4 Then Response.Write "<p><b>GetUndefined:</b> varname = " & A_varname & "</p>" & VbCrLf
  If Not loadfile(A_varname) Then
   Call halt("get_undefined: unable to load " & A_varname & ".")
   GetUndefined = False
   Exit Function
  End If
  MM_String = GetVar(A_varname)
  'Set MM_result = CreateObject("Scripting.Dictionary")
  m_oRegExp.IgnoreCase = True
  m_oRegExp.Global = True
  m_oRegExp.Pattern = "(" & BeginTag & ")([^ \t\r\n" & EndTag &"]+)" & EndTag
  Set Matches = m_oRegExp.Execute(MM_String)
  i = 0
  For Each Match In Matches
   if Not m_oVarVals.Exists(Match.SubMatches(1)) Then
    If Debug = 4 Then Response.Write "<p><b>get_undefined:</b> undefined: " & SubMatches(1) & "</p>" & VbCrLf
    'MM_result.Add Match.SubMatches(1), Match.SubMatches(1)
    MM_result(i) = Match.SubMatches(1)
    i = i + 1
   End If
  Next
  'if MM_result.Count > 0 Then
  ' Set GetUndefined = MM_result
  If IsArray(MM_result) Then
   GetUndefined = MM_result
  Else
   GetUndefined = False
  End If
 End Function

 '####
 '##
 '## @same phplib::template->get_undefined
 '##
 Public Function get_undefined(ByVal A_varname)
 '############################################################
  get_undefined = GetUndefined
 End Function

 '####
 '## This function returns the finished version of $str. That is, the policy
 '## regarding unresolved variable names will be applied to $str.
 '##
 '## Returns: a finished string derived from A_String and unknowns.
 '##
 '## usage: Finish(string A_String)
 '##
 '## @param     A_String         a string to which to apply the unresolved variable policy
 '## @access    public
 '## @return    string
 '## @see       Unknowns, SetUnknowns, set_unknowns
 '##
 Public Function Finish(ByVal A_String)
 '############################################################
  Dim MM_String
  Select Case Unknowns
   case "keep"
    MM_String = A_String
   case "remove"
    m_oRegExp.IgnoreCase = True
    m_oRegExp.Global = True
    m_oRegExp.Pattern = "(" & BeginTag & ")([^ \t\r\n" & EndTag &"]+)" & EndTag
    MM_String = m_oRegExp.Replace(A_String, "")
   case "comment"
    m_oRegExp.IgnoreCase = True
    m_oRegExp.Global = True
    m_oRegExp.Pattern = "(" & BeginTag & ")([^ \t\r\n" & EndTag &"]+)" & EndTag
    Set Matches = m_oRegExp.Execute(A_String)
    For Each Match In Matches
     MM_String = m_oRegExp.Replace(A_String, "<!-- Template variable " & Match.SubMatches(1) &" undefined -->")
    Next
  End Select
  Finish = MM_String
 End Function


 '####
 '## This function returns the finished version of the value of the variable named
 '## by $varname. That is, the policy regarding unresolved variable names will be
 '## applied to the variable A_varname and the result returned.
 '##
 '## Returns: a finished string derived from the variable A_varname.
 '##
 '## usage: oTemplate.GetVariable(string A_varname)
 '##
 '## @param     A_varname     a string containing the name of the variable to finish
 '## @access    public
 '## @return    string
 '## @see       SetUnknowns
 '## @see       Finish
 '##
 Public Function GetVariable(ByVal A_varname)
 '############################################################
  GetVariable = Finish(GetVar(A_varname))
 End Function

 'Public Function get(ByVal A_varname)
 '冲突不支持
 'End Function

 '####
 '## This function prints the finished version of the value of the variable named
 '## by $varname. That is, the policy regarding unresolved variable names will be
 '## applied to the variable A_varname then it will be printed.
 '##
 '## usage: oTemplate.WriteVariable string A_varname
 '##
 '## @param     A_varname     a string containing the name of the variable to finish and print
 '## @access    public
 '## @see       SetUnknowns
 '## @see       Finish
 '##
 Public Sub WriteVariable(ByVal A_varname)
 '############################################################
  Response.Write Finish(GetVal(A_varname))
 End Sub

 '####
 '##
 '## @see WriteVariable
 '## @same phplib::template->p
 '##
 Public Sub p(ByVal A_varname)
  Call WriteVariable(A_varname)
 End Sub

 '####
 '## When called with a relative pathname, this function will return the pathname
 '## with Root prepended. Absolute pathnames are returned unchanged.
 '##
 '## Returns: a string containing an absolute pathname.
 '##
 '## usage: filename(string A_filename)
 '##
 '## @param     A_filename    a string containing a filename
 '## @access    private
 '## @return    string
 '## @see       Root, SetRoot
 '##
 '## @same phplib::template->filename
 '##
 Private Function filename(ByVal A_filename)
 '############################################################
  Dim MM_FSO, MM_filename, MM_TempFilename, rs, sql
  If Debug = 4 Then Response.Write "<p><b>filename:</b> filename = " & A_filename & "</p>" & VbCrLf
  If Mode = "file" Then
   Set MM_FSO = CreateObject("Scripting.FileSystemObject")
   If Left(A_filename, 1) = "/" Then
    A_filename = Right(A_filename, len(A_filename) - 1)
   End If
   A_filename = Root & A_filename
   A_filename = Server.MapPath(A_filename)
   If Not MM_FSO.FileExists(A_filename) Then
    Call halt("filename: file " & A_filename & " does not exist.")
   Else
    MM_filename = A_filename
   End If
  ElseIf Mode = "db" Then
    A_filename = Split(A_filename, ".")
    MM_TempFilename = A_filename(0)
    sql = "SELECT tpldata_id FROM " & DataTable & " WHERE tplcat_id =" & Root &" AND tpldata_name='" & MM_TempFilename &"'"
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open sql, m_oConn, AdOpenForwardOnly, AdLockReadOnly, adCmdText
    If rs.EOF Then
     Call halt("filename: file " & MM_TempFilename & " does not exist.")
    Else
     MM_filename = rs("tpldata_id")
    End If
    Set rs = Nothing
    If Debug = 3 Then Response.Write "<p><b>filename:</b> sql = " & sql & "</p>" & VbCrLf
  End If
  filename = MM_filename
 End Function

 '####
 '## If a variable's value is undefined and the variable has a filename stored in
 '## ofile.Item(A_varname) then the backing file will be loaded and the file's
 '## contents will be assigned as the variable's value.
 '##
 '## Note that the behaviour of this function changed slightly after the 7.2d
 '## release. Where previously a variable was reloaded from file if the value
 '## was empty, now this is not done. This allows a variable to be loaded then
 '## set to "", and also prevents attempts to load empty variables. Files are
 '## now only loaded if oVarVals.Item(A_varname) is unset.
 '##
 '## Returns: true on success, false on error.
 '##
 '## usage: loadfile(string A_varname)
 '##
 '## @param     A_varname    a string containing the name of a variable to load
 '## @access    private
 '## @return    boolean
 '## @see       SetFile, SetFiles
 '##
 '## @same phplib::template->loadfile
 '##
 Private Function loadfile(ByVal A_varname)
 '############################################################
  Dim MM_FSO, MM_oFile, MM_filename, MM_FileSting, MM_bool
  If Debug = 4 Then Response.Write "<p><b>loadfile:</b> varname = " & A_varname & "</p>" & VbCrLf
  MM_bool = true
  If Not m_oFile.Exists(A_varname) Then
   loadfile = MM_bool
   If Debug = 4 Then Response.Write "<p><b>loadfile:</b> varname " & A_varname & " does not reference a file</p>" & VbCrLf
   Exit Function
  End If
  If m_oVarVals.Exists(A_varname) Then
   loadfile = MM_bool
   If Debug = 4 Then Response.Write "<p><b>loadfile:</b> varname " & A_varname & " is already loaded</p>" & VbCrLf
   Exit Function
  End If
  MM_filename = m_oFile.Item(A_varname)
  If Mode = "file" Then
   Set MM_FSO = CreateObject("Scripting.FileSystemObject")
   Set MM_oFile = MM_FSO.OpenTextFile(MM_filename)
   MM_FileSting = MM_oFile.ReadAll
   'MM_FileSting = Trim(MM_FileSting)
   If MM_FileSting = "" Then
    MM_bool = false
    Call halt("loadfile: While loading " & A_varname & ", " & MM_filename & " does not exist or is empty.")
   Else
    If Debug = 4 Then Response.Write "<b>loadfile:</b> loaded " & MM_filename & " into " & A_varname & "<br>" & VbCrLf
    Call SetVar(A_varname, MM_FileSting)
   End If
   MM_oFile.Close
   Set MM_oFile = Nothing
   set FSO = nothing
  ElseIf Mode = "db" Then
    sql = "SELECT tpldata_text FROM " & DataTable & " WHERE tpldata_id =" & MM_filename
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open sql, m_oConn, AdOpenForwardOnly, AdLockReadOnly, adCmdText
    If rs.EOF Then
     MM_bool = false
     Call halt("filename: file " & MM_TempFilename & " does not exist.")
    Else
     MM_FileSting = rs("tpldata_text")
     Call SetVar(A_varname, MM_FileSting)
    End If
    Set rs = Nothing
    If Debug = 3 Then Response.Write "<p><b>loadfile:</b> sql = " & sql & "</p>" & VbCrLf
  End If
  loadfile = MM_bool
 End Function

 '####
 '## This function will construct a regexp for a given variable name with any
 '## special chars quoted.
 '##
 '## Returns: a string containing an escaped variable name.
 '##
 '## usage: varname(string A_varname)
 '##
 '## @param     A_varname    a string containing a variable name
 '## @access    private
 '## @return    string
 '## @same phplib::template->varname
 '##
 Private Function varname(ByVal A_varname)
 '############################################################
  varname = BeginTag & A_varname & EndTag
 End Function

 '####
 '## This function is called whenever an error occurs and will handle the error
 '## according to the policy defined in IsHalt. Additionally the
 '## error message will be saved in m_strLastError.
 '##
 '## Returns: always returns false.
 '##
 '## usage: halt(string A_message)
 '##
 '## @param     $msg         a string containing an error message
 '## @access    private
 '## @return    void
 '## @see       IsHalt
 '##
 Private Sub halt(ByVal A_message)
 '############################################################
  m_strLastError = A_message
  If IsHalt <> "no" Then Call haltmsg(A_message)
  If IsHalt = "yes" Then
   Response.Write "<b>Halted.</b>"
   Response.End
  End If
 End Sub

 '####
 '## This function prints an error message.
 '## It can be overridden by your subclass of Template. It will be called with an
 '## error message to display.
 '##
 '## usage: haltmsg(string A_message)
 '##
 '## @param     A_message         a string containing the error message to display
 '## @access    public
 '## @return    void
 '## @see       halt
 '##
 Public Sub haltmsg(ByVal A_message)
 '############################################################
  Response.Write "<b>Template Error:</b>" & A_message & "<br>"
 End Sub

 '####
 '## Class constructor, set class default attributes, you can change it
 '## @see Property Let Debug
 '## @see Property Let Mode
 '## @see Property Let CatTable
 '## @see Property Let DataTable
 '## @see Property Let Unknown
 '## @see Property Let IsHalt
 '## @see Property Let BeginTag
 '## @see Property Let EndTag
 '####
 Private Sub class_Initialize
  Debug = 0
  Mode = "file"
  CatTable = "TplCat"
  DataTable = "TplData"
  Unknowns = "remove"
  IsHalt = "yes"
  m_strLastError = ""
  BeginTag = "{"
  EndTag = "}"
  m_Root = "templates/"
  Set m_oFile = CreateObject("Scripting.Dictionary")
  Set m_oVarKeys = CreateObject("Scripting.Dictionary")
  Set m_oVarVals = CreateObject("Scripting.Dictionary")
  Set m_oRegExp = New RegExp

  m_blnConnectionState = False

  m_strName = "aspTemplate"
  m_strVersion = "2.0.0"

  If Debug = 4 Then Response.Write "<p><b>Template:</b> root = " & m_Root & ", unknowns = " & Unknowns & "</p>" & VbCrLf

 End Sub

 '####
 '## Class destructor, free memory.
 '####
 Private Sub class_Terminate
  Set m_oFile = Nothing
  Set m_oVarKeys = Nothing
  Set m_oVarVals = Nothing
  Set m_oRegExp = Nothing
  Call CloseTemplateDatabase()
 End Sub

End Class

%>

本文地址:http://com.8s8s.com/it/it9057.htm