KUMAGATA-DENKYU

つくるのがすきなくまによる開発ブログ

JavaScript言語仕様拡張大作戦2 ~ヒアドキュメント編~

ヒアドキュメント

複数行の文字列を埋め込むようなヒアドキュメントって JavaScriptだと構文エラーでできないんですけど、これを実現します。

エラーになる例

var js = "
<html>
<body>
ヘイ提督ゥ!HTML直打ちもいいけどサー、改行と場所をわきまえなヨー。
</body>
</html>
";

これならOKだけど、めんどくさいし読みづらい例

var js = "\
<html>\
<body>\
制御文字?あぁ……ウザい。\
</body>\
</html>\
";

Pythonでのヒアドキュメント例

pyhtml = """
<html>
<body>
Pythonの本気を見るのです!
</body>
</html>
"""

JavaScriptヒアドキュメントのオレ仕様

こんな感じにすることにした。

var jshtml = ""/*
<html>
<body>
俺ヒアドキュメント!
</body>
</html>
*/;

実装

function _h(fn) {
    dat = fn.toString();

    dat = dat.replace(/""\/\*([\s\S]*?)\*\//gm, function(va, v1) {
    v1 = v1.replace(/\n/gm, "\\n").replace(/"/gm, '\\"');
        return '"'+ v1 + '"';
    });
    return eval(["(", dat, ")()"].join(''));
}

$(function(){ //jQueryつかう

    _h(function() { //この中は独自仕様になる

        $("body").append(
""/*
<pre style="font-size:30px; font-family:"MS P明朝">
第壱話
使
徒、襲来
</pre>
*/
        );

    });

});

実行結果

第壱話
使
徒、襲来

まとめ

CoffeeScriptとか使わなくてもヒアドキュメントできた。

注意点としてコメントアウト部分はかなり昔のFireFox限定でtoStringで取得されるプログラムから消えてしまうようです。最新のFireFoxだと問題ないです。

コメントアウトを使うと何を書いてもエラーにならないので、JavaScriptの文法を完全無視できます。

例えばこんな感じで別言語で書いたりできそう。 JavaScriptで他言語を実装すればですが・・・。

//C++で書く
_cpp(function(){/*
 int i;
 for(i=0;i<10;i++){
     printf("hoge");
  }
*/});

こんなのは便利そうなので誰か実装するべき

//吉里吉里のシナリオをそのまま書ける
_kirikiri(function(){/*
[wait time=200]
*start|スタート
[cm]
そんなこと言う人、嫌いです。
*/});

つづく。