ASP模板技术

来源:互联网 发布:网络跟同轴探头的区别 编辑:程序博客网 时间:2024/05/21 15:40

<!--             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
%>

显示结果如下:

原创粉丝点击