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

  早在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

  %>