<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
     >
  <channel>
    <title>mojavy.com</title>
    <link>http://mojavy.com/blog</link>
    <description></description>
    <pubDate>Tue, 01 Oct 2013 00:08:09 GMT</pubDate>
    <generator>Blogofile</generator>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>mustache基礎文法最速マスター</title>
      <link>http://mojavy.com/blog/2013/10/01/mustache-quick-master/</link>
      <pubDate>Tue, 01 Oct 2013 00:08:09 JST</pubDate>
      <category><![CDATA[ruby]]></category>
      <category><![CDATA[mustache]]></category>
      <guid isPermaLink="true">http://mojavy.com/blog/2013/10/01/mustache-quick-master/</guid>
      <description>mustache基礎文法最速マスター</description>
      <content:encoded><![CDATA[<p><img alt="mustache" src="/images/mustache-logo-250.png" /> </p>
<p>mustacheはシンプルなテンプレートエンジンなので本家の英語マニュアル <a href="http://mustache.github.io/mustache.5.html">mustache(5)</a> を見ても大したことはないですが、日本語情報の需要もそれなりにあると思うのでまとめておきます。</p>
<p>以下の内容はrubygemの<code>mustache-0.99.4</code>で確認しています。
他の言語の場合は適宜置きかえてください。</p>
<h2 id="_1">目次</h2>
<div class="toc">
<ul>
<li><a href="#_1">目次</a></li>
<li><a href="#_2">変数の展開</a></li>
<li><a href="#_3">変数のエスケープ</a></li>
<li><a href="#_4">条件分岐</a></li>
<li><a href="#_5">ループ</a></li>
<li><a href="#lambda">無名関数 (Lambda)</a></li>
<li><a href="#_6">コメント</a></li>
<li><a href="#_7">まとめ</a></li>
</ul>
</div>
<h2 id="_2">変数の展開</h2>
<p><code>{{name}}</code>のように2つのブレースで囲ったタグは、<code>name</code>という名前のキーの値でおきかえられます。</p>
<p>対応するキーが見つからなかった場合はデフォルトでは空文字になります。</p>
<div class="pygments_borland"><pre><span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;Hello, {{world}}!&quot;</span><span class="p">,</span> <span class="n">world</span><span class="p">:</span> <span class="s2">&quot;mustache&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;Hello, mustache!&quot;</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;{{no_such_key}}&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;&quot;</span>
</pre></div>

<h2 id="_3">変数のエスケープ</h2>
<p>デフォルトではHTMLエスケープが有効になります。アンエスケープされたHTMLが使いたい場合は<code>{{{name}}}</code>のように3つのブレースで囲います。</p>
<div class="pygments_borland"><pre><span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;{{html}}&quot;</span><span class="p">,</span>  <span class="n">html</span><span class="p">:</span> <span class="s2">&quot;&lt;b&gt;GitHub&lt;/b&gt;&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;&amp;lt;b&amp;gt;GitHub&amp;lt;/b&amp;gt;&quot;</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;{{{html}}}&quot;</span><span class="p">,</span> <span class="n">html</span><span class="p">:</span> <span class="s2">&quot;&lt;b&gt;GitHub&lt;/b&gt;&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;&lt;b&gt;GitHub&lt;/b&gt;&quot;</span>
</pre></div>

<h2 id="_4">条件分岐</h2>
<p><code>{{#name}} ... {{/name}}</code>のように、2つのタグに<code>#</code>と<code>/</code>をそれぞれつけたタグで囲われたブロックはセクションといいます。</p>
<p>セクションのキーに対応する値にbool値を渡せばif文のような使い方ができます。
<code>#</code>のかわりに<code>^</code>をつかうと真偽を反転できます。</p>
<div class="pygments_borland"><pre><span class="n">template</span> <span class="o">=</span> <span class="o">&lt;&lt;</span><span class="no">DOC</span>
<span class="sh">{{#condition}}</span>
<span class="sh">It is true.</span>
<span class="sh">{{/condition}}</span>
<span class="sh">{{^condition}}</span>
<span class="sh">No not true.</span>
<span class="sh">{{/condition}}</span>
<span class="no">DOC</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">condition</span><span class="p">:</span> <span class="kp">true</span><span class="p">)</span> <span class="c1"># =&gt; &quot;It is true.\n&quot;</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">condition</span><span class="p">:</span> <span class="kp">false</span><span class="p">)</span> <span class="c1"># =&gt; &quot;No not true.\n&quot;</span>
</pre></div>

<h2 id="_5">ループ</h2>
<p>セクションのキーに対応する値に配列を渡した場合は、それぞれの要素を引数として中のブロックが繰り返し評価されます。</p>
<div class="pygments_borland"><pre><span class="n">template</span> <span class="o">=</span> <span class="o">&lt;&lt;</span><span class="no">DOC</span>
<span class="sh">{{#animals}}</span>
<span class="sh">{{name}}</span>
<span class="sh">{{/animals}}</span>
<span class="no">DOC</span>
<span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="n">animals</span><span class="p">:</span> <span class="o">[</span><span class="p">{</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;cat&quot;</span><span class="p">},</span> <span class="p">{</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;dog&quot;</span><span class="p">},</span> <span class="p">{</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;pig&quot;</span><span class="p">}</span><span class="o">]</span><span class="p">}</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span> <span class="c1"># =&gt; &quot;cat\ndog\npig\n&quot;</span>
</pre></div>

<h2 id="lambda">無名関数 (Lambda)</h2>
<p>セクションのキーに対応する値に呼び出し可能なオブジェクトを渡した場合は、そのブロック内のテキストを引数として実行され、その返り値が結果として出力されます。</p>
<div class="pygments_borland"><pre><span class="n">template</span> <span class="o">=</span> <span class="o">&lt;&lt;</span><span class="no">DOC</span>
<span class="sh">{{#proc}}</span>
<span class="sh">mojavy is bad</span>
<span class="sh">{{/proc}}</span>
<span class="no">DOC</span>
<span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">template</span><span class="p">,</span> <span class="nb">proc</span><span class="p">:</span> <span class="o">-&gt;</span><span class="n">text</span><span class="p">{</span><span class="n">text</span><span class="o">.</span><span class="n">gsub</span><span class="p">(</span><span class="sr">/bad/</span><span class="p">,</span> <span class="s1">&#39;nice&#39;</span><span class="p">)})</span> <span class="c1"># =&gt; &quot;mojavy is nice\n&quot;</span>
</pre></div>

<h2 id="_6">コメント</h2>
<p><code>!</code>をつけるとコメントになります</p>
<div class="pygments_borland"><pre><span class="no">Mustache</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="s2">&quot;Comment here: {{! ignore me }}&quot;</span><span class="p">)</span> <span class="c1"># =&gt; &quot;Comment here: &quot;</span>
</pre></div>

<h2 id="_7">まとめ</h2>
<p>mustacheの基本的な機能について簡単なサンプルコードとともに解説しました。
ここではrubyのmustacheを使用しましたが、他の言語でも同様の機能が使えます。
一部の機能については省略しているので、より詳細な情報については本家ドキュメントを参照してください。</p>]]></content:encoded>
    </item>
  </channel>
</rss>
