express-compose
Version:
Engine agnostic helpers for express view rendering.
76 lines (68 loc) • 14.9 kB
HTML
<html> <head> <title>compose.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> compose.js </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">¶</a> </div> </td> <td class="code"> <div class="highlight"><pre><span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">define</span> <span class="o">!==</span> <span class="s1">'function'</span><span class="p">)</span> <span class="p">{</span> <span class="kd">var</span> <span class="nx">define</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'amdefine'</span><span class="p">)(</span><span class="nx">module</span><span class="p">);</span> <span class="p">}</span>
<span class="nx">define</span><span class="p">([</span><span class="s1">'underscore'</span><span class="p">],</span> <span class="kd">function</span><span class="p">(</span><span class="nx">_</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">exports</span> <span class="o">=</span> <span class="p">{};</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <p>Wraps a response in a object providing repeat and decorate methods.
Wrapping allows to cleanly separate options of the module from the
rendering options.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">wrap</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">res</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">{</span>
<span class="nx">repeat</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">template</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">fn</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">repeat</span><span class="p">(</span><span class="nx">res</span><span class="p">,</span> <span class="nx">template</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">fn</span><span class="p">);</span>
<span class="p">},</span>
<span class="nx">decorate</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">templates</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">fn</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">defaults</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({</span>
<span class="nx">compose</span><span class="o">:</span> <span class="s1">'content'</span><span class="p">,</span>
<span class="nx">callback</span><span class="o">:</span> <span class="kc">false</span>
<span class="p">},</span> <span class="nx">options</span><span class="p">);</span>
<span class="nx">opts</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">extend</span><span class="p">({},</span> <span class="nx">defaults</span><span class="p">,</span> <span class="nx">opts</span><span class="p">);</span>
<span class="nx">decorate</span><span class="p">(</span><span class="nx">res</span><span class="p">,</span> <span class="nx">templates</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">fn</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">};</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p>Renders a view multiple times, as long as options are available, and concatenates
the results.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">repeat</span><span class="p">(</span><span class="nx">res</span><span class="p">,</span> <span class="nx">template</span><span class="p">,</span> <span class="nx">options</span><span class="p">,</span> <span class="nx">fn</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">next</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">req</span><span class="p">.</span><span class="nx">next</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">req</span><span class="p">),</span>
<span class="nx">render</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">,</span> <span class="nx">res</span><span class="p">),</span>
<span class="nx">buff</span> <span class="o">=</span> <span class="p">[];</span>
<span class="kd">var</span> <span class="nx">nextCallback</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">opts</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">length</span> <span class="o">?</span> <span class="nx">options</span><span class="p">.</span><span class="nx">shift</span><span class="p">()</span> <span class="o">:</span> <span class="kc">false</span><span class="p">;</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">rendered</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">next</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
<span class="nx">buff</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">rendered</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">opts</span><span class="p">)</span>
<span class="nx">render</span><span class="p">(</span><span class="nx">template</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">nextCallback</span><span class="p">());</span>
<span class="k">else</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">content</span> <span class="o">=</span> <span class="nx">buff</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s1">''</span><span class="p">);</span>
<span class="nx">fn</span> <span class="o">?</span> <span class="nx">fn</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="nx">content</span><span class="p">)</span> <span class="o">:</span> <span class="nx">res</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="p">};</span>
<span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="nx">options</span> <span class="o">=</span> <span class="p">[</span><span class="nx">options</span><span class="p">]);</span>
<span class="kd">var</span> <span class="nx">opts</span> <span class="o">=</span> <span class="nx">options</span><span class="p">.</span><span class="nx">shift</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">callback</span> <span class="o">=</span> <span class="nx">nextCallback</span><span class="p">();</span>
<span class="nx">render</span><span class="p">(</span><span class="nx">template</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span>
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <p>Decorate a view recursively. It passes the rendered stuff to the next template
along with the original options until no templates are available.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">decorate</span><span class="p">(</span><span class="nx">res</span><span class="p">,</span> <span class="nx">templates</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">fn</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">next</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">req</span><span class="p">.</span><span class="nx">next</span><span class="p">,</span> <span class="nx">res</span><span class="p">.</span><span class="nx">req</span><span class="p">),</span>
<span class="nx">render</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">bind</span><span class="p">(</span><span class="nx">res</span><span class="p">.</span><span class="nx">render</span><span class="p">,</span> <span class="nx">res</span><span class="p">),</span>
<span class="nx">compose</span> <span class="o">=</span> <span class="nx">opts</span><span class="p">.</span><span class="nx">compose</span> <span class="o">||</span> <span class="s1">'content'</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">nextCallback</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">templates</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span>
<span class="k">return</span> <span class="nx">fn</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">template</span> <span class="o">=</span> <span class="nx">templates</span><span class="p">.</span><span class="nx">shift</span><span class="p">();</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">rendered</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">next</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">updatedOpts</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">clone</span><span class="p">(</span><span class="nx">opts</span><span class="p">);</span>
<span class="nx">updatedOpts</span><span class="p">[</span><span class="nx">compose</span><span class="p">]</span> <span class="o">=</span> <span class="nx">rendered</span><span class="p">;</span>
<span class="nx">render</span><span class="p">(</span><span class="nx">template</span><span class="p">,</span> <span class="nx">updatedOpts</span><span class="p">,</span> <span class="nx">nextCallback</span><span class="p">());</span>
<span class="p">};</span>
<span class="p">};</span>
<span class="nx">_</span><span class="p">.</span><span class="nx">isArray</span><span class="p">(</span><span class="nx">templates</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="nx">templates</span> <span class="o">=</span> <span class="p">[</span><span class="nx">templates</span><span class="p">]);</span>
<span class="kd">var</span> <span class="nx">template</span> <span class="o">=</span> <span class="nx">templates</span><span class="p">.</span><span class="nx">shift</span><span class="p">();</span>
<span class="kd">var</span> <span class="nx">callback</span> <span class="o">=</span> <span class="nx">nextCallback</span><span class="p">();</span>
<span class="nx">render</span><span class="p">(</span><span class="nx">template</span><span class="p">,</span> <span class="nx">opts</span><span class="p">,</span> <span class="nx">callback</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="p">{</span>
<span class="nx">repeat</span><span class="o">:</span> <span class="nx">repeat</span><span class="p">,</span>
<span class="nx">decorate</span><span class="o">:</span> <span class="nx">decorate</span><span class="p">,</span>
<span class="nx">wrap</span><span class="o">:</span> <span class="nx">wrap</span>
<span class="p">};</span>
<span class="p">});</span>
</pre></div> </td> </tr> </tbody> </table> </div> </body> </html>