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