分享一个好东东,动态Include文件 (Dynamic File Includes)

时间:2021-09-30 01:55:33

早在03年就在蓝色理想上看到过动态Include的文章,当时已经觉得很厉害,但实际应用了一下,不方便而且Include的效果不好. 

后来又在一网站上看到了改进版的,但是也不太好用~~~ 

哎,当时我真是觉得有点想放弃ASP了,但是由于公司还是用ASP来开发,我也是没有办法... 

今天,我一定要记住今天~~~在国外的一个网站上我竟然发现了这样一个好东东,太棒了~~~Great works!!! 

以前试的一些动态Include代码,都无法Include一个类,甚至函数~~~又或者Include文件中的Include无法被包含... 

现在这个鬼佬(dselkirk)写的类可以为我们做到这些了~~~

复制代码代码如下:


<%  
  public include, include_vars  
  set include = new cls_include  

  class cls_include  

    private sub class_initialize()  
      set include_vars = server.createobject("scripting.dictionary")  
    end sub  
    private sub class_deactivate()  
      arr_variables.removeall  
      set include_vars = nothing  
      set include = nothing  
    end sub  

    public default function include(byval str_path)  
      dim str_source  
      if str_path <> "" then  
        str_source = readfile(str_path)  
        if str_source <> "" then  
          processincludes str_source  
          convert2code str_source  
          formatcode str_source  
          if str_source <> "" then  
            if request.querystring("debug") = 1 then  
              response.write str_source  
              response.end  
            else  
              executeglobal str_source  
              include_vars.removeall  
            end if  
          end if  
        end if  
      end if  
    end function  

    private sub convert2code(str_source)  
      dim i, str_temp, arr_temp, int_len  
      if str_source <> "" then  
        if instr(str_source,"%" & ">") > instr(str_source,"<" & "%") then  
          str_temp = replace(str_source,"<" & "%","|%")  
          str_temp = replace(str_temp,"%" & ">","|")  
          if left(str_temp,1) = "|" then str_temp = right(str_temp,len(str_temp) - 1)  
          if right(str_temp,1) = "|" then str_temp = left(str_temp,len(str_temp) - 1)  
          arr_temp = split(str_temp,"|")  
          int_len = ubound(arr_temp)  
          if (int_len + 1) > 0 then  
            for i = 0 to int_len  
              str_temp = trim(arr_temp(i))  
              str_temp = replace(str_temp,vbcrlf & vbcrlf,vbcrlf)  
              if left(str_temp,2) = vbcrlf then str_temp = right(str_temp,len(str_temp) - 2)  
              if right(str_temp,2) = vbcrlf then str_temp = left(str_temp,len(str_temp) - 2)  
              if left(str_temp,1) = "%" then  
                str_temp = right(str_temp,len(str_temp) - 1)  
                if left(str_temp,1) = "=" then  
                  str_temp = right(str_temp,len(str_temp) - 1)  
                  str_temp = "response.write " & str_temp  
                end if  
              else  
                if str_temp <> "" then  
                  include_vars.add i, str_temp  
                  str_temp = "response.write include_vars.item(" & i & ")"   
                end if  
              end if  
              str_temp = replace(str_temp,chr(34) & chr(34) & " & ","")  
              str_temp = replace(str_temp," & " & chr(34) & chr(34),"")  
              if right(str_temp,2) <> vbcrlf then str_temp = str_temp  
              arr_temp(i) = str_temp  
            next  
            str_source = join(arr_temp,vbcrlf)  
          end if  
        else  
          if str_source <> "" then  
            include_vars.add "var", str_source  
            str_source = "response.write include_vars.item(""var"")"  
          end if  
        end if  
      end if  
    end sub  

    private sub processincludes(str_source)  
      dim int_start, str_path, str_mid, str_temp  
      str_source = replace(str_source,"<!-- #","<!--#")  
      int_start = instr(str_source,"<!--#include")  
      str_mid = lcase(getbetween(str_source,"<!--#include","-->"))  
      do until int_start = 0  
        str_mid = lcase(getbetween(str_source,"<!--","-->"))  
        int_start = instr(str_mid,"#include")  
        if int_start >  0 then  
          str_temp = lcase(getbetween(str_mid,chr(34),chr(34)))  
          str_temp = trim(str_temp)  
          str_path = readfile(str_temp)  
          str_source = replace(str_source,"<!--" & str_mid & "-->",str_path & vbcrlf)  
        end if  
        int_start = instr(str_source,"#include")  
      loop  
    end sub  

    private sub formatcode(str_code)  
      dim i, arr_temp, int_len  
      str_code = replace(str_code,vbcrlf & vbcrlf,vbcrlf)  
      if left(str_code,2) = vbcrlf then str_code = right(str_code,len(str_code) - 2)  
      str_code = trim(str_code)  
      if instr(str_code,vbcrlf) > 0 then  
        arr_temp = split(str_code,vbcrlf)  
        for i = 0 to ubound(arr_temp)  
          arr_temp(i) = ltrim(arr_temp(i))  
          if arr_temp(i) <> "" then arr_temp(i) = arr_temp(i) & vbcrlf  
        next  
        str_code = join(arr_temp,"")  
        arr_temp = vbnull  
      end if  
    end sub  

    private function readfile(str_path)  
      dim objfso, objfile  
      if str_path <> "" then  
        if instr(str_path,":") = 0 then str_path = server.mappath(str_path)  
        set objfso = server.createobject("scripting.filesystemobject")  
        if objfso.fileexists(str_path) then  
          set objfile = objfso.opentextfile(str_path, 1, false)  
          if err.number = 0 then  
            readfile = objfile.readall  
            objfile.close  
          end if  
          set objfile = nothing  
        end if  
        set objfso = nothing  
      end if  
    end function  

    private function getbetween(strdata, strstart, strend)  
      dim lngstart, lngend  
      lngstart = instr(strdata, strstart) + len(strstart)  
      if (lngstart <> 0) then  
        lngend = instr(lngstart, strdata, strend)  
        if (lngend <> 0) then  
          getbetween = mid(strdata, lngstart, lngend - lngstart)  
        end if  
      end if  
    end function  

  end class  
%>