snowball 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +1 -3
  3. data/{lib/snowball → bin}/roll.js +0 -0
  4. data/lib/snowball/roller.rb +1 -1
  5. data/lib/snowball/version.rb +1 -1
  6. data/node_modules/.bin/browserify +161 -0
  7. data/node_modules/.bin/cake +7 -0
  8. data/node_modules/.bin/coffee +7 -0
  9. data/node_modules/.bin/jade +168 -0
  10. data/node_modules/browserify/.travis.yml +4 -0
  11. data/node_modules/browserify/LICENSE +63 -0
  12. data/node_modules/browserify/README.markdown +172 -0
  13. data/node_modules/browserify/bin/cmd.js +161 -0
  14. data/node_modules/browserify/builtins/__browserify_process.js +55 -0
  15. data/node_modules/browserify/builtins/assert.js +314 -0
  16. data/node_modules/browserify/builtins/child_process.js +2 -0
  17. data/node_modules/browserify/builtins/events.js +178 -0
  18. data/node_modules/browserify/builtins/fs.js +1 -0
  19. data/node_modules/browserify/builtins/https.js +1 -0
  20. data/node_modules/browserify/builtins/net.js +1 -0
  21. data/node_modules/browserify/builtins/path.js +175 -0
  22. data/node_modules/browserify/builtins/querystring.js +250 -0
  23. data/node_modules/browserify/builtins/stream.js +119 -0
  24. data/node_modules/browserify/builtins/string_decoder.js +161 -0
  25. data/node_modules/browserify/builtins/sys.js +1 -0
  26. data/node_modules/browserify/builtins/timers.js +39 -0
  27. data/node_modules/browserify/builtins/tls.js +1 -0
  28. data/node_modules/browserify/builtins/tty.js +2 -0
  29. data/node_modules/browserify/builtins/url.js +604 -0
  30. data/node_modules/browserify/builtins/util.js +351 -0
  31. data/node_modules/browserify/example/debug/browserify.js +219 -0
  32. data/node_modules/browserify/example/debug/build.sh +3 -0
  33. data/node_modules/browserify/example/debug/index.html +7 -0
  34. data/node_modules/browserify/example/debug/js/entry.js +2 -0
  35. data/node_modules/browserify/example/debug/js/thrower.js +3 -0
  36. data/node_modules/browserify/example/debug/server.js +9 -0
  37. data/node_modules/browserify/example/simple-build/browserify.js +368 -0
  38. data/node_modules/browserify/example/simple-build/build.sh +3 -0
  39. data/node_modules/browserify/example/simple-build/index.html +9 -0
  40. data/node_modules/browserify/example/simple-build/js/bar.js +3 -0
  41. data/node_modules/browserify/example/simple-build/js/entry.js +5 -0
  42. data/node_modules/browserify/example/simple-build/js/foo.js +5 -0
  43. data/node_modules/browserify/example/simple-build/server.js +9 -0
  44. data/node_modules/browserify/example/test/b.js +5 -0
  45. data/node_modules/browserify/example/test/bar.js +3 -0
  46. data/node_modules/browserify/example/test/foo.js +3 -0
  47. data/node_modules/browserify/example/test/m.js +3 -0
  48. data/node_modules/browserify/example/test/n.js +3 -0
  49. data/node_modules/browserify/example/using-http/bundle.js +813 -0
  50. data/node_modules/browserify/example/using-http/entry.js +25 -0
  51. data/node_modules/browserify/example/using-http/index.html +9 -0
  52. data/node_modules/browserify/example/using-http/server.js +28 -0
  53. data/node_modules/browserify/index.js +202 -0
  54. data/node_modules/browserify/lib/watch.js +75 -0
  55. data/node_modules/browserify/lib/wrap.js +580 -0
  56. data/node_modules/browserify/lib/wrappers.js +10 -0
  57. data/node_modules/browserify/node_modules/buffer-browserify/.npmignore +1 -0
  58. data/node_modules/browserify/node_modules/buffer-browserify/README.md +11 -0
  59. data/node_modules/browserify/node_modules/buffer-browserify/buffer_ieee754.js +84 -0
  60. data/node_modules/browserify/node_modules/buffer-browserify/index.js +1317 -0
  61. data/node_modules/browserify/node_modules/buffer-browserify/node_modules/base64-js/README.md +14 -0
  62. data/node_modules/browserify/node_modules/buffer-browserify/node_modules/base64-js/lib/b64.js +84 -0
  63. data/node_modules/browserify/node_modules/buffer-browserify/node_modules/base64-js/package.json +30 -0
  64. data/node_modules/browserify/node_modules/buffer-browserify/node_modules/base64-js/test/runner.js +50 -0
  65. data/node_modules/browserify/node_modules/buffer-browserify/package.json +46 -0
  66. data/node_modules/browserify/node_modules/buffer-browserify/test/buffer.js +218 -0
  67. data/node_modules/browserify/node_modules/commondir/README.markdown +45 -0
  68. data/node_modules/browserify/node_modules/commondir/example/base.js +3 -0
  69. data/node_modules/browserify/node_modules/commondir/example/dir.js +3 -0
  70. data/node_modules/browserify/node_modules/commondir/index.js +29 -0
  71. data/node_modules/browserify/node_modules/commondir/package.json +47 -0
  72. data/node_modules/browserify/node_modules/commondir/test/dirs.js +66 -0
  73. data/node_modules/browserify/node_modules/crypto-browserify/.travis.yml +4 -0
  74. data/node_modules/browserify/node_modules/crypto-browserify/example/bundle.js +637 -0
  75. data/node_modules/browserify/node_modules/crypto-browserify/example/index.html +12 -0
  76. data/node_modules/browserify/node_modules/crypto-browserify/example/test.js +4 -0
  77. data/node_modules/browserify/node_modules/crypto-browserify/index.js +74 -0
  78. data/node_modules/browserify/node_modules/crypto-browserify/md5.js +384 -0
  79. data/node_modules/browserify/node_modules/crypto-browserify/package.json +33 -0
  80. data/node_modules/browserify/node_modules/crypto-browserify/readme.markdown +20 -0
  81. data/node_modules/browserify/node_modules/crypto-browserify/rng.js +37 -0
  82. data/node_modules/browserify/node_modules/crypto-browserify/sha.js +210 -0
  83. data/node_modules/browserify/node_modules/crypto-browserify/test/simple.js +35 -0
  84. data/node_modules/browserify/node_modules/deputy/.travis.yml +4 -0
  85. data/node_modules/browserify/node_modules/deputy/README.markdown +55 -0
  86. data/node_modules/browserify/node_modules/deputy/example/cache.js +5 -0
  87. data/node_modules/browserify/node_modules/deputy/index.js +46 -0
  88. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.npmignore +2 -0
  89. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.travis.yml +5 -0
  90. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/LICENSE +21 -0
  91. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js +6 -0
  92. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/index.js +82 -0
  93. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/package.json +34 -0
  94. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/readme.markdown +63 -0
  95. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/chmod.js +38 -0
  96. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/clobber.js +37 -0
  97. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/mkdirp.js +28 -0
  98. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm.js +32 -0
  99. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm_sync.js +39 -0
  100. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/race.js +41 -0
  101. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/rel.js +32 -0
  102. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return.js +25 -0
  103. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return_sync.js +24 -0
  104. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/root.js +18 -0
  105. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/sync.js +32 -0
  106. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask.js +28 -0
  107. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask_sync.js +32 -0
  108. data/node_modules/browserify/node_modules/deputy/package.json +47 -0
  109. data/node_modules/browserify/node_modules/deputy/test/cache.js +58 -0
  110. data/node_modules/browserify/node_modules/detective/.travis.yml +4 -0
  111. data/node_modules/browserify/node_modules/detective/README.markdown +66 -0
  112. data/node_modules/browserify/node_modules/detective/example/strings.js +6 -0
  113. data/node_modules/browserify/node_modules/detective/example/strings_src.js +3 -0
  114. data/node_modules/browserify/node_modules/detective/index.js +60 -0
  115. data/node_modules/browserify/node_modules/detective/node_modules/.bin/esparse +42 -0
  116. data/node_modules/browserify/node_modules/detective/node_modules/esprima/.travis.yml +5 -0
  117. data/node_modules/browserify/node_modules/detective/node_modules/esprima/LICENSE.BSD +19 -0
  118. data/node_modules/browserify/node_modules/detective/node_modules/esprima/README.md +74 -0
  119. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/codemirror/codemirror.css +112 -0
  120. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/codemirror/codemirror.js +2972 -0
  121. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/codemirror/javascript.js +360 -0
  122. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/json2.js +487 -0
  123. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/style.css +164 -0
  124. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/yui/treeview-min.js +12 -0
  125. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/yui/treeview-sprite.gif +0 -0
  126. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/yui/treeview.css +7 -0
  127. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/yui/yahoo-dom-event.js +14 -0
  128. data/node_modules/browserify/node_modules/detective/node_modules/esprima/bin/esparse.js +42 -0
  129. data/node_modules/browserify/node_modules/detective/node_modules/esprima/changes +92 -0
  130. data/node_modules/browserify/node_modules/detective/node_modules/esprima/cm +696 -0
  131. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/checkenv.js +42 -0
  132. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/collector.html +82 -0
  133. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/collector.js +170 -0
  134. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/functiontrace.html +106 -0
  135. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/functiontrace.js +123 -0
  136. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/parse.css +82 -0
  137. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/parse.html +352 -0
  138. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/precedence.html +225 -0
  139. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/rewrite.html +120 -0
  140. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/rewrite.js +71 -0
  141. data/node_modules/browserify/node_modules/detective/node_modules/esprima/esprima.js +3577 -0
  142. data/node_modules/browserify/node_modules/detective/node_modules/esprima/index.html +103 -0
  143. data/node_modules/browserify/node_modules/detective/node_modules/esprima/package.json +42 -0
  144. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/Tokenizer.js +646 -0
  145. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/XMLHttpRequest.js +509 -0
  146. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/ZeParser.js +2185 -0
  147. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/backbone-0.5.3.js +1158 -0
  148. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/benchmark.js +3261 -0
  149. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/escodegen.js +906 -0
  150. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/esmorph.js +240 -0
  151. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/ext-core-3.0.0.js +6579 -0
  152. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/ext-core-3.1.0.js +10255 -0
  153. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jquery-1.6.4.js +9046 -0
  154. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jquery-1.7.1.js +9266 -0
  155. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jquery.mobile-1.0.js +6951 -0
  156. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jsdefs.js +731 -0
  157. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jslex.js +588 -0
  158. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jsparse.js +1921 -0
  159. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/mootools-1.3.2.js +5952 -0
  160. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/mootools-1.4.1.js +6297 -0
  161. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/parse-js.js +1342 -0
  162. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/platform.js +878 -0
  163. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/prototype-1.6.1.js +4874 -0
  164. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/prototype-1.7.0.0.js +6082 -0
  165. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/underscore-1.2.3.js +981 -0
  166. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/benchmarks.html +58 -0
  167. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/benchmarks.js +328 -0
  168. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/compare.html +140 -0
  169. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/compare.js +270 -0
  170. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/compat.html +40 -0
  171. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/compat.js +239 -0
  172. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/coverage.footer.html +3 -0
  173. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/coverage.header.html +37 -0
  174. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/coverage.html +3617 -0
  175. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/index.html +36 -0
  176. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/reflect.js +403 -0
  177. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/run.js +66 -0
  178. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/test.js +16659 -0
  179. data/node_modules/browserify/node_modules/detective/node_modules/esprima/tools/generate-unicode-regex.py +164 -0
  180. data/node_modules/browserify/node_modules/detective/node_modules/esprima/tools/update-coverage.sh +28 -0
  181. data/node_modules/browserify/node_modules/detective/package.json +47 -0
  182. data/node_modules/browserify/node_modules/detective/test/both.js +11 -0
  183. data/node_modules/browserify/node_modules/detective/test/chained.js +9 -0
  184. data/node_modules/browserify/node_modules/detective/test/files/both.js +4 -0
  185. data/node_modules/browserify/node_modules/detective/test/files/chained.js +5 -0
  186. data/node_modules/browserify/node_modules/detective/test/files/nested.js +22 -0
  187. data/node_modules/browserify/node_modules/detective/test/files/skip.js +7 -0
  188. data/node_modules/browserify/node_modules/detective/test/files/strings.js +13 -0
  189. data/node_modules/browserify/node_modules/detective/test/files/word.js +13 -0
  190. data/node_modules/browserify/node_modules/detective/test/nested.js +9 -0
  191. data/node_modules/browserify/node_modules/detective/test/skip.js +9 -0
  192. data/node_modules/browserify/node_modules/detective/test/strings.js +9 -0
  193. data/node_modules/browserify/node_modules/detective/test/word.js +12 -0
  194. data/node_modules/browserify/node_modules/http-browserify/.npmignore +1 -0
  195. data/node_modules/browserify/node_modules/http-browserify/example/get/index.html +9 -0
  196. data/node_modules/browserify/node_modules/http-browserify/example/get/main.js +14 -0
  197. data/node_modules/browserify/node_modules/http-browserify/example/get/server.js +12 -0
  198. data/node_modules/browserify/node_modules/http-browserify/example/headers/index.html +9 -0
  199. data/node_modules/browserify/node_modules/http-browserify/example/headers/main.js +18 -0
  200. data/node_modules/browserify/node_modules/http-browserify/example/headers/server.js +15 -0
  201. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/data.json +139 -0
  202. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/index.html +9 -0
  203. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/main.js +13 -0
  204. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/.npmignore +2 -0
  205. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/.travis.yml +4 -0
  206. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/LICENSE.APACHE2 +15 -0
  207. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/LICENSE.MIT +24 -0
  208. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/examples/all_docs.js +13 -0
  209. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/index.js +189 -0
  210. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/LICENSE +24 -0
  211. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/README.markdown +11 -0
  212. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/bench.js +26 -0
  213. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/examples/twitterfeed.js +30 -0
  214. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/jsonparse.js +379 -0
  215. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/package.json +36 -0
  216. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/samplejson/basic.json +167 -0
  217. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/samplejson/basic2.json +180 -0
  218. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/test/primitives.js +54 -0
  219. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/test/utf8.js +38 -0
  220. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/package.json +40 -0
  221. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/readme.markdown +145 -0
  222. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/bool.js +41 -0
  223. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/destroy_missing.js +22 -0
  224. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/empty.js +44 -0
  225. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/fixtures/all_npm.json +4030 -0
  226. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/fn.js +39 -0
  227. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/memory.js +69 -0
  228. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/multiple_objects.js +42 -0
  229. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/multiple_objects_error.js +35 -0
  230. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/parsejson.js +28 -0
  231. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/stringify.js +41 -0
  232. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/stringify_object.js +47 -0
  233. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/test.js +35 -0
  234. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/test2.js +29 -0
  235. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/two-ways.js +41 -0
  236. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/server.js +10 -0
  237. data/node_modules/browserify/node_modules/http-browserify/example/post/index.html +9 -0
  238. data/node_modules/browserify/node_modules/http-browserify/example/post/main.js +16 -0
  239. data/node_modules/browserify/node_modules/http-browserify/example/post/server.js +19 -0
  240. data/node_modules/browserify/node_modules/http-browserify/example/streaming/index.html +9 -0
  241. data/node_modules/browserify/node_modules/http-browserify/example/streaming/main.js +16 -0
  242. data/node_modules/browserify/node_modules/http-browserify/example/streaming/server.js +21 -0
  243. data/node_modules/browserify/node_modules/http-browserify/index.js +59 -0
  244. data/node_modules/browserify/node_modules/http-browserify/lib/request.js +128 -0
  245. data/node_modules/browserify/node_modules/http-browserify/lib/response.js +119 -0
  246. data/node_modules/browserify/node_modules/http-browserify/node_modules/concat-stream/index.js +48 -0
  247. data/node_modules/browserify/node_modules/http-browserify/node_modules/concat-stream/package.json +30 -0
  248. data/node_modules/browserify/node_modules/http-browserify/node_modules/concat-stream/readme.md +31 -0
  249. data/node_modules/browserify/node_modules/http-browserify/node_modules/concat-stream/test.js +34 -0
  250. data/node_modules/browserify/node_modules/http-browserify/package.json +46 -0
  251. data/node_modules/browserify/node_modules/http-browserify/readme.markdown +128 -0
  252. data/node_modules/browserify/node_modules/nub/README.markdown +23 -0
  253. data/node_modules/browserify/node_modules/nub/index.js +64 -0
  254. data/node_modules/browserify/node_modules/nub/package.json +46 -0
  255. data/node_modules/browserify/node_modules/nub/test/by.js +51 -0
  256. data/node_modules/browserify/node_modules/nub/test/nub.js +46 -0
  257. data/node_modules/browserify/node_modules/resolve/.travis.yml +4 -0
  258. data/node_modules/browserify/node_modules/resolve/LICENSE +18 -0
  259. data/node_modules/browserify/node_modules/resolve/README.markdown +47 -0
  260. data/node_modules/browserify/node_modules/resolve/index.js +106 -0
  261. data/node_modules/browserify/node_modules/resolve/package.json +45 -0
  262. data/node_modules/browserify/node_modules/resolve/test/core.js +12 -0
  263. data/node_modules/browserify/node_modules/resolve/test/filter.js +15 -0
  264. data/node_modules/browserify/node_modules/resolve/test/mock.js +64 -0
  265. data/node_modules/browserify/node_modules/resolve/test/resolver.js +157 -0
  266. data/node_modules/browserify/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js +1 -0
  267. data/node_modules/browserify/node_modules/resolve/test/resolver/baz/doom.js +0 -0
  268. data/node_modules/browserify/node_modules/resolve/test/resolver/baz/package.json +3 -0
  269. data/node_modules/browserify/node_modules/resolve/test/resolver/baz/quux.js +1 -0
  270. data/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js +1 -0
  271. data/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js +1 -0
  272. data/node_modules/browserify/node_modules/resolve/test/resolver/cup.coffee +1 -0
  273. data/node_modules/browserify/node_modules/resolve/test/resolver/foo.js +1 -0
  274. data/node_modules/browserify/node_modules/resolve/test/resolver/mug.coffee +0 -0
  275. data/node_modules/browserify/node_modules/resolve/test/resolver/mug.js +0 -0
  276. data/node_modules/browserify/node_modules/resolve/test/resolver/other_path/lib/other-lib.js +0 -0
  277. data/node_modules/browserify/node_modules/resolve/test/resolver/other_path/root.js +0 -0
  278. data/node_modules/browserify/node_modules/syntax-error/.travis.yml +4 -0
  279. data/node_modules/browserify/node_modules/syntax-error/LICENSE +18 -0
  280. data/node_modules/browserify/node_modules/syntax-error/example/check.js +12 -0
  281. data/node_modules/browserify/node_modules/syntax-error/example/src.js +9 -0
  282. data/node_modules/browserify/node_modules/syntax-error/index.js +54 -0
  283. data/node_modules/browserify/node_modules/syntax-error/node_modules/.bin/esparse +42 -0
  284. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/.travis.yml +5 -0
  285. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/LICENSE.BSD +19 -0
  286. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/README.md +74 -0
  287. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/codemirror/codemirror.css +112 -0
  288. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/codemirror/codemirror.js +2972 -0
  289. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/codemirror/javascript.js +360 -0
  290. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/json2.js +487 -0
  291. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/style.css +164 -0
  292. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/yui/treeview-min.js +12 -0
  293. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/yui/treeview-sprite.gif +0 -0
  294. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/yui/treeview.css +7 -0
  295. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/yui/yahoo-dom-event.js +14 -0
  296. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/bin/esparse.js +42 -0
  297. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/changes +92 -0
  298. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/cm +696 -0
  299. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/checkenv.js +42 -0
  300. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/collector.html +82 -0
  301. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/collector.js +170 -0
  302. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/functiontrace.html +106 -0
  303. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/functiontrace.js +123 -0
  304. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/parse.css +82 -0
  305. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/parse.html +352 -0
  306. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/precedence.html +225 -0
  307. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/rewrite.html +120 -0
  308. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/rewrite.js +71 -0
  309. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/esprima.js +3577 -0
  310. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/index.html +103 -0
  311. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/package.json +42 -0
  312. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/Tokenizer.js +646 -0
  313. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/XMLHttpRequest.js +509 -0
  314. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/ZeParser.js +2185 -0
  315. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/backbone-0.5.3.js +1158 -0
  316. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/benchmark.js +3261 -0
  317. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/escodegen.js +906 -0
  318. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/esmorph.js +240 -0
  319. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/ext-core-3.0.0.js +6579 -0
  320. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/ext-core-3.1.0.js +10255 -0
  321. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jquery-1.6.4.js +9046 -0
  322. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jquery-1.7.1.js +9266 -0
  323. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jquery.mobile-1.0.js +6951 -0
  324. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jsdefs.js +731 -0
  325. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jslex.js +588 -0
  326. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jsparse.js +1921 -0
  327. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/mootools-1.3.2.js +5952 -0
  328. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/mootools-1.4.1.js +6297 -0
  329. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/parse-js.js +1342 -0
  330. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/platform.js +878 -0
  331. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/prototype-1.6.1.js +4874 -0
  332. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/prototype-1.7.0.0.js +6082 -0
  333. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/underscore-1.2.3.js +981 -0
  334. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/benchmarks.html +58 -0
  335. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/benchmarks.js +328 -0
  336. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/compare.html +140 -0
  337. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/compare.js +270 -0
  338. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/compat.html +40 -0
  339. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/compat.js +239 -0
  340. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/coverage.footer.html +3 -0
  341. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/coverage.header.html +37 -0
  342. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/coverage.html +3617 -0
  343. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/index.html +36 -0
  344. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/reflect.js +403 -0
  345. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/run.js +66 -0
  346. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/test.js +16659 -0
  347. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/tools/generate-unicode-regex.py +164 -0
  348. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/tools/update-coverage.sh +28 -0
  349. data/node_modules/browserify/node_modules/syntax-error/package.json +49 -0
  350. data/node_modules/browserify/node_modules/syntax-error/readme.markdown +87 -0
  351. data/node_modules/browserify/node_modules/syntax-error/test/check.js +17 -0
  352. data/node_modules/browserify/node_modules/syntax-error/test/sources/check.js +9 -0
  353. data/node_modules/browserify/node_modules/vm-browserify/README.markdown +103 -0
  354. data/node_modules/browserify/node_modules/vm-browserify/example/run/bundle.js +473 -0
  355. data/node_modules/browserify/node_modules/vm-browserify/example/run/entry.js +6 -0
  356. data/node_modules/browserify/node_modules/vm-browserify/example/run/index.html +9 -0
  357. data/node_modules/browserify/node_modules/vm-browserify/example/run/server.js +6 -0
  358. data/node_modules/browserify/node_modules/vm-browserify/index.js +85 -0
  359. data/node_modules/browserify/node_modules/vm-browserify/package.json +43 -0
  360. data/node_modules/browserify/node_modules/vm-browserify/testling/run.js +22 -0
  361. data/node_modules/browserify/node_modules/vm-browserify/testling/test.sh +11 -0
  362. data/node_modules/browserify/package.json +78 -0
  363. data/node_modules/browserify/test/alias.js +58 -0
  364. data/node_modules/browserify/test/backbone.js +21 -0
  365. data/node_modules/browserify/test/bin.js +39 -0
  366. data/node_modules/browserify/test/buffer.js +99 -0
  367. data/node_modules/browserify/test/bundle.js +32 -0
  368. data/node_modules/browserify/test/cache.js +28 -0
  369. data/node_modules/browserify/test/coffee.js +39 -0
  370. data/node_modules/browserify/test/coffee/bar.js +1 -0
  371. data/node_modules/browserify/test/coffee/baz.coffee +1 -0
  372. data/node_modules/browserify/test/coffee/entry.coffee +1 -0
  373. data/node_modules/browserify/test/coffee/foo.coffee +1 -0
  374. data/node_modules/browserify/test/coffee/index.coffee +5 -0
  375. data/node_modules/browserify/test/coffee/nested/nested.coffee +2 -0
  376. data/node_modules/browserify/test/comment.js +17 -0
  377. data/node_modules/browserify/test/comment/main.js +2 -0
  378. data/node_modules/browserify/test/crypto.js +37 -0
  379. data/node_modules/browserify/test/dnode.js +27 -0
  380. data/node_modules/browserify/test/dollar.js +19 -0
  381. data/node_modules/browserify/test/dollar/dollar/index.js +7 -0
  382. data/node_modules/browserify/test/entry.js +36 -0
  383. data/node_modules/browserify/test/entry/main.js +1 -0
  384. data/node_modules/browserify/test/entry/one.js +1 -0
  385. data/node_modules/browserify/test/entry/two.js +1 -0
  386. data/node_modules/browserify/test/error_code.js +24 -0
  387. data/node_modules/browserify/test/error_code/src.js +2 -0
  388. data/node_modules/browserify/test/export.js +52 -0
  389. data/node_modules/browserify/test/export/entry.js +1 -0
  390. data/node_modules/browserify/test/field.js +64 -0
  391. data/node_modules/browserify/test/field/miss.js +1 -0
  392. data/node_modules/browserify/test/field/node_modules/z-miss/browser.js +1 -0
  393. data/node_modules/browserify/test/field/node_modules/z-miss/main.js +1 -0
  394. data/node_modules/browserify/test/field/node_modules/z-miss/package.json +4 -0
  395. data/node_modules/browserify/test/field/node_modules/z-object/browser.js +1 -0
  396. data/node_modules/browserify/test/field/node_modules/z-object/main.js +1 -0
  397. data/node_modules/browserify/test/field/node_modules/z-object/package.json +6 -0
  398. data/node_modules/browserify/test/field/node_modules/z-string/browser.js +1 -0
  399. data/node_modules/browserify/test/field/node_modules/z-string/main.js +1 -0
  400. data/node_modules/browserify/test/field/node_modules/z-string/package.json +4 -0
  401. data/node_modules/browserify/test/field/node_modules/z-sub/browser/a.js +1 -0
  402. data/node_modules/browserify/test/field/node_modules/z-sub/browser/b.js +1 -0
  403. data/node_modules/browserify/test/field/node_modules/z-sub/main.js +1 -0
  404. data/node_modules/browserify/test/field/node_modules/z-sub/package.json +4 -0
  405. data/node_modules/browserify/test/field/object.js +1 -0
  406. data/node_modules/browserify/test/field/string.js +1 -0
  407. data/node_modules/browserify/test/field/sub.js +1 -0
  408. data/node_modules/browserify/test/global.js +19 -0
  409. data/node_modules/browserify/test/global/main.js +2 -0
  410. data/node_modules/browserify/test/jade.js +35 -0
  411. data/node_modules/browserify/test/json.js +17 -0
  412. data/node_modules/browserify/test/json/beep.json +4 -0
  413. data/node_modules/browserify/test/json/main.js +1 -0
  414. data/node_modules/browserify/test/maxlisteners.js +8 -0
  415. data/node_modules/browserify/test/module.js +22 -0
  416. data/node_modules/browserify/test/multi_entry.js +20 -0
  417. data/node_modules/browserify/test/multi_entry/a.js +2 -0
  418. data/node_modules/browserify/test/multi_entry/b.js +2 -0
  419. data/node_modules/browserify/test/multi_entry/c.js +3 -0
  420. data/node_modules/browserify/test/multi_ignore.js +23 -0
  421. data/node_modules/browserify/test/node_modules/beep/index.js +1 -0
  422. data/node_modules/browserify/test/require_cache.js +18 -0
  423. data/node_modules/browserify/test/retarget.js +27 -0
  424. data/node_modules/browserify/test/seq.js +47 -0
  425. data/node_modules/browserify/test/subdep.js +26 -0
  426. data/node_modules/browserify/test/subdep/index.js +1 -0
  427. data/node_modules/browserify/test/subdep/package.json +6 -0
  428. data/node_modules/browserify/test/util.js +48 -0
  429. data/node_modules/browserify/test/watch.js +91 -0
  430. data/node_modules/browserify/test/watch/a.js +1 -0
  431. data/node_modules/browserify/test/wrap.js +43 -0
  432. data/node_modules/browserify/test/wrap/a.js +2 -0
  433. data/node_modules/browserify/test/wrap/c.js +1 -0
  434. data/node_modules/browserify/test/wrap/node_modules/b/main.js +1 -0
  435. data/node_modules/browserify/test/wrap/node_modules/b/package.json +3 -0
  436. data/node_modules/browserify/test/wrap/node_modules/skipmetoo/index.js +1 -0
  437. data/node_modules/browserify/test/wrap/skipme.js +1 -0
  438. data/node_modules/browserify/test/wrap/x.js +0 -0
  439. data/node_modules/browserify/testling/README.markdown +29 -0
  440. data/node_modules/browserify/testling/test.sh +37 -0
  441. data/node_modules/browserify/testling/tick.js +9 -0
  442. data/node_modules/browserify/testling/timers.js +50 -0
  443. data/node_modules/browserify/testling/util.js +24 -0
  444. data/node_modules/browserify/v2.markdown +41 -0
  445. data/node_modules/browserify/wrappers/alias.js +1 -0
  446. data/node_modules/browserify/wrappers/body.js +2 -0
  447. data/node_modules/browserify/wrappers/body_debug.js +2 -0
  448. data/node_modules/browserify/wrappers/entry.js +3 -0
  449. data/node_modules/browserify/wrappers/entry_debug.js +3 -0
  450. data/node_modules/browserify/wrappers/package.js +3 -0
  451. data/node_modules/browserify/wrappers/prelude.js +196 -0
  452. data/node_modules/coffee-script/.npmignore +11 -0
  453. data/node_modules/coffee-script/CNAME +1 -0
  454. data/node_modules/coffee-script/CONTRIBUTING.md +9 -0
  455. data/node_modules/coffee-script/LICENSE +22 -0
  456. data/node_modules/coffee-script/README +51 -0
  457. data/node_modules/coffee-script/Rakefile +78 -0
  458. data/node_modules/coffee-script/bin/cake +7 -0
  459. data/node_modules/coffee-script/bin/coffee +7 -0
  460. data/node_modules/coffee-script/extras/jsl.conf +44 -0
  461. data/node_modules/coffee-script/lib/coffee-script/browser.js +92 -0
  462. data/node_modules/coffee-script/lib/coffee-script/cake.js +113 -0
  463. data/node_modules/coffee-script/lib/coffee-script/coffee-script.js +171 -0
  464. data/node_modules/coffee-script/lib/coffee-script/command.js +502 -0
  465. data/node_modules/coffee-script/lib/coffee-script/grammar.js +606 -0
  466. data/node_modules/coffee-script/lib/coffee-script/helpers.js +88 -0
  467. data/node_modules/coffee-script/lib/coffee-script/index.js +11 -0
  468. data/node_modules/coffee-script/lib/coffee-script/lexer.js +788 -0
  469. data/node_modules/coffee-script/lib/coffee-script/nodes.js +2971 -0
  470. data/node_modules/coffee-script/lib/coffee-script/optparse.js +138 -0
  471. data/node_modules/coffee-script/lib/coffee-script/parser.js +683 -0
  472. data/node_modules/coffee-script/lib/coffee-script/repl.js +276 -0
  473. data/node_modules/coffee-script/lib/coffee-script/rewriter.js +349 -0
  474. data/node_modules/coffee-script/lib/coffee-script/scope.js +146 -0
  475. data/node_modules/coffee-script/package.json +50 -0
  476. data/node_modules/jade-runtime/.npmignore +15 -0
  477. data/node_modules/jade-runtime/README.md +8 -0
  478. data/node_modules/jade-runtime/globals.js +32 -0
  479. data/node_modules/jade-runtime/index.js +2 -0
  480. data/node_modules/jade-runtime/jade-runtime.js +181 -0
  481. data/node_modules/jade-runtime/package.json +18 -0
  482. data/node_modules/jade/.npmignore +14 -0
  483. data/node_modules/jade/LICENSE +22 -0
  484. data/node_modules/jade/Readme.md +1299 -0
  485. data/node_modules/jade/bin/jade +168 -0
  486. data/node_modules/jade/index.js +4 -0
  487. data/node_modules/jade/jade.js +3586 -0
  488. data/node_modules/jade/jade.md +510 -0
  489. data/node_modules/jade/jade.min.js +2 -0
  490. data/node_modules/jade/lib/compiler.js +654 -0
  491. data/node_modules/jade/lib/doctypes.js +18 -0
  492. data/node_modules/jade/lib/filters.js +97 -0
  493. data/node_modules/jade/lib/inline-tags.js +28 -0
  494. data/node_modules/jade/lib/jade.js +253 -0
  495. data/node_modules/jade/lib/lexer.js +774 -0
  496. data/node_modules/jade/lib/nodes/attrs.js +77 -0
  497. data/node_modules/jade/lib/nodes/block-comment.js +33 -0
  498. data/node_modules/jade/lib/nodes/block.js +122 -0
  499. data/node_modules/jade/lib/nodes/case.js +43 -0
  500. data/node_modules/jade/lib/nodes/code.js +35 -0
  501. data/node_modules/jade/lib/nodes/comment.js +32 -0
  502. data/node_modules/jade/lib/nodes/doctype.js +29 -0
  503. data/node_modules/jade/lib/nodes/each.js +35 -0
  504. data/node_modules/jade/lib/nodes/filter.js +35 -0
  505. data/node_modules/jade/lib/nodes/index.js +20 -0
  506. data/node_modules/jade/lib/nodes/literal.js +32 -0
  507. data/node_modules/jade/lib/nodes/mixin.js +36 -0
  508. data/node_modules/jade/lib/nodes/node.js +25 -0
  509. data/node_modules/jade/lib/nodes/tag.js +95 -0
  510. data/node_modules/jade/lib/nodes/text.js +36 -0
  511. data/node_modules/jade/lib/parser.js +714 -0
  512. data/node_modules/jade/lib/runtime.js +174 -0
  513. data/node_modules/jade/lib/self-closing.js +19 -0
  514. data/node_modules/jade/lib/utils.js +49 -0
  515. data/node_modules/jade/node_modules/commander/.npmignore +4 -0
  516. data/node_modules/jade/node_modules/commander/.travis.yml +4 -0
  517. data/node_modules/jade/node_modules/commander/History.md +107 -0
  518. data/node_modules/jade/node_modules/commander/Makefile +7 -0
  519. data/node_modules/jade/node_modules/commander/Readme.md +262 -0
  520. data/node_modules/jade/node_modules/commander/index.js +2 -0
  521. data/node_modules/jade/node_modules/commander/lib/commander.js +1026 -0
  522. data/node_modules/jade/node_modules/commander/package.json +39 -0
  523. data/node_modules/jade/node_modules/mkdirp/.npmignore +2 -0
  524. data/node_modules/jade/node_modules/mkdirp/.travis.yml +4 -0
  525. data/node_modules/jade/node_modules/mkdirp/LICENSE +21 -0
  526. data/node_modules/jade/node_modules/mkdirp/README.markdown +61 -0
  527. data/node_modules/jade/node_modules/mkdirp/examples/pow.js +6 -0
  528. data/node_modules/jade/node_modules/mkdirp/index.js +82 -0
  529. data/node_modules/jade/node_modules/mkdirp/package.json +37 -0
  530. data/node_modules/jade/node_modules/mkdirp/test/chmod.js +38 -0
  531. data/node_modules/jade/node_modules/mkdirp/test/clobber.js +37 -0
  532. data/node_modules/jade/node_modules/mkdirp/test/mkdirp.js +28 -0
  533. data/node_modules/jade/node_modules/mkdirp/test/perm.js +32 -0
  534. data/node_modules/jade/node_modules/mkdirp/test/perm_sync.js +39 -0
  535. data/node_modules/jade/node_modules/mkdirp/test/race.js +41 -0
  536. data/node_modules/jade/node_modules/mkdirp/test/rel.js +32 -0
  537. data/node_modules/jade/node_modules/mkdirp/test/return.js +25 -0
  538. data/node_modules/jade/node_modules/mkdirp/test/return_sync.js +24 -0
  539. data/node_modules/jade/node_modules/mkdirp/test/root.js +18 -0
  540. data/node_modules/jade/node_modules/mkdirp/test/sync.js +32 -0
  541. data/node_modules/jade/node_modules/mkdirp/test/umask.js +28 -0
  542. data/node_modules/jade/node_modules/mkdirp/test/umask_sync.js +32 -0
  543. data/node_modules/jade/package.json +53 -0
  544. data/node_modules/jade/runtime.js +179 -0
  545. data/node_modules/jade/runtime.min.js +1 -0
  546. data/node_modules/jade/test.jade +7 -0
  547. data/node_modules/jade/testing/head.jade +5 -0
  548. data/node_modules/jade/testing/index.jade +1 -0
  549. data/node_modules/jade/testing/index.js +14 -0
  550. data/node_modules/jade/testing/layout.jade +10 -0
  551. data/node_modules/jade/testing/user.jade +7 -0
  552. data/node_modules/jade/testing/user.js +27 -0
  553. data/node_modules/optimist/.travis.yml +4 -0
  554. data/node_modules/optimist/LICENSE +21 -0
  555. data/node_modules/optimist/README.markdown +487 -0
  556. data/node_modules/optimist/example/bool.js +10 -0
  557. data/node_modules/optimist/example/boolean_double.js +7 -0
  558. data/node_modules/optimist/example/boolean_single.js +7 -0
  559. data/node_modules/optimist/example/default_hash.js +8 -0
  560. data/node_modules/optimist/example/default_singles.js +7 -0
  561. data/node_modules/optimist/example/divide.js +8 -0
  562. data/node_modules/optimist/example/line_count.js +20 -0
  563. data/node_modules/optimist/example/line_count_options.js +29 -0
  564. data/node_modules/optimist/example/line_count_wrap.js +29 -0
  565. data/node_modules/optimist/example/nonopt.js +4 -0
  566. data/node_modules/optimist/example/reflect.js +2 -0
  567. data/node_modules/optimist/example/short.js +3 -0
  568. data/node_modules/optimist/example/string.js +11 -0
  569. data/node_modules/optimist/example/usage-options.js +19 -0
  570. data/node_modules/optimist/example/xup.js +10 -0
  571. data/node_modules/optimist/index.js +475 -0
  572. data/node_modules/optimist/node_modules/wordwrap/.npmignore +1 -0
  573. data/node_modules/optimist/node_modules/wordwrap/README.markdown +70 -0
  574. data/node_modules/optimist/node_modules/wordwrap/example/center.js +10 -0
  575. data/node_modules/optimist/node_modules/wordwrap/example/meat.js +3 -0
  576. data/node_modules/optimist/node_modules/wordwrap/index.js +76 -0
  577. data/node_modules/optimist/node_modules/wordwrap/package.json +45 -0
  578. data/node_modules/optimist/node_modules/wordwrap/test/break.js +30 -0
  579. data/node_modules/optimist/node_modules/wordwrap/test/idleness.txt +63 -0
  580. data/node_modules/optimist/node_modules/wordwrap/test/wrap.js +31 -0
  581. data/node_modules/optimist/package.json +55 -0
  582. data/node_modules/optimist/test/_.js +71 -0
  583. data/node_modules/optimist/test/_/argv.js +2 -0
  584. data/node_modules/optimist/test/_/bin.js +3 -0
  585. data/node_modules/optimist/test/parse.js +420 -0
  586. data/node_modules/optimist/test/usage.js +292 -0
  587. data/snowball.gemspec +1 -2
  588. metadata +601 -21
  589. data/extconf.rb +0 -9
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Module dependencies.
5
+ */
6
+
7
+ var fs = require('fs')
8
+ , program = require('commander')
9
+ , path = require('path')
10
+ , basename = path.basename
11
+ , dirname = path.dirname
12
+ , resolve = path.resolve
13
+ , exists = fs.existsSync || path.existsSync
14
+ , join = path.join
15
+ , mkdirp = require('mkdirp')
16
+ , jade = require('../');
17
+
18
+ // jade options
19
+
20
+ var options = {};
21
+
22
+ // options
23
+
24
+ program
25
+ .version(jade.version)
26
+ .usage('[options] [dir|file ...]')
27
+ .option('-o, --obj <str>', 'javascript options object')
28
+ .option('-O, --out <dir>', 'output the compiled html to <dir>')
29
+ .option('-p, --path <path>', 'filename used to resolve includes')
30
+ .option('-P, --pretty', 'compile pretty html output')
31
+ .option('-c, --client', 'compile function for client-side runtime.js')
32
+ .option('-D, --no-debug', 'compile without debugging (smaller functions)')
33
+ .option('-w, --watch', 'watch files for changes and automatically re-render')
34
+
35
+ program.on('--help', function(){
36
+ console.log(' Examples:');
37
+ console.log('');
38
+ console.log(' # translate jade the templates dir');
39
+ console.log(' $ jade templates');
40
+ console.log('');
41
+ console.log(' # create {foo,bar}.html');
42
+ console.log(' $ jade {foo,bar}.jade');
43
+ console.log('');
44
+ console.log(' # jade over stdio');
45
+ console.log(' $ jade < my.jade > my.html');
46
+ console.log('');
47
+ console.log(' # jade over stdio');
48
+ console.log(' $ echo "h1 Jade!" | jade');
49
+ console.log('');
50
+ console.log(' # foo, bar dirs rendering to /tmp');
51
+ console.log(' $ jade foo bar --out /tmp ');
52
+ console.log('');
53
+ });
54
+
55
+ program.parse(process.argv);
56
+
57
+ // options given, parse them
58
+
59
+ if (program.obj) {
60
+ if (exists(program.obj)) {
61
+ options = JSON.parse(fs.readFileSync(program.obj));
62
+ } else {
63
+ options = eval('(' + program.obj + ')');
64
+ }
65
+ }
66
+
67
+ // --filename
68
+
69
+ if (program.path) options.filename = program.path;
70
+
71
+ // --no-debug
72
+
73
+ options.compileDebug = program.debug;
74
+
75
+ // --client
76
+
77
+ options.client = program.client;
78
+
79
+ // --pretty
80
+
81
+ options.pretty = program.pretty;
82
+
83
+ // --watch
84
+
85
+ options.watch = program.watch;
86
+
87
+ // left-over args are file paths
88
+
89
+ var files = program.args;
90
+
91
+ // compile files
92
+
93
+ if (files.length) {
94
+ console.log();
95
+ files.forEach(renderFile);
96
+ if (options.watch) {
97
+ files.forEach(function (file) {
98
+ fs.watchFile(file, {interval: 100}, function (curr, prev) {
99
+ if (curr.mtime > prev.mtime) renderFile(file);
100
+ });
101
+ });
102
+ }
103
+ process.on('exit', function () {
104
+ console.log();
105
+ });
106
+ // stdio
107
+ } else {
108
+ stdin();
109
+ }
110
+
111
+ /**
112
+ * Compile from stdin.
113
+ */
114
+
115
+ function stdin() {
116
+ var buf = '';
117
+ process.stdin.setEncoding('utf8');
118
+ process.stdin.on('data', function(chunk){ buf += chunk; });
119
+ process.stdin.on('end', function(){
120
+ var fn = jade.compile(buf, options);
121
+ var output = options.client
122
+ ? fn.toString()
123
+ : fn(options);
124
+ process.stdout.write(output);
125
+ }).resume();
126
+ }
127
+
128
+ /**
129
+ * Process the given path, compiling the jade files found.
130
+ * Always walk the subdirectories.
131
+ */
132
+
133
+ function renderFile(path) {
134
+ var re = /\.jade$/;
135
+ fs.lstat(path, function(err, stat) {
136
+ if (err) throw err;
137
+ // Found jade file
138
+ if (stat.isFile() && re.test(path)) {
139
+ fs.readFile(path, 'utf8', function(err, str){
140
+ if (err) throw err;
141
+ options.filename = path;
142
+ var fn = jade.compile(str, options);
143
+ var extname = options.client ? '.js' : '.html';
144
+ path = path.replace(re, extname);
145
+ if (program.out) path = join(program.out, basename(path));
146
+ var dir = resolve(dirname(path));
147
+ mkdirp(dir, 0755, function(err){
148
+ if (err) throw err;
149
+ var output = options.client
150
+ ? fn.toString()
151
+ : fn(options);
152
+ fs.writeFile(path, output, function(err){
153
+ if (err) throw err;
154
+ console.log(' \033[90mrendered \033[36m%s\033[0m', path);
155
+ });
156
+ });
157
+ });
158
+ // Found directory
159
+ } else if (stat.isDirectory()) {
160
+ fs.readdir(path, function(err, files) {
161
+ if (err) throw err;
162
+ files.map(function(filename) {
163
+ return path + '/' + filename;
164
+ }).forEach(renderFile);
165
+ });
166
+ }
167
+ });
168
+ }
@@ -0,0 +1,4 @@
1
+
2
+ module.exports = process.env.JADE_COV
3
+ ? require('./lib-cov/jade')
4
+ : require('./lib/jade');
@@ -0,0 +1,3586 @@
1
+ (function() {
2
+
3
+ // CommonJS require()
4
+
5
+ function require(p){
6
+ var path = require.resolve(p)
7
+ , mod = require.modules[path];
8
+ if (!mod) throw new Error('failed to require "' + p + '"');
9
+ if (!mod.exports) {
10
+ mod.exports = {};
11
+ mod.call(mod.exports, mod, mod.exports, require.relative(path));
12
+ }
13
+ return mod.exports;
14
+ }
15
+
16
+ require.modules = {};
17
+
18
+ require.resolve = function (path){
19
+ var orig = path
20
+ , reg = path + '.js'
21
+ , index = path + '/index.js';
22
+ return require.modules[reg] && reg
23
+ || require.modules[index] && index
24
+ || orig;
25
+ };
26
+
27
+ require.register = function (path, fn){
28
+ require.modules[path] = fn;
29
+ };
30
+
31
+ require.relative = function (parent) {
32
+ return function(p){
33
+ if ('.' != p.charAt(0)) return require(p);
34
+
35
+ var path = parent.split('/')
36
+ , segs = p.split('/');
37
+ path.pop();
38
+
39
+ for (var i = 0; i < segs.length; i++) {
40
+ var seg = segs[i];
41
+ if ('..' == seg) path.pop();
42
+ else if ('.' != seg) path.push(seg);
43
+ }
44
+
45
+ return require(path.join('/'));
46
+ };
47
+ };
48
+
49
+
50
+ require.register("compiler.js", function(module, exports, require){
51
+
52
+ /*!
53
+ * Jade - Compiler
54
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
55
+ * MIT Licensed
56
+ */
57
+
58
+ /**
59
+ * Module dependencies.
60
+ */
61
+
62
+ var nodes = require('./nodes')
63
+ , filters = require('./filters')
64
+ , doctypes = require('./doctypes')
65
+ , selfClosing = require('./self-closing')
66
+ , runtime = require('./runtime')
67
+ , utils = require('./utils');
68
+
69
+
70
+ if (!Object.keys) {
71
+ Object.keys = function(obj){
72
+ var arr = [];
73
+ for (var key in obj) {
74
+ if (obj.hasOwnProperty(key)) {
75
+ arr.push(key);
76
+ }
77
+ }
78
+ return arr;
79
+ }
80
+ }
81
+
82
+ if (!String.prototype.trimLeft) {
83
+ String.prototype.trimLeft = function(){
84
+ return this.replace(/^\s+/, '');
85
+ }
86
+ }
87
+
88
+
89
+
90
+ /**
91
+ * Initialize `Compiler` with the given `node`.
92
+ *
93
+ * @param {Node} node
94
+ * @param {Object} options
95
+ * @api public
96
+ */
97
+
98
+ var Compiler = module.exports = function Compiler(node, options) {
99
+ this.options = options = options || {};
100
+ this.node = node;
101
+ this.hasCompiledDoctype = false;
102
+ this.hasCompiledTag = false;
103
+ this.pp = options.pretty || false;
104
+ this.debug = false !== options.compileDebug;
105
+ this.indents = 0;
106
+ this.parentIndents = 0;
107
+ if (options.doctype) this.setDoctype(options.doctype);
108
+ };
109
+
110
+ /**
111
+ * Compiler prototype.
112
+ */
113
+
114
+ Compiler.prototype = {
115
+
116
+ /**
117
+ * Compile parse tree to JavaScript.
118
+ *
119
+ * @api public
120
+ */
121
+
122
+ compile: function(){
123
+ this.buf = ['var interp;'];
124
+ if (this.pp) this.buf.push("var __indent = [];");
125
+ this.lastBufferedIdx = -1;
126
+ this.visit(this.node);
127
+ return this.buf.join('\n');
128
+ },
129
+
130
+ /**
131
+ * Sets the default doctype `name`. Sets terse mode to `true` when
132
+ * html 5 is used, causing self-closing tags to end with ">" vs "/>",
133
+ * and boolean attributes are not mirrored.
134
+ *
135
+ * @param {string} name
136
+ * @api public
137
+ */
138
+
139
+ setDoctype: function(name){
140
+ var doctype = doctypes[(name || 'default').toLowerCase()];
141
+ doctype = doctype || '<!DOCTYPE ' + name + '>';
142
+ this.doctype = doctype;
143
+ this.terse = '5' == name || 'html' == name;
144
+ this.xml = 0 == this.doctype.indexOf('<?xml');
145
+ },
146
+
147
+ /**
148
+ * Buffer the given `str` optionally escaped.
149
+ *
150
+ * @param {String} str
151
+ * @param {Boolean} esc
152
+ * @api public
153
+ */
154
+
155
+ buffer: function(str, esc){
156
+ if (esc) str = utils.escape(str);
157
+
158
+ if (this.lastBufferedIdx == this.buf.length) {
159
+ this.lastBuffered += str;
160
+ this.buf[this.lastBufferedIdx - 1] = "buf.push('" + this.lastBuffered + "');"
161
+ } else {
162
+ this.buf.push("buf.push('" + str + "');");
163
+ this.lastBuffered = str;
164
+ this.lastBufferedIdx = this.buf.length;
165
+ }
166
+ },
167
+
168
+ /**
169
+ * Buffer an indent based on the current `indent`
170
+ * property and an additional `offset`.
171
+ *
172
+ * @param {Number} offset
173
+ * @param {Boolean} newline
174
+ * @api public
175
+ */
176
+
177
+ prettyIndent: function(offset, newline){
178
+ offset = offset || 0;
179
+ newline = newline ? '\\n' : '';
180
+ this.buffer(newline + Array(this.indents + offset).join(' '));
181
+ if (this.parentIndents)
182
+ this.buf.push("buf.push.apply(buf, __indent);");
183
+ },
184
+
185
+ /**
186
+ * Visit `node`.
187
+ *
188
+ * @param {Node} node
189
+ * @api public
190
+ */
191
+
192
+ visit: function(node){
193
+ var debug = this.debug;
194
+
195
+ if (debug) {
196
+ this.buf.push('__jade.unshift({ lineno: ' + node.line
197
+ + ', filename: ' + (node.filename
198
+ ? JSON.stringify(node.filename)
199
+ : '__jade[0].filename')
200
+ + ' });');
201
+ }
202
+
203
+ // Massive hack to fix our context
204
+ // stack for - else[ if] etc
205
+ if (false === node.debug && this.debug) {
206
+ this.buf.pop();
207
+ this.buf.pop();
208
+ }
209
+
210
+ this.visitNode(node);
211
+
212
+ if (debug) this.buf.push('__jade.shift();');
213
+ },
214
+
215
+ /**
216
+ * Visit `node`.
217
+ *
218
+ * @param {Node} node
219
+ * @api public
220
+ */
221
+
222
+ visitNode: function(node){
223
+ var name = node.constructor.name
224
+ || node.constructor.toString().match(/function ([^(\s]+)()/)[1];
225
+ return this['visit' + name](node);
226
+ },
227
+
228
+ /**
229
+ * Visit case `node`.
230
+ *
231
+ * @param {Literal} node
232
+ * @api public
233
+ */
234
+
235
+ visitCase: function(node){
236
+ var _ = this.withinCase;
237
+ this.withinCase = true;
238
+ this.buf.push('switch (' + node.expr + '){');
239
+ this.visit(node.block);
240
+ this.buf.push('}');
241
+ this.withinCase = _;
242
+ },
243
+
244
+ /**
245
+ * Visit when `node`.
246
+ *
247
+ * @param {Literal} node
248
+ * @api public
249
+ */
250
+
251
+ visitWhen: function(node){
252
+ if ('default' == node.expr) {
253
+ this.buf.push('default:');
254
+ } else {
255
+ this.buf.push('case ' + node.expr + ':');
256
+ }
257
+ this.visit(node.block);
258
+ this.buf.push(' break;');
259
+ },
260
+
261
+ /**
262
+ * Visit literal `node`.
263
+ *
264
+ * @param {Literal} node
265
+ * @api public
266
+ */
267
+
268
+ visitLiteral: function(node){
269
+ var str = node.str.replace(/\n/g, '\\\\n');
270
+ this.buffer(str);
271
+ },
272
+
273
+ /**
274
+ * Visit all nodes in `block`.
275
+ *
276
+ * @param {Block} block
277
+ * @api public
278
+ */
279
+
280
+ visitBlock: function(block){
281
+ var len = block.nodes.length
282
+ , escape = this.escape
283
+ , pp = this.pp
284
+
285
+ // Block keyword has a special meaning in mixins
286
+ if (this.parentIndents && block.mode) {
287
+ if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');")
288
+ this.buf.push('block && block();');
289
+ if (pp) this.buf.push("__indent.pop();")
290
+ return;
291
+ }
292
+
293
+ // Pretty print multi-line text
294
+ if (pp && len > 1 && !escape && block.nodes[0].isText && block.nodes[1].isText)
295
+ this.prettyIndent(1, true);
296
+
297
+ for (var i = 0; i < len; ++i) {
298
+ // Pretty print text
299
+ if (pp && i > 0 && !escape && block.nodes[i].isText && block.nodes[i-1].isText)
300
+ this.prettyIndent(1, false);
301
+
302
+ this.visit(block.nodes[i]);
303
+ // Multiple text nodes are separated by newlines
304
+ if (block.nodes[i+1] && block.nodes[i].isText && block.nodes[i+1].isText)
305
+ this.buffer('\\n');
306
+ }
307
+ },
308
+
309
+ /**
310
+ * Visit `doctype`. Sets terse mode to `true` when html 5
311
+ * is used, causing self-closing tags to end with ">" vs "/>",
312
+ * and boolean attributes are not mirrored.
313
+ *
314
+ * @param {Doctype} doctype
315
+ * @api public
316
+ */
317
+
318
+ visitDoctype: function(doctype){
319
+ if (doctype && (doctype.val || !this.doctype)) {
320
+ this.setDoctype(doctype.val || 'default');
321
+ }
322
+
323
+ if (this.doctype) this.buffer(this.doctype);
324
+ this.hasCompiledDoctype = true;
325
+ },
326
+
327
+ /**
328
+ * Visit `mixin`, generating a function that
329
+ * may be called within the template.
330
+ *
331
+ * @param {Mixin} mixin
332
+ * @api public
333
+ */
334
+
335
+ visitMixin: function(mixin){
336
+ var name = mixin.name.replace(/-/g, '_') + '_mixin'
337
+ , args = mixin.args || ''
338
+ , block = mixin.block
339
+ , attrs = mixin.attrs
340
+ , pp = this.pp;
341
+
342
+ if (mixin.call) {
343
+ if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');")
344
+ if (block || attrs.length) {
345
+
346
+ this.buf.push(name + '.call({');
347
+
348
+ if (block) {
349
+ this.buf.push('block: function(){');
350
+
351
+ // Render block with no indents, dynamically added when rendered
352
+ this.parentIndents++;
353
+ var _indents = this.indents;
354
+ this.indents = 0;
355
+ this.visit(mixin.block);
356
+ this.indents = _indents;
357
+ this.parentIndents--;
358
+
359
+ if (attrs.length) {
360
+ this.buf.push('},');
361
+ } else {
362
+ this.buf.push('}');
363
+ }
364
+ }
365
+
366
+ if (attrs.length) {
367
+ var val = this.attrs(attrs);
368
+ if (val.inherits) {
369
+ this.buf.push('attributes: merge({' + val.buf
370
+ + '}, attributes), escaped: merge(' + val.escaped + ', escaped, true)');
371
+ } else {
372
+ this.buf.push('attributes: {' + val.buf + '}, escaped: ' + val.escaped);
373
+ }
374
+ }
375
+
376
+ if (args) {
377
+ this.buf.push('}, ' + args + ');');
378
+ } else {
379
+ this.buf.push('});');
380
+ }
381
+
382
+ } else {
383
+ this.buf.push(name + '(' + args + ');');
384
+ }
385
+ if (pp) this.buf.push("__indent.pop();")
386
+ } else {
387
+ this.buf.push('var ' + name + ' = function(' + args + '){');
388
+ this.buf.push('var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};');
389
+ this.parentIndents++;
390
+ this.visit(block);
391
+ this.parentIndents--;
392
+ this.buf.push('};');
393
+ }
394
+ },
395
+
396
+ /**
397
+ * Visit `tag` buffering tag markup, generating
398
+ * attributes, visiting the `tag`'s code and block.
399
+ *
400
+ * @param {Tag} tag
401
+ * @api public
402
+ */
403
+
404
+ visitTag: function(tag){
405
+ this.indents++;
406
+ var name = tag.name
407
+ , pp = this.pp;
408
+
409
+ if (tag.buffer) name = "' + (" + name + ") + '";
410
+
411
+ if (!this.hasCompiledTag) {
412
+ if (!this.hasCompiledDoctype && 'html' == name) {
413
+ this.visitDoctype();
414
+ }
415
+ this.hasCompiledTag = true;
416
+ }
417
+
418
+ // pretty print
419
+ if (pp && !tag.isInline())
420
+ this.prettyIndent(0, true);
421
+
422
+ if ((~selfClosing.indexOf(name) || tag.selfClosing) && !this.xml) {
423
+ this.buffer('<' + name);
424
+ this.visitAttributes(tag.attrs);
425
+ this.terse
426
+ ? this.buffer('>')
427
+ : this.buffer('/>');
428
+ } else {
429
+ // Optimize attributes buffering
430
+ if (tag.attrs.length) {
431
+ this.buffer('<' + name);
432
+ if (tag.attrs.length) this.visitAttributes(tag.attrs);
433
+ this.buffer('>');
434
+ } else {
435
+ this.buffer('<' + name + '>');
436
+ }
437
+ if (tag.code) this.visitCode(tag.code);
438
+ this.escape = 'pre' == tag.name;
439
+ this.visit(tag.block);
440
+
441
+ // pretty print
442
+ if (pp && !tag.isInline() && 'pre' != tag.name && !tag.canInline())
443
+ this.prettyIndent(0, true);
444
+
445
+ this.buffer('</' + name + '>');
446
+ }
447
+ this.indents--;
448
+ },
449
+
450
+ /**
451
+ * Visit `filter`, throwing when the filter does not exist.
452
+ *
453
+ * @param {Filter} filter
454
+ * @api public
455
+ */
456
+
457
+ visitFilter: function(filter){
458
+ var fn = filters[filter.name];
459
+
460
+ // unknown filter
461
+ if (!fn) {
462
+ if (filter.isASTFilter) {
463
+ throw new Error('unknown ast filter "' + filter.name + ':"');
464
+ } else {
465
+ throw new Error('unknown filter ":' + filter.name + '"');
466
+ }
467
+ }
468
+
469
+ if (filter.isASTFilter) {
470
+ this.buf.push(fn(filter.block, this, filter.attrs));
471
+ } else {
472
+ var text = filter.block.nodes.map(function(node){ return node.val }).join('\n');
473
+ filter.attrs = filter.attrs || {};
474
+ filter.attrs.filename = this.options.filename;
475
+ this.buffer(utils.text(fn(text, filter.attrs)));
476
+ }
477
+ },
478
+
479
+ /**
480
+ * Visit `text` node.
481
+ *
482
+ * @param {Text} text
483
+ * @api public
484
+ */
485
+
486
+ visitText: function(text){
487
+ text = utils.text(text.val.replace(/\\/g, '\\\\'));
488
+ if (this.escape) text = escape(text);
489
+ this.buffer(text);
490
+ },
491
+
492
+ /**
493
+ * Visit a `comment`, only buffering when the buffer flag is set.
494
+ *
495
+ * @param {Comment} comment
496
+ * @api public
497
+ */
498
+
499
+ visitComment: function(comment){
500
+ if (!comment.buffer) return;
501
+ if (this.pp) this.prettyIndent(1, true);
502
+ this.buffer('<!--' + utils.escape(comment.val) + '-->');
503
+ },
504
+
505
+ /**
506
+ * Visit a `BlockComment`.
507
+ *
508
+ * @param {Comment} comment
509
+ * @api public
510
+ */
511
+
512
+ visitBlockComment: function(comment){
513
+ if (!comment.buffer) return;
514
+ if (0 == comment.val.trim().indexOf('if')) {
515
+ this.buffer('<!--[' + comment.val.trim() + ']>');
516
+ this.visit(comment.block);
517
+ this.buffer('<![endif]-->');
518
+ } else {
519
+ this.buffer('<!--' + comment.val);
520
+ this.visit(comment.block);
521
+ this.buffer('-->');
522
+ }
523
+ },
524
+
525
+ /**
526
+ * Visit `code`, respecting buffer / escape flags.
527
+ * If the code is followed by a block, wrap it in
528
+ * a self-calling function.
529
+ *
530
+ * @param {Code} code
531
+ * @api public
532
+ */
533
+
534
+ visitCode: function(code){
535
+ // Wrap code blocks with {}.
536
+ // we only wrap unbuffered code blocks ATM
537
+ // since they are usually flow control
538
+
539
+ // Buffer code
540
+ if (code.buffer) {
541
+ var val = code.val.trimLeft();
542
+ this.buf.push('var __val__ = ' + val);
543
+ val = 'null == __val__ ? "" : __val__';
544
+ if (code.escape) val = 'escape(' + val + ')';
545
+ this.buf.push("buf.push(" + val + ");");
546
+ } else {
547
+ this.buf.push(code.val);
548
+ }
549
+
550
+ // Block support
551
+ if (code.block) {
552
+ if (!code.buffer) this.buf.push('{');
553
+ this.visit(code.block);
554
+ if (!code.buffer) this.buf.push('}');
555
+ }
556
+ },
557
+
558
+ /**
559
+ * Visit `each` block.
560
+ *
561
+ * @param {Each} each
562
+ * @api public
563
+ */
564
+
565
+ visitEach: function(each){
566
+ this.buf.push(''
567
+ + '// iterate ' + each.obj + '\n'
568
+ + ';(function(){\n'
569
+ + ' if (\'number\' == typeof ' + each.obj + '.length) {\n'
570
+ + ' for (var ' + each.key + ' = 0, $$l = ' + each.obj + '.length; ' + each.key + ' < $$l; ' + each.key + '++) {\n'
571
+ + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n');
572
+
573
+ this.visit(each.block);
574
+
575
+ this.buf.push(''
576
+ + ' }\n'
577
+ + ' } else {\n'
578
+ + ' for (var ' + each.key + ' in ' + each.obj + ') {\n'
579
+ + ' if (' + each.obj + '.hasOwnProperty(' + each.key + ')){'
580
+ + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n');
581
+
582
+ this.visit(each.block);
583
+
584
+ this.buf.push(' }\n');
585
+
586
+ this.buf.push(' }\n }\n}).call(this);\n');
587
+ },
588
+
589
+ /**
590
+ * Visit `attrs`.
591
+ *
592
+ * @param {Array} attrs
593
+ * @api public
594
+ */
595
+
596
+ visitAttributes: function(attrs){
597
+ var val = this.attrs(attrs);
598
+ if (val.inherits) {
599
+ this.buf.push("buf.push(attrs(merge({ " + val.buf +
600
+ " }, attributes), merge(" + val.escaped + ", escaped, true)));");
601
+ } else if (val.constant) {
602
+ eval('var buf={' + val.buf + '};');
603
+ this.buffer(runtime.attrs(buf, JSON.parse(val.escaped)), true);
604
+ } else {
605
+ this.buf.push("buf.push(attrs({ " + val.buf + " }, " + val.escaped + "));");
606
+ }
607
+ },
608
+
609
+ /**
610
+ * Compile attributes.
611
+ */
612
+
613
+ attrs: function(attrs){
614
+ var buf = []
615
+ , classes = []
616
+ , escaped = {}
617
+ , constant = attrs.every(function(attr){ return isConstant(attr.val) })
618
+ , inherits = false;
619
+
620
+ if (this.terse) buf.push('terse: true');
621
+
622
+ attrs.forEach(function(attr){
623
+ if (attr.name == 'attributes') return inherits = true;
624
+ escaped[attr.name] = attr.escaped;
625
+ if (attr.name == 'class') {
626
+ classes.push('(' + attr.val + ')');
627
+ } else {
628
+ var pair = "'" + attr.name + "':(" + attr.val + ')';
629
+ buf.push(pair);
630
+ }
631
+ });
632
+
633
+ if (classes.length) {
634
+ classes = classes.join(" + ' ' + ");
635
+ buf.push("class: " + classes);
636
+ }
637
+
638
+ return {
639
+ buf: buf.join(', ').replace('class:', '"class":'),
640
+ escaped: JSON.stringify(escaped),
641
+ inherits: inherits,
642
+ constant: constant
643
+ };
644
+ }
645
+ };
646
+
647
+ /**
648
+ * Check if expression can be evaluated to a constant
649
+ *
650
+ * @param {String} expression
651
+ * @return {Boolean}
652
+ * @api private
653
+ */
654
+
655
+ function isConstant(val){
656
+ // Check strings/literals
657
+ if (/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val))
658
+ return true;
659
+
660
+ // Check numbers
661
+ if (!isNaN(Number(val)))
662
+ return true;
663
+
664
+ // Check arrays
665
+ var matches;
666
+ if (matches = /^ *\[(.*)\] *$/.exec(val))
667
+ return matches[1].split(',').every(isConstant);
668
+
669
+ return false;
670
+ }
671
+
672
+ /**
673
+ * Escape the given string of `html`.
674
+ *
675
+ * @param {String} html
676
+ * @return {String}
677
+ * @api private
678
+ */
679
+
680
+ function escape(html){
681
+ return String(html)
682
+ .replace(/&(?!\w+;)/g, '&amp;')
683
+ .replace(/</g, '&lt;')
684
+ .replace(/>/g, '&gt;')
685
+ .replace(/"/g, '&quot;');
686
+ }
687
+ }); // module: compiler.js
688
+
689
+ require.register("doctypes.js", function(module, exports, require){
690
+
691
+ /*!
692
+ * Jade - doctypes
693
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
694
+ * MIT Licensed
695
+ */
696
+
697
+ module.exports = {
698
+ '5': '<!DOCTYPE html>'
699
+ , 'default': '<!DOCTYPE html>'
700
+ , 'xml': '<?xml version="1.0" encoding="utf-8" ?>'
701
+ , 'transitional': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
702
+ , 'strict': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
703
+ , 'frameset': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">'
704
+ , '1.1': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'
705
+ , 'basic': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">'
706
+ , 'mobile': '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">'
707
+ };
708
+ }); // module: doctypes.js
709
+
710
+ require.register("filters.js", function(module, exports, require){
711
+
712
+ /*!
713
+ * Jade - filters
714
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
715
+ * MIT Licensed
716
+ */
717
+
718
+ module.exports = {
719
+
720
+ /**
721
+ * Wrap text with CDATA block.
722
+ */
723
+
724
+ cdata: function(str){
725
+ return '<![CDATA[\\n' + str + '\\n]]>';
726
+ },
727
+
728
+ /**
729
+ * Transform sass to css, wrapped in style tags.
730
+ */
731
+
732
+ sass: function(str){
733
+ str = str.replace(/\\n/g, '\n');
734
+ var sass = require('sass').render(str).replace(/\n/g, '\\n');
735
+ return '<style type="text/css">' + sass + '</style>';
736
+ },
737
+
738
+ /**
739
+ * Transform stylus to css, wrapped in style tags.
740
+ */
741
+
742
+ stylus: function(str, options){
743
+ var ret;
744
+ str = str.replace(/\\n/g, '\n');
745
+ var stylus = require('stylus');
746
+ stylus(str, options).render(function(err, css){
747
+ if (err) throw err;
748
+ ret = css.replace(/\n/g, '\\n');
749
+ });
750
+ return '<style type="text/css">' + ret + '</style>';
751
+ },
752
+
753
+ /**
754
+ * Transform less to css, wrapped in style tags.
755
+ */
756
+
757
+ less: function(str){
758
+ var ret;
759
+ str = str.replace(/\\n/g, '\n');
760
+ require('less').render(str, function(err, css){
761
+ if (err) throw err;
762
+ ret = '<style type="text/css">' + css.replace(/\n/g, '\\n') + '</style>';
763
+ });
764
+ return ret;
765
+ },
766
+
767
+ /**
768
+ * Transform markdown to html.
769
+ */
770
+
771
+ markdown: function(str){
772
+ var md;
773
+
774
+ // support markdown / discount
775
+ try {
776
+ md = require('markdown');
777
+ } catch (err){
778
+ try {
779
+ md = require('discount');
780
+ } catch (err) {
781
+ try {
782
+ md = require('markdown-js');
783
+ } catch (err) {
784
+ try {
785
+ md = require('marked');
786
+ } catch (err) {
787
+ throw new
788
+ Error('Cannot find markdown library, install markdown, discount, or marked.');
789
+ }
790
+ }
791
+ }
792
+ }
793
+
794
+ str = str.replace(/\\n/g, '\n');
795
+ return md.parse(str).replace(/\n/g, '\\n').replace(/'/g,'&#39;');
796
+ },
797
+
798
+ /**
799
+ * Transform coffeescript to javascript.
800
+ */
801
+
802
+ coffeescript: function(str){
803
+ str = str.replace(/\\n/g, '\n');
804
+ var js = require('coffee-script').compile(str).replace(/\\/g, '\\\\').replace(/\n/g, '\\n');
805
+ return '<script type="text/javascript">\\n' + js + '</script>';
806
+ }
807
+ };
808
+
809
+ }); // module: filters.js
810
+
811
+ require.register("inline-tags.js", function(module, exports, require){
812
+
813
+ /*!
814
+ * Jade - inline tags
815
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
816
+ * MIT Licensed
817
+ */
818
+
819
+ module.exports = [
820
+ 'a'
821
+ , 'abbr'
822
+ , 'acronym'
823
+ , 'b'
824
+ , 'br'
825
+ , 'code'
826
+ , 'em'
827
+ , 'font'
828
+ , 'i'
829
+ , 'img'
830
+ , 'ins'
831
+ , 'kbd'
832
+ , 'map'
833
+ , 'samp'
834
+ , 'small'
835
+ , 'span'
836
+ , 'strong'
837
+ , 'sub'
838
+ , 'sup'
839
+ ];
840
+ }); // module: inline-tags.js
841
+
842
+ require.register("jade.js", function(module, exports, require){
843
+ /*!
844
+ * Jade
845
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
846
+ * MIT Licensed
847
+ */
848
+
849
+ /**
850
+ * Module dependencies.
851
+ */
852
+
853
+ var Parser = require('./parser')
854
+ , Lexer = require('./lexer')
855
+ , Compiler = require('./compiler')
856
+ , runtime = require('./runtime')
857
+
858
+ /**
859
+ * Library version.
860
+ */
861
+
862
+ exports.version = '0.26.1';
863
+
864
+ /**
865
+ * Expose self closing tags.
866
+ */
867
+
868
+ exports.selfClosing = require('./self-closing');
869
+
870
+ /**
871
+ * Default supported doctypes.
872
+ */
873
+
874
+ exports.doctypes = require('./doctypes');
875
+
876
+ /**
877
+ * Text filters.
878
+ */
879
+
880
+ exports.filters = require('./filters');
881
+
882
+ /**
883
+ * Utilities.
884
+ */
885
+
886
+ exports.utils = require('./utils');
887
+
888
+ /**
889
+ * Expose `Compiler`.
890
+ */
891
+
892
+ exports.Compiler = Compiler;
893
+
894
+ /**
895
+ * Expose `Parser`.
896
+ */
897
+
898
+ exports.Parser = Parser;
899
+
900
+ /**
901
+ * Expose `Lexer`.
902
+ */
903
+
904
+ exports.Lexer = Lexer;
905
+
906
+ /**
907
+ * Nodes.
908
+ */
909
+
910
+ exports.nodes = require('./nodes');
911
+
912
+ /**
913
+ * Jade runtime helpers.
914
+ */
915
+
916
+ exports.runtime = runtime;
917
+
918
+ /**
919
+ * Template function cache.
920
+ */
921
+
922
+ exports.cache = {};
923
+
924
+ /**
925
+ * Parse the given `str` of jade and return a function body.
926
+ *
927
+ * @param {String} str
928
+ * @param {Object} options
929
+ * @return {String}
930
+ * @api private
931
+ */
932
+
933
+ function parse(str, options){
934
+ try {
935
+ // Parse
936
+ var parser = new Parser(str, options.filename, options);
937
+
938
+ // Compile
939
+ var compiler = new (options.compiler || Compiler)(parser.parse(), options)
940
+ , js = compiler.compile();
941
+
942
+ // Debug compiler
943
+ if (options.debug) {
944
+ console.error('\nCompiled Function:\n\n\033[90m%s\033[0m', js.replace(/^/gm, ' '));
945
+ }
946
+
947
+ return ''
948
+ + 'var buf = [];\n'
949
+ + (options.self
950
+ ? 'var self = locals || {};\n' + js
951
+ : 'with (locals || {}) {\n' + js + '\n}\n')
952
+ + 'return buf.join("");';
953
+ } catch (err) {
954
+ parser = parser.context();
955
+ runtime.rethrow(err, parser.filename, parser.lexer.lineno);
956
+ }
957
+ }
958
+
959
+ /**
960
+ * Compile a `Function` representation of the given jade `str`.
961
+ *
962
+ * Options:
963
+ *
964
+ * - `compileDebug` when `false` debugging code is stripped from the compiled template
965
+ * - `client` when `true` the helper functions `escape()` etc will reference `jade.escape()`
966
+ * for use with the Jade client-side runtime.js
967
+ *
968
+ * @param {String} str
969
+ * @param {Options} options
970
+ * @return {Function}
971
+ * @api public
972
+ */
973
+
974
+ exports.compile = function(str, options){
975
+ var options = options || {}
976
+ , client = options.client
977
+ , filename = options.filename
978
+ ? JSON.stringify(options.filename)
979
+ : 'undefined'
980
+ , fn;
981
+
982
+ if (options.compileDebug !== false) {
983
+ fn = [
984
+ 'var __jade = [{ lineno: 1, filename: ' + filename + ' }];'
985
+ , 'try {'
986
+ , parse(String(str), options)
987
+ , '} catch (err) {'
988
+ , ' rethrow(err, __jade[0].filename, __jade[0].lineno);'
989
+ , '}'
990
+ ].join('\n');
991
+ } else {
992
+ fn = parse(String(str), options);
993
+ }
994
+
995
+ if (client) {
996
+ fn = 'attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n' + fn;
997
+ }
998
+
999
+ fn = new Function('locals, attrs, escape, rethrow, merge', fn);
1000
+
1001
+ if (client) return fn;
1002
+
1003
+ return function(locals){
1004
+ return fn(locals, runtime.attrs, runtime.escape, runtime.rethrow, runtime.merge);
1005
+ };
1006
+ };
1007
+
1008
+ /**
1009
+ * Render the given `str` of jade and invoke
1010
+ * the callback `fn(err, str)`.
1011
+ *
1012
+ * Options:
1013
+ *
1014
+ * - `cache` enable template caching
1015
+ * - `filename` filename required for `include` / `extends` and caching
1016
+ *
1017
+ * @param {String} str
1018
+ * @param {Object|Function} options or fn
1019
+ * @param {Function} fn
1020
+ * @api public
1021
+ */
1022
+
1023
+ exports.render = function(str, options, fn){
1024
+ // swap args
1025
+ if ('function' == typeof options) {
1026
+ fn = options, options = {};
1027
+ }
1028
+
1029
+ // cache requires .filename
1030
+ if (options.cache && !options.filename) {
1031
+ return fn(new Error('the "filename" option is required for caching'));
1032
+ }
1033
+
1034
+ try {
1035
+ var path = options.filename;
1036
+ var tmpl = options.cache
1037
+ ? exports.cache[path] || (exports.cache[path] = exports.compile(str, options))
1038
+ : exports.compile(str, options);
1039
+ fn(null, tmpl(options));
1040
+ } catch (err) {
1041
+ fn(err);
1042
+ }
1043
+ };
1044
+
1045
+ /**
1046
+ * Render a Jade file at the given `path` and callback `fn(err, str)`.
1047
+ *
1048
+ * @param {String} path
1049
+ * @param {Object|Function} options or callback
1050
+ * @param {Function} fn
1051
+ * @api public
1052
+ */
1053
+
1054
+ exports.renderFile = function(path, options, fn){
1055
+ var key = path + ':string';
1056
+
1057
+ if ('function' == typeof options) {
1058
+ fn = options, options = {};
1059
+ }
1060
+
1061
+ try {
1062
+ options.filename = path;
1063
+ var str = options.cache
1064
+ ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8'))
1065
+ : fs.readFileSync(path, 'utf8');
1066
+ exports.render(str, options, fn);
1067
+ } catch (err) {
1068
+ fn(err);
1069
+ }
1070
+ };
1071
+
1072
+ /**
1073
+ * Express support.
1074
+ */
1075
+
1076
+ exports.__express = exports.renderFile;
1077
+
1078
+ }); // module: jade.js
1079
+
1080
+ require.register("lexer.js", function(module, exports, require){
1081
+
1082
+ /*!
1083
+ * Jade - Lexer
1084
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
1085
+ * MIT Licensed
1086
+ */
1087
+
1088
+ /**
1089
+ * Initialize `Lexer` with the given `str`.
1090
+ *
1091
+ * Options:
1092
+ *
1093
+ * - `colons` allow colons for attr delimiters
1094
+ *
1095
+ * @param {String} str
1096
+ * @param {Object} options
1097
+ * @api private
1098
+ */
1099
+
1100
+ var Lexer = module.exports = function Lexer(str, options) {
1101
+ options = options || {};
1102
+ this.input = str.replace(/\r\n|\r/g, '\n');
1103
+ this.colons = options.colons;
1104
+ this.deferredTokens = [];
1105
+ this.lastIndents = 0;
1106
+ this.lineno = 1;
1107
+ this.stash = [];
1108
+ this.indentStack = [];
1109
+ this.indentRe = null;
1110
+ this.pipeless = false;
1111
+ };
1112
+
1113
+ /**
1114
+ * Lexer prototype.
1115
+ */
1116
+
1117
+ Lexer.prototype = {
1118
+
1119
+ /**
1120
+ * Construct a token with the given `type` and `val`.
1121
+ *
1122
+ * @param {String} type
1123
+ * @param {String} val
1124
+ * @return {Object}
1125
+ * @api private
1126
+ */
1127
+
1128
+ tok: function(type, val){
1129
+ return {
1130
+ type: type
1131
+ , line: this.lineno
1132
+ , val: val
1133
+ }
1134
+ },
1135
+
1136
+ /**
1137
+ * Consume the given `len` of input.
1138
+ *
1139
+ * @param {Number} len
1140
+ * @api private
1141
+ */
1142
+
1143
+ consume: function(len){
1144
+ this.input = this.input.substr(len);
1145
+ },
1146
+
1147
+ /**
1148
+ * Scan for `type` with the given `regexp`.
1149
+ *
1150
+ * @param {String} type
1151
+ * @param {RegExp} regexp
1152
+ * @return {Object}
1153
+ * @api private
1154
+ */
1155
+
1156
+ scan: function(regexp, type){
1157
+ var captures;
1158
+ if (captures = regexp.exec(this.input)) {
1159
+ this.consume(captures[0].length);
1160
+ return this.tok(type, captures[1]);
1161
+ }
1162
+ },
1163
+
1164
+ /**
1165
+ * Defer the given `tok`.
1166
+ *
1167
+ * @param {Object} tok
1168
+ * @api private
1169
+ */
1170
+
1171
+ defer: function(tok){
1172
+ this.deferredTokens.push(tok);
1173
+ },
1174
+
1175
+ /**
1176
+ * Lookahead `n` tokens.
1177
+ *
1178
+ * @param {Number} n
1179
+ * @return {Object}
1180
+ * @api private
1181
+ */
1182
+
1183
+ lookahead: function(n){
1184
+ var fetch = n - this.stash.length;
1185
+ while (fetch-- > 0) this.stash.push(this.next());
1186
+ return this.stash[--n];
1187
+ },
1188
+
1189
+ /**
1190
+ * Return the indexOf `start` / `end` delimiters.
1191
+ *
1192
+ * @param {String} start
1193
+ * @param {String} end
1194
+ * @return {Number}
1195
+ * @api private
1196
+ */
1197
+
1198
+ indexOfDelimiters: function(start, end){
1199
+ var str = this.input
1200
+ , nstart = 0
1201
+ , nend = 0
1202
+ , pos = 0;
1203
+ for (var i = 0, len = str.length; i < len; ++i) {
1204
+ if (start == str.charAt(i)) {
1205
+ ++nstart;
1206
+ } else if (end == str.charAt(i)) {
1207
+ if (++nend == nstart) {
1208
+ pos = i;
1209
+ break;
1210
+ }
1211
+ }
1212
+ }
1213
+ return pos;
1214
+ },
1215
+
1216
+ /**
1217
+ * Stashed token.
1218
+ */
1219
+
1220
+ stashed: function() {
1221
+ return this.stash.length
1222
+ && this.stash.shift();
1223
+ },
1224
+
1225
+ /**
1226
+ * Deferred token.
1227
+ */
1228
+
1229
+ deferred: function() {
1230
+ return this.deferredTokens.length
1231
+ && this.deferredTokens.shift();
1232
+ },
1233
+
1234
+ /**
1235
+ * end-of-source.
1236
+ */
1237
+
1238
+ eos: function() {
1239
+ if (this.input.length) return;
1240
+ if (this.indentStack.length) {
1241
+ this.indentStack.shift();
1242
+ return this.tok('outdent');
1243
+ } else {
1244
+ return this.tok('eos');
1245
+ }
1246
+ },
1247
+
1248
+ /**
1249
+ * Blank line.
1250
+ */
1251
+
1252
+ blank: function() {
1253
+ var captures;
1254
+ if (captures = /^\n *\n/.exec(this.input)) {
1255
+ this.consume(captures[0].length - 1);
1256
+ if (this.pipeless) return this.tok('text', '');
1257
+ return this.next();
1258
+ }
1259
+ },
1260
+
1261
+ /**
1262
+ * Comment.
1263
+ */
1264
+
1265
+ comment: function() {
1266
+ var captures;
1267
+ if (captures = /^ *\/\/(-)?([^\n]*)/.exec(this.input)) {
1268
+ this.consume(captures[0].length);
1269
+ var tok = this.tok('comment', captures[2]);
1270
+ tok.buffer = '-' != captures[1];
1271
+ return tok;
1272
+ }
1273
+ },
1274
+
1275
+ /**
1276
+ * Interpolated tag.
1277
+ */
1278
+
1279
+ interpolation: function() {
1280
+ var captures;
1281
+ if (captures = /^#\{(.*?)\}/.exec(this.input)) {
1282
+ this.consume(captures[0].length);
1283
+ return this.tok('interpolation', captures[1]);
1284
+ }
1285
+ },
1286
+
1287
+ /**
1288
+ * Tag.
1289
+ */
1290
+
1291
+ tag: function() {
1292
+ var captures;
1293
+ if (captures = /^(\w[-:\w]*)(\/?)/.exec(this.input)) {
1294
+ this.consume(captures[0].length);
1295
+ var tok, name = captures[1];
1296
+ if (':' == name[name.length - 1]) {
1297
+ name = name.slice(0, -1);
1298
+ tok = this.tok('tag', name);
1299
+ this.defer(this.tok(':'));
1300
+ while (' ' == this.input[0]) this.input = this.input.substr(1);
1301
+ } else {
1302
+ tok = this.tok('tag', name);
1303
+ }
1304
+ tok.selfClosing = !! captures[2];
1305
+ return tok;
1306
+ }
1307
+ },
1308
+
1309
+ /**
1310
+ * Filter.
1311
+ */
1312
+
1313
+ filter: function() {
1314
+ return this.scan(/^:(\w+)/, 'filter');
1315
+ },
1316
+
1317
+ /**
1318
+ * Doctype.
1319
+ */
1320
+
1321
+ doctype: function() {
1322
+ return this.scan(/^(?:!!!|doctype) *([^\n]+)?/, 'doctype');
1323
+ },
1324
+
1325
+ /**
1326
+ * Id.
1327
+ */
1328
+
1329
+ id: function() {
1330
+ return this.scan(/^#([\w-]+)/, 'id');
1331
+ },
1332
+
1333
+ /**
1334
+ * Class.
1335
+ */
1336
+
1337
+ className: function() {
1338
+ return this.scan(/^\.([\w-]+)/, 'class');
1339
+ },
1340
+
1341
+ /**
1342
+ * Text.
1343
+ */
1344
+
1345
+ text: function() {
1346
+ return this.scan(/^(?:\| ?| ?)?([^\n]+)/, 'text');
1347
+ },
1348
+
1349
+ /**
1350
+ * Extends.
1351
+ */
1352
+
1353
+ "extends": function() {
1354
+ return this.scan(/^extends? +([^\n]+)/, 'extends');
1355
+ },
1356
+
1357
+ /**
1358
+ * Block prepend.
1359
+ */
1360
+
1361
+ prepend: function() {
1362
+ var captures;
1363
+ if (captures = /^prepend +([^\n]+)/.exec(this.input)) {
1364
+ this.consume(captures[0].length);
1365
+ var mode = 'prepend'
1366
+ , name = captures[1]
1367
+ , tok = this.tok('block', name);
1368
+ tok.mode = mode;
1369
+ return tok;
1370
+ }
1371
+ },
1372
+
1373
+ /**
1374
+ * Block append.
1375
+ */
1376
+
1377
+ append: function() {
1378
+ var captures;
1379
+ if (captures = /^append +([^\n]+)/.exec(this.input)) {
1380
+ this.consume(captures[0].length);
1381
+ var mode = 'append'
1382
+ , name = captures[1]
1383
+ , tok = this.tok('block', name);
1384
+ tok.mode = mode;
1385
+ return tok;
1386
+ }
1387
+ },
1388
+
1389
+ /**
1390
+ * Block.
1391
+ */
1392
+
1393
+ block: function() {
1394
+ var captures;
1395
+ if (captures = /^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)) {
1396
+ this.consume(captures[0].length);
1397
+ var mode = captures[1] || 'replace'
1398
+ , name = captures[2]
1399
+ , tok = this.tok('block', name);
1400
+
1401
+ tok.mode = mode;
1402
+ return tok;
1403
+ }
1404
+ },
1405
+
1406
+ /**
1407
+ * Yield.
1408
+ */
1409
+
1410
+ yield: function() {
1411
+ return this.scan(/^yield */, 'yield');
1412
+ },
1413
+
1414
+ /**
1415
+ * Include.
1416
+ */
1417
+
1418
+ include: function() {
1419
+ return this.scan(/^include +([^\n]+)/, 'include');
1420
+ },
1421
+
1422
+ /**
1423
+ * Case.
1424
+ */
1425
+
1426
+ "case": function() {
1427
+ return this.scan(/^case +([^\n]+)/, 'case');
1428
+ },
1429
+
1430
+ /**
1431
+ * When.
1432
+ */
1433
+
1434
+ when: function() {
1435
+ return this.scan(/^when +([^:\n]+)/, 'when');
1436
+ },
1437
+
1438
+ /**
1439
+ * Default.
1440
+ */
1441
+
1442
+ "default": function() {
1443
+ return this.scan(/^default */, 'default');
1444
+ },
1445
+
1446
+ /**
1447
+ * Assignment.
1448
+ */
1449
+
1450
+ assignment: function() {
1451
+ var captures;
1452
+ if (captures = /^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)) {
1453
+ this.consume(captures[0].length);
1454
+ var name = captures[1]
1455
+ , val = captures[2];
1456
+ return this.tok('code', 'var ' + name + ' = (' + val + ');');
1457
+ }
1458
+ },
1459
+
1460
+ /**
1461
+ * Call mixin.
1462
+ */
1463
+
1464
+ call: function(){
1465
+ var captures;
1466
+ if (captures = /^\+([-\w]+)/.exec(this.input)) {
1467
+ this.consume(captures[0].length);
1468
+ var tok = this.tok('call', captures[1]);
1469
+
1470
+ // Check for args (not attributes)
1471
+ if (captures = /^ *\((.*?)\)/.exec(this.input)) {
1472
+ if (!/^ *[-\w]+ *=/.test(captures[1])) {
1473
+ this.consume(captures[0].length);
1474
+ tok.args = captures[1];
1475
+ }
1476
+ }
1477
+
1478
+ return tok;
1479
+ }
1480
+ },
1481
+
1482
+ /**
1483
+ * Mixin.
1484
+ */
1485
+
1486
+ mixin: function(){
1487
+ var captures;
1488
+ if (captures = /^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)) {
1489
+ this.consume(captures[0].length);
1490
+ var tok = this.tok('mixin', captures[1]);
1491
+ tok.args = captures[2];
1492
+ return tok;
1493
+ }
1494
+ },
1495
+
1496
+ /**
1497
+ * Conditional.
1498
+ */
1499
+
1500
+ conditional: function() {
1501
+ var captures;
1502
+ if (captures = /^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)) {
1503
+ this.consume(captures[0].length);
1504
+ var type = captures[1]
1505
+ , js = captures[2];
1506
+
1507
+ switch (type) {
1508
+ case 'if': js = 'if (' + js + ')'; break;
1509
+ case 'unless': js = 'if (!(' + js + '))'; break;
1510
+ case 'else if': js = 'else if (' + js + ')'; break;
1511
+ case 'else': js = 'else'; break;
1512
+ }
1513
+
1514
+ return this.tok('code', js);
1515
+ }
1516
+ },
1517
+
1518
+ /**
1519
+ * While.
1520
+ */
1521
+
1522
+ "while": function() {
1523
+ var captures;
1524
+ if (captures = /^while +([^\n]+)/.exec(this.input)) {
1525
+ this.consume(captures[0].length);
1526
+ return this.tok('code', 'while (' + captures[1] + ')');
1527
+ }
1528
+ },
1529
+
1530
+ /**
1531
+ * Each.
1532
+ */
1533
+
1534
+ each: function() {
1535
+ var captures;
1536
+ if (captures = /^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)) {
1537
+ this.consume(captures[0].length);
1538
+ var tok = this.tok('each', captures[1]);
1539
+ tok.key = captures[2] || '$index';
1540
+ tok.code = captures[3];
1541
+ return tok;
1542
+ }
1543
+ },
1544
+
1545
+ /**
1546
+ * Code.
1547
+ */
1548
+
1549
+ code: function() {
1550
+ var captures;
1551
+ if (captures = /^(!?=|-)([^\n]+)/.exec(this.input)) {
1552
+ this.consume(captures[0].length);
1553
+ var flags = captures[1];
1554
+ captures[1] = captures[2];
1555
+ var tok = this.tok('code', captures[1]);
1556
+ tok.escape = flags[0] === '=';
1557
+ tok.buffer = flags[0] === '=' || flags[1] === '=';
1558
+ return tok;
1559
+ }
1560
+ },
1561
+
1562
+ /**
1563
+ * Attributes.
1564
+ */
1565
+
1566
+ attrs: function() {
1567
+ if ('(' == this.input.charAt(0)) {
1568
+ var index = this.indexOfDelimiters('(', ')')
1569
+ , str = this.input.substr(1, index-1)
1570
+ , tok = this.tok('attrs')
1571
+ , len = str.length
1572
+ , colons = this.colons
1573
+ , states = ['key']
1574
+ , escapedAttr
1575
+ , key = ''
1576
+ , val = ''
1577
+ , quote
1578
+ , c
1579
+ , p;
1580
+
1581
+ function state(){
1582
+ return states[states.length - 1];
1583
+ }
1584
+
1585
+ function interpolate(attr) {
1586
+ return attr.replace(/#\{([^}]+)\}/g, function(_, expr){
1587
+ return quote + " + (" + expr + ") + " + quote;
1588
+ });
1589
+ }
1590
+
1591
+ this.consume(index + 1);
1592
+ tok.attrs = {};
1593
+ tok.escaped = {};
1594
+
1595
+ function parse(c) {
1596
+ var real = c;
1597
+ // TODO: remove when people fix ":"
1598
+ if (colons && ':' == c) c = '=';
1599
+ switch (c) {
1600
+ case ',':
1601
+ case '\n':
1602
+ switch (state()) {
1603
+ case 'expr':
1604
+ case 'array':
1605
+ case 'string':
1606
+ case 'object':
1607
+ val += c;
1608
+ break;
1609
+ default:
1610
+ states.push('key');
1611
+ val = val.trim();
1612
+ key = key.trim();
1613
+ if ('' == key) return;
1614
+ key = key.replace(/^['"]|['"]$/g, '').replace('!', '');
1615
+ tok.escaped[key] = escapedAttr;
1616
+ tok.attrs[key] = '' == val
1617
+ ? true
1618
+ : interpolate(val);
1619
+ key = val = '';
1620
+ }
1621
+ break;
1622
+ case '=':
1623
+ switch (state()) {
1624
+ case 'key char':
1625
+ key += real;
1626
+ break;
1627
+ case 'val':
1628
+ case 'expr':
1629
+ case 'array':
1630
+ case 'string':
1631
+ case 'object':
1632
+ val += real;
1633
+ break;
1634
+ default:
1635
+ escapedAttr = '!' != p;
1636
+ states.push('val');
1637
+ }
1638
+ break;
1639
+ case '(':
1640
+ if ('val' == state()
1641
+ || 'expr' == state()) states.push('expr');
1642
+ val += c;
1643
+ break;
1644
+ case ')':
1645
+ if ('expr' == state()
1646
+ || 'val' == state()) states.pop();
1647
+ val += c;
1648
+ break;
1649
+ case '{':
1650
+ if ('val' == state()) states.push('object');
1651
+ val += c;
1652
+ break;
1653
+ case '}':
1654
+ if ('object' == state()) states.pop();
1655
+ val += c;
1656
+ break;
1657
+ case '[':
1658
+ if ('val' == state()) states.push('array');
1659
+ val += c;
1660
+ break;
1661
+ case ']':
1662
+ if ('array' == state()) states.pop();
1663
+ val += c;
1664
+ break;
1665
+ case '"':
1666
+ case "'":
1667
+ switch (state()) {
1668
+ case 'key':
1669
+ states.push('key char');
1670
+ break;
1671
+ case 'key char':
1672
+ states.pop();
1673
+ break;
1674
+ case 'string':
1675
+ if (c == quote) states.pop();
1676
+ val += c;
1677
+ break;
1678
+ default:
1679
+ states.push('string');
1680
+ val += c;
1681
+ quote = c;
1682
+ }
1683
+ break;
1684
+ case '':
1685
+ break;
1686
+ default:
1687
+ switch (state()) {
1688
+ case 'key':
1689
+ case 'key char':
1690
+ key += c;
1691
+ break;
1692
+ default:
1693
+ val += c;
1694
+ }
1695
+ }
1696
+ p = c;
1697
+ }
1698
+
1699
+ for (var i = 0; i < len; ++i) {
1700
+ parse(str.charAt(i));
1701
+ }
1702
+
1703
+ parse(',');
1704
+
1705
+ if ('/' == this.input.charAt(0)) {
1706
+ this.consume(1);
1707
+ tok.selfClosing = true;
1708
+ }
1709
+
1710
+ return tok;
1711
+ }
1712
+ },
1713
+
1714
+ /**
1715
+ * Indent | Outdent | Newline.
1716
+ */
1717
+
1718
+ indent: function() {
1719
+ var captures, re;
1720
+
1721
+ // established regexp
1722
+ if (this.indentRe) {
1723
+ captures = this.indentRe.exec(this.input);
1724
+ // determine regexp
1725
+ } else {
1726
+ // tabs
1727
+ re = /^\n(\t*) */;
1728
+ captures = re.exec(this.input);
1729
+
1730
+ // spaces
1731
+ if (captures && !captures[1].length) {
1732
+ re = /^\n( *)/;
1733
+ captures = re.exec(this.input);
1734
+ }
1735
+
1736
+ // established
1737
+ if (captures && captures[1].length) this.indentRe = re;
1738
+ }
1739
+
1740
+ if (captures) {
1741
+ var tok
1742
+ , indents = captures[1].length;
1743
+
1744
+ ++this.lineno;
1745
+ this.consume(indents + 1);
1746
+
1747
+ if (' ' == this.input[0] || '\t' == this.input[0]) {
1748
+ throw new Error('Invalid indentation, you can use tabs or spaces but not both');
1749
+ }
1750
+
1751
+ // blank line
1752
+ if ('\n' == this.input[0]) return this.tok('newline');
1753
+
1754
+ // outdent
1755
+ if (this.indentStack.length && indents < this.indentStack[0]) {
1756
+ while (this.indentStack.length && this.indentStack[0] > indents) {
1757
+ this.stash.push(this.tok('outdent'));
1758
+ this.indentStack.shift();
1759
+ }
1760
+ tok = this.stash.pop();
1761
+ // indent
1762
+ } else if (indents && indents != this.indentStack[0]) {
1763
+ this.indentStack.unshift(indents);
1764
+ tok = this.tok('indent', indents);
1765
+ // newline
1766
+ } else {
1767
+ tok = this.tok('newline');
1768
+ }
1769
+
1770
+ return tok;
1771
+ }
1772
+ },
1773
+
1774
+ /**
1775
+ * Pipe-less text consumed only when
1776
+ * pipeless is true;
1777
+ */
1778
+
1779
+ pipelessText: function() {
1780
+ if (this.pipeless) {
1781
+ if ('\n' == this.input[0]) return;
1782
+ var i = this.input.indexOf('\n');
1783
+ if (-1 == i) i = this.input.length;
1784
+ var str = this.input.substr(0, i);
1785
+ this.consume(str.length);
1786
+ return this.tok('text', str);
1787
+ }
1788
+ },
1789
+
1790
+ /**
1791
+ * ':'
1792
+ */
1793
+
1794
+ colon: function() {
1795
+ return this.scan(/^: */, ':');
1796
+ },
1797
+
1798
+ /**
1799
+ * Return the next token object, or those
1800
+ * previously stashed by lookahead.
1801
+ *
1802
+ * @return {Object}
1803
+ * @api private
1804
+ */
1805
+
1806
+ advance: function(){
1807
+ return this.stashed()
1808
+ || this.next();
1809
+ },
1810
+
1811
+ /**
1812
+ * Return the next token object.
1813
+ *
1814
+ * @return {Object}
1815
+ * @api private
1816
+ */
1817
+
1818
+ next: function() {
1819
+ return this.deferred()
1820
+ || this.blank()
1821
+ || this.eos()
1822
+ || this.pipelessText()
1823
+ || this.yield()
1824
+ || this.doctype()
1825
+ || this.interpolation()
1826
+ || this["case"]()
1827
+ || this.when()
1828
+ || this["default"]()
1829
+ || this["extends"]()
1830
+ || this.append()
1831
+ || this.prepend()
1832
+ || this.block()
1833
+ || this.include()
1834
+ || this.mixin()
1835
+ || this.call()
1836
+ || this.conditional()
1837
+ || this.each()
1838
+ || this["while"]()
1839
+ || this.assignment()
1840
+ || this.tag()
1841
+ || this.filter()
1842
+ || this.code()
1843
+ || this.id()
1844
+ || this.className()
1845
+ || this.attrs()
1846
+ || this.indent()
1847
+ || this.comment()
1848
+ || this.colon()
1849
+ || this.text();
1850
+ }
1851
+ };
1852
+
1853
+ }); // module: lexer.js
1854
+
1855
+ require.register("nodes/attrs.js", function(module, exports, require){
1856
+
1857
+ /*!
1858
+ * Jade - nodes - Attrs
1859
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
1860
+ * MIT Licensed
1861
+ */
1862
+
1863
+ /**
1864
+ * Module dependencies.
1865
+ */
1866
+
1867
+ var Node = require('./node'),
1868
+ Block = require('./block');
1869
+
1870
+ /**
1871
+ * Initialize a `Attrs` node.
1872
+ *
1873
+ * @api public
1874
+ */
1875
+
1876
+ var Attrs = module.exports = function Attrs() {
1877
+ this.attrs = [];
1878
+ };
1879
+
1880
+ /**
1881
+ * Inherit from `Node`.
1882
+ */
1883
+
1884
+ Attrs.prototype = new Node;
1885
+ Attrs.prototype.constructor = Attrs;
1886
+
1887
+
1888
+ /**
1889
+ * Set attribute `name` to `val`, keep in mind these become
1890
+ * part of a raw js object literal, so to quote a value you must
1891
+ * '"quote me"', otherwise or example 'user.name' is literal JavaScript.
1892
+ *
1893
+ * @param {String} name
1894
+ * @param {String} val
1895
+ * @param {Boolean} escaped
1896
+ * @return {Tag} for chaining
1897
+ * @api public
1898
+ */
1899
+
1900
+ Attrs.prototype.setAttribute = function(name, val, escaped){
1901
+ this.attrs.push({ name: name, val: val, escaped: escaped });
1902
+ return this;
1903
+ };
1904
+
1905
+ /**
1906
+ * Remove attribute `name` when present.
1907
+ *
1908
+ * @param {String} name
1909
+ * @api public
1910
+ */
1911
+
1912
+ Attrs.prototype.removeAttribute = function(name){
1913
+ for (var i = 0, len = this.attrs.length; i < len; ++i) {
1914
+ if (this.attrs[i] && this.attrs[i].name == name) {
1915
+ delete this.attrs[i];
1916
+ }
1917
+ }
1918
+ };
1919
+
1920
+ /**
1921
+ * Get attribute value by `name`.
1922
+ *
1923
+ * @param {String} name
1924
+ * @return {String}
1925
+ * @api public
1926
+ */
1927
+
1928
+ Attrs.prototype.getAttribute = function(name){
1929
+ for (var i = 0, len = this.attrs.length; i < len; ++i) {
1930
+ if (this.attrs[i] && this.attrs[i].name == name) {
1931
+ return this.attrs[i].val;
1932
+ }
1933
+ }
1934
+ };
1935
+
1936
+ }); // module: nodes/attrs.js
1937
+
1938
+ require.register("nodes/block-comment.js", function(module, exports, require){
1939
+
1940
+ /*!
1941
+ * Jade - nodes - BlockComment
1942
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
1943
+ * MIT Licensed
1944
+ */
1945
+
1946
+ /**
1947
+ * Module dependencies.
1948
+ */
1949
+
1950
+ var Node = require('./node');
1951
+
1952
+ /**
1953
+ * Initialize a `BlockComment` with the given `block`.
1954
+ *
1955
+ * @param {String} val
1956
+ * @param {Block} block
1957
+ * @param {Boolean} buffer
1958
+ * @api public
1959
+ */
1960
+
1961
+ var BlockComment = module.exports = function BlockComment(val, block, buffer) {
1962
+ this.block = block;
1963
+ this.val = val;
1964
+ this.buffer = buffer;
1965
+ };
1966
+
1967
+ /**
1968
+ * Inherit from `Node`.
1969
+ */
1970
+
1971
+ BlockComment.prototype = new Node;
1972
+ BlockComment.prototype.constructor = BlockComment;
1973
+
1974
+ }); // module: nodes/block-comment.js
1975
+
1976
+ require.register("nodes/block.js", function(module, exports, require){
1977
+
1978
+ /*!
1979
+ * Jade - nodes - Block
1980
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
1981
+ * MIT Licensed
1982
+ */
1983
+
1984
+ /**
1985
+ * Module dependencies.
1986
+ */
1987
+
1988
+ var Node = require('./node');
1989
+
1990
+ /**
1991
+ * Initialize a new `Block` with an optional `node`.
1992
+ *
1993
+ * @param {Node} node
1994
+ * @api public
1995
+ */
1996
+
1997
+ var Block = module.exports = function Block(node){
1998
+ this.nodes = [];
1999
+ if (node) this.push(node);
2000
+ };
2001
+
2002
+ /**
2003
+ * Inherit from `Node`.
2004
+ */
2005
+
2006
+ Block.prototype = new Node;
2007
+ Block.prototype.constructor = Block;
2008
+
2009
+
2010
+ /**
2011
+ * Block flag.
2012
+ */
2013
+
2014
+ Block.prototype.isBlock = true;
2015
+
2016
+ /**
2017
+ * Replace the nodes in `other` with the nodes
2018
+ * in `this` block.
2019
+ *
2020
+ * @param {Block} other
2021
+ * @api private
2022
+ */
2023
+
2024
+ Block.prototype.replace = function(other){
2025
+ other.nodes = this.nodes;
2026
+ };
2027
+
2028
+ /**
2029
+ * Pust the given `node`.
2030
+ *
2031
+ * @param {Node} node
2032
+ * @return {Number}
2033
+ * @api public
2034
+ */
2035
+
2036
+ Block.prototype.push = function(node){
2037
+ return this.nodes.push(node);
2038
+ };
2039
+
2040
+ /**
2041
+ * Check if this block is empty.
2042
+ *
2043
+ * @return {Boolean}
2044
+ * @api public
2045
+ */
2046
+
2047
+ Block.prototype.isEmpty = function(){
2048
+ return 0 == this.nodes.length;
2049
+ };
2050
+
2051
+ /**
2052
+ * Unshift the given `node`.
2053
+ *
2054
+ * @param {Node} node
2055
+ * @return {Number}
2056
+ * @api public
2057
+ */
2058
+
2059
+ Block.prototype.unshift = function(node){
2060
+ return this.nodes.unshift(node);
2061
+ };
2062
+
2063
+ /**
2064
+ * Return the "last" block, or the first `yield` node.
2065
+ *
2066
+ * @return {Block}
2067
+ * @api private
2068
+ */
2069
+
2070
+ Block.prototype.includeBlock = function(){
2071
+ var ret = this
2072
+ , node;
2073
+
2074
+ for (var i = 0, len = this.nodes.length; i < len; ++i) {
2075
+ node = this.nodes[i];
2076
+ if (node.yield) return node;
2077
+ else if (node.textOnly) continue;
2078
+ else if (node.includeBlock) ret = node.includeBlock();
2079
+ else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock();
2080
+ }
2081
+
2082
+ return ret;
2083
+ };
2084
+
2085
+ /**
2086
+ * Return a clone of this block.
2087
+ *
2088
+ * @return {Block}
2089
+ * @api private
2090
+ */
2091
+
2092
+ Block.prototype.clone = function(){
2093
+ var clone = new Block;
2094
+ for (var i = 0, len = this.nodes.length; i < len; ++i) {
2095
+ clone.push(this.nodes[i].clone());
2096
+ }
2097
+ return clone;
2098
+ };
2099
+
2100
+
2101
+ }); // module: nodes/block.js
2102
+
2103
+ require.register("nodes/case.js", function(module, exports, require){
2104
+
2105
+ /*!
2106
+ * Jade - nodes - Case
2107
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2108
+ * MIT Licensed
2109
+ */
2110
+
2111
+ /**
2112
+ * Module dependencies.
2113
+ */
2114
+
2115
+ var Node = require('./node');
2116
+
2117
+ /**
2118
+ * Initialize a new `Case` with `expr`.
2119
+ *
2120
+ * @param {String} expr
2121
+ * @api public
2122
+ */
2123
+
2124
+ var Case = exports = module.exports = function Case(expr, block){
2125
+ this.expr = expr;
2126
+ this.block = block;
2127
+ };
2128
+
2129
+ /**
2130
+ * Inherit from `Node`.
2131
+ */
2132
+
2133
+ Case.prototype = new Node;
2134
+ Case.prototype.constructor = Case;
2135
+
2136
+
2137
+ var When = exports.When = function When(expr, block){
2138
+ this.expr = expr;
2139
+ this.block = block;
2140
+ this.debug = false;
2141
+ };
2142
+
2143
+ /**
2144
+ * Inherit from `Node`.
2145
+ */
2146
+
2147
+ When.prototype = new Node;
2148
+ When.prototype.constructor = When;
2149
+
2150
+
2151
+
2152
+ }); // module: nodes/case.js
2153
+
2154
+ require.register("nodes/code.js", function(module, exports, require){
2155
+
2156
+ /*!
2157
+ * Jade - nodes - Code
2158
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2159
+ * MIT Licensed
2160
+ */
2161
+
2162
+ /**
2163
+ * Module dependencies.
2164
+ */
2165
+
2166
+ var Node = require('./node');
2167
+
2168
+ /**
2169
+ * Initialize a `Code` node with the given code `val`.
2170
+ * Code may also be optionally buffered and escaped.
2171
+ *
2172
+ * @param {String} val
2173
+ * @param {Boolean} buffer
2174
+ * @param {Boolean} escape
2175
+ * @api public
2176
+ */
2177
+
2178
+ var Code = module.exports = function Code(val, buffer, escape) {
2179
+ this.val = val;
2180
+ this.buffer = buffer;
2181
+ this.escape = escape;
2182
+ if (val.match(/^ *else/)) this.debug = false;
2183
+ };
2184
+
2185
+ /**
2186
+ * Inherit from `Node`.
2187
+ */
2188
+
2189
+ Code.prototype = new Node;
2190
+ Code.prototype.constructor = Code;
2191
+
2192
+ }); // module: nodes/code.js
2193
+
2194
+ require.register("nodes/comment.js", function(module, exports, require){
2195
+
2196
+ /*!
2197
+ * Jade - nodes - Comment
2198
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2199
+ * MIT Licensed
2200
+ */
2201
+
2202
+ /**
2203
+ * Module dependencies.
2204
+ */
2205
+
2206
+ var Node = require('./node');
2207
+
2208
+ /**
2209
+ * Initialize a `Comment` with the given `val`, optionally `buffer`,
2210
+ * otherwise the comment may render in the output.
2211
+ *
2212
+ * @param {String} val
2213
+ * @param {Boolean} buffer
2214
+ * @api public
2215
+ */
2216
+
2217
+ var Comment = module.exports = function Comment(val, buffer) {
2218
+ this.val = val;
2219
+ this.buffer = buffer;
2220
+ };
2221
+
2222
+ /**
2223
+ * Inherit from `Node`.
2224
+ */
2225
+
2226
+ Comment.prototype = new Node;
2227
+ Comment.prototype.constructor = Comment;
2228
+
2229
+ }); // module: nodes/comment.js
2230
+
2231
+ require.register("nodes/doctype.js", function(module, exports, require){
2232
+
2233
+ /*!
2234
+ * Jade - nodes - Doctype
2235
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2236
+ * MIT Licensed
2237
+ */
2238
+
2239
+ /**
2240
+ * Module dependencies.
2241
+ */
2242
+
2243
+ var Node = require('./node');
2244
+
2245
+ /**
2246
+ * Initialize a `Doctype` with the given `val`.
2247
+ *
2248
+ * @param {String} val
2249
+ * @api public
2250
+ */
2251
+
2252
+ var Doctype = module.exports = function Doctype(val) {
2253
+ this.val = val;
2254
+ };
2255
+
2256
+ /**
2257
+ * Inherit from `Node`.
2258
+ */
2259
+
2260
+ Doctype.prototype = new Node;
2261
+ Doctype.prototype.constructor = Doctype;
2262
+
2263
+ }); // module: nodes/doctype.js
2264
+
2265
+ require.register("nodes/each.js", function(module, exports, require){
2266
+
2267
+ /*!
2268
+ * Jade - nodes - Each
2269
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2270
+ * MIT Licensed
2271
+ */
2272
+
2273
+ /**
2274
+ * Module dependencies.
2275
+ */
2276
+
2277
+ var Node = require('./node');
2278
+
2279
+ /**
2280
+ * Initialize an `Each` node, representing iteration
2281
+ *
2282
+ * @param {String} obj
2283
+ * @param {String} val
2284
+ * @param {String} key
2285
+ * @param {Block} block
2286
+ * @api public
2287
+ */
2288
+
2289
+ var Each = module.exports = function Each(obj, val, key, block) {
2290
+ this.obj = obj;
2291
+ this.val = val;
2292
+ this.key = key;
2293
+ this.block = block;
2294
+ };
2295
+
2296
+ /**
2297
+ * Inherit from `Node`.
2298
+ */
2299
+
2300
+ Each.prototype = new Node;
2301
+ Each.prototype.constructor = Each;
2302
+
2303
+ }); // module: nodes/each.js
2304
+
2305
+ require.register("nodes/filter.js", function(module, exports, require){
2306
+
2307
+ /*!
2308
+ * Jade - nodes - Filter
2309
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2310
+ * MIT Licensed
2311
+ */
2312
+
2313
+ /**
2314
+ * Module dependencies.
2315
+ */
2316
+
2317
+ var Node = require('./node')
2318
+ , Block = require('./block');
2319
+
2320
+ /**
2321
+ * Initialize a `Filter` node with the given
2322
+ * filter `name` and `block`.
2323
+ *
2324
+ * @param {String} name
2325
+ * @param {Block|Node} block
2326
+ * @api public
2327
+ */
2328
+
2329
+ var Filter = module.exports = function Filter(name, block, attrs) {
2330
+ this.name = name;
2331
+ this.block = block;
2332
+ this.attrs = attrs;
2333
+ this.isASTFilter = !block.nodes.every(function(node){ return node.isText });
2334
+ };
2335
+
2336
+ /**
2337
+ * Inherit from `Node`.
2338
+ */
2339
+
2340
+ Filter.prototype = new Node;
2341
+ Filter.prototype.constructor = Filter;
2342
+
2343
+ }); // module: nodes/filter.js
2344
+
2345
+ require.register("nodes/index.js", function(module, exports, require){
2346
+
2347
+ /*!
2348
+ * Jade - nodes
2349
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2350
+ * MIT Licensed
2351
+ */
2352
+
2353
+ exports.Node = require('./node');
2354
+ exports.Tag = require('./tag');
2355
+ exports.Code = require('./code');
2356
+ exports.Each = require('./each');
2357
+ exports.Case = require('./case');
2358
+ exports.Text = require('./text');
2359
+ exports.Block = require('./block');
2360
+ exports.Mixin = require('./mixin');
2361
+ exports.Filter = require('./filter');
2362
+ exports.Comment = require('./comment');
2363
+ exports.Literal = require('./literal');
2364
+ exports.BlockComment = require('./block-comment');
2365
+ exports.Doctype = require('./doctype');
2366
+
2367
+ }); // module: nodes/index.js
2368
+
2369
+ require.register("nodes/literal.js", function(module, exports, require){
2370
+
2371
+ /*!
2372
+ * Jade - nodes - Literal
2373
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2374
+ * MIT Licensed
2375
+ */
2376
+
2377
+ /**
2378
+ * Module dependencies.
2379
+ */
2380
+
2381
+ var Node = require('./node');
2382
+
2383
+ /**
2384
+ * Initialize a `Literal` node with the given `str.
2385
+ *
2386
+ * @param {String} str
2387
+ * @api public
2388
+ */
2389
+
2390
+ var Literal = module.exports = function Literal(str) {
2391
+ this.str = str
2392
+ .replace(/\\/g, "\\\\")
2393
+ .replace(/\n|\r\n/g, "\\n")
2394
+ .replace(/'/g, "\\'");
2395
+ };
2396
+
2397
+ /**
2398
+ * Inherit from `Node`.
2399
+ */
2400
+
2401
+ Literal.prototype = new Node;
2402
+ Literal.prototype.constructor = Literal;
2403
+
2404
+
2405
+ }); // module: nodes/literal.js
2406
+
2407
+ require.register("nodes/mixin.js", function(module, exports, require){
2408
+
2409
+ /*!
2410
+ * Jade - nodes - Mixin
2411
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2412
+ * MIT Licensed
2413
+ */
2414
+
2415
+ /**
2416
+ * Module dependencies.
2417
+ */
2418
+
2419
+ var Attrs = require('./attrs');
2420
+
2421
+ /**
2422
+ * Initialize a new `Mixin` with `name` and `block`.
2423
+ *
2424
+ * @param {String} name
2425
+ * @param {String} args
2426
+ * @param {Block} block
2427
+ * @api public
2428
+ */
2429
+
2430
+ var Mixin = module.exports = function Mixin(name, args, block, call){
2431
+ this.name = name;
2432
+ this.args = args;
2433
+ this.block = block;
2434
+ this.attrs = [];
2435
+ this.call = call;
2436
+ };
2437
+
2438
+ /**
2439
+ * Inherit from `Attrs`.
2440
+ */
2441
+
2442
+ Mixin.prototype = new Attrs;
2443
+ Mixin.prototype.constructor = Mixin;
2444
+
2445
+
2446
+
2447
+ }); // module: nodes/mixin.js
2448
+
2449
+ require.register("nodes/node.js", function(module, exports, require){
2450
+
2451
+ /*!
2452
+ * Jade - nodes - Node
2453
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2454
+ * MIT Licensed
2455
+ */
2456
+
2457
+ /**
2458
+ * Initialize a `Node`.
2459
+ *
2460
+ * @api public
2461
+ */
2462
+
2463
+ var Node = module.exports = function Node(){};
2464
+
2465
+ /**
2466
+ * Clone this node (return itself)
2467
+ *
2468
+ * @return {Node}
2469
+ * @api private
2470
+ */
2471
+
2472
+ Node.prototype.clone = function(){
2473
+ return this;
2474
+ };
2475
+
2476
+ }); // module: nodes/node.js
2477
+
2478
+ require.register("nodes/tag.js", function(module, exports, require){
2479
+
2480
+ /*!
2481
+ * Jade - nodes - Tag
2482
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2483
+ * MIT Licensed
2484
+ */
2485
+
2486
+ /**
2487
+ * Module dependencies.
2488
+ */
2489
+
2490
+ var Attrs = require('./attrs'),
2491
+ Block = require('./block'),
2492
+ inlineTags = require('../inline-tags');
2493
+
2494
+ /**
2495
+ * Initialize a `Tag` node with the given tag `name` and optional `block`.
2496
+ *
2497
+ * @param {String} name
2498
+ * @param {Block} block
2499
+ * @api public
2500
+ */
2501
+
2502
+ var Tag = module.exports = function Tag(name, block) {
2503
+ this.name = name;
2504
+ this.attrs = [];
2505
+ this.block = block || new Block;
2506
+ };
2507
+
2508
+ /**
2509
+ * Inherit from `Attrs`.
2510
+ */
2511
+
2512
+ Tag.prototype = new Attrs;
2513
+ Tag.prototype.constructor = Tag;
2514
+
2515
+
2516
+ /**
2517
+ * Clone this tag.
2518
+ *
2519
+ * @return {Tag}
2520
+ * @api private
2521
+ */
2522
+
2523
+ Tag.prototype.clone = function(){
2524
+ var clone = new Tag(this.name, this.block.clone());
2525
+ clone.line = this.line;
2526
+ clone.attrs = this.attrs;
2527
+ clone.textOnly = this.textOnly;
2528
+ return clone;
2529
+ };
2530
+
2531
+ /**
2532
+ * Check if this tag is an inline tag.
2533
+ *
2534
+ * @return {Boolean}
2535
+ * @api private
2536
+ */
2537
+
2538
+ Tag.prototype.isInline = function(){
2539
+ return ~inlineTags.indexOf(this.name);
2540
+ };
2541
+
2542
+ /**
2543
+ * Check if this tag's contents can be inlined. Used for pretty printing.
2544
+ *
2545
+ * @return {Boolean}
2546
+ * @api private
2547
+ */
2548
+
2549
+ Tag.prototype.canInline = function(){
2550
+ var nodes = this.block.nodes;
2551
+
2552
+ function isInline(node){
2553
+ // Recurse if the node is a block
2554
+ if (node.isBlock) return node.nodes.every(isInline);
2555
+ return node.isText || (node.isInline && node.isInline());
2556
+ }
2557
+
2558
+ // Empty tag
2559
+ if (!nodes.length) return true;
2560
+
2561
+ // Text-only or inline-only tag
2562
+ if (1 == nodes.length) return isInline(nodes[0]);
2563
+
2564
+ // Multi-line inline-only tag
2565
+ if (this.block.nodes.every(isInline)) {
2566
+ for (var i = 1, len = nodes.length; i < len; ++i) {
2567
+ if (nodes[i-1].isText && nodes[i].isText)
2568
+ return false;
2569
+ }
2570
+ return true;
2571
+ }
2572
+
2573
+ // Mixed tag
2574
+ return false;
2575
+ };
2576
+ }); // module: nodes/tag.js
2577
+
2578
+ require.register("nodes/text.js", function(module, exports, require){
2579
+
2580
+ /*!
2581
+ * Jade - nodes - Text
2582
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2583
+ * MIT Licensed
2584
+ */
2585
+
2586
+ /**
2587
+ * Module dependencies.
2588
+ */
2589
+
2590
+ var Node = require('./node');
2591
+
2592
+ /**
2593
+ * Initialize a `Text` node with optional `line`.
2594
+ *
2595
+ * @param {String} line
2596
+ * @api public
2597
+ */
2598
+
2599
+ var Text = module.exports = function Text(line) {
2600
+ this.val = '';
2601
+ if ('string' == typeof line) this.val = line;
2602
+ };
2603
+
2604
+ /**
2605
+ * Inherit from `Node`.
2606
+ */
2607
+
2608
+ Text.prototype = new Node;
2609
+ Text.prototype.constructor = Text;
2610
+
2611
+
2612
+ /**
2613
+ * Flag as text.
2614
+ */
2615
+
2616
+ Text.prototype.isText = true;
2617
+ }); // module: nodes/text.js
2618
+
2619
+ require.register("parser.js", function(module, exports, require){
2620
+
2621
+ /*!
2622
+ * Jade - Parser
2623
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
2624
+ * MIT Licensed
2625
+ */
2626
+
2627
+ /**
2628
+ * Module dependencies.
2629
+ */
2630
+
2631
+ var Lexer = require('./lexer')
2632
+ , nodes = require('./nodes');
2633
+
2634
+ /**
2635
+ * Initialize `Parser` with the given input `str` and `filename`.
2636
+ *
2637
+ * @param {String} str
2638
+ * @param {String} filename
2639
+ * @param {Object} options
2640
+ * @api public
2641
+ */
2642
+
2643
+ var Parser = exports = module.exports = function Parser(str, filename, options){
2644
+ this.input = str;
2645
+ this.lexer = new Lexer(str, options);
2646
+ this.filename = filename;
2647
+ this.blocks = {};
2648
+ this.mixins = {};
2649
+ this.options = options;
2650
+ this.contexts = [this];
2651
+ };
2652
+
2653
+ /**
2654
+ * Tags that may not contain tags.
2655
+ */
2656
+
2657
+ var textOnly = exports.textOnly = ['script', 'style'];
2658
+
2659
+ /**
2660
+ * Parser prototype.
2661
+ */
2662
+
2663
+ Parser.prototype = {
2664
+
2665
+ /**
2666
+ * Push `parser` onto the context stack,
2667
+ * or pop and return a `Parser`.
2668
+ */
2669
+
2670
+ context: function(parser){
2671
+ if (parser) {
2672
+ this.contexts.push(parser);
2673
+ } else {
2674
+ return this.contexts.pop();
2675
+ }
2676
+ },
2677
+
2678
+ /**
2679
+ * Return the next token object.
2680
+ *
2681
+ * @return {Object}
2682
+ * @api private
2683
+ */
2684
+
2685
+ advance: function(){
2686
+ return this.lexer.advance();
2687
+ },
2688
+
2689
+ /**
2690
+ * Skip `n` tokens.
2691
+ *
2692
+ * @param {Number} n
2693
+ * @api private
2694
+ */
2695
+
2696
+ skip: function(n){
2697
+ while (n--) this.advance();
2698
+ },
2699
+
2700
+ /**
2701
+ * Single token lookahead.
2702
+ *
2703
+ * @return {Object}
2704
+ * @api private
2705
+ */
2706
+
2707
+ peek: function() {
2708
+ return this.lookahead(1);
2709
+ },
2710
+
2711
+ /**
2712
+ * Return lexer lineno.
2713
+ *
2714
+ * @return {Number}
2715
+ * @api private
2716
+ */
2717
+
2718
+ line: function() {
2719
+ return this.lexer.lineno;
2720
+ },
2721
+
2722
+ /**
2723
+ * `n` token lookahead.
2724
+ *
2725
+ * @param {Number} n
2726
+ * @return {Object}
2727
+ * @api private
2728
+ */
2729
+
2730
+ lookahead: function(n){
2731
+ return this.lexer.lookahead(n);
2732
+ },
2733
+
2734
+ /**
2735
+ * Parse input returning a string of js for evaluation.
2736
+ *
2737
+ * @return {String}
2738
+ * @api public
2739
+ */
2740
+
2741
+ parse: function(){
2742
+ var block = new nodes.Block, parser;
2743
+ block.line = this.line();
2744
+
2745
+ while ('eos' != this.peek().type) {
2746
+ if ('newline' == this.peek().type) {
2747
+ this.advance();
2748
+ } else {
2749
+ block.push(this.parseExpr());
2750
+ }
2751
+ }
2752
+
2753
+ if (parser = this.extending) {
2754
+ this.context(parser);
2755
+ var ast = parser.parse();
2756
+ this.context();
2757
+ // hoist mixins
2758
+ for (var name in this.mixins)
2759
+ ast.unshift(this.mixins[name]);
2760
+ return ast;
2761
+ }
2762
+
2763
+ return block;
2764
+ },
2765
+
2766
+ /**
2767
+ * Expect the given type, or throw an exception.
2768
+ *
2769
+ * @param {String} type
2770
+ * @api private
2771
+ */
2772
+
2773
+ expect: function(type){
2774
+ if (this.peek().type === type) {
2775
+ return this.advance();
2776
+ } else {
2777
+ throw new Error('expected "' + type + '", but got "' + this.peek().type + '"');
2778
+ }
2779
+ },
2780
+
2781
+ /**
2782
+ * Accept the given `type`.
2783
+ *
2784
+ * @param {String} type
2785
+ * @api private
2786
+ */
2787
+
2788
+ accept: function(type){
2789
+ if (this.peek().type === type) {
2790
+ return this.advance();
2791
+ }
2792
+ },
2793
+
2794
+ /**
2795
+ * tag
2796
+ * | doctype
2797
+ * | mixin
2798
+ * | include
2799
+ * | filter
2800
+ * | comment
2801
+ * | text
2802
+ * | each
2803
+ * | code
2804
+ * | yield
2805
+ * | id
2806
+ * | class
2807
+ * | interpolation
2808
+ */
2809
+
2810
+ parseExpr: function(){
2811
+ switch (this.peek().type) {
2812
+ case 'tag':
2813
+ return this.parseTag();
2814
+ case 'mixin':
2815
+ return this.parseMixin();
2816
+ case 'block':
2817
+ return this.parseBlock();
2818
+ case 'case':
2819
+ return this.parseCase();
2820
+ case 'when':
2821
+ return this.parseWhen();
2822
+ case 'default':
2823
+ return this.parseDefault();
2824
+ case 'extends':
2825
+ return this.parseExtends();
2826
+ case 'include':
2827
+ return this.parseInclude();
2828
+ case 'doctype':
2829
+ return this.parseDoctype();
2830
+ case 'filter':
2831
+ return this.parseFilter();
2832
+ case 'comment':
2833
+ return this.parseComment();
2834
+ case 'text':
2835
+ return this.parseText();
2836
+ case 'each':
2837
+ return this.parseEach();
2838
+ case 'code':
2839
+ return this.parseCode();
2840
+ case 'call':
2841
+ return this.parseCall();
2842
+ case 'interpolation':
2843
+ return this.parseInterpolation();
2844
+ case 'yield':
2845
+ this.advance();
2846
+ var block = new nodes.Block;
2847
+ block.yield = true;
2848
+ return block;
2849
+ case 'id':
2850
+ case 'class':
2851
+ var tok = this.advance();
2852
+ this.lexer.defer(this.lexer.tok('tag', 'div'));
2853
+ this.lexer.defer(tok);
2854
+ return this.parseExpr();
2855
+ default:
2856
+ throw new Error('unexpected token "' + this.peek().type + '"');
2857
+ }
2858
+ },
2859
+
2860
+ /**
2861
+ * Text
2862
+ */
2863
+
2864
+ parseText: function(){
2865
+ var tok = this.expect('text')
2866
+ , node = new nodes.Text(tok.val);
2867
+ node.line = this.line();
2868
+ return node;
2869
+ },
2870
+
2871
+ /**
2872
+ * ':' expr
2873
+ * | block
2874
+ */
2875
+
2876
+ parseBlockExpansion: function(){
2877
+ if (':' == this.peek().type) {
2878
+ this.advance();
2879
+ return new nodes.Block(this.parseExpr());
2880
+ } else {
2881
+ return this.block();
2882
+ }
2883
+ },
2884
+
2885
+ /**
2886
+ * case
2887
+ */
2888
+
2889
+ parseCase: function(){
2890
+ var val = this.expect('case').val
2891
+ , node = new nodes.Case(val);
2892
+ node.line = this.line();
2893
+ node.block = this.block();
2894
+ return node;
2895
+ },
2896
+
2897
+ /**
2898
+ * when
2899
+ */
2900
+
2901
+ parseWhen: function(){
2902
+ var val = this.expect('when').val
2903
+ return new nodes.Case.When(val, this.parseBlockExpansion());
2904
+ },
2905
+
2906
+ /**
2907
+ * default
2908
+ */
2909
+
2910
+ parseDefault: function(){
2911
+ this.expect('default');
2912
+ return new nodes.Case.When('default', this.parseBlockExpansion());
2913
+ },
2914
+
2915
+ /**
2916
+ * code
2917
+ */
2918
+
2919
+ parseCode: function(){
2920
+ var tok = this.expect('code')
2921
+ , node = new nodes.Code(tok.val, tok.buffer, tok.escape)
2922
+ , block
2923
+ , i = 1;
2924
+ node.line = this.line();
2925
+ while (this.lookahead(i) && 'newline' == this.lookahead(i).type) ++i;
2926
+ block = 'indent' == this.lookahead(i).type;
2927
+ if (block) {
2928
+ this.skip(i-1);
2929
+ node.block = this.block();
2930
+ }
2931
+ return node;
2932
+ },
2933
+
2934
+ /**
2935
+ * comment
2936
+ */
2937
+
2938
+ parseComment: function(){
2939
+ var tok = this.expect('comment')
2940
+ , node;
2941
+
2942
+ if ('indent' == this.peek().type) {
2943
+ node = new nodes.BlockComment(tok.val, this.block(), tok.buffer);
2944
+ } else {
2945
+ node = new nodes.Comment(tok.val, tok.buffer);
2946
+ }
2947
+
2948
+ node.line = this.line();
2949
+ return node;
2950
+ },
2951
+
2952
+ /**
2953
+ * doctype
2954
+ */
2955
+
2956
+ parseDoctype: function(){
2957
+ var tok = this.expect('doctype')
2958
+ , node = new nodes.Doctype(tok.val);
2959
+ node.line = this.line();
2960
+ return node;
2961
+ },
2962
+
2963
+ /**
2964
+ * filter attrs? text-block
2965
+ */
2966
+
2967
+ parseFilter: function(){
2968
+ var block
2969
+ , tok = this.expect('filter')
2970
+ , attrs = this.accept('attrs');
2971
+
2972
+ this.lexer.pipeless = true;
2973
+ block = this.parseTextBlock();
2974
+ this.lexer.pipeless = false;
2975
+
2976
+ var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs);
2977
+ node.line = this.line();
2978
+ return node;
2979
+ },
2980
+
2981
+ /**
2982
+ * tag ':' attrs? block
2983
+ */
2984
+
2985
+ parseASTFilter: function(){
2986
+ var block
2987
+ , tok = this.expect('tag')
2988
+ , attrs = this.accept('attrs');
2989
+
2990
+ this.expect(':');
2991
+ block = this.block();
2992
+
2993
+ var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs);
2994
+ node.line = this.line();
2995
+ return node;
2996
+ },
2997
+
2998
+ /**
2999
+ * each block
3000
+ */
3001
+
3002
+ parseEach: function(){
3003
+ var tok = this.expect('each')
3004
+ , node = new nodes.Each(tok.code, tok.val, tok.key);
3005
+ node.line = this.line();
3006
+ node.block = this.block();
3007
+ return node;
3008
+ },
3009
+
3010
+ /**
3011
+ * 'extends' name
3012
+ */
3013
+
3014
+ parseExtends: function(){
3015
+ var path = require('path')
3016
+ , fs = require('fs')
3017
+ , dirname = path.dirname
3018
+ , basename = path.basename
3019
+ , join = path.join;
3020
+
3021
+ if (!this.filename)
3022
+ throw new Error('the "filename" option is required to extend templates');
3023
+
3024
+ var path = this.expect('extends').val.trim()
3025
+ , dir = dirname(this.filename);
3026
+
3027
+ var path = join(dir, path + '.jade')
3028
+ , str = fs.readFileSync(path, 'utf8')
3029
+ , parser = new Parser(str, path, this.options);
3030
+
3031
+ parser.blocks = this.blocks;
3032
+ parser.contexts = this.contexts;
3033
+ this.extending = parser;
3034
+
3035
+ // TODO: null node
3036
+ return new nodes.Literal('');
3037
+ },
3038
+
3039
+ /**
3040
+ * 'block' name block
3041
+ */
3042
+
3043
+ parseBlock: function(){
3044
+ var block = this.expect('block')
3045
+ , mode = block.mode
3046
+ , name = block.val.trim();
3047
+
3048
+ block = 'indent' == this.peek().type
3049
+ ? this.block()
3050
+ : new nodes.Block(new nodes.Literal(''));
3051
+
3052
+ var prev = this.blocks[name];
3053
+
3054
+ if (prev) {
3055
+ switch (prev.mode) {
3056
+ case 'append':
3057
+ block.nodes = block.nodes.concat(prev.nodes);
3058
+ prev = block;
3059
+ break;
3060
+ case 'prepend':
3061
+ block.nodes = prev.nodes.concat(block.nodes);
3062
+ prev = block;
3063
+ break;
3064
+ }
3065
+ }
3066
+
3067
+ block.mode = mode;
3068
+ return this.blocks[name] = prev || block;
3069
+ },
3070
+
3071
+ /**
3072
+ * include block?
3073
+ */
3074
+
3075
+ parseInclude: function(){
3076
+ var path = require('path')
3077
+ , fs = require('fs')
3078
+ , dirname = path.dirname
3079
+ , basename = path.basename
3080
+ , join = path.join;
3081
+
3082
+ var path = this.expect('include').val.trim()
3083
+ , dir = dirname(this.filename);
3084
+
3085
+ if (!this.filename)
3086
+ throw new Error('the "filename" option is required to use includes');
3087
+
3088
+ // no extension
3089
+ if (!~basename(path).indexOf('.')) {
3090
+ path += '.jade';
3091
+ }
3092
+
3093
+ // non-jade
3094
+ if ('.jade' != path.substr(-5)) {
3095
+ var path = join(dir, path)
3096
+ , str = fs.readFileSync(path, 'utf8');
3097
+ return new nodes.Literal(str);
3098
+ }
3099
+
3100
+ var path = join(dir, path)
3101
+ , str = fs.readFileSync(path, 'utf8')
3102
+ , parser = new Parser(str, path, this.options);
3103
+ parser.blocks = this.blocks;
3104
+ parser.mixins = this.mixins;
3105
+
3106
+ this.context(parser);
3107
+ var ast = parser.parse();
3108
+ this.context();
3109
+ ast.filename = path;
3110
+
3111
+ if ('indent' == this.peek().type) {
3112
+ ast.includeBlock().push(this.block());
3113
+ }
3114
+
3115
+ return ast;
3116
+ },
3117
+
3118
+ /**
3119
+ * call ident block
3120
+ */
3121
+
3122
+ parseCall: function(){
3123
+ var tok = this.expect('call')
3124
+ , name = tok.val
3125
+ , args = tok.args
3126
+ , mixin = new nodes.Mixin(name, args, new nodes.Block, true);
3127
+
3128
+ this.tag(mixin);
3129
+ if (mixin.block.isEmpty()) mixin.block = null;
3130
+ return mixin;
3131
+ },
3132
+
3133
+ /**
3134
+ * mixin block
3135
+ */
3136
+
3137
+ parseMixin: function(){
3138
+ var tok = this.expect('mixin')
3139
+ , name = tok.val
3140
+ , args = tok.args
3141
+ , mixin;
3142
+
3143
+ // definition
3144
+ if ('indent' == this.peek().type) {
3145
+ mixin = new nodes.Mixin(name, args, this.block(), false);
3146
+ this.mixins[name] = mixin;
3147
+ return mixin;
3148
+ // call
3149
+ } else {
3150
+ return new nodes.Mixin(name, args, null, true);
3151
+ }
3152
+ },
3153
+
3154
+ /**
3155
+ * indent (text | newline)* outdent
3156
+ */
3157
+
3158
+ parseTextBlock: function(){
3159
+ var block = new nodes.Block;
3160
+ block.line = this.line();
3161
+ var spaces = this.expect('indent').val;
3162
+ if (null == this._spaces) this._spaces = spaces;
3163
+ var indent = Array(spaces - this._spaces + 1).join(' ');
3164
+ while ('outdent' != this.peek().type) {
3165
+ switch (this.peek().type) {
3166
+ case 'newline':
3167
+ this.advance();
3168
+ break;
3169
+ case 'indent':
3170
+ this.parseTextBlock().nodes.forEach(function(node){
3171
+ block.push(node);
3172
+ });
3173
+ break;
3174
+ default:
3175
+ var text = new nodes.Text(indent + this.advance().val);
3176
+ text.line = this.line();
3177
+ block.push(text);
3178
+ }
3179
+ }
3180
+
3181
+ if (spaces == this._spaces) this._spaces = null;
3182
+ this.expect('outdent');
3183
+ return block;
3184
+ },
3185
+
3186
+ /**
3187
+ * indent expr* outdent
3188
+ */
3189
+
3190
+ block: function(){
3191
+ var block = new nodes.Block;
3192
+ block.line = this.line();
3193
+ this.expect('indent');
3194
+ while ('outdent' != this.peek().type) {
3195
+ if ('newline' == this.peek().type) {
3196
+ this.advance();
3197
+ } else {
3198
+ block.push(this.parseExpr());
3199
+ }
3200
+ }
3201
+ this.expect('outdent');
3202
+ return block;
3203
+ },
3204
+
3205
+ /**
3206
+ * interpolation (attrs | class | id)* (text | code | ':')? newline* block?
3207
+ */
3208
+
3209
+ parseInterpolation: function(){
3210
+ var tok = this.advance();
3211
+ var tag = new nodes.Tag(tok.val);
3212
+ tag.buffer = true;
3213
+ return this.tag(tag);
3214
+ },
3215
+
3216
+ /**
3217
+ * tag (attrs | class | id)* (text | code | ':')? newline* block?
3218
+ */
3219
+
3220
+ parseTag: function(){
3221
+ // ast-filter look-ahead
3222
+ var i = 2;
3223
+ if ('attrs' == this.lookahead(i).type) ++i;
3224
+ if (':' == this.lookahead(i).type) {
3225
+ if ('indent' == this.lookahead(++i).type) {
3226
+ return this.parseASTFilter();
3227
+ }
3228
+ }
3229
+
3230
+ var tok = this.advance()
3231
+ , tag = new nodes.Tag(tok.val);
3232
+
3233
+ tag.selfClosing = tok.selfClosing;
3234
+
3235
+ return this.tag(tag);
3236
+ },
3237
+
3238
+ /**
3239
+ * Parse tag.
3240
+ */
3241
+
3242
+ tag: function(tag){
3243
+ var dot;
3244
+
3245
+ tag.line = this.line();
3246
+
3247
+ // (attrs | class | id)*
3248
+ out:
3249
+ while (true) {
3250
+ switch (this.peek().type) {
3251
+ case 'id':
3252
+ case 'class':
3253
+ var tok = this.advance();
3254
+ tag.setAttribute(tok.type, "'" + tok.val + "'");
3255
+ continue;
3256
+ case 'attrs':
3257
+ var tok = this.advance()
3258
+ , obj = tok.attrs
3259
+ , escaped = tok.escaped
3260
+ , names = Object.keys(obj);
3261
+
3262
+ if (tok.selfClosing) tag.selfClosing = true;
3263
+
3264
+ for (var i = 0, len = names.length; i < len; ++i) {
3265
+ var name = names[i]
3266
+ , val = obj[name];
3267
+ tag.setAttribute(name, val, escaped[name]);
3268
+ }
3269
+ continue;
3270
+ default:
3271
+ break out;
3272
+ }
3273
+ }
3274
+
3275
+ // check immediate '.'
3276
+ if ('.' == this.peek().val) {
3277
+ dot = tag.textOnly = true;
3278
+ this.advance();
3279
+ }
3280
+
3281
+ // (text | code | ':')?
3282
+ switch (this.peek().type) {
3283
+ case 'text':
3284
+ tag.block.push(this.parseText());
3285
+ break;
3286
+ case 'code':
3287
+ tag.code = this.parseCode();
3288
+ break;
3289
+ case ':':
3290
+ this.advance();
3291
+ tag.block = new nodes.Block;
3292
+ tag.block.push(this.parseExpr());
3293
+ break;
3294
+ }
3295
+
3296
+ // newline*
3297
+ while ('newline' == this.peek().type) this.advance();
3298
+
3299
+ tag.textOnly = tag.textOnly || ~textOnly.indexOf(tag.name);
3300
+
3301
+ // script special-case
3302
+ if ('script' == tag.name) {
3303
+ var type = tag.getAttribute('type');
3304
+ if (!dot && type && 'text/javascript' != type.replace(/^['"]|['"]$/g, '')) {
3305
+ tag.textOnly = false;
3306
+ }
3307
+ }
3308
+
3309
+ // block?
3310
+ if ('indent' == this.peek().type) {
3311
+ if (tag.textOnly) {
3312
+ this.lexer.pipeless = true;
3313
+ tag.block = this.parseTextBlock();
3314
+ this.lexer.pipeless = false;
3315
+ } else {
3316
+ var block = this.block();
3317
+ if (tag.block) {
3318
+ for (var i = 0, len = block.nodes.length; i < len; ++i) {
3319
+ tag.block.push(block.nodes[i]);
3320
+ }
3321
+ } else {
3322
+ tag.block = block;
3323
+ }
3324
+ }
3325
+ }
3326
+
3327
+ return tag;
3328
+ }
3329
+ };
3330
+
3331
+ }); // module: parser.js
3332
+
3333
+ require.register("runtime.js", function(module, exports, require){
3334
+
3335
+ /*!
3336
+ * Jade - runtime
3337
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
3338
+ * MIT Licensed
3339
+ */
3340
+
3341
+ /**
3342
+ * Lame Array.isArray() polyfill for now.
3343
+ */
3344
+
3345
+ if (!Array.isArray) {
3346
+ Array.isArray = function(arr){
3347
+ return '[object Array]' == Object.prototype.toString.call(arr);
3348
+ };
3349
+ }
3350
+
3351
+ /**
3352
+ * Lame Object.keys() polyfill for now.
3353
+ */
3354
+
3355
+ if (!Object.keys) {
3356
+ Object.keys = function(obj){
3357
+ var arr = [];
3358
+ for (var key in obj) {
3359
+ if (obj.hasOwnProperty(key)) {
3360
+ arr.push(key);
3361
+ }
3362
+ }
3363
+ return arr;
3364
+ }
3365
+ }
3366
+
3367
+ /**
3368
+ * Merge two attribute objects giving precedence
3369
+ * to values in object `b`. Classes are special-cased
3370
+ * allowing for arrays and merging/joining appropriately
3371
+ * resulting in a string.
3372
+ *
3373
+ * @param {Object} a
3374
+ * @param {Object} b
3375
+ * @return {Object} a
3376
+ * @api private
3377
+ */
3378
+
3379
+ exports.merge = function merge(a, b) {
3380
+ var ac = a['class'];
3381
+ var bc = b['class'];
3382
+
3383
+ if (ac || bc) {
3384
+ ac = ac || [];
3385
+ bc = bc || [];
3386
+ if (!Array.isArray(ac)) ac = [ac];
3387
+ if (!Array.isArray(bc)) bc = [bc];
3388
+ ac = ac.filter(nulls);
3389
+ bc = bc.filter(nulls);
3390
+ a['class'] = ac.concat(bc).join(' ');
3391
+ }
3392
+
3393
+ for (var key in b) {
3394
+ if (key != 'class') {
3395
+ a[key] = b[key];
3396
+ }
3397
+ }
3398
+
3399
+ return a;
3400
+ };
3401
+
3402
+ /**
3403
+ * Filter null `val`s.
3404
+ *
3405
+ * @param {Mixed} val
3406
+ * @return {Mixed}
3407
+ * @api private
3408
+ */
3409
+
3410
+ function nulls(val) {
3411
+ return val != null;
3412
+ }
3413
+
3414
+ /**
3415
+ * Render the given attributes object.
3416
+ *
3417
+ * @param {Object} obj
3418
+ * @param {Object} escaped
3419
+ * @return {String}
3420
+ * @api private
3421
+ */
3422
+
3423
+ exports.attrs = function attrs(obj, escaped){
3424
+ var buf = []
3425
+ , terse = obj.terse;
3426
+
3427
+ delete obj.terse;
3428
+ var keys = Object.keys(obj)
3429
+ , len = keys.length;
3430
+
3431
+ if (len) {
3432
+ buf.push('');
3433
+ for (var i = 0; i < len; ++i) {
3434
+ var key = keys[i]
3435
+ , val = obj[key];
3436
+
3437
+ if ('boolean' == typeof val || null == val) {
3438
+ if (val) {
3439
+ terse
3440
+ ? buf.push(key)
3441
+ : buf.push(key + '="' + key + '"');
3442
+ }
3443
+ } else if (0 == key.indexOf('data') && 'string' != typeof val) {
3444
+ buf.push(key + "='" + JSON.stringify(val) + "'");
3445
+ } else if ('class' == key && Array.isArray(val)) {
3446
+ buf.push(key + '="' + exports.escape(val.join(' ')) + '"');
3447
+ } else if (escaped && escaped[key]) {
3448
+ buf.push(key + '="' + exports.escape(val) + '"');
3449
+ } else {
3450
+ buf.push(key + '="' + val + '"');
3451
+ }
3452
+ }
3453
+ }
3454
+
3455
+ return buf.join(' ');
3456
+ };
3457
+
3458
+ /**
3459
+ * Escape the given string of `html`.
3460
+ *
3461
+ * @param {String} html
3462
+ * @return {String}
3463
+ * @api private
3464
+ */
3465
+
3466
+ exports.escape = function escape(html){
3467
+ return String(html)
3468
+ .replace(/&(?!(\w+|\#\d+);)/g, '&amp;')
3469
+ .replace(/</g, '&lt;')
3470
+ .replace(/>/g, '&gt;')
3471
+ .replace(/"/g, '&quot;');
3472
+ };
3473
+
3474
+ /**
3475
+ * Re-throw the given `err` in context to the
3476
+ * the jade in `filename` at the given `lineno`.
3477
+ *
3478
+ * @param {Error} err
3479
+ * @param {String} filename
3480
+ * @param {String} lineno
3481
+ * @api private
3482
+ */
3483
+
3484
+ exports.rethrow = function rethrow(err, filename, lineno){
3485
+ if (!filename) throw err;
3486
+
3487
+ var context = 3
3488
+ , str = require('fs').readFileSync(filename, 'utf8')
3489
+ , lines = str.split('\n')
3490
+ , start = Math.max(lineno - context, 0)
3491
+ , end = Math.min(lines.length, lineno + context);
3492
+
3493
+ // Error context
3494
+ var context = lines.slice(start, end).map(function(line, i){
3495
+ var curr = i + start + 1;
3496
+ return (curr == lineno ? ' > ' : ' ')
3497
+ + curr
3498
+ + '| '
3499
+ + line;
3500
+ }).join('\n');
3501
+
3502
+ // Alter exception message
3503
+ err.path = filename;
3504
+ err.message = (filename || 'Jade') + ':' + lineno
3505
+ + '\n' + context + '\n\n' + err.message;
3506
+ throw err;
3507
+ };
3508
+
3509
+ }); // module: runtime.js
3510
+
3511
+ require.register("self-closing.js", function(module, exports, require){
3512
+
3513
+ /*!
3514
+ * Jade - self closing tags
3515
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
3516
+ * MIT Licensed
3517
+ */
3518
+
3519
+ module.exports = [
3520
+ 'meta'
3521
+ , 'img'
3522
+ , 'link'
3523
+ , 'input'
3524
+ , 'source'
3525
+ , 'area'
3526
+ , 'base'
3527
+ , 'col'
3528
+ , 'br'
3529
+ , 'hr'
3530
+ ];
3531
+ }); // module: self-closing.js
3532
+
3533
+ require.register("utils.js", function(module, exports, require){
3534
+
3535
+ /*!
3536
+ * Jade - utils
3537
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
3538
+ * MIT Licensed
3539
+ */
3540
+
3541
+ /**
3542
+ * Convert interpolation in the given string to JavaScript.
3543
+ *
3544
+ * @param {String} str
3545
+ * @return {String}
3546
+ * @api private
3547
+ */
3548
+
3549
+ var interpolate = exports.interpolate = function(str){
3550
+ return str.replace(/(\\)?([#!]){(.*?)}/g, function(str, escape, flag, code){
3551
+ return escape
3552
+ ? str
3553
+ : "' + "
3554
+ + ('!' == flag ? '' : 'escape')
3555
+ + "((interp = " + code.replace(/\\'/g, "'")
3556
+ + ") == null ? '' : interp) + '";
3557
+ });
3558
+ };
3559
+
3560
+ /**
3561
+ * Escape single quotes in `str`.
3562
+ *
3563
+ * @param {String} str
3564
+ * @return {String}
3565
+ * @api private
3566
+ */
3567
+
3568
+ var escape = exports.escape = function(str) {
3569
+ return str.replace(/'/g, "\\'");
3570
+ };
3571
+
3572
+ /**
3573
+ * Interpolate, and escape the given `str`.
3574
+ *
3575
+ * @param {String} str
3576
+ * @return {String}
3577
+ * @api private
3578
+ */
3579
+
3580
+ exports.text = function(str){
3581
+ return interpolate(escape(str));
3582
+ };
3583
+ }); // module: utils.js
3584
+
3585
+ window.jade = require("jade");
3586
+ })();