ASP テンプレート クラスの説明
作成者: shaoyun フォームwww.devjs.com
時間: 17:05 2008-12-10
++機能紹介
--単層ループタグをサポートし、ページクラス内で複数回使用できます。
--テンプレートファイルの導入をサポートし、ロード時にテンプレートがマージされます。
-- テンプレート ファイルのパスを指定できます。パスは相対パスであり、デフォルトは現在のファイル パスです。
-- 空行の最終出力については、
++ タグ定義
{$tag$} の通常のタグ
を削除します。
{$include:filename$} テンプレート ファイル タグ
<loop name="tagname">...</loop> ループタグ、name 属性はタグ名です
ループ タグ内の
サブタグ++ タグの説明
:正規表現を使用してタグを照合およびフィルタリングします。ループ タグ内の name 属性の前に複数のスペースを含めることができ、name の前後に他の属性を含めることもできます。属性は引用符で囲んでも囲んでも構いません。設定は最初の
++ 関数の記述
と一致します。読み込み時に、テンプレート ファイル内のネストされたテンプレート ファイルのタグを確認します。ネストされたテンプレート ファイル タグの内容を置き換え、テンプレート ファイルをマージし、
テンプレート タグを解析するための変数 Assign 関数に格納します。通常のタグの場合は、それをデータ オブジェクトに追加します。ループ タグの場合は、それをデータ オブジェクトに格納します。ループデータオブジェクトの場合は、サイクル内に蓄積されたデータがデータオブジェクトの
フラッシュ関数テンプレートクラスに追加されます。これは、単一のサイクルラベルを処理するために使用される非常に重要な関数です。サイクルごとに、サイクル ブロックの内部置換を実行し、サイクル データを蓄積して保存します。完了後、Bulid 関数を呼び出して、
未保存および保存済みのループ データをデータ オブジェクトに追加し、すべてのデータを出力する必要があります。通常のラベルの置換はこのステップで完了します。特に
、assign 関数は、デフォルトの属性を呼び出して値を割り当てるという便利な機能を備えています。例:
プログラムコード
tp.assign("title","news") は、
このより簡潔な割り当てメソッドの
プログラム コード
を使用できます。
tp("title")="News"
tp はインスタンス化されたテンプレート オブジェクトです。
テンプレート コード全体は次のとおりです (template.asp)。
プログラムコード
<%
クラス テンプレート プライベート
m_content,m_looptmp,tagData,loopdata,m_loop_content,m_Looptag,m_TplPath,m_SetTplPath
Private m_ClassName,m_Version,m_Copyright
Private Sub Class_Initialize()
m_content="" : m_looptmp="" : m_loop_content="" : m_looptag=""
m_ClassName="Shaoyun ASP テンプレート クラス" : m_Version="1.0" : m_Copyright="DevJS.com"
m_TplPath="./" : m_SetTplPath=false
tagData = Server.CreateObject("Scripting.Dictionary") を設定します
SetloopData = Server.CreateObject("Scripting.Dictionary")
End Sub
Private Sub Class_Terminate()
m_content="" : m_looptmp="" : m_loop_content="" : m_looptag=""
m_TplPath="./" : m_SetTplPath=false
tagData = なしを設定:loopData = なしを設定
End Sub
Public プロパティ Get ClassName
クラス名 = m_クラス名
End プロパティ
Public プロパティ Get Version
バージョン = m_Version
End プロパティ
Public プロパティ Get Copyright
著作権 = m_Copyright
End プロパティ
Rem は、テンプレートにこのタグが含まれるかどうかを決定するテンプレート クラスのデフォルトのプロパティです。
パブリックデフォルトプロパティ Get Tag(タグ名)
タグ = InStr(m_content,"{$" & タグ名 & "$")>0
End プロパティ
Rem は、定義された代入関数を呼び出します。このプロパティは、代入操作を簡素化するために使用されます。
Public プロパティ Let Tag(tagname,replaceString)
Call Assign(タグ名,replaceString)
End プロパティ
Public プロパティ Get TplPath
TplPath = m_TplPath
End プロパティ
Rem はテンプレート ファイルのパスを設定します
Public プロパティ Let TplPath(sTplPath)
sTplPath<>"" の場合、m_TplPath = sTplPath
右の場合 (m_TplPath,1)<>"/" then m_TplPath = m_TplPath & "/"
End プロパティ
プライベート関数 LoadFromFile(sFilePath,sCharset)
LoadFromFile=false
ディムオストリーム
oStream=Server.CreateObject("ADODB.Stream") を設定します
oStream.Type=2
oStream.Mode=3
oStream.Open
oStream.Charset=sCharset
oStream.Position=oStream.Size
oStream.LoadFromFile sFilePath
LoadFromFile=oStream.ReadText
oStream.Close
oStream=Nothing を設定します
終了関数
プライベート関数 FileExist(filespec)
エラー時は次へ再開
ファイル存在=False
Dim oFSO : Set oFSO = Server.CreateObject("Scripting.FileSystemObject")
FileExist=oFSO.FileExists(ファイル仕様)
oFSO=何も設定しない
End Function
Rem はループブロックを取得します
プライベート関数 GetTmpStr(tplstr,tagname,attname)
Dim regEx、一致、一致
正規表現 = 新しい正規表現を設定します
regEx.Pattern = "<" & タグ名 & ".*?s+name=[""|']?" & 属性名 & "[""|']?.*?>([s S.]*?)</" & タグ名 & ">"
regEx.Global = False
regEx.IgnoreCase = True
一致を設定 = regEx.Execute(tplstr)
試合中の各試合について
GetTmpStr=Match.Value
次
regEx = なしを設定します
End Function
Rem は HTML タグを削除します
プライベート関数 RemoveTag(tagString,tagname)
ディム正規表現
regex=New RegExp を設定します
regEx.Pattern = "<[/]?" & タグ名 & ".*?>"
regEx.Global = True
regEx.IgnoreCase = True
RemoveTag = regEx.Replace(tagString,"")
regex=nothing を設定します
End Function
Rem 空白行を削除
プライベート関数 RemoveSpace(tagString)
ディム正規表現
regex=New RegExp を設定します
regEx.Pattern = "ns*r"
regEx.Global = True
regEx.IgnoreCase = True
RemoveSpace = regEx.Replace(tagString,"")
regex=nothing を設定します
End Function
Rem は、テンプレート ファイルを読み取り、ネストされたテンプレートを同時に処理し、テンプレートをマージします。
パブリック関数 LoadTpl(tplfile)
tplfile=サーバー.マップパス(tplfile)
FileExist(tplfile)でない場合
Response.Write "テンプレート ファイルのロードに失敗しました!"
応答.終了
終了関数
終了の場合
m_content=LoadFromFile(tplfile,"GB2312")
Dim regEx,Matches,Match,fname,sContent
正規表現 = 新しい正規表現を設定します
regEx.Pattern = "{$include:(.*?)$}"
regEx.Global = True
regEx.IgnoreCase = True
一致を設定 = regEx.Execute(m_content)
試合中の各試合について
fname=Match.SubMatches(0)
fname=Server.MapPath(m_TplPath & fname)
FileExist(fname) の場合
sContent=LoadFromFile(fname,"GB2312")
m_content=replace(m_content,Match.value,sContent)
終了の場合
次
regEx = なしを設定します
End Function
Rem代入置換関数
パブリック関数の割り当て(タグ名,replaceString)
tagname="" の場合、関数を終了します
ループラベルの場合はレム
InStr(タグ名,"/")>0かつInStr(タグ名,"/")<Len(タグ名)の場合
Remはループラベル名を取得します
m_curLooptag=Left(タグ名,InStrRev(タグ名,"/")-1)
m_Looptag="" の場合
Rem 初めてループラベルを検出した場合、ループに必要な変数の初期値を設定します。
m_looptag=m_curLooptag : m_loop_content=""
m_looptmp=GetTmpStr(m_content,"loop",m_Looptag)
それ以外
m_LoopTag<>m_curLooptag の場合
Rem ループラベルが変更された場合、初期ループ変数
m_content=replace(m_content,m_looptmp,m_loop_content)
m_looptag=m_curLooptag : m_loop_content=""
m_looptmp=GetTmpStr(m_content,"loop",m_Looptag)
終了の場合
終了の場合
If Not(loopData.Exists(tagname)) thenloopData.Add タグ名,replaceString
それ以外
レム共通ラベル
tagData.タグ名の追加、文字列の置換
終了の場合
End Function
Rem はブロック内置換を実行します
パブリック関数 Flash()
ループデータ.カウント>0の場合、
ディム・アイ
chgtmp=RemoveTag(m_looptmp,"ループ")
arrtag=loopData.keys
arrval=loopData.items
i=0 の場合、loopData.count-1 へ
chgtmp=replace(chgtmp,"{$" & arrtag(i) & "$}",arrval(i))
次
Rem はブロック内のデータを変数に保存します
m_loop_content=m_loop_content & chgtmp
ループデータ.RemoveAll
次の場合に終了
Function
Rem ビルドを終了し、テンプレートの最終置き換えを完了します
パブリック関数 Bulid()
m_content=replace(m_content,m_looptmp,m_loop_content)
arrtag=tagData.keys
arrval=tagData.items
i=0 の場合 tagData.count-1 へ
m_content=replace(m_content,"{$" & arrtag(i) & "$}",arrval(i))
次
m_Content=スペースの削除(m_Content)
Response.Write m_Content
終了関数
終了クラス
%>
親テンプレートのテンプレート コード (default.tpl):
プログラムコード
{$include:head.tpl$}
<h1 align=center>{$doc_title$}</h1>
<h3>{$news_title$}</h3>
<ul>
<ループ名="ニュース">
<Li style="color:#F00">ニュースのタイトル: {$news/title$}--著者: {$news/author$}</Li>
</ループ>
</ul>
<h3>{$lastest_news$}</h3>
<ul>
<!-- このループ内の bing と count はテスト用であり、実際に使用する場合は削除してください -->
<loop binding="id" name=arts count="15">
<Li>記事のタイトル: {$arts/title$}--著者: {$arts/author$}</Li>
</ループ>
</ul>
{$include:foot.tpl$}
ネストされたサブテンプレート (head.tpl):
プログラムコード
<title>{$doc_title$}</title>
ネストされた子テンプレート (foot.tpl):
プログラムコード
<p align=center>DevJS.Com による著作権</p>
呼び出しコード (default.asp):
プログラムコード
<!--#include file="function/template.asp"-->
<%
Remテンプレートクラスの使用例
Set tp = new Template
tp.tplpath="tpl"
tp.LoadTpl(tp.tplpath & "default.tpl")
tp.assign "doc_title","テンプレートメカニズムの例"
tp.assign "news_title","国内ニュース"
i=0~2の場合
call tp.assign("arts/title","金融危機により大量の失業者が発生した")
call tp.assign("arts/author","NetEase")
tp.flush
次
tp.assign "lastest_news","最新の記事"
Rem はここで別の割り当て方法を使用します
i=0~2の場合
tp("news/title")="政府からの良いニュースは株式市場の押し上げに役立つだろう"
tp("ニュース/著者")="総武"
tp.flush
次
tp.bulid
tp = 何も設定しない
%>
この記事は、shaoyun のブログhttp://www.devjs.com/からのものです。元のアドレス: http://www.devjs.com/post/asp-template-class.html