blingbling HTML

blingbling HTMLは、JavaScript向けのHTML規格です。blingbling DSLシリーズのひとつで、HTMLでできることの大部分を実現できる他、PHPスタイルの埋め込み式や、拡張タグを使ったマークアップにも対応しています。

機能・特徴

blingbling HTMLには次のような機能・特徴があります。シリーズを通しての特徴はblingbling DSLを参照下さい。

  • スクリプトへのテンプレートの埋め込み
  • 出力としてDOMを返す
  • 埋め込み式や変数を使ったマークアップ
  • 自分で開発した要素や属性を使ったレンダリング
  • レンダリング結果の補正(アフターフィルター)
  • HTMLとの文法上の違いが少なく、ノウハウをそのまま活用できる

文法

blingbling HTMLは、HTMLさながらに開始タグ、内容、終了タグを使って記述します。HTMLとの文法上の違いは、タグの記述に山括弧ではなく丸括弧を、属性の記述に角括弧を用いることぐらいで、HTML同様に見やすくインデントすることもできます。ただし、エクステンション(プラグイン拡張)により文法そのものが拡張されている場合はこの限りではありません。以下に、いくつかのサンプルコードを示します。

基本的な書き方

ドキュメントの始まりのHTMLタグでそれがblingbling HTMLで記述されていることを示し、その中に内容を追加していきます。タグの終了は基本的に空タグで表現します。HTMLはインタプリタが提供するグローバル変数 です。

  1. (html)
  2. ("div[id=hoge][class=fuga]")()
  3. ();

このコードは以下のJavaScriptコードと等価です。

  1. (function(){
  2. var H = document.createElement("html");
  3. var D = document.createElement("div");
  4. D.setAttribute("id", "hoge");
  5. D.setAttribute("class", "fuga");
  6. H.appendChild(D);
  7. return H.childNodes;
  8. })();

文章を含める

タグの頭に"="をつければ、そのタグをテキストとして解釈します。

  1. (html)
  2. ("h1")
  3. ("=hello, world")
  4. ()
  5. ();

文章の改行

"BR"タグを使うと文章がそこで改行されます。BRをはじめ、LINK、IMGなどの子を持たない要素は終了タグが不要です。

  1. (html)
  2. ("=hello, world")("br")
  3. ("=blingbling HTMLによる出力")
  4. ();

スクリプトの埋め込み

"("と")"で囲まれた部分はJavaScriptとして認識されます。グローバルはもちろんスコープ内のすべての変数にアクセスできるので、名前空間を汚染する心配もありません。

  1. var host = location.host;
  2. (function(){
  3. var text = "にようこそ";
  4. (html)
  5. ("h1")
  6. ("="+host+text)
  7. ()
  8. ();
  9. })()

画面出力

blingbling HTMLの出力はDOMNodeListです。ブラウザへ画面結果を出力するためには、DOM APIやjQueryなどのフレームワークを利用し、以下のように記述します。※DOM Documentのロードが完了している事が前提です

DOMを使った例 :

  1. document
  2. .getElementsByTagName("body")
  3. .item(0)
  4. .appendChild((
  5. (html)
  6. ("h1")
  7. ("=hello, world")
  8. ()
  9. ()
  10. )[0]);

jQueryを使った例 :

  1. $("body").html(
  2. (html)
  3. ("h1")
  4. ("=hello, world")
  5. ()
  6. ()
  7. );

拡張

blingbling HTMLのインタプリタは、そのほとんどの機能(例えばここまでで紹介した文法の全てもそう)が標準ライブラリ添付のエクステンションとして実装されているので、ディベロッパはこれを追加したり差し替えたりするだけで、自分で開発した要素や独自構文が使用できるようになります。この項では2つのエクステンションを例に、拡張の使い方や実装例を示します。

例 1 : Comment Extension

blingbling HTMLにはいくつかの公認エクステンションがあります。そのひとつ「Comment」は次のような拡張構文を提供します。

  1. (html)
  2. ("h1")
  3. ("!hello, world") //コメントノードとして解釈される
  4. ()
  5. ();

Commentは、コードの頭が"!"で始まっている場合にそのコードをコメントノードとして解釈するエクステンションです。これは次のように実装されています。

  1. (html)
  2. (function(mix){
  3. return (typeof mix == "string"
  4. && mix.charAt(0) == "!")?
  5. this.appendChild(
  6. document.createComment(mix.slice(1))
  7. ): void(0);
  8. })
  9. ();

Commentはインタプリタにビルドするタイプのエクステンションです。ビルドは、jsLexなどのツールを使って次のような手順で行います。

  1. blingbling HTMLのリポジトリからインタプリタの開発コードをチェックアウト
  2. blingbling HTMLのリポジトリから追加したいエクステンションをチェックアウト
  3. 開発コードの中から必要なファイルを選別し、commentとともにビルド

エクステンションは相互に依存しているものもあれば、競合しているものもあるので、正しい順番でそれらをビルドしなければなりません。blingbling HTMLには、限定的ではあるものの、こうしたビルド作業を軽減するための拡張構文も用意されています。

例 2 : DTD Extension

以下のコードは標準ライブラリ添付の「DTD」エクステンションが提供する拡張構文を用いたFUGAレンダラーの実装例です。

  1. (html)
  2. ("!ELEMENT FUGA", function(){ //FUGA要素のレンダリングを担う
  3. return this.appendChild(
  4. document.createElement("h1")
  5. );
  6. })
  7. ();

DTDは、新しい要素や属性を登録するためのエクステンションです。新しく登録された要素(この場合はFUGA)は一般的な要素と同じように扱うことができます。

  1. (html)
  2. ("fuga") //h1としてレンダリングされる
  3. ("=hello, world")
  4. ()
  5. ();

DTDで実装されたエクステンション(レンダラー)は、インタプリタの後に<SCRIPT>から読込むだけで使用できます。

  1. <script type="text/javascript" src="/src/blingbling-html.0.9.min.js"></script>
  2. <script type="text/javascript" src="/src/fuga.js"></script>