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 | }
|
10 | a {
|
11 | color: #252519;
|
12 | }
|
13 | a:hover {
|
14 | text-decoration: underline;
|
15 | color: #19469D;
|
16 | }
|
17 | p {
|
18 | margin: 12px 0;
|
19 | }
|
20 | h1, h2, h3 {
|
21 | margin: 0;
|
22 | padding: 0;
|
23 | }
|
24 | ul#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 | }
|
41 | ul#menu:hover {
|
42 | opacity: 1;
|
43 | }
|
44 | ul#menu li {
|
45 | padding: 2px 10px;
|
46 | border-bottom: 1px solid #eee;
|
47 | }
|
48 | ul#menu li:hover {
|
49 | background: rgba(0,0,0,0.03);
|
50 | }
|
51 | ul#menu li:last-child {
|
52 | border-bottom: none;
|
53 | }
|
54 | ul#menu li a {
|
55 | text-decoration: none;
|
56 | font-size: 12px;
|
57 | color: rgba(0,0,0,0.5);
|
58 | }
|
59 | ul#menu li a strong {
|
60 | font-weight: normal;
|
61 | color: #252519;
|
62 | }
|
63 | table#source {
|
64 | width: 100%;
|
65 | border-collapse: collapse;
|
66 | }
|
67 | table#source td:first-child {
|
68 | padding: 30px 40px 30px 40px;
|
69 | vertical-align: top;
|
70 | }
|
71 | table#source td:first-child,
|
72 | table#source td:first-child pre {
|
73 | width: 450px;
|
74 | }
|
75 | table#source td:last-child {
|
76 | padding: 30px 0 30px 40px;
|
77 | border-left: 1px solid #E5E5EE;
|
78 | background: #F5F5FF;
|
79 | }
|
80 | table#source tr {
|
81 | border-bottom: 1px solid #E5E5EE;
|
82 | }
|
83 | table#source tr.filename {
|
84 | padding-top: 40px;
|
85 | border-top: 1px solid #E5E5EE;
|
86 | }
|
87 | table#source tr.filename td:first-child {
|
88 | text-transform: capitalize;
|
89 | }
|
90 | table#source tr.filename td:last-child {
|
91 | font-size: 12px;
|
92 | }
|
93 | table#source tr.filename h2 {
|
94 | margin: 0;
|
95 | padding: 0;
|
96 | }
|
97 | table#source tr.code h1,
|
98 | table#source tr.code h2,
|
99 | table#source tr.code h3 {
|
100 | margin-top: 30px;
|
101 | font-family: "Lucida Grande", "Helvetica Nueue", Arial, sans-serif;
|
102 | font-size: 18px;
|
103 | }
|
104 | table#source tr.code h2 {
|
105 | font-size: 16px;
|
106 | }
|
107 | table#source tr.code h3 {
|
108 | font-size: 14px;
|
109 | }
|
110 | table#source tr.code ul {
|
111 | margin: 15px 0 15px 35px;
|
112 | padding: 0;
|
113 | }
|
114 | table#source tr.code ul li {
|
115 | margin: 0;
|
116 | padding: 1px 0;
|
117 | }
|
118 | table#source tr.code ul li p {
|
119 | margin: 0;
|
120 | padding: 0;
|
121 | }
|
122 | table#source tr.code td:first-child pre {
|
123 | padding: 20px;
|
124 | }
|
125 | #ribbon {
|
126 | position: absolute;
|
127 | top: 0;
|
128 | right: 0;
|
129 | }
|
130 | code .string { color: #219161; }
|
131 | code .regexp { color: #219161; }
|
132 | code .keyword { color: #954121; }
|
133 | code .number { color: #19469D; }
|
134 | code .comment { color: #bbb; }
|
135 | code .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">'<!DOCTYPE html>'</span>,
|
202 | <span class="string">'xml'</span>: <span class="string">'<?xml version="1.0" encoding="utf-8" ?>'</span>,
|
203 | <span class="string">'default'</span>: <span class="string">'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'</span>,
|
204 | <span class="string">'transitional'</span>: <span class="string">'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'</span>,
|
205 | <span class="string">'strict'</span>: <span class="string">'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'</span>,
|
206 | <span class="string">'frameset'</span>: <span class="string">'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">'</span>,
|
207 | <span class="string">'1.1'</span>: <span class="string">'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'</span>,
|
208 | <span class="string">'basic'</span>: <span class="string">'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">'</span>,
|
209 | <span class="string">'mobile'</span>: <span class="string">'<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">'</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">'<![CDATA[\\n'</span> + <span class="variable">str</span> + <span class="string">'\\n]]>'</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">'<script type="text/javascript">\\n//<![CDATA[\\n'</span> + <span class="variable">str</span> + <span class="string">'\\n//]]></script>'</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">'<style>'</span> + <span class="variable">sass</span> + <span class="string">'</style>'</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">'" + interpolate(this.advance.val.replace(/'</span>/<span class="variable">g</span>, &<span class="variable">quot</span>;\\<span class="string">'")) + " '</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">'] + "'</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">'" + filter(interpolate(this.parseTextBlock())) + "'</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 ":'</span> + <span class="variable">name</span> + <span class="string">'"'</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">'"'</span> + <span class="this">this</span>.<span class="variable">advance</span>.<span class="variable">val</span> + <span class="string">'"'</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">'" + interpolate(this.advance.val.trim().replace(/'</span>/<span class="variable">g</span>, &<span class="variable">quot</span>;\\<span class="string">'")) + "'</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">'"'</span> + <span class="variable">classes</span>.<span class="variable">join</span>(<span class="string">' '</span>) + <span class="string">'"'</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">' + " " + ('</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">'" + key + "'</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">'<" + name + attrBuf + (html5 ? '</span><span class="string">' : '</span> /<span class="string">' ) + ">'</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">'<" + name + attrBuf + ">'</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">'</" + name + ">'</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 |