|  | 
 
  <!--             Template.class.asp              -->
 <%
 '=======================================================================
 ' file:        Template.class.asp ASP页面模板类
 ' author:      伍子
 ' date:        2005-04-01
 ' website:     http://www.54youngor.com/
 ' email:       letsflytogether.com
 ' reference:   phplib,kktTemplate
 '=======================================================================
 class Template
 private m_classname
 '/* if set, echo assignments */
 private m_debug
 '/* $file[handle] = "filename"; */
 private m_file
 '/* relative filenames are relative to this pathname */
 private m_root
 '/* $varkeys[key] = "key"; $varvals[key] = "value"; */
 private m_varkeys
 private m_varvals
 '/* "remove"  => remove undefined variables
 '* "comment" => replace undefined variables with comments
 '* "keep"    => keep undefined variables
 '*/
 private m_unknowns
 '/* "yes" => halt, "report" => report error, continue, "no" => ignore error quietly */
 private m_halt_on_error
 '/* last error message is retained here */
 private m_last_error
 private m_regexp
 private m_fso
 
 private sub class_initialize
 m_classname="Template"
 m_debug=true
 set m_file=Server.CreateObject("Scripting.Dictionary")
 m_root=Server.MapPath(".")&"/"
 set m_varkeys=Server.CreateObject("Scripting.Dictionary")
 set m_varvals=Server.CreateObject("Scripting.Dictionary")
 m_unknowns="remove"
 m_halt_on_error="yes"
 m_last_error=""
 set m_regexp=new RegExp
 m_regexp.IgnoreCase = True
 m_regexp.Global     = True
 set m_fso = Server.CreateObject("Scripting.FileSystemObject")
 end sub
 
 private sub class_terminate
 set m_file=nothing
 set m_varkeys=nothing
 set m_varvals=nothing
 set m_regexp=nothing
 set m_fso=nothing
 end sub
 
 '/* public:set_root(pathname root)
 ' * root:new template directory.
 ' */
 public sub set_root(ByVal root)
 if not is_dir(m_root&root&"/") then
 halt("set_root:root is not a directory.")
 end if
 m_root=m_root&root&"/"
 end sub
 
 '/* public: set_unknowns(enum $unknowns)
 ' * unknowns: "remove", "comment", "keep"
 ' *
 ' */
 public sub set_unknowns(ByVal unknowns)
 m_unknowns=unknowns
 end sub
 
 '/* public: set_file(array $filelist)
 ' * filelist: array of handle, filename pairs.
 ' *
 ' * public: set_file(string $handle, string $filename)
 ' * handle: handle for a filename,
 ' * filename: name of template file
 ' */
 public sub set_file(ByVal handle,ByVal file)
 if not m_file.Exists(file) then
 m_file.Add handle,filename(file)
 end if
 end sub
 
 '/* public: set_var(array $values)
 ' * values: array of variable name, value pairs.
 ' *
 ' * public: set_var(string $varname, string $value)
 ' * varname: name of a variable that is to be defined
 ' * value:   value of that variable
 ' */
 public sub set_var(ByVal name,ByVal value)
 if not m_varkeys.Exists(name) then
 m_varkeys.Add name,varname(name)
 end if
 if not m_varvals.Exists(name) then
 m_varvals.Add name,value
 else
 m_varvals.Item(name)=value
 end if
 'response.Write(name & "====" & value &"<br>-----------------------------------------------------<br>")
 end sub
 
 '/* public: set_block(string $parent, string $handle, string $name = "")
 ' * extract the template $handle from $parent,
 ' * place variable {$name} instead.
 ' */
 public sub set_block(ByVal parent,ByVal handle,ByVal name)
 if not loadfile(parent) then
 halt("subst: unable to load ."&parent)
 end if
 if name="" then
 name=handle
 end if
 str=get_var(parent)
 m_regexp.Pattern="<!--\s+BEGIN " & handle & "\s+-->([\s\S.]*)<!--\s+END " & handle & "\s+-->"
 set matches=m_regexp.Execute(str)
 str=m_regexp.Replace(str,"{" & name & "}")
 for each match in matches
 set_var handle,match.SubMatches(0)
 next
 set_var parent,str
 end sub
 
 '/* public: get_var(string varname)
 ' * varname: name of variable.
 ' *
 ' * public: get_var(array varname)
 ' * varname: array of variable names
 ' */
 public function get_var(ByVal name)
 get_var=m_varvals.Item(name)
 end function
 
 '/* public: subst(string $handle)
 ' * handle: handle of template where variables are to be substituted.
 ' */
 public function subst(ByVal handle)
 if not loadfile(handle) then
 halt("subst: unable to load " & handle)
 end if
 str=get_var(handle)
 keys=m_varkeys.Keys
 for i_i=0 to m_varkeys.Count-1
 m_regexp.Pattern=m_varkeys.Item(keys(i_i))
 str=m_regexp.Replace(str,m_varvals.Item(keys(i_i)))
 next
 subst=str
 end function
 
 '/* public: parse(string $target, string $handle, boolean append)
 ' * public: parse(string $target, array  $handle, boolean append)
 ' * target: handle of variable to generate
 ' * handle: handle of template to substitute
 ' * append: append to target handle
 ' */
 public sub parse(ByVal target,ByVal handle,ByVal append)
 str=subst(handle)
 if append=true then
 set_var target,get_var(target) & str
 else
 set_var target,str
 end if
 end sub
 
 '/* public: finish(string $str)
 ' * str: string to finish.
 ' */
 public function finish(ByVal str)
 select case m_unknowns
 case "keep"
 finish=str
 case "remove"
 m_regexp.pattern ="{[^ \t\r\n}]+}"
 finish=m_regexp.Replace(str, "")
 case "comment"
 m_regexp.pattern = "{[^ \t\r\n}]+}"
 finish = m_regexp.Replace(str, "<!-- Template Variable undefined -->")
 case else finish = str
 end select
 end function
 
 '/* public: p(string $varname)
 ' * varname: name of variable to print.
 ' */
 public sub p(ByVal name)
 response.Write(finish(get_var(name)))
 end sub
 
 '/* public: p(string $varname)
 ' * varname: name of variable to print.
 ' */
 public sub pparse(ByVal target,ByVal handle,ByVal append)
 parse target,handle,append
 p target
 end sub
 
 ' private *************************************************************
 private function is_dir(ByVal path)
 is_dir = m_fso.FolderExists(path)
 end function
 
 private function file_exists(ByVal file)
 file_exists = m_fso.FileExists(file)
 end function
 
 '/* private: loadfile(string $handle)
 ' * handle:  load file defined by handle, if it is not loaded yet.
 ' */
 private function loadfile(ByVal handle)
 if not (m_varkeys.Exists(handle) and m_varvals.Item(handle)<>"") then
 if m_file.Item(handle)="" then
 halt("loadfile:" & handle & " is not a valid handle.")
 end if
 name=m_file.Item(handle)
 if not file_exists(name) then
 halt("loadfile:while loading " & handle & ", " & name & " does not exist.")
 end if
 set fh = m_fso.OpenTextFile(name)
 str = fh.ReadAll
 if str="" then
 halt("loadfile:while loading " & handle & ", " & name & " is empty.")
 end if
 set fh = nothing
 set_var handle,str
 end if
 loadfile=true
 end function
 
 '/* private: filename($filename)
 ' * filename: name to be completed.
 ' */
 private function filename(ByVal file)
 if not file_exists(m_root&file) then
 halt("filename:file "&file&" does not exist.")
 end if
 filename=m_root&file
 end function
 
 '/* private: varname($varname)
 ' * varname: name of a replacement variable to be protected.
 ' */
 private function varname(ByVal name)
 varname="{"&name&"}"
 end function
 
 '/* public: halt(string $msg)
 ' * msg:    error message to show.
 ' */
 private sub halt(ByVal msg)
 m_last_error=msg
 if m_halt_on_error<>"no" then
 haltmsg(msg)
 end if
 if m_halt_on_error="yes" then
 response.Write("<b>Halted.</b>")
 response.End()
 end if
 end sub
 
 '/* public, override: haltmsg($msg)
 ' * msg: error message to show.
 ' */
 private sub haltmsg(ByVal msg)
 response.Write("<b>Template Error:</b>"&msg&"<br>")
 response.End()
 end sub
 
 end class
 %>
 
 
 <!--                main.htm                -->
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
 <title>无标题文档</title>
 </head>
 
 <body>
 {HEAD}<br>
 <p>{CONTENT}</p>
 <table width="100%"  border="0" cellspacing="0" cellpadding="0">
 <!-- BEGIN BROW -->
 <tr>
 <!-- BEGIN BCOL -->
 <td>{NUMBER}</td>
 <!-- END BCOL -->
 </tr>
 <!-- END BROW -->
 </table>
 <p>{FOOT}</p>
 </body>
 </html>
 
 
 <!--               head.htm               -->
 <table width="100%"  border="0" cellspacing="0" cellpadding="0">
 <tr>
 <td align="center">欢迎您,{NAME}</td>
 </tr>
 </table>
 
 
 <!--                foot.htm               -->
 <table width="100%"  border="0" cellspacing="0" cellpadding="0">
 <tr>
 <td align="center">版权所有:{COMPANY}</td>
 </tr>
 </table>
 
 
 <!--                test.asp                -->
 <!--#include file="library/Template.class.asp"-->
 <%
 dim tpl
 set tpl = new Template
 'tpl.set_root("tpl")
 'tpl.set_unknowns("comment")
 tpl.set_file "fh","template/main.htm"
 tpl.set_file "headh","template/head.htm"
 tpl.set_file "footh","template/foot.htm"
 tpl.set_block "fh","BROW","row"
 tpl.set_block "BROW","BCOL","col"
 tpl.set_var "NAME","朋友"
 tpl.set_var "CONTENT","ASP模板技术,支持模板嵌套,块操作"
 tpl.set_var "COMPANY","youngor-studio"
 for i=0 to 10
 tpl.set_var "col",""
 for j=0 to 10
 tpl.set_var "NUMBER",CStr(i)&CStr(j)
 tpl.parse "col","BCOL",true
 next
 tpl.parse "row","BROW",true
 next
 tpl.parse "HEAD","headh",false
 tpl.parse "FOOT","footh",false
 tpl.pparse "out","fh",false
 set tpl=nothing
 %>
 |