UNPKG

54.6 kBHTMLView Raw
1<html>
2 <head>
3 <title>Jade</title>
4 <style>body {
5 margin: 0;
6 padding: 0;
7 font: 14px/1.5 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
8 color: #252519;
9}
10a {
11 color: #252519;
12}
13a:hover {
14 text-decoration: underline;
15 color: #19469D;
16}
17p {
18 margin: 12px 0;
19}
20h1, h2, h3 {
21 margin: 0;
22 padding: 0;
23}
24ul#menu {
25 opacity: 0;
26 position: fixed;
27 top: 0;
28 right: 0;
29 list-style: none;
30 margin: 0;
31 padding: 10px 2px;
32 text-align: right;
33 background: rgba(255,255,255,0.7);
34 -webkit-box-shadow: -1px 2px 2px rgba(0,0,0,0.3);
35 -moz-box-shadow: -1px 2px 2px rgba(0,0,0,0.3);
36 -webkit-border-bottom-left-radius: 5px;
37 -moz-border-bottom-left-radius: 5px;
38 -webkit-transition-properties: opacity;
39 -webkit-transition-duration: 0.6s;
40}
41ul#menu:hover {
42 opacity: 1;
43}
44ul#menu li {
45 padding: 2px 10px;
46 border-bottom: 1px solid #eee;
47}
48ul#menu li:hover {
49 background: rgba(0,0,0,0.03);
50}
51ul#menu li:last-child {
52 border-bottom: none;
53}
54ul#menu li a {
55 text-decoration: none;
56 font-size: 12px;
57 color: rgba(0,0,0,0.5);
58}
59ul#menu li a strong {
60 font-weight: normal;
61 color: #252519;
62}
63table#source {
64 width: 100%;
65 border-collapse: collapse;
66}
67table#source td:first-child {
68 padding: 30px 40px 30px 40px;
69 vertical-align: top;
70}
71table#source td:first-child,
72table#source td:first-child pre {
73 width: 450px;
74}
75table#source td:last-child {
76 padding: 30px 0 30px 40px;
77 border-left: 1px solid #E5E5EE;
78 background: #F5F5FF;
79}
80table#source tr {
81 border-bottom: 1px solid #E5E5EE;
82}
83table#source tr.filename {
84 padding-top: 40px;
85 border-top: 1px solid #E5E5EE;
86}
87table#source tr.filename td:first-child {
88 text-transform: capitalize;
89}
90table#source tr.filename td:last-child {
91 font-size: 12px;
92}
93table#source tr.filename h2 {
94 margin: 0;
95 padding: 0;
96}
97table#source tr.code h1,
98table#source tr.code h2,
99table#source tr.code h3 {
100 margin-top: 30px;
101 font-family: "Lucida Grande", "Helvetica Nueue", Arial, sans-serif;
102 font-size: 18px;
103}
104table#source tr.code h2 {
105 font-size: 16px;
106}
107table#source tr.code h3 {
108 font-size: 14px;
109}
110table#source tr.code ul {
111 margin: 15px 0 15px 35px;
112 padding: 0;
113}
114table#source tr.code ul li {
115 margin: 0;
116 padding: 1px 0;
117}
118table#source tr.code ul li p {
119 margin: 0;
120 padding: 0;
121}
122table#source tr.code td:first-child pre {
123 padding: 20px;
124}
125#ribbon {
126 position: absolute;
127 top: 0;
128 right: 0;
129}
130code .string { color: #219161; }
131code .regexp { color: #219161; }
132code .keyword { color: #954121; }
133code .number { color: #19469D; }
134code .comment { color: #bbb; }
135code .this { color: #19469D; }</style>
136 </head>
137 <body>
138<ul id="menu"><li><a href="#lib/jade.js">lib/<strong>jade</strong></a></li></ul><table id="source"><tbody><tr><td><h1>Jade</h1><p>Jade is a high performance template engine for <a href="http://nodejs.org">node</a>, inspired by <a href="http://haml-lang.com/">haml</a>, created by <a href="http://github.com/visionmedia">TJ Holowaychuk</a>.</p></td><td></td></tr><tr class="filename"><td><h2 id="lib/jade.js">jade</h2></td><td>lib/jade.js</td></tr><tr class="code">
139<td class="docs">
140<p>Library version.</p>
141</td>
142<td class="code">
143<pre><code><span class="variable">exports</span>.<span class="variable">version</span> = <span class="string">'0.0.1'</span>;</code></pre>
144</td>
145</tr>
146<tr class="code">
147<td class="docs">
148<p>Module dependencies.</p>
149</td>
150<td class="code">
151<pre><code><span class="keyword">var</span> <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>),
152 <span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>);</code></pre>
153</td>
154</tr>
155<tr class="code">
156<td class="docs">
157<p>Intermediate JavaScript cache.</p>
158
159<ul>
160<li><strong>type</strong>: <em>Object</em></li>
161</ul>
162
163</td>
164<td class="code">
165<pre><code><span class="keyword">var</span> <span class="variable">cache</span> = <span class="variable">exports</span>.<span class="variable">cache</span> = {};</code></pre>
166</td>
167</tr>
168<tr class="code">
169<td class="docs">
170<p>Self closing tags.</p>
171
172<ul>
173<li><strong>type</strong>: <em>Object</em></li>
174</ul>
175
176</td>
177<td class="code">
178<pre><code><span class="keyword">var</span> <span class="variable">selfClosing</span> = <span class="variable">exports</span>.<span class="variable">selfClosing</span> = [
179 <span class="string">'meta'</span>,
180 <span class="string">'img'</span>,
181 <span class="string">'link'</span>,
182 <span class="string">'br'</span>,
183 <span class="string">'hr'</span>,
184 <span class="string">'input'</span>,
185 <span class="string">'area'</span>,
186 <span class="string">'base'</span>
187];</code></pre>
188</td>
189</tr>
190<tr class="code">
191<td class="docs">
192<p>Default supported doctypes.</p>
193
194<ul>
195<li><strong>type</strong>: <em>Object</em></li>
196</ul>
197
198</td>
199<td class="code">
200<pre><code><span class="keyword">var</span> <span class="variable">doctypes</span> = <span class="variable">exports</span>.<span class="variable">doctypes</span> = {
201 <span class="string">'5'</span>: <span class="string">'&lt;!DOCTYPE html&gt;'</span>,
202 <span class="string">'xml'</span>: <span class="string">'&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;'</span>,
203 <span class="string">'default'</span>: <span class="string">'&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;'</span>,
204 <span class="string">'transitional'</span>: <span class="string">'&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;'</span>,
205 <span class="string">'strict'</span>: <span class="string">'&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;'</span>,
206 <span class="string">'frameset'</span>: <span class="string">'&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Frameset//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd&quot;&gt;'</span>,
207 <span class="string">'1.1'</span>: <span class="string">'&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.1//EN&quot; &quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&quot;&gt;'</span>,
208 <span class="string">'basic'</span>: <span class="string">'&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML Basic 1.1//EN&quot; &quot;http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd&quot;&gt;'</span>,
209 <span class="string">'mobile'</span>: <span class="string">'&lt;!DOCTYPE html PUBLIC &quot;-//WAPFORUM//DTD XHTML Mobile 1.2//EN&quot; &quot;http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd&quot;&gt;'</span>
210};</code></pre>
211</td>
212</tr>
213<tr class="code">
214<td class="docs">
215<p>Filters.</p>
216
217<ul>
218<li><strong>type</strong>: <em>Object</em></li>
219</ul>
220
221</td>
222<td class="code">
223<pre><code><span class="keyword">var</span> <span class="variable">filters</span> = <span class="variable">exports</span>.<span class="variable">filters</span> = {</code></pre>
224</td>
225</tr>
226<tr class="code">
227<td class="docs">
228<p>Wrap text with CDATA block.</p>
229</td>
230<td class="code">
231<pre><code><span class="variable">cdata</span>: <span class="keyword">function</span>(<span class="variable">str</span>){
232 <span class="keyword">return</span> <span class="string">'&lt;![CDATA[\\n'</span> + <span class="variable">str</span> + <span class="string">'\\n]]&gt;'</span>;
233 },</code></pre>
234</td>
235</tr>
236<tr class="code">
237<td class="docs">
238<p>Wrap text with script and CDATA tags.</p>
239</td>
240<td class="code">
241<pre><code><span class="variable">javascript</span>: <span class="keyword">function</span>(<span class="variable">str</span>){
242 <span class="keyword">return</span> <span class="string">'&lt;script type=&quot;text/javascript&quot;&gt;\\n//&lt;![CDATA[\\n'</span> + <span class="variable">str</span> + <span class="string">'\\n//]]&gt;&lt;/script&gt;'</span>;
243 },</code></pre>
244</td>
245</tr>
246<tr class="code">
247<td class="docs">
248<p>Transform sass to css, wrapped in style tags.</p>t and CDAT
249</td>
250<td class="code">
251<pre><code><span class="variable">sass</span>: <span class="keyword">function</span>(<span class="variable">str</span>){
252 <span class="variable">str</span> = <span class="variable">str</span>.<span class="variable">replace</span>(<span class="regexp">/\\n/g</span>, <span class="string">'\n'</span>);
253 <span class="keyword">var</span> <span class="variable">sass</span> = <span class="variable">require</span>(<span class="string">'sass'</span>).<span class="variable">render</span>(<span class="variable">str</span>).<span class="variable">replace</span>(<span class="regexp">/\n/g</span>, <span class="string">'\\n'</span>);
254 <span class="keyword">return</span> <span class="string">'&lt;style&gt;'</span> + <span class="variable">sass</span> + <span class="string">'&lt;/style&gt;'</span>;
255 },</code></pre>
256</td>
257</tr>
258<tr class="code">
259<td class="docs">
260<p>Transform markdown to html.</p>in style tags.
261</td>
262<td class="code">
263<pre><code><span class="variable">markdown</span>: <span class="keyword">function</span>(<span class="variable">str</span>){
264 <span class="variable">str</span> = <span class="variable">str</span>.<span class="variable">replace</span>(<span class="regexp">/\\n/g</span>, <span class="string">'\n'</span>);
265 <span class="keyword">return</span> <span class="variable">require</span>(<span class="string">'markdown'</span>).<span class="variable">parse</span>(<span class="variable">str</span>).<span class="variable">replace</span>(<span class="regexp">/\n/g</span>, <span class="string">'\\n'</span>);
266 }
267};</code></pre>
268</td>
269</tr>
270<tr class="code">
271<td class="docs">
272<p>Initialize jade parser with the given input string.</p>
273
274<h2></h2>
275
276<ul>
277<li><p><strong>param</strong>: <em>String</em> str</p></li>
278<li><p><strong>param</strong>: <em>String</em> filename</p></li>
279<li><p><strong>api</strong>: <em>public</em></p></li>
280</ul>
281
282</td>
283<td class="code">
284<pre><code><span class="keyword">function</span> <span class="class">Parser</span>(<span class="variable">str</span>, <span class="variable">filename</span>){
285 <span class="this">this</span>.<span class="variable">input</span> = <span class="variable">str</span>.<span class="variable">replace</span>(<span class="regexp">/\r\n|\r/g</span>, <span class="string">'\n'</span>);
286 <span class="this">this</span>.<span class="variable">filename</span> = <span class="variable">filename</span>;
287 <span class="this">this</span>.<span class="variable">deferredTokens</span> = [];
288 <span class="this">this</span>.<span class="variable">lastIndents</span> = <span class="number integer">0</span>;
289 <span class="this">this</span>.<span class="variable">lineno</span> = <span class="number integer">1</span>;
290}</code></pre>
291</td>
292</tr>
293<tr class="code">
294<td class="docs">
295<p>Parser prototype.</p>
296</td>
297<td class="code">
298<pre><code><span class="class">Parser</span>.<span class="variable">prototype</span> = {</code></pre>
299</td>
300</tr>
301<tr class="code">
302<td class="docs">
303<p>Generate token object.</p>
304</td>
305<td class="code">
306<pre><code><span class="keyword">function</span> <span class="variable">token</span>(<span class="variable">type</span>){
307 <span class="variable">self</span>.<span class="variable">input</span> = <span class="variable">self</span>.<span class="variable">input</span>.<span class="variable">substr</span>(<span class="variable">captures</span>[<span class="number integer">0</span>].<span class="variable">length</span>);
308 <span class="keyword">return</span> {
309 <span class="variable">type</span>: <span class="variable">type</span>,
310 <span class="variable">line</span>: <span class="variable">self</span>.<span class="variable">lineno</span>,
311 <span class="variable">val</span>: <span class="variable">captures</span>[<span class="number integer">1</span>]
312 };
313 }
314
315 <span class="comment">// EOS</span>
316 <span class="keyword">if</span> (!<span class="this">this</span>.<span class="variable">input</span>.<span class="variable">length</span>) {
317 <span class="keyword">if</span> (<span class="this">this</span>.<span class="variable">lastIndents</span>-- &<span class="variable">gt</span>; <span class="number integer">0</span>) {
318 <span class="keyword">return</span> { <span class="variable">type</span>: <span class="string">'outdent'</span>, <span class="variable">line</span>: <span class="this">this</span>.<span class="variable">lineno</span> };
319 } <span class="keyword">else</span> {
320 <span class="keyword">return</span> { <span class="variable">type</span>: <span class="string">'eos'</span>, <span class="variable">line</span>: <span class="this">this</span>.<span class="variable">lineno</span> };
321 }
322 }
323
324 <span class="comment">// Tag</span>
325 <span class="keyword">if</span> (<span class="variable">captures</span> = <span class="regexp">/^(\w[:\w]*)/</span>.<span class="variable">exec</span>(<span class="this">this</span>.<span class="variable">input</span>)) {
326 <span class="keyword">return</span> <span class="variable">token</span>(<span class="string">'tag'</span>);
327 }
328
329 <span class="comment">// Filter</span>
330 <span class="keyword">if</span> (<span class="variable">captures</span> = <span class="regexp">/^:(\w+)/</span>.<span class="variable">exec</span>(<span class="this">this</span>.<span class="variable">input</span>)) {
331 <span class="keyword">return</span> <span class="variable">token</span>(<span class="string">'filter'</span>);
332 }
333
334 <span class="comment">// Code</span>
335 <span class="keyword">if</span> (<span class="variable">captures</span> = <span class="regexp">/^(!?=|-)([^\n]+)/</span>.<span class="variable">exec</span>(<span class="this">this</span>.<span class="variable">input</span>)) {
336 <span class="keyword">var</span> <span class="variable">flags</span> = <span class="variable">captures</span>[<span class="number integer">1</span>];
337 <span class="variable">captures</span>[<span class="number integer">1</span>] = <span class="variable">captures</span>[<span class="number integer">2</span>];
338 <span class="keyword">var</span> <span class="variable">tok</span> = <span class="variable">token</span>(<span class="string">'code'</span>);
339 <span class="variable">tok</span>.<span class="variable">escape</span> = <span class="variable">flags</span>[<span class="number integer">0</span>] === <span class="string">'='</span>;
340 <span class="variable">tok</span>.<span class="variable">buffer</span> = <span class="variable">flags</span>[<span class="number integer">0</span>] === <span class="string">'='</span> || <span class="variable">flags</span>[<span class="number integer">1</span>] === <span class="string">'='</span>;
341 <span class="keyword">return</span> <span class="variable">tok</span>;
342 }
343
344 <span class="comment">// Doctype</span>
345 <span class="keyword">if</span> (<span class="variable">captures</span> = <span class="regexp">/^!!! *(\w+)?/</span>.<span class="variable">exec</span>(<span class="this">this</span>.<span class="variable">input</span>)) {
346 <span class="keyword">return</span> <span class="variable">token</span>(<span class="string">'doctype'</span>);
347 }
348
349 <span class="comment">// Id</span>
350 <span class="keyword">if</span> (<span class="variable">captures</span> = <span class="regexp">/^#([\w-]+)/</span>.<span class="variable">exec</span>(<span class="this">this</span>.<span class="variable">input</span>)) {
351 <span class="keyword">return</span> <span class="variable">token</span>(<span class="string">'id'</span>);
352 }
353
354 <span class="comment">// Class</span>
355 <span class="keyword">if</span> (<span class="variable">captures</span> = <span class="regexp">/^\.([\w-]+)/</span>.<span class="variable">exec</span>(<span class="this">this</span>.<span class="variable">input</span>)) {
356 <span class="keyword">return</span> <span class="variable">token</span>(<span class="string">'class'</span>);
357 }
358
359 <span class="comment">// Attributes</span>
360 <span class="keyword">if</span> (<span class="variable">captures</span> = <span class="regexp">/^\(([^\)]+)\)/</span>.<span class="variable">exec</span>(<span class="this">this</span>.<span class="variable">input</span>)) {
361 <span class="keyword">var</span> <span class="variable">tok</span> = <span class="variable">token</span>(<span class="string">'attrs'</span>),
362 <span class="variable">attrs</span> = <span class="variable">tok</span>.<span class="variable">val</span>.<span class="variable">split</span>(<span class="regexp">/ *, */</span>);
363 <span class="variable">tok</span>.<span class="variable">attrs</span> = {};
364 <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">attrs</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
365 <span class="keyword">var</span> <span class="variable">pair</span> = <span class="variable">attrs</span>[<span class="variable">i</span>].<span class="variable">split</span>(<span class="regexp">/ *[:=] */</span>);
366 <span class="variable">tok</span>.<span class="variable">attrs</span>[<span class="variable">pair</span>[<span class="number integer">0</span>]] = <span class="variable">pair</span>[<span class="number integer">1</span>];
367 }
368 <span class="keyword">return</span> <span class="variable">tok</span>;
369 }
370
371 <span class="comment">// Indent</span>
372 <span class="keyword">if</span> (<span class="variable">captures</span> = <span class="regexp">/^\n( *)/</span>.<span class="variable">exec</span>(<span class="this">this</span>.<span class="variable">input</span>)) {
373 ++<span class="this">this</span>.<span class="variable">lineno</span>;
374 <span class="keyword">var</span> <span class="variable">tok</span> = <span class="variable">token</span>(<span class="string">'indent'</span>),
375 <span class="variable">indents</span> = <span class="variable">tok</span>.<span class="variable">val</span>.<span class="variable">length</span> / <span class="number integer">2</span>;
376 <span class="keyword">if</span> (<span class="variable">indents</span> % <span class="number integer">1</span> !== <span class="number integer">0</span>) {
377 <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'Invalid indentation, got '</span>
378 + <span class="variable">tok</span>.<span class="variable">val</span>.<span class="variable">length</span> + <span class="string">' space'</span>
379 + (<span class="variable">tok</span>.<span class="variable">val</span>.<span class="variable">length</span> &<span class="variable">gt</span>; <span class="number integer">1</span> ? <span class="string">'s'</span> : <span class="string">''</span>)
380 + <span class="string">', must be a multiple of two.'</span>);
381 } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="variable">indents</span> === <span class="this">this</span>.<span class="variable">lastIndents</span>) {
382 <span class="variable">tok</span>.<span class="variable">type</span> = <span class="string">'newline'</span>;
383 } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="variable">indents</span> &<span class="variable">gt</span>; <span class="this">this</span>.<span class="variable">lastIndents</span> + <span class="number integer">1</span>) {
384 <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'Invalid indentation, got '</span>
385 + <span class="variable">indents</span> + <span class="string">' expected '</span>
386 + (<span class="this">this</span>.<span class="variable">lastIndents</span> + <span class="number integer">1</span>) + <span class="string">'.'</span>);
387 } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="variable">indents</span> &<span class="variable">lt</span>; <span class="this">this</span>.<span class="variable">lastIndents</span>) {
388 <span class="keyword">var</span> <span class="variable">n</span> = <span class="this">this</span>.<span class="variable">lastIndents</span> - <span class="variable">indents</span>;
389 <span class="variable">tok</span>.<span class="variable">type</span> = <span class="string">'outdent'</span>;
390 <span class="keyword">while</span> (--<span class="variable">n</span>) {
391 <span class="this">this</span>.<span class="variable">deferredTokens</span>.<span class="variable">push</span>({
392 <span class="variable">type</span>: <span class="string">'outdent'</span>,
393 <span class="variable">line</span>: <span class="this">this</span>.<span class="variable">lineno</span>
394 });
395 }
396 }
397 <span class="this">this</span>.<span class="variable">lastIndents</span> = <span class="variable">indents</span>;
398 <span class="keyword">return</span> <span class="variable">tok</span>;
399 }
400
401 <span class="comment">// Text</span>
402 <span class="keyword">if</span> (<span class="variable">captures</span> = <span class="regexp">/^(?:\| ?)?([^\n]+)/</span>.<span class="variable">exec</span>(<span class="this">this</span>.<span class="variable">input</span>)) {
403 <span class="keyword">return</span> <span class="variable">token</span>(<span class="string">'text'</span>);
404 }
405 },</code></pre>
406</td>
407</tr>
408<tr class="code">
409<td class="docs">
410<p>Parse input returning a string of js for evaluation.</p>
411
412<h2></h2>
413
414<ul>
415<li><p><strong>return</strong>: <em>String</em></p></li>
416<li><p><strong>api</strong>: <em>public</em></p></li>
417</ul>
418
419</td>
420<td class="code">
421<pre><code><span class="variable">parse</span>: <span class="keyword">function</span>(){
422 <span class="keyword">var</span> <span class="variable">buf</span> = [<span class="string">'var buf = [];'</span>];
423 <span class="keyword">while</span> (<span class="this">this</span>.<span class="variable">peek</span>.<span class="variable">type</span> !== <span class="string">'eos'</span>) {
424 <span class="variable">buf</span>.<span class="variable">push</span>(<span class="this">this</span>.<span class="variable">parseExpr</span>());
425 }
426 <span class="variable">buf</span>.<span class="variable">push</span>(&<span class="variable">quot</span>;<span class="keyword">return</span> <span class="variable">buf</span>.<span class="variable">join</span>(<span class="string">''</span>);&<span class="variable">quot</span>;);
427 <span class="keyword">return</span> <span class="variable">buf</span>.<span class="variable">join</span>(<span class="string">'\n'</span>);
428 },</code></pre>
429</td>
430</tr>
431<tr class="code">
432<td class="docs">
433<p> tag
434| id
435| class
436| text
437| filter
438| doctype
439| code block?
440| expr newline</p>
441</td>
442<td class="code">
443<pre><code><span class="variable">parseExpr</span>: <span class="keyword">function</span>(){
444 <span class="keyword">switch</span> (<span class="this">this</span>.<span class="variable">peek</span>.<span class="variable">type</span>) {
445 <span class="keyword">case</span> <span class="string">'tag'</span>:
446 <span class="keyword">return</span> <span class="this">this</span>.<span class="variable">parseTag</span>();
447 <span class="keyword">case</span> <span class="string">'doctype'</span>:
448 <span class="keyword">return</span> <span class="this">this</span>.<span class="variable">parseDoctype</span>();
449 <span class="keyword">case</span> <span class="string">'filter'</span>:
450 <span class="keyword">return</span> <span class="this">this</span>.<span class="variable">parseFilter</span>();
451 <span class="keyword">case</span> <span class="string">'text'</span>:
452 <span class="keyword">return</span> &<span class="variable">quot</span>;<span class="variable">buf</span>.<span class="variable">push</span>(<span class="string">'&quot; + interpolate(this.advance.val.replace(/'</span>/<span class="variable">g</span>, &<span class="variable">quot</span>;\\<span class="string">'&quot;)) + &quot; '</span>);&<span class="variable">quot</span>;;
453 <span class="keyword">case</span> <span class="string">'id'</span>:
454 <span class="keyword">case</span> <span class="string">'class'</span>:
455 <span class="keyword">var</span> <span class="variable">tok</span> = <span class="this">this</span>.<span class="variable">advance</span>;
456 <span class="this">this</span>.<span class="variable">deferredTokens</span>.<span class="variable">push</span>({
457 <span class="variable">val</span>: <span class="string">'div'</span>,
458 <span class="variable">type</span>: <span class="string">'tag'</span>,
459 <span class="variable">line</span>: <span class="this">this</span>.<span class="variable">lineno</span>
460 });
461 <span class="this">this</span>.<span class="variable">deferredTokens</span>.<span class="variable">push</span>(<span class="variable">tok</span>);
462 <span class="keyword">return</span> <span class="this">this</span>.<span class="variable">parseExpr</span>();
463 <span class="keyword">case</span> <span class="string">'code'</span>:
464 <span class="keyword">var</span> <span class="variable">tok</span> = <span class="this">this</span>.<span class="variable">advance</span>,
465 <span class="variable">val</span> = <span class="variable">tok</span>.<span class="variable">val</span>;
466 <span class="keyword">var</span> <span class="variable">buf</span> = <span class="variable">tok</span>.<span class="variable">buffer</span>
467 ? <span class="string">'buf.push('</span> + (<span class="variable">tok</span>.<span class="variable">escape</span>
468 ? <span class="string">'escape('</span> + <span class="variable">val</span> + <span class="string">')'</span>
469 : <span class="variable">val</span>) + <span class="string">')'</span>
470 : <span class="variable">val</span>;
471 <span class="keyword">return</span> <span class="this">this</span>.<span class="variable">peek</span>.<span class="variable">type</span> === <span class="string">'indent'</span>
472 ? <span class="variable">buf</span> + <span class="string">'\n(function(){'</span> + <span class="this">this</span>.<span class="variable">parseBlock</span>() + <span class="string">'})();'</span>
473 : <span class="variable">buf</span> + <span class="string">';'</span>;
474 <span class="keyword">case</span> <span class="string">'newline'</span>:
475 <span class="this">this</span>.<span class="variable">advance</span>;
476 <span class="keyword">return</span> <span class="this">this</span>.<span class="variable">_</span> + <span class="this">this</span>.<span class="variable">parseExpr</span>();
477 }
478 },</code></pre>
479</td>
480</tr>
481<tr class="code">
482<td class="docs">
483<p>doctype</p>
484</td>
485<td class="code">
486<pre><code><span class="variable">parseDoctype</span>: <span class="keyword">function</span>(){
487 <span class="keyword">var</span> <span class="variable">name</span> = <span class="this">this</span>.<span class="variable">expect</span>(<span class="string">'doctype'</span>).<span class="variable">val</span>;
488 <span class="keyword">if</span> (<span class="variable">name</span> === <span class="string">'5'</span>) <span class="this">this</span>.<span class="variable">mode</span> = <span class="string">'html 5'</span>;
489 <span class="keyword">return</span> &<span class="variable">quot</span>;<span class="variable">buf</span>.<span class="variable">push</span>(<span class="variable">default</span><span class="string">'] + &quot;'</span>);&<span class="variable">quot</span>;;
490 },</code></pre>
491</td>
492</tr>
493<tr class="code">
494<td class="docs">
495<p>filter text</p>
496</td>
497<td class="code">
498<pre><code><span class="variable">parseFilter</span>: <span class="keyword">function</span>(){
499 <span class="keyword">var</span> <span class="variable">name</span> = <span class="this">this</span>.<span class="variable">expect</span>(<span class="string">'filter'</span>).<span class="variable">val</span>,
500 <span class="variable">filter</span> = <span class="variable">filters</span>[<span class="variable">name</span>];
501 <span class="keyword">if</span> (<span class="variable">filter</span>) {
502 <span class="keyword">return</span> &<span class="variable">quot</span>;<span class="variable">buf</span>.<span class="variable">push</span>(<span class="string">'&quot; + filter(interpolate(this.parseTextBlock())) + &quot;'</span>);&<span class="variable">quot</span>;;
503 } <span class="keyword">else</span> {
504 <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'unknown filter &quot;:'</span> + <span class="variable">name</span> + <span class="string">'&quot;'</span>);
505 }
506 },</code></pre>
507</td>
508</tr>
509<tr class="code">
510<td class="docs">
511<p>indent (text | newline)* outdent</p>
512</td>
513<td class="code">
514<pre><code><span class="variable">parseTextBlock</span>: <span class="keyword">function</span>(){
515 <span class="keyword">var</span> <span class="variable">buf</span> = [];
516 <span class="this">this</span>.<span class="variable">expect</span>(<span class="string">'indent'</span>);
517 <span class="keyword">while</span> (<span class="this">this</span>.<span class="variable">peek</span>.<span class="variable">type</span> === <span class="string">'text'</span> || <span class="this">this</span>.<span class="variable">peek</span>.<span class="variable">type</span> === <span class="string">'newline'</span>) {
518 <span class="keyword">if</span> (<span class="this">this</span>.<span class="variable">peek</span>.<span class="variable">type</span> === <span class="string">'newline'</span>) {
519 <span class="this">this</span>.<span class="variable">advance</span>;
520 <span class="variable">buf</span>.<span class="variable">push</span>(<span class="string">'\\n'</span>);
521 } <span class="keyword">else</span> {
522 <span class="variable">buf</span>.<span class="variable">push</span>(<span class="this">this</span>.<span class="variable">advance</span>.<span class="variable">val</span>);
523 }
524 }
525 <span class="this">this</span>.<span class="variable">expect</span>(<span class="string">'outdent'</span>);
526 <span class="keyword">return</span> <span class="variable">buf</span>.<span class="variable">join</span>(<span class="string">''</span>);
527 },</code></pre>
528</td>
529</tr>
530<tr class="code">
531<td class="docs">
532<p>indent expr* outdent</p>
533</td>
534<td class="code">
535<pre><code><span class="variable">parseBlock</span>: <span class="keyword">function</span>(){
536 <span class="keyword">var</span> <span class="variable">buf</span> = [];
537 <span class="variable">buf</span>.<span class="variable">push</span>(<span class="this">this</span>.<span class="variable">_</span>); <span class="this">this</span>.<span class="variable">expect</span>(<span class="string">'indent'</span>);
538 <span class="keyword">while</span> (<span class="this">this</span>.<span class="variable">peek</span>.<span class="variable">type</span> !== <span class="string">'outdent'</span>) {
539 <span class="variable">buf</span>.<span class="variable">push</span>(<span class="this">this</span>.<span class="variable">parseExpr</span>());
540 }
541 <span class="this">this</span>.<span class="variable">expect</span>(<span class="string">'outdent'</span>);
542 <span class="keyword">return</span> <span class="variable">buf</span>.<span class="variable">join</span>(<span class="string">'\n'</span>);
543 },</code></pre>
544</td>
545</tr>
546<tr class="code">
547<td class="docs">
548<p>tag (attrs | class | id)* (text | code | block)</p>
549</td>
550<td class="code">
551<pre><code><span class="variable">parseTag</span>: <span class="keyword">function</span>(){
552 <span class="keyword">var</span> <span class="variable">name</span> = <span class="this">this</span>.<span class="variable">advance</span>.<span class="variable">val</span>,
553 <span class="variable">html5</span> = <span class="this">this</span>.<span class="variable">mode</span> === <span class="string">'html 5'</span>,
554 <span class="variable">hasAttrs</span> = <span class="variable">false</span>,
555 <span class="variable">attrBuf</span> = <span class="string">''</span>,
556 <span class="variable">codeClass</span> = <span class="string">''</span>,
557 <span class="variable">classes</span> = [],
558 <span class="variable">attrs</span> = {},
559 <span class="variable">buf</span> = [];
560
561 <span class="comment">// (attrs | class | id)*</span>
562 <span class="variable">out</span>:
563 <span class="keyword">while</span> (<span class="number integer">1</span>) {
564 <span class="keyword">switch</span> (<span class="this">this</span>.<span class="variable">peek</span>.<span class="variable">type</span>) {
565 <span class="keyword">case</span> <span class="string">'id'</span>:
566 <span class="variable">hasAttrs</span> = <span class="variable">true</span>;
567 <span class="variable">attrs</span>.<span class="variable">id</span> = <span class="string">'&quot;'</span> + <span class="this">this</span>.<span class="variable">advance</span>.<span class="variable">val</span> + <span class="string">'&quot;'</span>;
568 <span class="keyword">continue</span>;
569 <span class="keyword">case</span> <span class="string">'class'</span>:
570 <span class="variable">hasAttrs</span> = <span class="variable">true</span>;
571 <span class="variable">classes</span>.<span class="variable">push</span>(<span class="this">this</span>.<span class="variable">advance</span>.<span class="variable">val</span>);
572 <span class="keyword">continue</span>;
573 <span class="keyword">case</span> <span class="string">'attrs'</span>:
574 <span class="variable">hasAttrs</span> = <span class="variable">true</span>;
575 <span class="keyword">var</span> <span class="variable">obj</span> = <span class="this">this</span>.<span class="variable">advance</span>.<span class="variable">attrs</span>,
576 <span class="variable">keys</span> = <span class="class">Object</span>.<span class="variable">keys</span>(<span class="variable">obj</span>);
577 <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">keys</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
578 <span class="keyword">var</span> <span class="variable">key</span> = <span class="variable">keys</span>[<span class="variable">i</span>],
579 <span class="variable">val</span> = <span class="variable">obj</span>[<span class="variable">key</span>];
580 <span class="keyword">if</span> (<span class="variable">key</span> === <span class="string">'class'</span>) {
581 <span class="variable">codeClass</span> = <span class="variable">val</span>;
582 } <span class="keyword">else</span> {
583 <span class="variable">attrs</span>[<span class="variable">key</span>] = <span class="variable">val</span> === <span class="variable">undefined</span>
584 ? <span class="variable">true</span>
585 : <span class="variable">val</span>;
586 <span class="variable">attrs</span>.<span class="variable">html5</span> = <span class="variable">html5</span>;
587 }
588 }
589 <span class="keyword">continue</span>;
590 <span class="keyword">default</span>:
591 <span class="keyword">break</span> <span class="variable">out</span>;
592 }
593 }
594
595 <span class="comment">// (text | code | block)</span>
596 <span class="keyword">switch</span> (<span class="this">this</span>.<span class="variable">peek</span>.<span class="variable">type</span>) {
597 <span class="keyword">case</span> <span class="string">'text'</span>:
598 <span class="variable">buf</span>.<span class="variable">push</span>(&<span class="variable">quot</span>;<span class="variable">buf</span>.<span class="variable">push</span>(<span class="string">'&quot; + interpolate(this.advance.val.trim().replace(/'</span>/<span class="variable">g</span>, &<span class="variable">quot</span>;\\<span class="string">'&quot;)) + &quot;'</span>);&<span class="variable">quot</span>;);
599 <span class="keyword">break</span>;
600 <span class="keyword">case</span> <span class="string">'code'</span>:
601 <span class="keyword">var</span> <span class="variable">tok</span> = <span class="this">this</span>.<span class="variable">advance</span>;
602 <span class="keyword">if</span> (<span class="variable">tok</span>.<span class="variable">buffer</span>) {
603 <span class="variable">buf</span>.<span class="variable">push</span>(<span class="string">'buf.push('</span> + (<span class="variable">tok</span>.<span class="variable">escape</span>
604 ? <span class="string">'escape('</span> + <span class="variable">tok</span>.<span class="variable">val</span> + <span class="string">')'</span>
605 : <span class="variable">tok</span>.<span class="variable">val</span>) + <span class="string">');'</span>);
606 } <span class="keyword">else</span> {
607 <span class="variable">buf</span>.<span class="variable">push</span>(<span class="variable">tok</span>.<span class="variable">val</span> + <span class="string">';'</span>);
608 }
609 <span class="keyword">break</span>;
610 <span class="keyword">case</span> <span class="string">'indent'</span>:
611 <span class="variable">buf</span>.<span class="variable">push</span>(<span class="this">this</span>.<span class="variable">parseBlock</span>());
612 <span class="keyword">break</span>;
613 }
614
615 <span class="comment">// Build attrs</span>
616 <span class="keyword">if</span> (<span class="variable">hasAttrs</span>) {
617 <span class="comment">// Classes</span>
618 <span class="keyword">if</span> (<span class="variable">classes</span>.<span class="variable">length</span>) {
619 <span class="variable">attrs</span>[<span class="string">'class'</span>] = <span class="string">'&quot;'</span> + <span class="variable">classes</span>.<span class="variable">join</span>(<span class="string">' '</span>) + <span class="string">'&quot;'</span>;
620 }
621 <span class="keyword">if</span> (<span class="variable">codeClass</span>) {
622 <span class="keyword">if</span> (<span class="variable">attrs</span>[<span class="string">'class'</span>]) {
623 <span class="variable">attrs</span>[<span class="string">'class'</span>] += <span class="string">' + &quot; &quot; + ('</span> + <span class="variable">codeClass</span> + <span class="string">')'</span>;
624 } <span class="keyword">else</span> {
625 <span class="variable">attrs</span>[<span class="string">'class'</span>] = <span class="variable">codeClass</span>;
626 }
627 }
628
629 <span class="comment">// Attributes</span>
630 <span class="variable">attrBuf</span> += &<span class="variable">quot</span>;' + <span class="variable">attrs</span>({ &<span class="variable">quot</span>;;
631 <span class="keyword">var</span> <span class="variable">keys</span> = <span class="class">Object</span>.<span class="variable">keys</span>(<span class="variable">attrs</span>);
632 <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">keys</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
633 <span class="keyword">var</span> <span class="variable">key</span> = <span class="variable">keys</span>[<span class="variable">i</span>],
634 <span class="variable">val</span> = <span class="variable">attrs</span>[<span class="variable">key</span>];
635 <span class="variable">attrBuf</span> += &<span class="variable">quot</span>;<span class="string">'&quot; + key + &quot;'</span>: &<span class="variable">quot</span>; + <span class="variable">val</span> + (<span class="variable">i</span> === <span class="variable">len</span> - <span class="number integer">1</span> ? <span class="string">''</span> : <span class="string">', '</span>);
636 }
637 <span class="variable">attrBuf</span> += &<span class="variable">quot</span>; }) + '&<span class="variable">quot</span>;;
638 } <span class="keyword">else</span> {
639 <span class="variable">attrBuf</span> = &<span class="variable">quot</span>;<span class="string">' + '</span>&<span class="variable">quot</span>;;
640 }
641
642 <span class="comment">// Build the tag</span>
643 <span class="keyword">if</span> (<span class="variable">selfClosing</span>.<span class="variable">indexOf</span>(<span class="variable">name</span>) &<span class="variable">gt</span>;= <span class="number integer">0</span>) {
644 <span class="keyword">return</span> [
645 &<span class="variable">quot</span>;<span class="variable">buf</span>.<span class="variable">push</span>(<span class="string">'&lt;&quot; + name + attrBuf + (html5 ? '</span><span class="string">' : '</span> /<span class="string">' ) + &quot;&gt;'</span>);&<span class="variable">quot</span>;,
646 <span class="variable">buf</span>.<span class="variable">join</span>(<span class="string">'\n'</span>)
647 ].<span class="variable">join</span>(<span class="string">'\n'</span>);
648 } <span class="keyword">else</span> {
649 <span class="keyword">return</span> [
650 &<span class="variable">quot</span>;<span class="variable">buf</span>.<span class="variable">push</span>(<span class="string">'&lt;&quot; + name + attrBuf + &quot;&gt;'</span>);&<span class="variable">quot</span>;,
651 <span class="variable">buf</span>.<span class="variable">join</span>(<span class="string">'\n'</span>),
652 &<span class="variable">quot</span>;<span class="variable">buf</span>.<span class="variable">push</span>(<span class="string">'&lt;/&quot; + name + &quot;&gt;'</span>);&<span class="variable">quot</span>;
653 ].<span class="variable">join</span>(<span class="string">'\n'</span>);
654 }
655 }
656};</code></pre>
657</td>
658</tr>
659<tr class="code">
660<td class="docs">
661<p>Render the given <code>str</code> of jade.</p>
662
663<h2>Options</h2>
664
665<ul>
666<li><code>scope</code> Evaluation scope (<code>this</code>)</li>
667<li><code>locals</code> Local variable object</li>
668<li><code>filename</code> Used in exceptions, and required by <code>cache</code></li>
669<li><code>cache</code> Cache intermediate JavaScript in memory keyed by <code>filename</code></li>
670</ul>
671
672
673<h2>Examples</h2>
674
675<pre><code>jade.render('h1= title', {
676 title: 'Jade rules!'
677});
678</code></pre>
679
680<h2></h2>
681
682<ul>
683<li><p><strong>param</strong>: <em>String</em> str</p></li>
684<li><p><strong>param</strong>: <em>Object</em> options</p></li>
685<li><p><strong>return</strong>: <em>String</em></p></li>
686<li><p><strong>api</strong>: <em>public</em></p></li>
687</ul>
688
689</td>
690<td class="code">
691<pre><code><span class="variable">exports</span>.<span class="variable">render</span> = <span class="keyword">function</span>(<span class="variable">str</span>, <span class="variable">options</span>){
692 <span class="keyword">var</span> <span class="variable">js</span>,
693 <span class="variable">options</span> = <span class="variable">options</span> || {},
694 <span class="variable">filename</span> = <span class="variable">options</span>.<span class="variable">filename</span>;
695
696 <span class="comment">// Attempt to parse</span>
697 <span class="keyword">function</span> <span class="variable">parse</span>(){
698 <span class="keyword">try</span> {
699 <span class="keyword">var</span> <span class="variable">parser</span> = <span class="keyword">new</span> <span class="class">Parser</span>(<span class="variable">str</span>, <span class="variable">filename</span>);
700 <span class="keyword">if</span> (<span class="variable">options</span>.<span class="variable">debug</span>) {
701 <span class="variable">parser</span>.<span class="variable">debug</span>();
702 <span class="variable">parser</span> = <span class="keyword">new</span> <span class="class">Parser</span>(<span class="variable">str</span>, <span class="variable">filename</span>);
703 }
704 <span class="keyword">var</span> <span class="variable">js</span> = <span class="variable">parser</span>.<span class="variable">parse</span>()
705 <span class="keyword">if</span> (<span class="variable">options</span>.<span class="variable">debug</span>) <span class="variable">sys</span>.<span class="variable">puts</span>(<span class="string">'\nfunction:'</span>, <span class="variable">js</span>.<span class="variable">replace</span>(<span class="regexp">/^/gm</span>, <span class="string">' '</span>));
706 <span class="keyword">return</span> <span class="variable">js</span>;
707 } <span class="keyword">catch</span> (<span class="variable">err</span>) {
708 <span class="variable">rethrow</span>(<span class="variable">err</span>, <span class="variable">parser</span>.<span class="variable">lineno</span>);
709 }
710 }
711
712 <span class="comment">// Re-throw the given error</span>
713 <span class="keyword">function</span> <span class="variable">rethrow</span>(<span class="variable">err</span>, <span class="variable">lineno</span>){
714 <span class="keyword">var</span> <span class="variable">start</span> = <span class="variable">lineno</span> - <span class="number integer">3</span> &<span class="variable">gt</span>; <span class="number integer">0</span>
715 ? <span class="variable">lineno</span> - <span class="number integer">3</span>
716 : <span class="number integer">0</span>;
717 <span class="comment">// Error context</span>
718 <span class="keyword">var</span> <span class="variable">context</span> = <span class="variable">str</span>.<span class="variable">split</span>(<span class="string">'\n'</span>).<span class="variable">slice</span>(<span class="variable">start</span>, <span class="variable">lineno</span>).<span class="variable">map</span>(<span class="keyword">function</span>(<span class="variable">line</span>, <span class="variable">i</span>){
719 <span class="keyword">return</span> <span class="string">' '</span> + (<span class="variable">i</span> + <span class="variable">start</span> + <span class="number integer">1</span>) + <span class="string">'. '</span> + <span class="variable">sys</span>.<span class="variable">inspect</span>(<span class="variable">line</span>);
720 }).<span class="variable">join</span>(<span class="string">'\n'</span>);
721
722 <span class="comment">// Alter exception message</span>
723 <span class="variable">err</span>.<span class="variable">path</span> = <span class="variable">filename</span>;
724 <span class="variable">err</span>.<span class="variable">message</span> = (<span class="variable">filename</span> || <span class="string">'Jade'</span>) + <span class="string">':'</span> + <span class="variable">lineno</span>
725 + <span class="string">'\n'</span> + <span class="variable">context</span> + <span class="string">'\n\n'</span> + <span class="variable">err</span>.<span class="variable">message</span>;
726 <span class="keyword">throw</span> <span class="variable">err</span>;
727 }
728
729 <span class="comment">// Cache templates</span>
730 <span class="keyword">if</span> (<span class="variable">options</span>.<span class="variable">cache</span>) {
731 <span class="keyword">if</span> (<span class="variable">filename</span>) {
732 <span class="keyword">if</span> (<span class="variable">cache</span>[<span class="variable">filename</span>]) {
733 <span class="variable">js</span> = <span class="variable">cache</span>[<span class="variable">filename</span>];
734 } <span class="keyword">else</span> {
735 <span class="variable">js</span> = <span class="variable">cache</span>[<span class="variable">filename</span>] = <span class="variable">parse</span>();
736 }
737 } <span class="keyword">else</span> {
738 <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'filename is required when using the cache option'</span>);
739 }
740 } <span class="keyword">else</span> {
741 <span class="variable">js</span> = <span class="variable">parse</span>();
742 }
743
744 <span class="comment">// Generate function</span>
745 <span class="keyword">var</span> <span class="variable">fn</span> = <span class="class">Function</span>(<span class="string">'locals, attrs, escape, _'</span>, <span class="string">'with (locals) {'</span> + <span class="variable">js</span> + <span class="string">'}'</span>);
746
747 <span class="keyword">try</span> {
748 <span class="keyword">var</span> <span class="variable">_</span> = { <span class="variable">lineno</span>: <span class="number integer">1</span> };
749 <span class="keyword">return</span> <span class="variable">fn</span>.<span class="variable">call</span>(<span class="variable">options</span>.<span class="variable">scope</span>,
750 <span class="variable">options</span>.<span class="variable">locals</span> || {},
751 <span class="variable">attrs</span>,
752 <span class="variable">escape</span>,
753 <span class="variable">_</span>);
754 } <span class="keyword">catch</span> (<span class="variable">err</span>) {
755 <span class="variable">rethrow</span>(<span class="variable">err</span>, <span class="variable">_</span>.<span class="variable">lineno</span>);
756 }
757};</code></pre>
758</td>
759</tr>
760<tr class="code">
761<td class="docs">
762<p>Render jade template at the given <code>path</code>.</p>
763
764<h2></h2>
765
766<ul>
767<li><p><strong>param</strong>: <em>String</em> path</p></li>
768<li><p><strong>param</strong>: <em>Object</em> options</p></li>
769<li><p><strong>param</strong>: <em>Function</em> fn</p></li>
770<li><p><strong>api</strong>: <em>public</em></p></li>
771</ul>
772
773</td>
774<td class="code">
775<pre><code><span class="variable">exports</span>.<span class="variable">renderFile</span> = <span class="keyword">function</span>(<span class="variable">path</span>, <span class="variable">options</span>, <span class="variable">fn</span>){
776 <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">options</span> === <span class="string">'function'</span>) {
777 <span class="variable">fn</span> = <span class="variable">options</span>;
778 <span class="variable">options</span> = {};
779 }
780 <span class="variable">options</span>.<span class="variable">filename</span> = <span class="variable">path</span>;
781 <span class="variable">fs</span>.<span class="variable">readFile</span>(<span class="variable">path</span>, <span class="string">'utf8'</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">str</span>){
782 <span class="keyword">if</span> (<span class="variable">err</span>) {
783 <span class="variable">fn</span>(<span class="variable">err</span>);
784 } <span class="keyword">else</span> {
785 <span class="keyword">try</span> {
786 <span class="variable">fn</span>(<span class="keyword">null</span>, <span class="variable">exports</span>.<span class="variable">render</span>(<span class="variable">str</span>, <span class="variable">options</span>));
787 } <span class="keyword">catch</span> (<span class="variable">err</span>) {
788 <span class="variable">fn</span>(<span class="variable">err</span>);
789 }
790 }
791 });
792};</code></pre>
793</td>
794</tr> </body>
795</html></tbody></table>
\No newline at end of file