WSH:VBScriptでヒアドキュメント
VBScriptでヒアドキュメントができないか、というのがあったので、考えてみた。
VBScriptは使ってないFunctionでも構文解析してしまうので、コメントかな。
まずは回答
Option Explicit ' here document sample Dim m_regexp Set m_regexp = CreateObject("VBScript.Regexp") m_regexp.Multiline = True m_regexp.Global = True Dim m_scriptText Function GetHereDoc(name) If Len(m_scriptText) = 0 Then Dim fso, f Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(WScript.ScriptFullName) m_scriptText = f.ReadAll() Set f = Nothing Set fso = Nothing End If m_regexp.Pattern = "(^'\s*TextBlock\s+" + name + "\s*$)\n((.|\n)*?)(?=\n'\s*EndTextBlock)" Dim matches Set matches = m_regexp.Execute(m_scriptText) If matches.Count > 0 Then If matches.Item(0).SubMatches.Count > 1 Then Dim ret ret = matches.Item(0).SubMatches(1) m_regexp.Pattern = "^'" GetHereDoc = m_regexp.Replace(ret, "") End If End If End Function 'TextBlock 松尾 芭蕉 '夏草や ' 兵どもが ' 夢の跡 'EndTextBlock 'TextBlock 小林 一茶 ' 我と来て ' 遊べや親の ' ない雀 'EndTextBlock 'TextBlock 正岡 子規 ' 柿食へば ' 鐘が鳴るなり '法隆寺 'EndTextBlock Function Main() WScript.Echo(GetHereDoc("松尾 芭蕉")) MsgBox(GetHereDoc("正岡 子規")) Main = 0 End Function WScript.Quit(Main())
「Dim m_regexp」からGetHereDoc関数の終わりまでが肝。
そこを使用するVBScriptにコピーして使う想定。
実際の使い方は、、、ま、上のScriptを実行して考えて。
解説
m_で始まる二つの変数は、GetHereDoc関数を複数回呼ぶ想定で、グローバルにしてます。
ヒアドキュメントの形式は、UWSCにあわせていますが、その辺を変えたい場合は、「m_regexp.Pattern = "(^'\s*TextBlock\s+" + name + "\s*$)\n((.|\n)*?)(?=\n'\s*EndTextBlock)"」を変えればOKですね。
ヒアドキュメントの先頭スペースを削除したい場合は、「m_regexp.Pattern = "^'"」を「m_regexp.Pattern = "^'\s*"」にすればOKかと。
この思想なら、JScript(Javascript)にするのも簡単ですね。
WSH想定ですが、ブラウザでやりたい場合は、ヒアドキュメントをHTMLコメント等にして、DOM操作すれば良いと思われます。