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操作すれば良いと思われます。