深圳升蓝软件
数据库开发 .Net技术  |  ASP技术 PHP技术 JSP技术 应用技术类   
Hiblue Software

一个仿phplib的模板类


March 25,2004
用php用惯了,用phplib用惯了,没有他觉得很不舒服
上网查找没有人写,自己写了一个,asp水平不高,希望
能有高手指点修改。
<%
' ====================================
' Name:        Template Class
' Purpose:    Parse and output HTML page
' Date:        10.2002
' Author:    pig
' Email:    [email protected]
' Phone:    13910320759
' ====================================

class Template
    dim gs_root
    dim gs_handle()
    dim gs_file()
    dim gs_keys()
    dim gs_keyVars()
    dim gs_vars()

    '构造函数
    Private Sub Template_Initialize()
        call of_setRoot(".")
        'call of_redimVar()
    End Sub
   
    function of_redimVar()
        redim gs_handle(0)
        redim gs_file(0)
        redim gs_keys(0)
        redim gs_keyVars(0)
        redim gs_vars(0)
    end function

    '设置模板存放路径
    function of_setRoot(byVal ps_root)
        if ps_root <> "" then
            gs_root = ps_root
        end if
    end function

    '设置文件名称函数
    function of_setFile(byVal ps_fileHandle,byVal ps_fileName)
        if ps_fileName <> "" then
            li_maxNum=UBound(gs_handle)
            gs_handle(li_maxNum)    = ps_fileHandle
            gs_file(li_maxNum)        = gs_root+"/"+ps_fileName

            li_maxNum=li_maxNum+1
            redim Preserve gs_handle(li_maxNum)
            redim Preserve gs_file(li_maxNum)
        end if
    end function

    '设置要替换的参数变量
    function of_setVar(byVal ps_key,byVal ps_var)
        if ps_key <> "" and ps_var <> "" then
            li_keyIndex=of_getIndex(gs_keys,ps_key)
            if li_keyIndex="no" then
                li_maxNum=UBound(gs_keys)
                gs_keys(li_maxNum)=ps_key
                gs_keyVars(li_maxNum)="{" & ps_key & "}"
                gs_vars(li_maxNum)=ps_var
               
                li_maxNum=li_maxNum+1
                redim Preserve gs_keys(li_maxNum)
                redim Preserve gs_keyVars(li_maxNum)
                redim Preserve gs_vars(li_maxNum)
            else
                gs_keys(li_keyIndex)=ps_key
                gs_keyVars(li_keyIndex)="{" & ps_key & "}"
                gs_vars(li_keyIndex)=ps_var
            end if
        end if
    end function

    '定义重载文字块儿
    function of_setBlock(byVal ps_parent,byVal ps_handle,byVal ps_name)
        if (not of_loadFile(ps_parent)) then
            ls_error="of_loadFile unable to load "+ps_parent
            response.write(ls_error)
            of_setBlock=false
            exit function
        end if

        if ps_name="" then
            ps_name=ps_handle
        end if

        ls_string=of_getVar(ps_parent)
        ls_pattern = "<!--s*BEGIN "&ps_handle&"s*-->(.*)<!--s*END "&ps_handle&"s*-->"

        Set regEx = New RegExp
        regEx.Pattern = "n"
        regEx.IgnoreCase = false
        regEx.global = true
        ls_string = regEx.Replace(ls_string,"")

        regEx.Pattern = ls_pattern
        regEx.Multiline = true
        regEx.global = false
        Set Matches = regEx.Execute(ls_string)
        ls_string = regEx.Replace(ls_string,"{"&ps_name&"}")

        For Each Match in Matches   
            ls_value=Match.value
        Next

        regEx.Pattern = "<!--s*BEGIN "&ps_handle&"s*-->"
        regEx.IgnoreCase = false
        regEx.global = true
        ls_value = regEx.Replace(ls_value,"")

        regEx.Pattern = "<!--s*END "&ps_handle&"s*-->"
        regEx.IgnoreCase = false
        regEx.global = true
        ls_value = regEx.Replace(ls_value,"")

        call of_setVar(ps_handle,ls_value)
        call of_setVar(ps_parent,ls_string)
    end function

    '装载变量内容
    function of_loadFile(byVal ps_handle)
        li_keyIndex=of_getIndex(gs_keys,ps_handle)
        if li_keyIndex = "no" then
            li_fileIndex=of_getIndex(gs_handle,ps_handle)
            if li_fileIndex = "no" then
                ls_error="loadfile:"+ps_handle+" is not a valid handle."
                response.write(ls_error)
                of_loadFile=false
                exit function
            end if

            ls_fileName=gs_file(li_fileIndex)
            ls_fileName=server.mappath(ls_fileName)
            Set MyFileObject=Server.CreateObject("Scripting.FileSystemObject")
            li_exist=MyFileObject.FileExists(ls_fileName)
            if li_exist then
                Set MyTextFile=MyFileObject.OpenTextFile(ls_fileName)
                ls_file=MyTextFile.readAll()
                MyTextFile.Close
                call of_setVar(ps_handle,ls_file)
            else
                ls_error="loadfile:"+ls_fileName+" is not a valid file or path."
                response.write(ls_error)
                of_loadFile=false
                exit function
            end if
        end if

        of_loadFile=true
    end function

    '变量替换过程
    function of_replace(byval ps_handle)
        if (not of_loadFile(ps_handle)) then
            ls_error="of_replace: unable to load "+ps_handle
            response.write(ls_error)
            of_replace=false
            exit function
        end if

        ls_str=of_getVar(ps_handle)
        li_minIndex=LBound(gs_keys)
        li_maxIndex=UBound(gs_keys)
        
        for i=li_minIndex to li_maxIndex
            Set regEx = New RegExp
            regEx.Pattern = gs_keyVars(i)
            regEx.IgnoreCase = True
            ls_str = regEx.Replace(ls_str, gs_vars(i))
        next

        of_replace=ls_str
    end function
   
    '获取存储变量
    function of_getVar(byval ps_keyName)
        li_keyIndex=of_getIndex(gs_keys,ps_keyName)
        if(li_keyIndex="no") then
            of_getVar=""
        else
            ls_varName=gs_vars(li_keyIndex)
            of_getVar=ls_varName
        end if
    end function

    '查找数组中相应字符串的索引值
    function of_getIndex(byval ps_array,byval ps_handle)
        li_minIndex=LBound(ps_array)
        li_maxIndex=UBound(ps_array)
        li_index="no"
        for i=li_minIndex to li_maxIndex
            if (ps_array(i)=ps_handle) then
                li_index=i
                exit for
            end if
        next
        of_getIndex=li_index
    end function

    '分析变量
    function of_parse(byval ps_target,byval ps_handle,byval ps_append)
        ls_string = of_replace(ps_handle)
        if ps_append=true then
            ls_org = of_getVar(ps_target) & ls_string

            'if pi_time=2 then
            '    response.write(ls_string)
            '    exit function
            'end if

            call of_setVar(ps_target,ls_org)
        else
            call of_setVar(ps_target,ls_string)
        end if
    end function
   
    function of_print(byval ps_keyName)
        li_keyIndex=of_getIndex(gs_keys,ps_keyName)
        ls_varString=gs_vars(li_keyIndex)

        Set regEx = New RegExp
        regEx.Pattern = "{[^ trn}]+}"
        regEx.IgnoreCase = True
        ls_varString = regEx.Replace(ls_varString, "")
        of_print=ls_varString
    end function
end class
%>

调用页面:
<%
dim c_html
set c_html = new Template

call c_html.of_redimVar()
call c_html.of_setFile("main","index.htm")
call c_html.of_setBlock("main","block_test","myTest")

call c_html.of_setVar("TEST","testblock1")
call c_html.of_parse("myTest","block_test",true)
call c_html.of_setVar("TEST","testblock2")
call c_html.of_parse("myTest","block_test",true)

call c_html.of_setVar("TEST1","success")
call c_html.of_parse("MAIN_OUTPUT","main",false)
ls_result=c_html.of_print("MAIN_OUTPUT")
response.write(ls_result)
%>

模板文件:
{TEST1}
<table border=1>
<!-- BEGIN block_test -->      
<tr><td width='250' class='h1' height='40' bgcolor='#f0f0f0' align='center'>
    {TEST}
</td></tr>
<!-- END block_test -->
</table>

希望对用惯了phplib中的强大功能的朋友能有所帮助
我希望交接所有php以及asp的爱好者
我的qq:9457009
Copyright © 2001-2008 Shenzhen Hiblue Software Team All rights reserved