aboutsummaryrefslogtreecommitdiff
path: root/node_modules/jade
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/jade')
-rw-r--r--node_modules/jade/.npmignore15
-rw-r--r--node_modules/jade/LICENSE22
-rwxr-xr-xnode_modules/jade/bin/jade147
-rw-r--r--node_modules/jade/index.js4
-rw-r--r--node_modules/jade/jade.js3586
-rw-r--r--node_modules/jade/jade.md510
-rw-r--r--node_modules/jade/jade.min.js2
-rw-r--r--node_modules/jade/lib/compiler.js642
-rw-r--r--node_modules/jade/lib/doctypes.js18
-rw-r--r--node_modules/jade/lib/filters.js97
-rw-r--r--node_modules/jade/lib/inline-tags.js28
-rw-r--r--node_modules/jade/lib/jade.js237
-rw-r--r--node_modules/jade/lib/lexer.js771
-rw-r--r--node_modules/jade/lib/nodes/attrs.js77
-rw-r--r--node_modules/jade/lib/nodes/block-comment.js33
-rw-r--r--node_modules/jade/lib/nodes/block.js121
-rw-r--r--node_modules/jade/lib/nodes/case.js43
-rw-r--r--node_modules/jade/lib/nodes/code.js35
-rw-r--r--node_modules/jade/lib/nodes/comment.js32
-rw-r--r--node_modules/jade/lib/nodes/doctype.js29
-rw-r--r--node_modules/jade/lib/nodes/each.js35
-rw-r--r--node_modules/jade/lib/nodes/filter.js35
-rw-r--r--node_modules/jade/lib/nodes/index.js20
-rw-r--r--node_modules/jade/lib/nodes/literal.js32
-rw-r--r--node_modules/jade/lib/nodes/mixin.js36
-rw-r--r--node_modules/jade/lib/nodes/node.js25
-rw-r--r--node_modules/jade/lib/nodes/tag.js95
-rw-r--r--node_modules/jade/lib/nodes/text.js36
-rw-r--r--node_modules/jade/lib/parser.js710
-rw-r--r--node_modules/jade/lib/runtime.js174
-rw-r--r--node_modules/jade/lib/self-closing.js19
-rw-r--r--node_modules/jade/lib/utils.js49
-rw-r--r--node_modules/jade/node_modules/commander/.npmignore4
-rw-r--r--node_modules/jade/node_modules/commander/.travis.yml4
-rw-r--r--node_modules/jade/node_modules/commander/History.md107
-rw-r--r--node_modules/jade/node_modules/commander/Makefile7
-rw-r--r--node_modules/jade/node_modules/commander/Readme.md262
-rw-r--r--node_modules/jade/node_modules/commander/index.js2
-rw-r--r--node_modules/jade/node_modules/commander/lib/commander.js1026
-rw-r--r--node_modules/jade/node_modules/commander/package.json13
-rw-r--r--node_modules/jade/node_modules/mkdirp/.gitignore2
-rw-r--r--node_modules/jade/node_modules/mkdirp/.gitignore.orig2
-rw-r--r--node_modules/jade/node_modules/mkdirp/.gitignore.rej5
-rw-r--r--node_modules/jade/node_modules/mkdirp/LICENSE21
-rw-r--r--node_modules/jade/node_modules/mkdirp/README.markdown54
-rw-r--r--node_modules/jade/node_modules/mkdirp/examples/pow.js6
-rw-r--r--node_modules/jade/node_modules/mkdirp/examples/pow.js.orig6
-rw-r--r--node_modules/jade/node_modules/mkdirp/examples/pow.js.rej19
-rw-r--r--node_modules/jade/node_modules/mkdirp/index.js79
-rw-r--r--node_modules/jade/node_modules/mkdirp/package.json23
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/chmod.js38
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/clobber.js37
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/mkdirp.js28
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/perm.js32
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/perm_sync.js39
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/race.js41
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/rel.js32
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/sync.js27
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/umask.js28
-rw-r--r--node_modules/jade/node_modules/mkdirp/test/umask_sync.js27
-rw-r--r--node_modules/jade/package.json29
-rw-r--r--node_modules/jade/runtime.js179
-rw-r--r--node_modules/jade/runtime.min.js1
-rw-r--r--node_modules/jade/test.jade7
-rw-r--r--node_modules/jade/testing/head.jade5
-rw-r--r--node_modules/jade/testing/index.jade22
-rw-r--r--node_modules/jade/testing/index.js11
-rw-r--r--node_modules/jade/testing/layout.jade6
-rw-r--r--node_modules/jade/testing/user.jade7
-rw-r--r--node_modules/jade/testing/user.js27
70 files changed, 0 insertions, 9980 deletions
diff --git a/node_modules/jade/.npmignore b/node_modules/jade/.npmignore
deleted file mode 100644
index b9af3d4be..000000000
--- a/node_modules/jade/.npmignore
+++ /dev/null
@@ -1,15 +0,0 @@
-test
-support
-benchmarks
-examples
-lib-cov
-coverage.html
-.gitmodules
-.travis.yml
-History.md
-Readme.md
-Makefile
-test/
-support/
-benchmarks/
-examples/
diff --git a/node_modules/jade/LICENSE b/node_modules/jade/LICENSE
deleted file mode 100644
index 8ad0e0d3e..000000000
--- a/node_modules/jade/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2009-2010 TJ Holowaychuk <tj@vision-media.ca>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/node_modules/jade/bin/jade b/node_modules/jade/bin/jade
deleted file mode 100755
index 7e6002f90..000000000
--- a/node_modules/jade/bin/jade
+++ /dev/null
@@ -1,147 +0,0 @@
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var fs = require('fs')
- , program = require('commander')
- , path = require('path')
- , basename = path.basename
- , dirname = path.dirname
- , resolve = path.resolve
- , join = path.join
- , mkdirp = require('mkdirp')
- , jade = require('../');
-
-// jade options
-
-var options = {};
-
-// options
-
-program
- .version(jade.version)
- .usage('[options] [dir|file ...]')
- .option('-o, --obj <str>', 'javascript options object')
- .option('-O, --out <dir>', 'output the compiled html to <dir>')
- .option('-p, --path <path>', 'filename used to resolve includes')
- .option('-P, --pretty', 'compile pretty html output')
- .option('-c, --client', 'compile for client-side runtime.js')
- .option('-D, --no-debug', 'compile without debugging (smaller functions)')
-
-program.on('--help', function(){
- console.log(' Examples:');
- console.log('');
- console.log(' # translate jade the templates dir');
- console.log(' $ jade templates');
- console.log('');
- console.log(' # create {foo,bar}.html');
- console.log(' $ jade {foo,bar}.jade');
- console.log('');
- console.log(' # jade over stdio');
- console.log(' $ jade < my.jade > my.html');
- console.log('');
- console.log(' # jade over stdio');
- console.log(' $ echo "h1 Jade!" | jade');
- console.log('');
- console.log(' # foo, bar dirs rendering to /tmp');
- console.log(' $ jade foo bar --out /tmp ');
- console.log('');
-});
-
-program.parse(process.argv);
-
-// options given, parse them
-
-if (program.obj) options = eval('(' + program.obj + ')');
-
-// --filename
-
-if (program.path) options.filename = program.path;
-
-// --no-debug
-
-options.compileDebug = program.debug;
-
-// --client
-
-options.client = program.client;
-
-// --pretty
-
-options.pretty = program.pretty;
-
-// left-over args are file paths
-
-var files = program.args;
-
-// compile files
-
-if (files.length) {
- console.log();
- files.forEach(renderFile);
- process.on('exit', console.log);
-// stdio
-} else {
- stdin();
-}
-
-/**
- * Compile from stdin.
- */
-
-function stdin() {
- var buf = '';
- process.stdin.setEncoding('utf8');
- process.stdin.on('data', function(chunk){ buf += chunk; });
- process.stdin.on('end', function(){
- var fn = jade.compile(buf, options);
- var output = options.client
- ? fn.toString()
- : fn(options);
- process.stdout.write(output);
- }).resume();
-}
-
-/**
- * Process the given path, compiling the jade files found.
- * Always walk the subdirectories.
- */
-
-function renderFile(path) {
- var re = /\.jade$/;
- fs.lstat(path, function(err, stat) {
- if (err) throw err;
- // Found jade file
- if (stat.isFile() && re.test(path)) {
- fs.readFile(path, 'utf8', function(err, str){
- if (err) throw err;
- options.filename = path;
- var fn = jade.compile(str, options);
- var extname = options.client ? '.js' : '.html';
- path = path.replace(re, extname);
- if (program.out) path = join(program.out, basename(path));
- var dir = resolve(dirname(path));
- mkdirp(dir, 0755, function(err){
- if (err) throw err;
- var output = options.client
- ? fn.toString()
- : fn(options);
- fs.writeFile(path, output, function(err){
- if (err) throw err;
- console.log(' \033[90mrendered \033[36m%s\033[0m', path);
- });
- });
- });
- // Found directory
- } else if (stat.isDirectory()) {
- fs.readdir(path, function(err, files) {
- if (err) throw err;
- files.map(function(filename) {
- return path + '/' + filename;
- }).forEach(renderFile);
- });
- }
- });
-}
diff --git a/node_modules/jade/index.js b/node_modules/jade/index.js
deleted file mode 100644
index 8ad059f77..000000000
--- a/node_modules/jade/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-
-module.exports = process.env.JADE_COV
- ? require('./lib-cov/jade')
- : require('./lib/jade'); \ No newline at end of file
diff --git a/node_modules/jade/jade.js b/node_modules/jade/jade.js
deleted file mode 100644
index 1983a2039..000000000
--- a/node_modules/jade/jade.js
+++ /dev/null
@@ -1,3586 +0,0 @@
-(function() {
-
-// CommonJS require()
-
-function require(p){
- var path = require.resolve(p)
- , mod = require.modules[path];
- if (!mod) throw new Error('failed to require "' + p + '"');
- if (!mod.exports) {
- mod.exports = {};
- mod.call(mod.exports, mod, mod.exports, require.relative(path));
- }
- return mod.exports;
- }
-
-require.modules = {};
-
-require.resolve = function (path){
- var orig = path
- , reg = path + '.js'
- , index = path + '/index.js';
- return require.modules[reg] && reg
- || require.modules[index] && index
- || orig;
- };
-
-require.register = function (path, fn){
- require.modules[path] = fn;
- };
-
-require.relative = function (parent) {
- return function(p){
- if ('.' != p.charAt(0)) return require(p);
-
- var path = parent.split('/')
- , segs = p.split('/');
- path.pop();
-
- for (var i = 0; i < segs.length; i++) {
- var seg = segs[i];
- if ('..' == seg) path.pop();
- else if ('.' != seg) path.push(seg);
- }
-
- return require(path.join('/'));
- };
- };
-
-
-require.register("compiler.js", function(module, exports, require){
-
-/*!
- * Jade - Compiler
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var nodes = require('./nodes')
- , filters = require('./filters')
- , doctypes = require('./doctypes')
- , selfClosing = require('./self-closing')
- , runtime = require('./runtime')
- , utils = require('./utils');
-
-
- if (!Object.keys) {
- Object.keys = function(obj){
- var arr = [];
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- arr.push(key);
- }
- }
- return arr;
- }
- }
-
- if (!String.prototype.trimLeft) {
- String.prototype.trimLeft = function(){
- return this.replace(/^\s+/, '');
- }
- }
-
-
-
-/**
- * Initialize `Compiler` with the given `node`.
- *
- * @param {Node} node
- * @param {Object} options
- * @api public
- */
-
-var Compiler = module.exports = function Compiler(node, options) {
- this.options = options = options || {};
- this.node = node;
- this.hasCompiledDoctype = false;
- this.hasCompiledTag = false;
- this.pp = options.pretty || false;
- this.debug = false !== options.compileDebug;
- this.indents = 0;
- this.parentIndents = 0;
- if (options.doctype) this.setDoctype(options.doctype);
-};
-
-/**
- * Compiler prototype.
- */
-
-Compiler.prototype = {
-
- /**
- * Compile parse tree to JavaScript.
- *
- * @api public
- */
-
- compile: function(){
- this.buf = ['var interp;'];
- if (this.pp) this.buf.push("var __indent = [];");
- this.lastBufferedIdx = -1;
- this.visit(this.node);
- return this.buf.join('\n');
- },
-
- /**
- * Sets the default doctype `name`. Sets terse mode to `true` when
- * html 5 is used, causing self-closing tags to end with ">" vs "/>",
- * and boolean attributes are not mirrored.
- *
- * @param {string} name
- * @api public
- */
-
- setDoctype: function(name){
- var doctype = doctypes[(name || 'default').toLowerCase()];
- doctype = doctype || '<!DOCTYPE ' + name + '>';
- this.doctype = doctype;
- this.terse = '5' == name || 'html' == name;
- this.xml = 0 == this.doctype.indexOf('<?xml');
- },
-
- /**
- * Buffer the given `str` optionally escaped.
- *
- * @param {String} str
- * @param {Boolean} esc
- * @api public
- */
-
- buffer: function(str, esc){
- if (esc) str = utils.escape(str);
-
- if (this.lastBufferedIdx == this.buf.length) {
- this.lastBuffered += str;
- this.buf[this.lastBufferedIdx - 1] = "buf.push('" + this.lastBuffered + "');"
- } else {
- this.buf.push("buf.push('" + str + "');");
- this.lastBuffered = str;
- this.lastBufferedIdx = this.buf.length;
- }
- },
-
- /**
- * Buffer an indent based on the current `indent`
- * property and an additional `offset`.
- *
- * @param {Number} offset
- * @param {Boolean} newline
- * @api public
- */
-
- prettyIndent: function(offset, newline){
- offset = offset || 0;
- newline = newline ? '\\n' : '';
- this.buffer(newline + Array(this.indents + offset).join(' '));
- if (this.parentIndents)
- this.buf.push("buf.push.apply(buf, __indent);");
- },
-
- /**
- * Visit `node`.
- *
- * @param {Node} node
- * @api public
- */
-
- visit: function(node){
- var debug = this.debug;
-
- if (debug) {
- this.buf.push('__jade.unshift({ lineno: ' + node.line
- + ', filename: ' + (node.filename
- ? JSON.stringify(node.filename)
- : '__jade[0].filename')
- + ' });');
- }
-
- // Massive hack to fix our context
- // stack for - else[ if] etc
- if (false === node.debug && this.debug) {
- this.buf.pop();
- this.buf.pop();
- }
-
- this.visitNode(node);
-
- if (debug) this.buf.push('__jade.shift();');
- },
-
- /**
- * Visit `node`.
- *
- * @param {Node} node
- * @api public
- */
-
- visitNode: function(node){
- var name = node.constructor.name
- || node.constructor.toString().match(/function ([^(\s]+)()/)[1];
- return this['visit' + name](node);
- },
-
- /**
- * Visit case `node`.
- *
- * @param {Literal} node
- * @api public
- */
-
- visitCase: function(node){
- var _ = this.withinCase;
- this.withinCase = true;
- this.buf.push('switch (' + node.expr + '){');
- this.visit(node.block);
- this.buf.push('}');
- this.withinCase = _;
- },
-
- /**
- * Visit when `node`.
- *
- * @param {Literal} node
- * @api public
- */
-
- visitWhen: function(node){
- if ('default' == node.expr) {
- this.buf.push('default:');
- } else {
- this.buf.push('case ' + node.expr + ':');
- }
- this.visit(node.block);
- this.buf.push(' break;');
- },
-
- /**
- * Visit literal `node`.
- *
- * @param {Literal} node
- * @api public
- */
-
- visitLiteral: function(node){
- var str = node.str.replace(/\n/g, '\\\\n');
- this.buffer(str);
- },
-
- /**
- * Visit all nodes in `block`.
- *
- * @param {Block} block
- * @api public
- */
-
- visitBlock: function(block){
- var len = block.nodes.length
- , escape = this.escape
- , pp = this.pp
-
- // Block keyword has a special meaning in mixins
- if (this.parentIndents && block.mode) {
- if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');")
- this.buf.push('block && block();');
- if (pp) this.buf.push("__indent.pop();")
- return;
- }
-
- // Pretty print multi-line text
- if (pp && len > 1 && !escape && block.nodes[0].isText && block.nodes[1].isText)
- this.prettyIndent(1, true);
-
- for (var i = 0; i < len; ++i) {
- // Pretty print text
- if (pp && i > 0 && !escape && block.nodes[i].isText && block.nodes[i-1].isText)
- this.prettyIndent(1, false);
-
- this.visit(block.nodes[i]);
- // Multiple text nodes are separated by newlines
- if (block.nodes[i+1] && block.nodes[i].isText && block.nodes[i+1].isText)
- this.buffer('\\n');
- }
- },
-
- /**
- * Visit `doctype`. Sets terse mode to `true` when html 5
- * is used, causing self-closing tags to end with ">" vs "/>",
- * and boolean attributes are not mirrored.
- *
- * @param {Doctype} doctype
- * @api public
- */
-
- visitDoctype: function(doctype){
- if (doctype && (doctype.val || !this.doctype)) {
- this.setDoctype(doctype.val || 'default');
- }
-
- if (this.doctype) this.buffer(this.doctype);
- this.hasCompiledDoctype = true;
- },
-
- /**
- * Visit `mixin`, generating a function that
- * may be called within the template.
- *
- * @param {Mixin} mixin
- * @api public
- */
-
- visitMixin: function(mixin){
- var name = mixin.name.replace(/-/g, '_') + '_mixin'
- , args = mixin.args || ''
- , block = mixin.block
- , attrs = mixin.attrs
- , pp = this.pp;
-
- if (mixin.call) {
- if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');")
- if (block || attrs.length) {
-
- this.buf.push(name + '.call({');
-
- if (block) {
- this.buf.push('block: function(){');
-
- // Render block with no indents, dynamically added when rendered
- this.parentIndents++;
- var _indents = this.indents;
- this.indents = 0;
- this.visit(mixin.block);
- this.indents = _indents;
- this.parentIndents--;
-
- if (attrs.length) {
- this.buf.push('},');
- } else {
- this.buf.push('}');
- }
- }
-
- if (attrs.length) {
- var val = this.attrs(attrs);
- if (val.inherits) {
- this.buf.push('attributes: merge({' + val.buf
- + '}, attributes), escaped: merge(' + val.escaped + ', escaped, true)');
- } else {
- this.buf.push('attributes: {' + val.buf + '}, escaped: ' + val.escaped);
- }
- }
-
- if (args) {
- this.buf.push('}, ' + args + ');');
- } else {
- this.buf.push('});');
- }
-
- } else {
- this.buf.push(name + '(' + args + ');');
- }
- if (pp) this.buf.push("__indent.pop();")
- } else {
- this.buf.push('var ' + name + ' = function(' + args + '){');
- this.buf.push('var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};');
- this.parentIndents++;
- this.visit(block);
- this.parentIndents--;
- this.buf.push('};');
- }
- },
-
- /**
- * Visit `tag` buffering tag markup, generating
- * attributes, visiting the `tag`'s code and block.
- *
- * @param {Tag} tag
- * @api public
- */
-
- visitTag: function(tag){
- this.indents++;
- var name = tag.name
- , pp = this.pp;
-
- if (tag.buffer) name = "' + (" + name + ") + '";
-
- if (!this.hasCompiledTag) {
- if (!this.hasCompiledDoctype && 'html' == name) {
- this.visitDoctype();
- }
- this.hasCompiledTag = true;
- }
-
- // pretty print
- if (pp && !tag.isInline())
- this.prettyIndent(0, true);
-
- if ((~selfClosing.indexOf(name) || tag.selfClosing) && !this.xml) {
- this.buffer('<' + name);
- this.visitAttributes(tag.attrs);
- this.terse
- ? this.buffer('>')
- : this.buffer('/>');
- } else {
- // Optimize attributes buffering
- if (tag.attrs.length) {
- this.buffer('<' + name);
- if (tag.attrs.length) this.visitAttributes(tag.attrs);
- this.buffer('>');
- } else {
- this.buffer('<' + name + '>');
- }
- if (tag.code) this.visitCode(tag.code);
- this.escape = 'pre' == tag.name;
- this.visit(tag.block);
-
- // pretty print
- if (pp && !tag.isInline() && 'pre' != tag.name && !tag.canInline())
- this.prettyIndent(0, true);
-
- this.buffer('</' + name + '>');
- }
- this.indents--;
- },
-
- /**
- * Visit `filter`, throwing when the filter does not exist.
- *
- * @param {Filter} filter
- * @api public
- */
-
- visitFilter: function(filter){
- var fn = filters[filter.name];
-
- // unknown filter
- if (!fn) {
- if (filter.isASTFilter) {
- throw new Error('unknown ast filter "' + filter.name + ':"');
- } else {
- throw new Error('unknown filter ":' + filter.name + '"');
- }
- }
-
- if (filter.isASTFilter) {
- this.buf.push(fn(filter.block, this, filter.attrs));
- } else {
- var text = filter.block.nodes.map(function(node){ return node.val }).join('\n');
- filter.attrs = filter.attrs || {};
- filter.attrs.filename = this.options.filename;
- this.buffer(utils.text(fn(text, filter.attrs)));
- }
- },
-
- /**
- * Visit `text` node.
- *
- * @param {Text} text
- * @api public
- */
-
- visitText: function(text){
- text = utils.text(text.val.replace(/\\/g, '\\\\'));
- if (this.escape) text = escape(text);
- this.buffer(text);
- },
-
- /**
- * Visit a `comment`, only buffering when the buffer flag is set.
- *
- * @param {Comment} comment
- * @api public
- */
-
- visitComment: function(comment){
- if (!comment.buffer) return;
- if (this.pp) this.prettyIndent(1, true);
- this.buffer('<!--' + utils.escape(comment.val) + '-->');
- },
-
- /**
- * Visit a `BlockComment`.
- *
- * @param {Comment} comment
- * @api public
- */
-
- visitBlockComment: function(comment){
- if (!comment.buffer) return;
- if (0 == comment.val.trim().indexOf('if')) {
- this.buffer('<!--[' + comment.val.trim() + ']>');
- this.visit(comment.block);
- this.buffer('<![endif]-->');
- } else {
- this.buffer('<!--' + comment.val);
- this.visit(comment.block);
- this.buffer('-->');
- }
- },
-
- /**
- * Visit `code`, respecting buffer / escape flags.
- * If the code is followed by a block, wrap it in
- * a self-calling function.
- *
- * @param {Code} code
- * @api public
- */
-
- visitCode: function(code){
- // Wrap code blocks with {}.
- // we only wrap unbuffered code blocks ATM
- // since they are usually flow control
-
- // Buffer code
- if (code.buffer) {
- var val = code.val.trimLeft();
- this.buf.push('var __val__ = ' + val);
- val = 'null == __val__ ? "" : __val__';
- if (code.escape) val = 'escape(' + val + ')';
- this.buf.push("buf.push(" + val + ");");
- } else {
- this.buf.push(code.val);
- }
-
- // Block support
- if (code.block) {
- if (!code.buffer) this.buf.push('{');
- this.visit(code.block);
- if (!code.buffer) this.buf.push('}');
- }
- },
-
- /**
- * Visit `each` block.
- *
- * @param {Each} each
- * @api public
- */
-
- visitEach: function(each){
- this.buf.push(''
- + '// iterate ' + each.obj + '\n'
- + ';(function(){\n'
- + ' if (\'number\' == typeof ' + each.obj + '.length) {\n'
- + ' for (var ' + each.key + ' = 0, $$l = ' + each.obj + '.length; ' + each.key + ' < $$l; ' + each.key + '++) {\n'
- + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n');
-
- this.visit(each.block);
-
- this.buf.push(''
- + ' }\n'
- + ' } else {\n'
- + ' for (var ' + each.key + ' in ' + each.obj + ') {\n'
- + ' if (' + each.obj + '.hasOwnProperty(' + each.key + ')){'
- + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n');
-
- this.visit(each.block);
-
- this.buf.push(' }\n');
-
- this.buf.push(' }\n }\n}).call(this);\n');
- },
-
- /**
- * Visit `attrs`.
- *
- * @param {Array} attrs
- * @api public
- */
-
- visitAttributes: function(attrs){
- var val = this.attrs(attrs);
- if (val.inherits) {
- this.buf.push("buf.push(attrs(merge({ " + val.buf +
- " }, attributes), merge(" + val.escaped + ", escaped, true)));");
- } else if (val.constant) {
- eval('var buf={' + val.buf + '};');
- this.buffer(runtime.attrs(buf, JSON.parse(val.escaped)), true);
- } else {
- this.buf.push("buf.push(attrs({ " + val.buf + " }, " + val.escaped + "));");
- }
- },
-
- /**
- * Compile attributes.
- */
-
- attrs: function(attrs){
- var buf = []
- , classes = []
- , escaped = {}
- , constant = attrs.every(function(attr){ return isConstant(attr.val) })
- , inherits = false;
-
- if (this.terse) buf.push('terse: true');
-
- attrs.forEach(function(attr){
- if (attr.name == 'attributes') return inherits = true;
- escaped[attr.name] = attr.escaped;
- if (attr.name == 'class') {
- classes.push('(' + attr.val + ')');
- } else {
- var pair = "'" + attr.name + "':(" + attr.val + ')';
- buf.push(pair);
- }
- });
-
- if (classes.length) {
- classes = classes.join(" + ' ' + ");
- buf.push("class: " + classes);
- }
-
- return {
- buf: buf.join(', ').replace('class:', '"class":'),
- escaped: JSON.stringify(escaped),
- inherits: inherits,
- constant: constant
- };
- }
-};
-
-/**
- * Check if expression can be evaluated to a constant
- *
- * @param {String} expression
- * @return {Boolean}
- * @api private
- */
-
-function isConstant(val){
- // Check strings/literals
- if (/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val))
- return true;
-
- // Check numbers
- if (!isNaN(Number(val)))
- return true;
-
- // Check arrays
- var matches;
- if (matches = /^ *\[(.*)\] *$/.exec(val))
- return matches[1].split(',').every(isConstant);
-
- return false;
-}
-
-/**
- * Escape the given string of `html`.
- *
- * @param {String} html
- * @return {String}
- * @api private
- */
-
-function escape(html){
- return String(html)
- .replace(/&(?!\w+;)/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/"/g, '&quot;');
-}
-}); // module: compiler.js
-
-require.register("doctypes.js", function(module, exports, require){
-
-/*!
- * Jade - doctypes
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-module.exports = {
- '5': '<!DOCTYPE html>'
- , 'default': '<!DOCTYPE html>'
- , 'xml': '<?xml version="1.0" encoding="utf-8" ?>'
- , 'transitional': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
- , 'strict': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
- , 'frameset': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">'
- , '1.1': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'
- , 'basic': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">'
- , 'mobile': '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">'
-};
-}); // module: doctypes.js
-
-require.register("filters.js", function(module, exports, require){
-
-/*!
- * Jade - filters
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-module.exports = {
-
- /**
- * Wrap text with CDATA block.
- */
-
- cdata: function(str){
- return '<![CDATA[\\n' + str + '\\n]]>';
- },
-
- /**
- * Transform sass to css, wrapped in style tags.
- */
-
- sass: function(str){
- str = str.replace(/\\n/g, '\n');
- var sass = require('sass').render(str).replace(/\n/g, '\\n');
- return '<style type="text/css">' + sass + '</style>';
- },
-
- /**
- * Transform stylus to css, wrapped in style tags.
- */
-
- stylus: function(str, options){
- var ret;
- str = str.replace(/\\n/g, '\n');
- var stylus = require('stylus');
- stylus(str, options).render(function(err, css){
- if (err) throw err;
- ret = css.replace(/\n/g, '\\n');
- });
- return '<style type="text/css">' + ret + '</style>';
- },
-
- /**
- * Transform less to css, wrapped in style tags.
- */
-
- less: function(str){
- var ret;
- str = str.replace(/\\n/g, '\n');
- require('less').render(str, function(err, css){
- if (err) throw err;
- ret = '<style type="text/css">' + css.replace(/\n/g, '\\n') + '</style>';
- });
- return ret;
- },
-
- /**
- * Transform markdown to html.
- */
-
- markdown: function(str){
- var md;
-
- // support markdown / discount
- try {
- md = require('markdown');
- } catch (err){
- try {
- md = require('discount');
- } catch (err) {
- try {
- md = require('markdown-js');
- } catch (err) {
- try {
- md = require('marked');
- } catch (err) {
- throw new
- Error('Cannot find markdown library, install markdown, discount, or marked.');
- }
- }
- }
- }
-
- str = str.replace(/\\n/g, '\n');
- return md.parse(str).replace(/\n/g, '\\n').replace(/'/g,'&#39;');
- },
-
- /**
- * Transform coffeescript to javascript.
- */
-
- coffeescript: function(str){
- str = str.replace(/\\n/g, '\n');
- var js = require('coffee-script').compile(str).replace(/\\/g, '\\\\').replace(/\n/g, '\\n');
- return '<script type="text/javascript">\\n' + js + '</script>';
- }
-};
-
-}); // module: filters.js
-
-require.register("inline-tags.js", function(module, exports, require){
-
-/*!
- * Jade - inline tags
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-module.exports = [
- 'a'
- , 'abbr'
- , 'acronym'
- , 'b'
- , 'br'
- , 'code'
- , 'em'
- , 'font'
- , 'i'
- , 'img'
- , 'ins'
- , 'kbd'
- , 'map'
- , 'samp'
- , 'small'
- , 'span'
- , 'strong'
- , 'sub'
- , 'sup'
-];
-}); // module: inline-tags.js
-
-require.register("jade.js", function(module, exports, require){
-/*!
- * Jade
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Parser = require('./parser')
- , Lexer = require('./lexer')
- , Compiler = require('./compiler')
- , runtime = require('./runtime')
-
-/**
- * Library version.
- */
-
-exports.version = '0.26.1';
-
-/**
- * Expose self closing tags.
- */
-
-exports.selfClosing = require('./self-closing');
-
-/**
- * Default supported doctypes.
- */
-
-exports.doctypes = require('./doctypes');
-
-/**
- * Text filters.
- */
-
-exports.filters = require('./filters');
-
-/**
- * Utilities.
- */
-
-exports.utils = require('./utils');
-
-/**
- * Expose `Compiler`.
- */
-
-exports.Compiler = Compiler;
-
-/**
- * Expose `Parser`.
- */
-
-exports.Parser = Parser;
-
-/**
- * Expose `Lexer`.
- */
-
-exports.Lexer = Lexer;
-
-/**
- * Nodes.
- */
-
-exports.nodes = require('./nodes');
-
-/**
- * Jade runtime helpers.
- */
-
-exports.runtime = runtime;
-
-/**
- * Template function cache.
- */
-
-exports.cache = {};
-
-/**
- * Parse the given `str` of jade and return a function body.
- *
- * @param {String} str
- * @param {Object} options
- * @return {String}
- * @api private
- */
-
-function parse(str, options){
- try {
- // Parse
- var parser = new Parser(str, options.filename, options);
-
- // Compile
- var compiler = new (options.compiler || Compiler)(parser.parse(), options)
- , js = compiler.compile();
-
- // Debug compiler
- if (options.debug) {
- console.error('\nCompiled Function:\n\n\033[90m%s\033[0m', js.replace(/^/gm, ' '));
- }
-
- return ''
- + 'var buf = [];\n'
- + (options.self
- ? 'var self = locals || {};\n' + js
- : 'with (locals || {}) {\n' + js + '\n}\n')
- + 'return buf.join("");';
- } catch (err) {
- parser = parser.context();
- runtime.rethrow(err, parser.filename, parser.lexer.lineno);
- }
-}
-
-/**
- * Compile a `Function` representation of the given jade `str`.
- *
- * Options:
- *
- * - `compileDebug` when `false` debugging code is stripped from the compiled template
- * - `client` when `true` the helper functions `escape()` etc will reference `jade.escape()`
- * for use with the Jade client-side runtime.js
- *
- * @param {String} str
- * @param {Options} options
- * @return {Function}
- * @api public
- */
-
-exports.compile = function(str, options){
- var options = options || {}
- , client = options.client
- , filename = options.filename
- ? JSON.stringify(options.filename)
- : 'undefined'
- , fn;
-
- if (options.compileDebug !== false) {
- fn = [
- 'var __jade = [{ lineno: 1, filename: ' + filename + ' }];'
- , 'try {'
- , parse(String(str), options)
- , '} catch (err) {'
- , ' rethrow(err, __jade[0].filename, __jade[0].lineno);'
- , '}'
- ].join('\n');
- } else {
- fn = parse(String(str), options);
- }
-
- if (client) {
- fn = 'attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n' + fn;
- }
-
- fn = new Function('locals, attrs, escape, rethrow, merge', fn);
-
- if (client) return fn;
-
- return function(locals){
- return fn(locals, runtime.attrs, runtime.escape, runtime.rethrow, runtime.merge);
- };
-};
-
-/**
- * Render the given `str` of jade and invoke
- * the callback `fn(err, str)`.
- *
- * Options:
- *
- * - `cache` enable template caching
- * - `filename` filename required for `include` / `extends` and caching
- *
- * @param {String} str
- * @param {Object|Function} options or fn
- * @param {Function} fn
- * @api public
- */
-
-exports.render = function(str, options, fn){
- // swap args
- if ('function' == typeof options) {
- fn = options, options = {};
- }
-
- // cache requires .filename
- if (options.cache && !options.filename) {
- return fn(new Error('the "filename" option is required for caching'));
- }
-
- try {
- var path = options.filename;
- var tmpl = options.cache
- ? exports.cache[path] || (exports.cache[path] = exports.compile(str, options))
- : exports.compile(str, options);
- fn(null, tmpl(options));
- } catch (err) {
- fn(err);
- }
-};
-
-/**
- * Render a Jade file at the given `path` and callback `fn(err, str)`.
- *
- * @param {String} path
- * @param {Object|Function} options or callback
- * @param {Function} fn
- * @api public
- */
-
-exports.renderFile = function(path, options, fn){
- var key = path + ':string';
-
- if ('function' == typeof options) {
- fn = options, options = {};
- }
-
- try {
- options.filename = path;
- var str = options.cache
- ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8'))
- : fs.readFileSync(path, 'utf8');
- exports.render(str, options, fn);
- } catch (err) {
- fn(err);
- }
-};
-
-/**
- * Express support.
- */
-
-exports.__express = exports.renderFile;
-
-}); // module: jade.js
-
-require.register("lexer.js", function(module, exports, require){
-
-/*!
- * Jade - Lexer
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Initialize `Lexer` with the given `str`.
- *
- * Options:
- *
- * - `colons` allow colons for attr delimiters
- *
- * @param {String} str
- * @param {Object} options
- * @api private
- */
-
-var Lexer = module.exports = function Lexer(str, options) {
- options = options || {};
- this.input = str.replace(/\r\n|\r/g, '\n');
- this.colons = options.colons;
- this.deferredTokens = [];
- this.lastIndents = 0;
- this.lineno = 1;
- this.stash = [];
- this.indentStack = [];
- this.indentRe = null;
- this.pipeless = false;
-};
-
-/**
- * Lexer prototype.
- */
-
-Lexer.prototype = {
-
- /**
- * Construct a token with the given `type` and `val`.
- *
- * @param {String} type
- * @param {String} val
- * @return {Object}
- * @api private
- */
-
- tok: function(type, val){
- return {
- type: type
- , line: this.lineno
- , val: val
- }
- },
-
- /**
- * Consume the given `len` of input.
- *
- * @param {Number} len
- * @api private
- */
-
- consume: function(len){
- this.input = this.input.substr(len);
- },
-
- /**
- * Scan for `type` with the given `regexp`.
- *
- * @param {String} type
- * @param {RegExp} regexp
- * @return {Object}
- * @api private
- */
-
- scan: function(regexp, type){
- var captures;
- if (captures = regexp.exec(this.input)) {
- this.consume(captures[0].length);
- return this.tok(type, captures[1]);
- }
- },
-
- /**
- * Defer the given `tok`.
- *
- * @param {Object} tok
- * @api private
- */
-
- defer: function(tok){
- this.deferredTokens.push(tok);
- },
-
- /**
- * Lookahead `n` tokens.
- *
- * @param {Number} n
- * @return {Object}
- * @api private
- */
-
- lookahead: function(n){
- var fetch = n - this.stash.length;
- while (fetch-- > 0) this.stash.push(this.next());
- return this.stash[--n];
- },
-
- /**
- * Return the indexOf `start` / `end` delimiters.
- *
- * @param {String} start
- * @param {String} end
- * @return {Number}
- * @api private
- */
-
- indexOfDelimiters: function(start, end){
- var str = this.input
- , nstart = 0
- , nend = 0
- , pos = 0;
- for (var i = 0, len = str.length; i < len; ++i) {
- if (start == str.charAt(i)) {
- ++nstart;
- } else if (end == str.charAt(i)) {
- if (++nend == nstart) {
- pos = i;
- break;
- }
- }
- }
- return pos;
- },
-
- /**
- * Stashed token.
- */
-
- stashed: function() {
- return this.stash.length
- && this.stash.shift();
- },
-
- /**
- * Deferred token.
- */
-
- deferred: function() {
- return this.deferredTokens.length
- && this.deferredTokens.shift();
- },
-
- /**
- * end-of-source.
- */
-
- eos: function() {
- if (this.input.length) return;
- if (this.indentStack.length) {
- this.indentStack.shift();
- return this.tok('outdent');
- } else {
- return this.tok('eos');
- }
- },
-
- /**
- * Blank line.
- */
-
- blank: function() {
- var captures;
- if (captures = /^\n *\n/.exec(this.input)) {
- this.consume(captures[0].length - 1);
- if (this.pipeless) return this.tok('text', '');
- return this.next();
- }
- },
-
- /**
- * Comment.
- */
-
- comment: function() {
- var captures;
- if (captures = /^ *\/\/(-)?([^\n]*)/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok = this.tok('comment', captures[2]);
- tok.buffer = '-' != captures[1];
- return tok;
- }
- },
-
- /**
- * Interpolated tag.
- */
-
- interpolation: function() {
- var captures;
- if (captures = /^#\{(.*?)\}/.exec(this.input)) {
- this.consume(captures[0].length);
- return this.tok('interpolation', captures[1]);
- }
- },
-
- /**
- * Tag.
- */
-
- tag: function() {
- var captures;
- if (captures = /^(\w[-:\w]*)(\/?)/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok, name = captures[1];
- if (':' == name[name.length - 1]) {
- name = name.slice(0, -1);
- tok = this.tok('tag', name);
- this.defer(this.tok(':'));
- while (' ' == this.input[0]) this.input = this.input.substr(1);
- } else {
- tok = this.tok('tag', name);
- }
- tok.selfClosing = !! captures[2];
- return tok;
- }
- },
-
- /**
- * Filter.
- */
-
- filter: function() {
- return this.scan(/^:(\w+)/, 'filter');
- },
-
- /**
- * Doctype.
- */
-
- doctype: function() {
- return this.scan(/^(?:!!!|doctype) *([^\n]+)?/, 'doctype');
- },
-
- /**
- * Id.
- */
-
- id: function() {
- return this.scan(/^#([\w-]+)/, 'id');
- },
-
- /**
- * Class.
- */
-
- className: function() {
- return this.scan(/^\.([\w-]+)/, 'class');
- },
-
- /**
- * Text.
- */
-
- text: function() {
- return this.scan(/^(?:\| ?| ?)?([^\n]+)/, 'text');
- },
-
- /**
- * Extends.
- */
-
- "extends": function() {
- return this.scan(/^extends? +([^\n]+)/, 'extends');
- },
-
- /**
- * Block prepend.
- */
-
- prepend: function() {
- var captures;
- if (captures = /^prepend +([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var mode = 'prepend'
- , name = captures[1]
- , tok = this.tok('block', name);
- tok.mode = mode;
- return tok;
- }
- },
-
- /**
- * Block append.
- */
-
- append: function() {
- var captures;
- if (captures = /^append +([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var mode = 'append'
- , name = captures[1]
- , tok = this.tok('block', name);
- tok.mode = mode;
- return tok;
- }
- },
-
- /**
- * Block.
- */
-
- block: function() {
- var captures;
- if (captures = /^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)) {
- this.consume(captures[0].length);
- var mode = captures[1] || 'replace'
- , name = captures[2]
- , tok = this.tok('block', name);
-
- tok.mode = mode;
- return tok;
- }
- },
-
- /**
- * Yield.
- */
-
- yield: function() {
- return this.scan(/^yield */, 'yield');
- },
-
- /**
- * Include.
- */
-
- include: function() {
- return this.scan(/^include +([^\n]+)/, 'include');
- },
-
- /**
- * Case.
- */
-
- "case": function() {
- return this.scan(/^case +([^\n]+)/, 'case');
- },
-
- /**
- * When.
- */
-
- when: function() {
- return this.scan(/^when +([^:\n]+)/, 'when');
- },
-
- /**
- * Default.
- */
-
- "default": function() {
- return this.scan(/^default */, 'default');
- },
-
- /**
- * Assignment.
- */
-
- assignment: function() {
- var captures;
- if (captures = /^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)) {
- this.consume(captures[0].length);
- var name = captures[1]
- , val = captures[2];
- return this.tok('code', 'var ' + name + ' = (' + val + ');');
- }
- },
-
- /**
- * Call mixin.
- */
-
- call: function(){
- var captures;
- if (captures = /^\+([-\w]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok = this.tok('call', captures[1]);
-
- // Check for args (not attributes)
- if (captures = /^ *\((.*?)\)/.exec(this.input)) {
- if (!/^ *[-\w]+ *=/.test(captures[1])) {
- this.consume(captures[0].length);
- tok.args = captures[1];
- }
- }
-
- return tok;
- }
- },
-
- /**
- * Mixin.
- */
-
- mixin: function(){
- var captures;
- if (captures = /^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok = this.tok('mixin', captures[1]);
- tok.args = captures[2];
- return tok;
- }
- },
-
- /**
- * Conditional.
- */
-
- conditional: function() {
- var captures;
- if (captures = /^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)) {
- this.consume(captures[0].length);
- var type = captures[1]
- , js = captures[2];
-
- switch (type) {
- case 'if': js = 'if (' + js + ')'; break;
- case 'unless': js = 'if (!(' + js + '))'; break;
- case 'else if': js = 'else if (' + js + ')'; break;
- case 'else': js = 'else'; break;
- }
-
- return this.tok('code', js);
- }
- },
-
- /**
- * While.
- */
-
- "while": function() {
- var captures;
- if (captures = /^while +([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- return this.tok('code', 'while (' + captures[1] + ')');
- }
- },
-
- /**
- * Each.
- */
-
- each: function() {
- var captures;
- if (captures = /^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok = this.tok('each', captures[1]);
- tok.key = captures[2] || '$index';
- tok.code = captures[3];
- return tok;
- }
- },
-
- /**
- * Code.
- */
-
- code: function() {
- var captures;
- if (captures = /^(!?=|-)([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var flags = captures[1];
- captures[1] = captures[2];
- var tok = this.tok('code', captures[1]);
- tok.escape = flags[0] === '=';
- tok.buffer = flags[0] === '=' || flags[1] === '=';
- return tok;
- }
- },
-
- /**
- * Attributes.
- */
-
- attrs: function() {
- if ('(' == this.input.charAt(0)) {
- var index = this.indexOfDelimiters('(', ')')
- , str = this.input.substr(1, index-1)
- , tok = this.tok('attrs')
- , len = str.length
- , colons = this.colons
- , states = ['key']
- , escapedAttr
- , key = ''
- , val = ''
- , quote
- , c
- , p;
-
- function state(){
- return states[states.length - 1];
- }
-
- function interpolate(attr) {
- return attr.replace(/#\{([^}]+)\}/g, function(_, expr){
- return quote + " + (" + expr + ") + " + quote;
- });
- }
-
- this.consume(index + 1);
- tok.attrs = {};
- tok.escaped = {};
-
- function parse(c) {
- var real = c;
- // TODO: remove when people fix ":"
- if (colons && ':' == c) c = '=';
- switch (c) {
- case ',':
- case '\n':
- switch (state()) {
- case 'expr':
- case 'array':
- case 'string':
- case 'object':
- val += c;
- break;
- default:
- states.push('key');
- val = val.trim();
- key = key.trim();
- if ('' == key) return;
- key = key.replace(/^['"]|['"]$/g, '').replace('!', '');
- tok.escaped[key] = escapedAttr;
- tok.attrs[key] = '' == val
- ? true
- : interpolate(val);
- key = val = '';
- }
- break;
- case '=':
- switch (state()) {
- case 'key char':
- key += real;
- break;
- case 'val':
- case 'expr':
- case 'array':
- case 'string':
- case 'object':
- val += real;
- break;
- default:
- escapedAttr = '!' != p;
- states.push('val');
- }
- break;
- case '(':
- if ('val' == state()
- || 'expr' == state()) states.push('expr');
- val += c;
- break;
- case ')':
- if ('expr' == state()
- || 'val' == state()) states.pop();
- val += c;
- break;
- case '{':
- if ('val' == state()) states.push('object');
- val += c;
- break;
- case '}':
- if ('object' == state()) states.pop();
- val += c;
- break;
- case '[':
- if ('val' == state()) states.push('array');
- val += c;
- break;
- case ']':
- if ('array' == state()) states.pop();
- val += c;
- break;
- case '"':
- case "'":
- switch (state()) {
- case 'key':
- states.push('key char');
- break;
- case 'key char':
- states.pop();
- break;
- case 'string':
- if (c == quote) states.pop();
- val += c;
- break;
- default:
- states.push('string');
- val += c;
- quote = c;
- }
- break;
- case '':
- break;
- default:
- switch (state()) {
- case 'key':
- case 'key char':
- key += c;
- break;
- default:
- val += c;
- }
- }
- p = c;
- }
-
- for (var i = 0; i < len; ++i) {
- parse(str.charAt(i));
- }
-
- parse(',');
-
- if ('/' == this.input.charAt(0)) {
- this.consume(1);
- tok.selfClosing = true;
- }
-
- return tok;
- }
- },
-
- /**
- * Indent | Outdent | Newline.
- */
-
- indent: function() {
- var captures, re;
-
- // established regexp
- if (this.indentRe) {
- captures = this.indentRe.exec(this.input);
- // determine regexp
- } else {
- // tabs
- re = /^\n(\t*) */;
- captures = re.exec(this.input);
-
- // spaces
- if (captures && !captures[1].length) {
- re = /^\n( *)/;
- captures = re.exec(this.input);
- }
-
- // established
- if (captures && captures[1].length) this.indentRe = re;
- }
-
- if (captures) {
- var tok
- , indents = captures[1].length;
-
- ++this.lineno;
- this.consume(indents + 1);
-
- if (' ' == this.input[0] || '\t' == this.input[0]) {
- throw new Error('Invalid indentation, you can use tabs or spaces but not both');
- }
-
- // blank line
- if ('\n' == this.input[0]) return this.tok('newline');
-
- // outdent
- if (this.indentStack.length && indents < this.indentStack[0]) {
- while (this.indentStack.length && this.indentStack[0] > indents) {
- this.stash.push(this.tok('outdent'));
- this.indentStack.shift();
- }
- tok = this.stash.pop();
- // indent
- } else if (indents && indents != this.indentStack[0]) {
- this.indentStack.unshift(indents);
- tok = this.tok('indent', indents);
- // newline
- } else {
- tok = this.tok('newline');
- }
-
- return tok;
- }
- },
-
- /**
- * Pipe-less text consumed only when
- * pipeless is true;
- */
-
- pipelessText: function() {
- if (this.pipeless) {
- if ('\n' == this.input[0]) return;
- var i = this.input.indexOf('\n');
- if (-1 == i) i = this.input.length;
- var str = this.input.substr(0, i);
- this.consume(str.length);
- return this.tok('text', str);
- }
- },
-
- /**
- * ':'
- */
-
- colon: function() {
- return this.scan(/^: */, ':');
- },
-
- /**
- * Return the next token object, or those
- * previously stashed by lookahead.
- *
- * @return {Object}
- * @api private
- */
-
- advance: function(){
- return this.stashed()
- || this.next();
- },
-
- /**
- * Return the next token object.
- *
- * @return {Object}
- * @api private
- */
-
- next: function() {
- return this.deferred()
- || this.blank()
- || this.eos()
- || this.pipelessText()
- || this.yield()
- || this.doctype()
- || this.interpolation()
- || this["case"]()
- || this.when()
- || this["default"]()
- || this["extends"]()
- || this.append()
- || this.prepend()
- || this.block()
- || this.include()
- || this.mixin()
- || this.call()
- || this.conditional()
- || this.each()
- || this["while"]()
- || this.assignment()
- || this.tag()
- || this.filter()
- || this.code()
- || this.id()
- || this.className()
- || this.attrs()
- || this.indent()
- || this.comment()
- || this.colon()
- || this.text();
- }
-};
-
-}); // module: lexer.js
-
-require.register("nodes/attrs.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Attrs
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node'),
- Block = require('./block');
-
-/**
- * Initialize a `Attrs` node.
- *
- * @api public
- */
-
-var Attrs = module.exports = function Attrs() {
- this.attrs = [];
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Attrs.prototype = new Node;
-Attrs.prototype.constructor = Attrs;
-
-
-/**
- * Set attribute `name` to `val`, keep in mind these become
- * part of a raw js object literal, so to quote a value you must
- * '"quote me"', otherwise or example 'user.name' is literal JavaScript.
- *
- * @param {String} name
- * @param {String} val
- * @param {Boolean} escaped
- * @return {Tag} for chaining
- * @api public
- */
-
-Attrs.prototype.setAttribute = function(name, val, escaped){
- this.attrs.push({ name: name, val: val, escaped: escaped });
- return this;
-};
-
-/**
- * Remove attribute `name` when present.
- *
- * @param {String} name
- * @api public
- */
-
-Attrs.prototype.removeAttribute = function(name){
- for (var i = 0, len = this.attrs.length; i < len; ++i) {
- if (this.attrs[i] && this.attrs[i].name == name) {
- delete this.attrs[i];
- }
- }
-};
-
-/**
- * Get attribute value by `name`.
- *
- * @param {String} name
- * @return {String}
- * @api public
- */
-
-Attrs.prototype.getAttribute = function(name){
- for (var i = 0, len = this.attrs.length; i < len; ++i) {
- if (this.attrs[i] && this.attrs[i].name == name) {
- return this.attrs[i].val;
- }
- }
-};
-
-}); // module: nodes/attrs.js
-
-require.register("nodes/block-comment.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - BlockComment
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `BlockComment` with the given `block`.
- *
- * @param {String} val
- * @param {Block} block
- * @param {Boolean} buffer
- * @api public
- */
-
-var BlockComment = module.exports = function BlockComment(val, block, buffer) {
- this.block = block;
- this.val = val;
- this.buffer = buffer;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-BlockComment.prototype = new Node;
-BlockComment.prototype.constructor = BlockComment;
-
-}); // module: nodes/block-comment.js
-
-require.register("nodes/block.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Block
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a new `Block` with an optional `node`.
- *
- * @param {Node} node
- * @api public
- */
-
-var Block = module.exports = function Block(node){
- this.nodes = [];
- if (node) this.push(node);
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Block.prototype = new Node;
-Block.prototype.constructor = Block;
-
-
-/**
- * Block flag.
- */
-
-Block.prototype.isBlock = true;
-
-/**
- * Replace the nodes in `other` with the nodes
- * in `this` block.
- *
- * @param {Block} other
- * @api private
- */
-
-Block.prototype.replace = function(other){
- other.nodes = this.nodes;
-};
-
-/**
- * Pust the given `node`.
- *
- * @param {Node} node
- * @return {Number}
- * @api public
- */
-
-Block.prototype.push = function(node){
- return this.nodes.push(node);
-};
-
-/**
- * Check if this block is empty.
- *
- * @return {Boolean}
- * @api public
- */
-
-Block.prototype.isEmpty = function(){
- return 0 == this.nodes.length;
-};
-
-/**
- * Unshift the given `node`.
- *
- * @param {Node} node
- * @return {Number}
- * @api public
- */
-
-Block.prototype.unshift = function(node){
- return this.nodes.unshift(node);
-};
-
-/**
- * Return the "last" block, or the first `yield` node.
- *
- * @return {Block}
- * @api private
- */
-
-Block.prototype.includeBlock = function(){
- var ret = this
- , node;
-
- for (var i = 0, len = this.nodes.length; i < len; ++i) {
- node = this.nodes[i];
- if (node.yield) return node;
- else if (node.textOnly) continue;
- else if (node.includeBlock) ret = node.includeBlock();
- else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock();
- }
-
- return ret;
-};
-
-/**
- * Return a clone of this block.
- *
- * @return {Block}
- * @api private
- */
-
-Block.prototype.clone = function(){
- var clone = new Block;
- for (var i = 0, len = this.nodes.length; i < len; ++i) {
- clone.push(this.nodes[i].clone());
- }
- return clone;
-};
-
-
-}); // module: nodes/block.js
-
-require.register("nodes/case.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Case
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a new `Case` with `expr`.
- *
- * @param {String} expr
- * @api public
- */
-
-var Case = exports = module.exports = function Case(expr, block){
- this.expr = expr;
- this.block = block;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Case.prototype = new Node;
-Case.prototype.constructor = Case;
-
-
-var When = exports.When = function When(expr, block){
- this.expr = expr;
- this.block = block;
- this.debug = false;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-When.prototype = new Node;
-When.prototype.constructor = When;
-
-
-
-}); // module: nodes/case.js
-
-require.register("nodes/code.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Code
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Code` node with the given code `val`.
- * Code may also be optionally buffered and escaped.
- *
- * @param {String} val
- * @param {Boolean} buffer
- * @param {Boolean} escape
- * @api public
- */
-
-var Code = module.exports = function Code(val, buffer, escape) {
- this.val = val;
- this.buffer = buffer;
- this.escape = escape;
- if (val.match(/^ *else/)) this.debug = false;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Code.prototype = new Node;
-Code.prototype.constructor = Code;
-
-}); // module: nodes/code.js
-
-require.register("nodes/comment.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Comment
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Comment` with the given `val`, optionally `buffer`,
- * otherwise the comment may render in the output.
- *
- * @param {String} val
- * @param {Boolean} buffer
- * @api public
- */
-
-var Comment = module.exports = function Comment(val, buffer) {
- this.val = val;
- this.buffer = buffer;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Comment.prototype = new Node;
-Comment.prototype.constructor = Comment;
-
-}); // module: nodes/comment.js
-
-require.register("nodes/doctype.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Doctype
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Doctype` with the given `val`.
- *
- * @param {String} val
- * @api public
- */
-
-var Doctype = module.exports = function Doctype(val) {
- this.val = val;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Doctype.prototype = new Node;
-Doctype.prototype.constructor = Doctype;
-
-}); // module: nodes/doctype.js
-
-require.register("nodes/each.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Each
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize an `Each` node, representing iteration
- *
- * @param {String} obj
- * @param {String} val
- * @param {String} key
- * @param {Block} block
- * @api public
- */
-
-var Each = module.exports = function Each(obj, val, key, block) {
- this.obj = obj;
- this.val = val;
- this.key = key;
- this.block = block;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Each.prototype = new Node;
-Each.prototype.constructor = Each;
-
-}); // module: nodes/each.js
-
-require.register("nodes/filter.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Filter
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node')
- , Block = require('./block');
-
-/**
- * Initialize a `Filter` node with the given
- * filter `name` and `block`.
- *
- * @param {String} name
- * @param {Block|Node} block
- * @api public
- */
-
-var Filter = module.exports = function Filter(name, block, attrs) {
- this.name = name;
- this.block = block;
- this.attrs = attrs;
- this.isASTFilter = !block.nodes.every(function(node){ return node.isText });
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Filter.prototype = new Node;
-Filter.prototype.constructor = Filter;
-
-}); // module: nodes/filter.js
-
-require.register("nodes/index.js", function(module, exports, require){
-
-/*!
- * Jade - nodes
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-exports.Node = require('./node');
-exports.Tag = require('./tag');
-exports.Code = require('./code');
-exports.Each = require('./each');
-exports.Case = require('./case');
-exports.Text = require('./text');
-exports.Block = require('./block');
-exports.Mixin = require('./mixin');
-exports.Filter = require('./filter');
-exports.Comment = require('./comment');
-exports.Literal = require('./literal');
-exports.BlockComment = require('./block-comment');
-exports.Doctype = require('./doctype');
-
-}); // module: nodes/index.js
-
-require.register("nodes/literal.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Literal
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Literal` node with the given `str.
- *
- * @param {String} str
- * @api public
- */
-
-var Literal = module.exports = function Literal(str) {
- this.str = str
- .replace(/\\/g, "\\\\")
- .replace(/\n|\r\n/g, "\\n")
- .replace(/'/g, "\\'");
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Literal.prototype = new Node;
-Literal.prototype.constructor = Literal;
-
-
-}); // module: nodes/literal.js
-
-require.register("nodes/mixin.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Mixin
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Attrs = require('./attrs');
-
-/**
- * Initialize a new `Mixin` with `name` and `block`.
- *
- * @param {String} name
- * @param {String} args
- * @param {Block} block
- * @api public
- */
-
-var Mixin = module.exports = function Mixin(name, args, block, call){
- this.name = name;
- this.args = args;
- this.block = block;
- this.attrs = [];
- this.call = call;
-};
-
-/**
- * Inherit from `Attrs`.
- */
-
-Mixin.prototype = new Attrs;
-Mixin.prototype.constructor = Mixin;
-
-
-
-}); // module: nodes/mixin.js
-
-require.register("nodes/node.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Node
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Initialize a `Node`.
- *
- * @api public
- */
-
-var Node = module.exports = function Node(){};
-
-/**
- * Clone this node (return itself)
- *
- * @return {Node}
- * @api private
- */
-
-Node.prototype.clone = function(){
- return this;
-};
-
-}); // module: nodes/node.js
-
-require.register("nodes/tag.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Tag
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Attrs = require('./attrs'),
- Block = require('./block'),
- inlineTags = require('../inline-tags');
-
-/**
- * Initialize a `Tag` node with the given tag `name` and optional `block`.
- *
- * @param {String} name
- * @param {Block} block
- * @api public
- */
-
-var Tag = module.exports = function Tag(name, block) {
- this.name = name;
- this.attrs = [];
- this.block = block || new Block;
-};
-
-/**
- * Inherit from `Attrs`.
- */
-
-Tag.prototype = new Attrs;
-Tag.prototype.constructor = Tag;
-
-
-/**
- * Clone this tag.
- *
- * @return {Tag}
- * @api private
- */
-
-Tag.prototype.clone = function(){
- var clone = new Tag(this.name, this.block.clone());
- clone.line = this.line;
- clone.attrs = this.attrs;
- clone.textOnly = this.textOnly;
- return clone;
-};
-
-/**
- * Check if this tag is an inline tag.
- *
- * @return {Boolean}
- * @api private
- */
-
-Tag.prototype.isInline = function(){
- return ~inlineTags.indexOf(this.name);
-};
-
-/**
- * Check if this tag's contents can be inlined. Used for pretty printing.
- *
- * @return {Boolean}
- * @api private
- */
-
-Tag.prototype.canInline = function(){
- var nodes = this.block.nodes;
-
- function isInline(node){
- // Recurse if the node is a block
- if (node.isBlock) return node.nodes.every(isInline);
- return node.isText || (node.isInline && node.isInline());
- }
-
- // Empty tag
- if (!nodes.length) return true;
-
- // Text-only or inline-only tag
- if (1 == nodes.length) return isInline(nodes[0]);
-
- // Multi-line inline-only tag
- if (this.block.nodes.every(isInline)) {
- for (var i = 1, len = nodes.length; i < len; ++i) {
- if (nodes[i-1].isText && nodes[i].isText)
- return false;
- }
- return true;
- }
-
- // Mixed tag
- return false;
-};
-}); // module: nodes/tag.js
-
-require.register("nodes/text.js", function(module, exports, require){
-
-/*!
- * Jade - nodes - Text
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Text` node with optional `line`.
- *
- * @param {String} line
- * @api public
- */
-
-var Text = module.exports = function Text(line) {
- this.val = '';
- if ('string' == typeof line) this.val = line;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Text.prototype = new Node;
-Text.prototype.constructor = Text;
-
-
-/**
- * Flag as text.
- */
-
-Text.prototype.isText = true;
-}); // module: nodes/text.js
-
-require.register("parser.js", function(module, exports, require){
-
-/*!
- * Jade - Parser
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Lexer = require('./lexer')
- , nodes = require('./nodes');
-
-/**
- * Initialize `Parser` with the given input `str` and `filename`.
- *
- * @param {String} str
- * @param {String} filename
- * @param {Object} options
- * @api public
- */
-
-var Parser = exports = module.exports = function Parser(str, filename, options){
- this.input = str;
- this.lexer = new Lexer(str, options);
- this.filename = filename;
- this.blocks = {};
- this.mixins = {};
- this.options = options;
- this.contexts = [this];
-};
-
-/**
- * Tags that may not contain tags.
- */
-
-var textOnly = exports.textOnly = ['script', 'style'];
-
-/**
- * Parser prototype.
- */
-
-Parser.prototype = {
-
- /**
- * Push `parser` onto the context stack,
- * or pop and return a `Parser`.
- */
-
- context: function(parser){
- if (parser) {
- this.contexts.push(parser);
- } else {
- return this.contexts.pop();
- }
- },
-
- /**
- * Return the next token object.
- *
- * @return {Object}
- * @api private
- */
-
- advance: function(){
- return this.lexer.advance();
- },
-
- /**
- * Skip `n` tokens.
- *
- * @param {Number} n
- * @api private
- */
-
- skip: function(n){
- while (n--) this.advance();
- },
-
- /**
- * Single token lookahead.
- *
- * @return {Object}
- * @api private
- */
-
- peek: function() {
- return this.lookahead(1);
- },
-
- /**
- * Return lexer lineno.
- *
- * @return {Number}
- * @api private
- */
-
- line: function() {
- return this.lexer.lineno;
- },
-
- /**
- * `n` token lookahead.
- *
- * @param {Number} n
- * @return {Object}
- * @api private
- */
-
- lookahead: function(n){
- return this.lexer.lookahead(n);
- },
-
- /**
- * Parse input returning a string of js for evaluation.
- *
- * @return {String}
- * @api public
- */
-
- parse: function(){
- var block = new nodes.Block, parser;
- block.line = this.line();
-
- while ('eos' != this.peek().type) {
- if ('newline' == this.peek().type) {
- this.advance();
- } else {
- block.push(this.parseExpr());
- }
- }
-
- if (parser = this.extending) {
- this.context(parser);
- var ast = parser.parse();
- this.context();
- // hoist mixins
- for (var name in this.mixins)
- ast.unshift(this.mixins[name]);
- return ast;
- }
-
- return block;
- },
-
- /**
- * Expect the given type, or throw an exception.
- *
- * @param {String} type
- * @api private
- */
-
- expect: function(type){
- if (this.peek().type === type) {
- return this.advance();
- } else {
- throw new Error('expected "' + type + '", but got "' + this.peek().type + '"');
- }
- },
-
- /**
- * Accept the given `type`.
- *
- * @param {String} type
- * @api private
- */
-
- accept: function(type){
- if (this.peek().type === type) {
- return this.advance();
- }
- },
-
- /**
- * tag
- * | doctype
- * | mixin
- * | include
- * | filter
- * | comment
- * | text
- * | each
- * | code
- * | yield
- * | id
- * | class
- * | interpolation
- */
-
- parseExpr: function(){
- switch (this.peek().type) {
- case 'tag':
- return this.parseTag();
- case 'mixin':
- return this.parseMixin();
- case 'block':
- return this.parseBlock();
- case 'case':
- return this.parseCase();
- case 'when':
- return this.parseWhen();
- case 'default':
- return this.parseDefault();
- case 'extends':
- return this.parseExtends();
- case 'include':
- return this.parseInclude();
- case 'doctype':
- return this.parseDoctype();
- case 'filter':
- return this.parseFilter();
- case 'comment':
- return this.parseComment();
- case 'text':
- return this.parseText();
- case 'each':
- return this.parseEach();
- case 'code':
- return this.parseCode();
- case 'call':
- return this.parseCall();
- case 'interpolation':
- return this.parseInterpolation();
- case 'yield':
- this.advance();
- var block = new nodes.Block;
- block.yield = true;
- return block;
- case 'id':
- case 'class':
- var tok = this.advance();
- this.lexer.defer(this.lexer.tok('tag', 'div'));
- this.lexer.defer(tok);
- return this.parseExpr();
- default:
- throw new Error('unexpected token "' + this.peek().type + '"');
- }
- },
-
- /**
- * Text
- */
-
- parseText: function(){
- var tok = this.expect('text')
- , node = new nodes.Text(tok.val);
- node.line = this.line();
- return node;
- },
-
- /**
- * ':' expr
- * | block
- */
-
- parseBlockExpansion: function(){
- if (':' == this.peek().type) {
- this.advance();
- return new nodes.Block(this.parseExpr());
- } else {
- return this.block();
- }
- },
-
- /**
- * case
- */
-
- parseCase: function(){
- var val = this.expect('case').val
- , node = new nodes.Case(val);
- node.line = this.line();
- node.block = this.block();
- return node;
- },
-
- /**
- * when
- */
-
- parseWhen: function(){
- var val = this.expect('when').val
- return new nodes.Case.When(val, this.parseBlockExpansion());
- },
-
- /**
- * default
- */
-
- parseDefault: function(){
- this.expect('default');
- return new nodes.Case.When('default', this.parseBlockExpansion());
- },
-
- /**
- * code
- */
-
- parseCode: function(){
- var tok = this.expect('code')
- , node = new nodes.Code(tok.val, tok.buffer, tok.escape)
- , block
- , i = 1;
- node.line = this.line();
- while (this.lookahead(i) && 'newline' == this.lookahead(i).type) ++i;
- block = 'indent' == this.lookahead(i).type;
- if (block) {
- this.skip(i-1);
- node.block = this.block();
- }
- return node;
- },
-
- /**
- * comment
- */
-
- parseComment: function(){
- var tok = this.expect('comment')
- , node;
-
- if ('indent' == this.peek().type) {
- node = new nodes.BlockComment(tok.val, this.block(), tok.buffer);
- } else {
- node = new nodes.Comment(tok.val, tok.buffer);
- }
-
- node.line = this.line();
- return node;
- },
-
- /**
- * doctype
- */
-
- parseDoctype: function(){
- var tok = this.expect('doctype')
- , node = new nodes.Doctype(tok.val);
- node.line = this.line();
- return node;
- },
-
- /**
- * filter attrs? text-block
- */
-
- parseFilter: function(){
- var block
- , tok = this.expect('filter')
- , attrs = this.accept('attrs');
-
- this.lexer.pipeless = true;
- block = this.parseTextBlock();
- this.lexer.pipeless = false;
-
- var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs);
- node.line = this.line();
- return node;
- },
-
- /**
- * tag ':' attrs? block
- */
-
- parseASTFilter: function(){
- var block
- , tok = this.expect('tag')
- , attrs = this.accept('attrs');
-
- this.expect(':');
- block = this.block();
-
- var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs);
- node.line = this.line();
- return node;
- },
-
- /**
- * each block
- */
-
- parseEach: function(){
- var tok = this.expect('each')
- , node = new nodes.Each(tok.code, tok.val, tok.key);
- node.line = this.line();
- node.block = this.block();
- return node;
- },
-
- /**
- * 'extends' name
- */
-
- parseExtends: function(){
- var path = require('path')
- , fs = require('fs')
- , dirname = path.dirname
- , basename = path.basename
- , join = path.join;
-
- if (!this.filename)
- throw new Error('the "filename" option is required to extend templates');
-
- var path = this.expect('extends').val.trim()
- , dir = dirname(this.filename);
-
- var path = join(dir, path + '.jade')
- , str = fs.readFileSync(path, 'utf8')
- , parser = new Parser(str, path, this.options);
-
- parser.blocks = this.blocks;
- parser.contexts = this.contexts;
- this.extending = parser;
-
- // TODO: null node
- return new nodes.Literal('');
- },
-
- /**
- * 'block' name block
- */
-
- parseBlock: function(){
- var block = this.expect('block')
- , mode = block.mode
- , name = block.val.trim();
-
- block = 'indent' == this.peek().type
- ? this.block()
- : new nodes.Block(new nodes.Literal(''));
-
- var prev = this.blocks[name];
-
- if (prev) {
- switch (prev.mode) {
- case 'append':
- block.nodes = block.nodes.concat(prev.nodes);
- prev = block;
- break;
- case 'prepend':
- block.nodes = prev.nodes.concat(block.nodes);
- prev = block;
- break;
- }
- }
-
- block.mode = mode;
- return this.blocks[name] = prev || block;
- },
-
- /**
- * include block?
- */
-
- parseInclude: function(){
- var path = require('path')
- , fs = require('fs')
- , dirname = path.dirname
- , basename = path.basename
- , join = path.join;
-
- var path = this.expect('include').val.trim()
- , dir = dirname(this.filename);
-
- if (!this.filename)
- throw new Error('the "filename" option is required to use includes');
-
- // no extension
- if (!~basename(path).indexOf('.')) {
- path += '.jade';
- }
-
- // non-jade
- if ('.jade' != path.substr(-5)) {
- var path = join(dir, path)
- , str = fs.readFileSync(path, 'utf8');
- return new nodes.Literal(str);
- }
-
- var path = join(dir, path)
- , str = fs.readFileSync(path, 'utf8')
- , parser = new Parser(str, path, this.options);
- parser.blocks = this.blocks;
- parser.mixins = this.mixins;
-
- this.context(parser);
- var ast = parser.parse();
- this.context();
- ast.filename = path;
-
- if ('indent' == this.peek().type) {
- ast.includeBlock().push(this.block());
- }
-
- return ast;
- },
-
- /**
- * call ident block
- */
-
- parseCall: function(){
- var tok = this.expect('call')
- , name = tok.val
- , args = tok.args
- , mixin = new nodes.Mixin(name, args, new nodes.Block, true);
-
- this.tag(mixin);
- if (mixin.block.isEmpty()) mixin.block = null;
- return mixin;
- },
-
- /**
- * mixin block
- */
-
- parseMixin: function(){
- var tok = this.expect('mixin')
- , name = tok.val
- , args = tok.args
- , mixin;
-
- // definition
- if ('indent' == this.peek().type) {
- mixin = new nodes.Mixin(name, args, this.block(), false);
- this.mixins[name] = mixin;
- return mixin;
- // call
- } else {
- return new nodes.Mixin(name, args, null, true);
- }
- },
-
- /**
- * indent (text | newline)* outdent
- */
-
- parseTextBlock: function(){
- var block = new nodes.Block;
- block.line = this.line();
- var spaces = this.expect('indent').val;
- if (null == this._spaces) this._spaces = spaces;
- var indent = Array(spaces - this._spaces + 1).join(' ');
- while ('outdent' != this.peek().type) {
- switch (this.peek().type) {
- case 'newline':
- this.advance();
- break;
- case 'indent':
- this.parseTextBlock().nodes.forEach(function(node){
- block.push(node);
- });
- break;
- default:
- var text = new nodes.Text(indent + this.advance().val);
- text.line = this.line();
- block.push(text);
- }
- }
-
- if (spaces == this._spaces) this._spaces = null;
- this.expect('outdent');
- return block;
- },
-
- /**
- * indent expr* outdent
- */
-
- block: function(){
- var block = new nodes.Block;
- block.line = this.line();
- this.expect('indent');
- while ('outdent' != this.peek().type) {
- if ('newline' == this.peek().type) {
- this.advance();
- } else {
- block.push(this.parseExpr());
- }
- }
- this.expect('outdent');
- return block;
- },
-
- /**
- * interpolation (attrs | class | id)* (text | code | ':')? newline* block?
- */
-
- parseInterpolation: function(){
- var tok = this.advance();
- var tag = new nodes.Tag(tok.val);
- tag.buffer = true;
- return this.tag(tag);
- },
-
- /**
- * tag (attrs | class | id)* (text | code | ':')? newline* block?
- */
-
- parseTag: function(){
- // ast-filter look-ahead
- var i = 2;
- if ('attrs' == this.lookahead(i).type) ++i;
- if (':' == this.lookahead(i).type) {
- if ('indent' == this.lookahead(++i).type) {
- return this.parseASTFilter();
- }
- }
-
- var tok = this.advance()
- , tag = new nodes.Tag(tok.val);
-
- tag.selfClosing = tok.selfClosing;
-
- return this.tag(tag);
- },
-
- /**
- * Parse tag.
- */
-
- tag: function(tag){
- var dot;
-
- tag.line = this.line();
-
- // (attrs | class | id)*
- out:
- while (true) {
- switch (this.peek().type) {
- case 'id':
- case 'class':
- var tok = this.advance();
- tag.setAttribute(tok.type, "'" + tok.val + "'");
- continue;
- case 'attrs':
- var tok = this.advance()
- , obj = tok.attrs
- , escaped = tok.escaped
- , names = Object.keys(obj);
-
- if (tok.selfClosing) tag.selfClosing = true;
-
- for (var i = 0, len = names.length; i < len; ++i) {
- var name = names[i]
- , val = obj[name];
- tag.setAttribute(name, val, escaped[name]);
- }
- continue;
- default:
- break out;
- }
- }
-
- // check immediate '.'
- if ('.' == this.peek().val) {
- dot = tag.textOnly = true;
- this.advance();
- }
-
- // (text | code | ':')?
- switch (this.peek().type) {
- case 'text':
- tag.block.push(this.parseText());
- break;
- case 'code':
- tag.code = this.parseCode();
- break;
- case ':':
- this.advance();
- tag.block = new nodes.Block;
- tag.block.push(this.parseExpr());
- break;
- }
-
- // newline*
- while ('newline' == this.peek().type) this.advance();
-
- tag.textOnly = tag.textOnly || ~textOnly.indexOf(tag.name);
-
- // script special-case
- if ('script' == tag.name) {
- var type = tag.getAttribute('type');
- if (!dot && type && 'text/javascript' != type.replace(/^['"]|['"]$/g, '')) {
- tag.textOnly = false;
- }
- }
-
- // block?
- if ('indent' == this.peek().type) {
- if (tag.textOnly) {
- this.lexer.pipeless = true;
- tag.block = this.parseTextBlock();
- this.lexer.pipeless = false;
- } else {
- var block = this.block();
- if (tag.block) {
- for (var i = 0, len = block.nodes.length; i < len; ++i) {
- tag.block.push(block.nodes[i]);
- }
- } else {
- tag.block = block;
- }
- }
- }
-
- return tag;
- }
-};
-
-}); // module: parser.js
-
-require.register("runtime.js", function(module, exports, require){
-
-/*!
- * Jade - runtime
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Lame Array.isArray() polyfill for now.
- */
-
-if (!Array.isArray) {
- Array.isArray = function(arr){
- return '[object Array]' == Object.prototype.toString.call(arr);
- };
-}
-
-/**
- * Lame Object.keys() polyfill for now.
- */
-
-if (!Object.keys) {
- Object.keys = function(obj){
- var arr = [];
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- arr.push(key);
- }
- }
- return arr;
- }
-}
-
-/**
- * Merge two attribute objects giving precedence
- * to values in object `b`. Classes are special-cased
- * allowing for arrays and merging/joining appropriately
- * resulting in a string.
- *
- * @param {Object} a
- * @param {Object} b
- * @return {Object} a
- * @api private
- */
-
-exports.merge = function merge(a, b) {
- var ac = a['class'];
- var bc = b['class'];
-
- if (ac || bc) {
- ac = ac || [];
- bc = bc || [];
- if (!Array.isArray(ac)) ac = [ac];
- if (!Array.isArray(bc)) bc = [bc];
- ac = ac.filter(nulls);
- bc = bc.filter(nulls);
- a['class'] = ac.concat(bc).join(' ');
- }
-
- for (var key in b) {
- if (key != 'class') {
- a[key] = b[key];
- }
- }
-
- return a;
-};
-
-/**
- * Filter null `val`s.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
-function nulls(val) {
- return val != null;
-}
-
-/**
- * Render the given attributes object.
- *
- * @param {Object} obj
- * @param {Object} escaped
- * @return {String}
- * @api private
- */
-
-exports.attrs = function attrs(obj, escaped){
- var buf = []
- , terse = obj.terse;
-
- delete obj.terse;
- var keys = Object.keys(obj)
- , len = keys.length;
-
- if (len) {
- buf.push('');
- for (var i = 0; i < len; ++i) {
- var key = keys[i]
- , val = obj[key];
-
- if ('boolean' == typeof val || null == val) {
- if (val) {
- terse
- ? buf.push(key)
- : buf.push(key + '="' + key + '"');
- }
- } else if (0 == key.indexOf('data') && 'string' != typeof val) {
- buf.push(key + "='" + JSON.stringify(val) + "'");
- } else if ('class' == key && Array.isArray(val)) {
- buf.push(key + '="' + exports.escape(val.join(' ')) + '"');
- } else if (escaped && escaped[key]) {
- buf.push(key + '="' + exports.escape(val) + '"');
- } else {
- buf.push(key + '="' + val + '"');
- }
- }
- }
-
- return buf.join(' ');
-};
-
-/**
- * Escape the given string of `html`.
- *
- * @param {String} html
- * @return {String}
- * @api private
- */
-
-exports.escape = function escape(html){
- return String(html)
- .replace(/&(?!(\w+|\#\d+);)/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/"/g, '&quot;');
-};
-
-/**
- * Re-throw the given `err` in context to the
- * the jade in `filename` at the given `lineno`.
- *
- * @param {Error} err
- * @param {String} filename
- * @param {String} lineno
- * @api private
- */
-
-exports.rethrow = function rethrow(err, filename, lineno){
- if (!filename) throw err;
-
- var context = 3
- , str = require('fs').readFileSync(filename, 'utf8')
- , lines = str.split('\n')
- , start = Math.max(lineno - context, 0)
- , end = Math.min(lines.length, lineno + context);
-
- // Error context
- var context = lines.slice(start, end).map(function(line, i){
- var curr = i + start + 1;
- return (curr == lineno ? ' > ' : ' ')
- + curr
- + '| '
- + line;
- }).join('\n');
-
- // Alter exception message
- err.path = filename;
- err.message = (filename || 'Jade') + ':' + lineno
- + '\n' + context + '\n\n' + err.message;
- throw err;
-};
-
-}); // module: runtime.js
-
-require.register("self-closing.js", function(module, exports, require){
-
-/*!
- * Jade - self closing tags
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-module.exports = [
- 'meta'
- , 'img'
- , 'link'
- , 'input'
- , 'source'
- , 'area'
- , 'base'
- , 'col'
- , 'br'
- , 'hr'
-];
-}); // module: self-closing.js
-
-require.register("utils.js", function(module, exports, require){
-
-/*!
- * Jade - utils
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Convert interpolation in the given string to JavaScript.
- *
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-var interpolate = exports.interpolate = function(str){
- return str.replace(/(\\)?([#!]){(.*?)}/g, function(str, escape, flag, code){
- return escape
- ? str
- : "' + "
- + ('!' == flag ? '' : 'escape')
- + "((interp = " + code.replace(/\\'/g, "'")
- + ") == null ? '' : interp) + '";
- });
-};
-
-/**
- * Escape single quotes in `str`.
- *
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-var escape = exports.escape = function(str) {
- return str.replace(/'/g, "\\'");
-};
-
-/**
- * Interpolate, and escape the given `str`.
- *
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-exports.text = function(str){
- return interpolate(escape(str));
-};
-}); // module: utils.js
-
-window.jade = require("jade");
-})();
diff --git a/node_modules/jade/jade.md b/node_modules/jade/jade.md
deleted file mode 100644
index 051dc0311..000000000
--- a/node_modules/jade/jade.md
+++ /dev/null
@@ -1,510 +0,0 @@
-
-# Jade
-
- The jade template engine for node.js
-
-## Synopsis
-
- jade [-h|--help] [-v|--version] [-o|--obj STR]
- [-O|--out DIR] [-p|--path PATH] [-P|--pretty]
- [-c|--client] [-D|--no-debug]
-
-## Examples
-
- translate jade the templates dir
-
- $ jade templates
-
- create {foo,bar}.html
-
- $ jade {foo,bar}.jade
-
- jade over stdio
-
- $ jade < my.jade > my.html
-
- jade over s
-
- $ echo "h1 Jade!" | jade
-
- foo, bar dirs rendering to /tmp
-
- $ jade foo bar --out /tmp
-
- compile client-side templates without debugging
- instrumentation, making the output javascript
- very light-weight. This requires runtime.js
- in your projects.
-
- $ jade --client --no-debug < my.jade
-
-## Tags
-
- Tags are simply nested via whitespace, closing
- tags defined for you. These indents are called "blocks".
-
- ul
- li
- a Foo
- li
- a Bar
-
- You may have several tags in one "block":
-
- ul
- li
- a Foo
- a Bar
- a Baz
-
-## Self-closing Tags
-
- Some tags are flagged as self-closing by default, such
- as `meta`, `link`, and so on. To explicitly self-close
- a tag simply append the `/` character:
-
- foo/
- foo(bar='baz')/
-
- Would yield:
-
- <foo/>
- <foo bar="baz"/>
-
-## Attributes
-
- Tag attributes look similar to HTML, however
- the values are regular JavaScript, here are
- some examples:
-
- a(href='google.com') Google
- a(class='button', href='google.com') Google
-
- As mentioned the attribute values are just JavaScript,
- this means ternary operations and other JavaScript expressions
- work just fine:
-
- body(class=user.authenticated ? 'authenticated' : 'anonymous')
- a(href=user.website || 'http://google.com')
-
- Multiple lines work too:
-
- input(type='checkbox',
- name='agreement',
- checked)
-
- Multiple lines without the comma work fine:
-
- input(type='checkbox'
- name='agreement'
- checked)
-
- Funky whitespace? fine:
-
- input(
- type='checkbox'
- name='agreement'
- checked)
-
-## Boolean attributes
-
- Boolean attributes are mirrored by Jade, and accept
- bools, aka _true_ or _false_. When no value is specified
- _true_ is assumed. For example:
-
- input(type="checkbox", checked)
- // => "<input type="checkbox" checked="checked" />"
-
- For example if the checkbox was for an agreement, perhaps `user.agreed`
- was _true_ the following would also output 'checked="checked"':
-
- input(type="checkbox", checked=user.agreed)
-
-## Class attributes
-
- The _class_ attribute accepts an array of classes,
- this can be handy when generated from a javascript
- function etc:
-
- classes = ['foo', 'bar', 'baz']
- a(class=classes)
- // => "<a class="foo bar baz"></a>"
-
-## Class literal
-
- Classes may be defined using a ".CLASSNAME" syntax:
-
- .button
- // => "<div class="button"></div>"
-
- Or chained:
-
- .large.button
- // => "<div class="large button"></div>"
-
- The previous defaulted to divs, however you
- may also specify the tag type:
-
- h1.title My Title
- // => "<h1 class="title">My Title</h1>"
-
-## Id literal
-
- Much like the class literal there's an id literal:
-
- #user-1
- // => "<div id="user-1"></div>"
-
- Again we may specify the tag as well:
-
- ul#menu
- li: a(href='/home') Home
- li: a(href='/store') Store
- li: a(href='/contact') Contact
-
- Finally all of these may be used in any combination,
- the following are all valid tags:
-
- a.button#contact(style: 'color: red') Contact
- a.button(style: 'color: red')#contact Contact
- a(style: 'color: red').button#contact Contact
-
-## Block expansion
-
- Jade supports the concept of "block expansion", in which
- using a trailing ":" after a tag will inject a block:
-
- ul
- li: a Foo
- li: a Bar
- li: a Baz
-
-## Text
-
- Arbitrary text may follow tags:
-
- p Welcome to my site
-
- yields:
-
- <p>Welcome to my site</p>
-
-## Pipe text
-
- Another form of text is "pipe" text. Pipes act
- as the text margin for large bodies of text.
-
- p
- | This is a large
- | body of text for
- | this tag.
- |
- | Nothing too
- | exciting.
-
- yields:
-
- <p>This is a large
- body of text for
- this tag.
-
- Nothing too
- exciting.
- </p>
-
- Using pipes we can also specify regular Jade tags
- within the text:
-
- p
- | Click to visit
- a(href='http://google.com') Google
- | if you want.
-
-## Text only tags
-
- As an alternative to pipe text you may add
- a trailing "." to indicate that the block
- contains nothing but plain-text, no tags:
-
- p.
- This is a large
- body of text for
- this tag.
-
- Nothing too
- exciting.
-
- Some tags are text-only by default, for example
- _script_, _textarea_, and _style_ tags do not
- contain nested HTML so Jade implies the trailing ".":
-
- script
- if (foo) {
- bar();
- }
-
- style
- body {
- padding: 50px;
- font: 14px Helvetica;
- }
-
-## Template script tags
-
- Sometimes it's useful to define HTML in script
- tags using Jade, typically for client-side templates.
-
- To do this simply give the _script_ tag an arbitrary
- _type_ attribute such as _text/x-template_:
-
- script(type='text/template')
- h1 Look!
- p Jade still works in here!
-
-## Interpolation
-
- Both plain-text and piped-text support interpolation,
- which comes in two forms, escapes and non-escaped. The
- following will output the _user.name_ in the paragraph
- but HTML within it will be escaped to prevent XSS attacks:
-
- p Welcome #{user.name}
-
- The following syntax is identical however it will _not_ escape
- HTML, and should only be used with strings that you trust:
-
- p Welcome !{user.name}
-
-## Inline HTML
-
- Sometimes constructing small inline snippets of HTML
- in Jade can be annoying, luckily we can add plain
- HTML as well:
-
- p Welcome <em>#{user.name}</em>
-
-## Code
-
- To buffer output with Jade simply use _=_ at the beginning
- of a line or after a tag. This method escapes any HTML
- present in the string.
-
- p= user.description
-
- To buffer output unescaped use the _!=_ variant, but again
- be careful of XSS.
-
- p!= user.description
-
- The final way to mess with JavaScript code in Jade is the unbuffered
- _-_, which can be used for conditionals, defining variables etc:
-
- - var user = { description: 'foo bar baz' }
- #user
- - if (user.description) {
- h2 Description
- p.description= user.description
- - }
-
- When compiled blocks are wrapped in anonymous functions, so the
- following is also valid, without braces:
-
- - var user = { description: 'foo bar baz' }
- #user
- - if (user.description)
- h2 Description
- p.description= user.description
-
- If you really want you could even use `.forEach()` and others:
-
- - users.forEach(function(user){
- .user
- h2= user.name
- p User #{user.name} is #{user.age} years old
- - })
-
- Taking this further Jade provides some syntax for conditionals,
- iteration, switch statements etc. Let's look at those next!
-
-## Assignment
-
- Jade's first-class assignment is simple, simply use the _=_
- operator and Jade will _var_ it for you. The following are equivalent:
-
- - var user = { name: 'tobi' }
- user = { name: 'tobi' }
-
-## Conditionals
-
- Jade's first-class conditional syntax allows for optional
- parenthesis, and you may now omit the leading _-_ otherwise
- it's identical, still just regular javascript:
-
- user = { description: 'foo bar baz' }
- #user
- if user.description
- h2 Description
- p.description= user.description
-
- Jade provides the negated version, _unless_ as well, the following
- are equivalent:
-
- - if (!(user.isAnonymous))
- p You're logged in as #{user.name}
-
- unless user.isAnonymous
- p You're logged in as #{user.name}
-
-## Iteration
-
- JavaScript's _for_ loops don't look very declarative, so Jade
- also provides its own _for_ loop construct, aliased as _each_:
-
- for user in users
- .user
- h2= user.name
- p user #{user.name} is #{user.age} year old
-
- As mentioned _each_ is identical:
-
- each user in users
- .user
- h2= user.name
-
- If necessary the index is available as well:
-
- for user, i in users
- .user(class='user-#{i}')
- h2= user.name
-
- Remember, it's just JavaScript:
-
- ul#letters
- for letter in ['a', 'b', 'c']
- li= letter
-
-## Mixins
-
- Mixins provide a way to define jade "functions" which "mix in"
- their contents when called. This is useful for abstracting
- out large fragments of Jade.
-
- The simplest possible mixin which accepts no arguments might
- look like this:
-
- mixin hello
- p Hello
-
- You use a mixin by placing `+` before the name:
-
- +hello
-
- For something a little more dynamic, mixins can take
- arguments, the mixin itself is converted to a javascript
- function internally:
-
- mixin hello(user)
- p Hello #{user}
-
- +hello('Tobi')
-
- Yields:
-
- <p>Hello Tobi</p>
-
- Mixins may optionally take blocks, when a block is passed
- its contents becomes the implicit `block` argument. For
- example here is a mixin passed a block, and also invoked
- without passing a block:
-
- mixin article(title)
- .article
- .article-wrapper
- h1= title
- if block
- block
- else
- p No content provided
-
- +article('Hello world')
-
- +article('Hello world')
- p This is my
- p Amazing article
-
- yields:
-
- <div class="article">
- <div class="article-wrapper">
- <h1>Hello world</h1>
- <p>No content provided</p>
- </div>
- </div>
-
- <div class="article">
- <div class="article-wrapper">
- <h1>Hello world</h1>
- <p>This is my</p>
- <p>Amazing article</p>
- </div>
- </div>
-
- Mixins can even take attributes, just like a tag. When
- attributes are passed they become the implicit `attributes`
- argument. Individual attributes can be accessed just like
- normal object properties:
-
- mixin centered
- .centered(class=attributes.class)
- block
-
- +centered.bold Hello world
-
- +centered.red
- p This is my
- p Amazing article
-
- yields:
-
- <div class="centered bold">Hello world</div>
- <div class="centered red">
- <p>This is my</p>
- <p>Amazing article</p>
- </div>
-
- If you use `attributes` directly, *all* passed attributes
- get used:
-
- mixin link
- a.menu(attributes)
- block
-
- +link.highlight(href='#top') Top
- +link#sec1.plain(href='#section1') Section 1
- +link#sec2.plain(href='#section2') Section 2
-
- yields:
-
- <a href="#top" class="highlight menu">Top</a>
- <a id="sec1" href="#section1" class="plain menu">Section 1</a>
- <a id="sec2" href="#section2" class="plain menu">Section 2</a>
-
- If you pass arguments, they must directly follow the mixin:
-
- mixin list(arr)
- if block
- .title
- block
- ul(attributes)
- each item in arr
- li= item
-
- +list(['foo', 'bar', 'baz'])(id='myList', class='bold')
-
- yields:
-
- <ul id="myList" class="bold">
- <li>foo</li>
- <li>bar</li>
- <li>baz</li>
- </ul>
diff --git a/node_modules/jade/jade.min.js b/node_modules/jade/jade.min.js
deleted file mode 100644
index 72e4535e0..000000000
--- a/node_modules/jade/jade.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-(function(){function require(p){var path=require.resolve(p),mod=require.modules[path];if(!mod)throw new Error('failed to require "'+p+'"');return mod.exports||(mod.exports={},mod.call(mod.exports,mod,mod.exports,require.relative(path))),mod.exports}require.modules={},require.resolve=function(path){var orig=path,reg=path+".js",index=path+"/index.js";return require.modules[reg]&&reg||require.modules[index]&&index||orig},require.register=function(path,fn){require.modules[path]=fn},require.relative=function(parent){return function(p){if("."!=p.charAt(0))return require(p);var path=parent.split("/"),segs=p.split("/");path.pop();for(var i=0;i<segs.length;i++){var seg=segs[i];".."==seg?path.pop():"."!=seg&&path.push(seg)}return require(path.join("/"))}},require.register("compiler.js",function(module,exports,require){var nodes=require("./nodes"),filters=require("./filters"),doctypes=require("./doctypes"),selfClosing=require("./self-closing"),runtime=require("./runtime"),utils=require("./utils");Object.keys||(Object.keys=function(obj){var arr=[];for(var key in obj)obj.hasOwnProperty(key)&&arr.push(key);return arr}),String.prototype.trimLeft||(String.prototype.trimLeft=function(){return this.replace(/^\s+/,"")});var Compiler=module.exports=function Compiler(node,options){this.options=options=options||{},this.node=node,this.hasCompiledDoctype=!1,this.hasCompiledTag=!1,this.pp=options.pretty||!1,this.debug=!1!==options.compileDebug,this.indents=0,this.parentIndents=0,options.doctype&&this.setDoctype(options.doctype)};Compiler.prototype={compile:function(){return this.buf=["var interp;"],this.pp&&this.buf.push("var __indent = [];"),this.lastBufferedIdx=-1,this.visit(this.node),this.buf.join("\n")},setDoctype:function(name){var doctype=doctypes[(name||"default").toLowerCase()];doctype=doctype||"<!DOCTYPE "+name+">",this.doctype=doctype,this.terse="5"==name||"html"==name,this.xml=0==this.doctype.indexOf("<?xml")},buffer:function(str,esc){esc&&(str=utils.escape(str)),this.lastBufferedIdx==this.buf.length?(this.lastBuffered+=str,this.buf[this.lastBufferedIdx-1]="buf.push('"+this.lastBuffered+"');"):(this.buf.push("buf.push('"+str+"');"),this.lastBuffered=str,this.lastBufferedIdx=this.buf.length)},prettyIndent:function(offset,newline){offset=offset||0,newline=newline?"\\n":"",this.buffer(newline+Array(this.indents+offset).join(" ")),this.parentIndents&&this.buf.push("buf.push.apply(buf, __indent);")},visit:function(node){var debug=this.debug;debug&&this.buf.push("__jade.unshift({ lineno: "+node.line+", filename: "+(node.filename?JSON.stringify(node.filename):"__jade[0].filename")+" });"),!1===node.debug&&this.debug&&(this.buf.pop(),this.buf.pop()),this.visitNode(node),debug&&this.buf.push("__jade.shift();")},visitNode:function(node){var name=node.constructor.name||node.constructor.toString().match(/function ([^(\s]+)()/)[1];return this["visit"+name](node)},visitCase:function(node){var _=this.withinCase;this.withinCase=!0,this.buf.push("switch ("+node.expr+"){"),this.visit(node.block),this.buf.push("}"),this.withinCase=_},visitWhen:function(node){"default"==node.expr?this.buf.push("default:"):this.buf.push("case "+node.expr+":"),this.visit(node.block),this.buf.push(" break;")},visitLiteral:function(node){var str=node.str.replace(/\n/g,"\\\\n");this.buffer(str)},visitBlock:function(block){var len=block.nodes.length,escape=this.escape,pp=this.pp;if(this.parentIndents&&block.mode){pp&&this.buf.push("__indent.push('"+Array(this.indents+1).join(" ")+"');"),this.buf.push("block && block();"),pp&&this.buf.push("__indent.pop();");return}pp&&len>1&&!escape&&block.nodes[0].isText&&block.nodes[1].isText&&this.prettyIndent(1,!0);for(var i=0;i<len;++i)pp&&i>0&&!escape&&block.nodes[i].isText&&block.nodes[i-1].isText&&this.prettyIndent(1,!1),this.visit(block.nodes[i]),block.nodes[i+1]&&block.nodes[i].isText&&block.nodes[i+1].isText&&this.buffer("\\n")},visitDoctype:function(doctype){doctype&&(doctype.val||!this.doctype)&&this.setDoctype(doctype.val||"default"),this.doctype&&this.buffer(this.doctype),this.hasCompiledDoctype=!0},visitMixin:function(mixin){var name=mixin.name.replace(/-/g,"_")+"_mixin",args=mixin.args||"",block=mixin.block,attrs=mixin.attrs,pp=this.pp;if(mixin.call){pp&&this.buf.push("__indent.push('"+Array(this.indents+1).join(" ")+"');");if(block||attrs.length){this.buf.push(name+".call({");if(block){this.buf.push("block: function(){"),this.parentIndents++;var _indents=this.indents;this.indents=0,this.visit(mixin.block),this.indents=_indents,this.parentIndents--,attrs.length?this.buf.push("},"):this.buf.push("}")}if(attrs.length){var val=this.attrs(attrs);val.inherits?this.buf.push("attributes: merge({"+val.buf+"}, attributes), escaped: merge("+val.escaped+", escaped, true)"):this.buf.push("attributes: {"+val.buf+"}, escaped: "+val.escaped)}args?this.buf.push("}, "+args+");"):this.buf.push("});")}else this.buf.push(name+"("+args+");");pp&&this.buf.push("__indent.pop();")}else this.buf.push("var "+name+" = function("+args+"){"),this.buf.push("var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};"),this.parentIndents++,this.visit(block),this.parentIndents--,this.buf.push("};")},visitTag:function(tag){this.indents++;var name=tag.name,pp=this.pp;tag.buffer&&(name="' + ("+name+") + '"),this.hasCompiledTag||(!this.hasCompiledDoctype&&"html"==name&&this.visitDoctype(),this.hasCompiledTag=!0),pp&&!tag.isInline()&&this.prettyIndent(0,!0),(~selfClosing.indexOf(name)||tag.selfClosing)&&!this.xml?(this.buffer("<"+name),this.visitAttributes(tag.attrs),this.terse?this.buffer(">"):this.buffer("/>")):(tag.attrs.length?(this.buffer("<"+name),tag.attrs.length&&this.visitAttributes(tag.attrs),this.buffer(">")):this.buffer("<"+name+">"),tag.code&&this.visitCode(tag.code),this.escape="pre"==tag.name,this.visit(tag.block),pp&&!tag.isInline()&&"pre"!=tag.name&&!tag.canInline()&&this.prettyIndent(0,!0),this.buffer("</"+name+">")),this.indents--},visitFilter:function(filter){var fn=filters[filter.name];if(!fn)throw filter.isASTFilter?new Error('unknown ast filter "'+filter.name+':"'):new Error('unknown filter ":'+filter.name+'"');if(filter.isASTFilter)this.buf.push(fn(filter.block,this,filter.attrs));else{var text=filter.block.nodes.map(function(node){return node.val}).join("\n");filter.attrs=filter.attrs||{},filter.attrs.filename=this.options.filename,this.buffer(utils.text(fn(text,filter.attrs)))}},visitText:function(text){text=utils.text(text.val.replace(/\\/g,"\\\\")),this.escape&&(text=escape(text)),this.buffer(text)},visitComment:function(comment){if(!comment.buffer)return;this.pp&&this.prettyIndent(1,!0),this.buffer("<!--"+utils.escape(comment.val)+"-->")},visitBlockComment:function(comment){if(!comment.buffer)return;0==comment.val.trim().indexOf("if")?(this.buffer("<!--["+comment.val.trim()+"]>"),this.visit(comment.block),this.buffer("<![endif]-->")):(this.buffer("<!--"+comment.val),this.visit(comment.block),this.buffer("-->"))},visitCode:function(code){if(code.buffer){var val=code.val.trimLeft();this.buf.push("var __val__ = "+val),val='null == __val__ ? "" : __val__',code.escape&&(val="escape("+val+")"),this.buf.push("buf.push("+val+");")}else this.buf.push(code.val);code.block&&(code.buffer||this.buf.push("{"),this.visit(code.block),code.buffer||this.buf.push("}"))},visitEach:function(each){this.buf.push("// iterate "+each.obj+"\n"+";(function(){\n"+" if ('number' == typeof "+each.obj+".length) {\n"+" for (var "+each.key+" = 0, $$l = "+each.obj+".length; "+each.key+" < $$l; "+each.key+"++) {\n"+" var "+each.val+" = "+each.obj+"["+each.key+"];\n"),this.visit(each.block),this.buf.push(" }\n } else {\n for (var "+each.key+" in "+each.obj+") {\n"+" if ("+each.obj+".hasOwnProperty("+each.key+")){"+" var "+each.val+" = "+each.obj+"["+each.key+"];\n"),this.visit(each.block),this.buf.push(" }\n"),this.buf.push(" }\n }\n}).call(this);\n")},visitAttributes:function(attrs){var val=this.attrs(attrs);val.inherits?this.buf.push("buf.push(attrs(merge({ "+val.buf+" }, attributes), merge("+val.escaped+", escaped, true)));"):val.constant?(eval("var buf={"+val.buf+"};"),this.buffer(runtime.attrs(buf,JSON.parse(val.escaped)),!0)):this.buf.push("buf.push(attrs({ "+val.buf+" }, "+val.escaped+"));")},attrs:function(attrs){var buf=[],classes=[],escaped={},constant=attrs.every(function(attr){return isConstant(attr.val)}),inherits=!1;return this.terse&&buf.push("terse: true"),attrs.forEach(function(attr){if(attr.name=="attributes")return inherits=!0;escaped[attr.name]=attr.escaped;if(attr.name=="class")classes.push("("+attr.val+")");else{var pair="'"+attr.name+"':("+attr.val+")";buf.push(pair)}}),classes.length&&(classes=classes.join(" + ' ' + "),buf.push("class: "+classes)),{buf:buf.join(", ").replace("class:",'"class":'),escaped:JSON.stringify(escaped),inherits:inherits,constant:constant}}};function isConstant(val){if(/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val))return!0;if(!isNaN(Number(val)))return!0;var matches;return(matches=/^ *\[(.*)\] *$/.exec(val))?matches[1].split(",").every(isConstant):!1}function escape(html){return String(html).replace(/&(?!\w+;)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}}),require.register("doctypes.js",function(module,exports,require){module.exports={5:"<!DOCTYPE html>","default":"<!DOCTYPE html>",xml:'<?xml version="1.0" encoding="utf-8" ?>',transitional:'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',strict:'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',frameset:'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',1.1:'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',basic:'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',mobile:'<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">'}}),require.register("filters.js",function(module,exports,require){module.exports={cdata:function(str){return"<![CDATA[\\n"+str+"\\n]]>"},sass:function(str){str=str.replace(/\\n/g,"\n");var sass=require("sass").render(str).replace(/\n/g,"\\n");return'<style type="text/css">'+sass+"</style>"},stylus:function(str,options){var ret;str=str.replace(/\\n/g,"\n");var stylus=require("stylus");return stylus(str,options).render(function(err,css){if(err)throw err;ret=css.replace(/\n/g,"\\n")}),'<style type="text/css">'+ret+"</style>"},less:function(str){var ret;return str=str.replace(/\\n/g,"\n"),require("less").render(str,function(err,css){if(err)throw err;ret='<style type="text/css">'+css.replace(/\n/g,"\\n")+"</style>"}),ret},markdown:function(str){var md;try{md=require("markdown")}catch(err){try{md=require("discount")}catch(err){try{md=require("markdown-js")}catch(err){try{md=require("marked")}catch(err){throw new Error("Cannot find markdown library, install markdown, discount, or marked.")}}}}return str=str.replace(/\\n/g,"\n"),md.parse(str).replace(/\n/g,"\\n").replace(/'/g,"&#39;")},coffeescript:function(str){str=str.replace(/\\n/g,"\n");var js=require("coffee-script").compile(str).replace(/\\/g,"\\\\").replace(/\n/g,"\\n");return'<script type="text/javascript">\\n'+js+"</script>"}}}),require.register("inline-tags.js",function(module,exports,require){module.exports=["a","abbr","acronym","b","br","code","em","font","i","img","ins","kbd","map","samp","small","span","strong","sub","sup"]}),require.register("jade.js",function(module,exports,require){var Parser=require("./parser"),Lexer=require("./lexer"),Compiler=require("./compiler"),runtime=require("./runtime");exports.version="0.26.1",exports.selfClosing=require("./self-closing"),exports.doctypes=require("./doctypes"),exports.filters=require("./filters"),exports.utils=require("./utils"),exports.Compiler=Compiler,exports.Parser=Parser,exports.Lexer=Lexer,exports.nodes=require("./nodes"),exports.runtime=runtime,exports.cache={};function parse(str,options){try{var parser=new Parser(str,options.filename,options),compiler=new(options.compiler||Compiler)(parser.parse(),options),js=compiler.compile();return options.debug&&console.error("\nCompiled Function:\n\n%s",js.replace(/^/gm," ")),"var buf = [];\n"+(options.self?"var self = locals || {};\n"+js:"with (locals || {}) {\n"+js+"\n}\n")+'return buf.join("");'}catch(err){parser=parser.context(),runtime.rethrow(err,parser.filename,parser.lexer.lineno)}}exports.compile=function(str,options){var options=options||{},client=options.client,filename=options.filename?JSON.stringify(options.filename):"undefined",fn;return options.compileDebug!==!1?fn=["var __jade = [{ lineno: 1, filename: "+filename+" }];","try {",parse(String(str),options),"} catch (err) {"," rethrow(err, __jade[0].filename, __jade[0].lineno);","}"].join("\n"):fn=parse(String(str),options),client&&(fn="attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n"+fn),fn=new Function("locals, attrs, escape, rethrow, merge",fn),client?fn:function(locals){return fn(locals,runtime.attrs,runtime.escape,runtime.rethrow,runtime.merge)}},exports.render=function(str,options,fn){"function"==typeof options&&(fn=options,options={});if(options.cache&&!options.filename)return fn(new Error('the "filename" option is required for caching'));try{var path=options.filename,tmpl=options.cache?exports.cache[path]||(exports.cache[path]=exports.compile(str,options)):exports.compile(str,options);fn(null,tmpl(options))}catch(err){fn(err)}},exports.renderFile=function(path,options,fn){var key=path+":string";"function"==typeof options&&(fn=options,options={});try{options.filename=path;var str=options.cache?exports.cache[key]||(exports.cache[key]=fs.readFileSync(path,"utf8")):fs.readFileSync(path,"utf8");exports.render(str,options,fn)}catch(err){fn(err)}},exports.__express=exports.renderFile}),require.register("lexer.js",function(module,exports,require){var Lexer=module.exports=function Lexer(str,options){options=options||{},this.input=str.replace(/\r\n|\r/g,"\n"),this.colons=options.colons,this.deferredTokens=[],this.lastIndents=0,this.lineno=1,this.stash=[],this.indentStack=[],this.indentRe=null,this.pipeless=!1};Lexer.prototype={tok:function(type,val){return{type:type,line:this.lineno,val:val}},consume:function(len){this.input=this.input.substr(len)},scan:function(regexp,type){var captures;if(captures=regexp.exec(this.input))return this.consume(captures[0].length),this.tok(type,captures[1])},defer:function(tok){this.deferredTokens.push(tok)},lookahead:function(n){var fetch=n-this.stash.length;while(fetch-->0)this.stash.push(this.next());return this.stash[--n]},indexOfDelimiters:function(start,end){var str=this.input,nstart=0,nend=0,pos=0;for(var i=0,len=str.length;i<len;++i)if(start==str.charAt(i))++nstart;else if(end==str.charAt(i)&&++nend==nstart){pos=i;break}return pos},stashed:function(){return this.stash.length&&this.stash.shift()},deferred:function(){return this.deferredTokens.length&&this.deferredTokens.shift()},eos:function(){if(this.input.length)return;return this.indentStack.length?(this.indentStack.shift(),this.tok("outdent")):this.tok("eos")},blank:function(){var captures;if(captures=/^\n *\n/.exec(this.input))return this.consume(captures[0].length-1),this.pipeless?this.tok("text",""):this.next()},comment:function(){var captures;if(captures=/^ *\/\/(-)?([^\n]*)/.exec(this.input)){this.consume(captures[0].length);var tok=this.tok("comment",captures[2]);return tok.buffer="-"!=captures[1],tok}},interpolation:function(){var captures;if(captures=/^#\{(.*?)\}/.exec(this.input))return this.consume(captures[0].length),this.tok("interpolation",captures[1])},tag:function(){var captures;if(captures=/^(\w[-:\w]*)(\/?)/.exec(this.input)){this.consume(captures[0].length);var tok,name=captures[1];if(":"==name[name.length-1]){name=name.slice(0,-1),tok=this.tok("tag",name),this.defer(this.tok(":"));while(" "==this.input[0])this.input=this.input.substr(1)}else tok=this.tok("tag",name);return tok.selfClosing=!!captures[2],tok}},filter:function(){return this.scan(/^:(\w+)/,"filter")},doctype:function(){return this.scan(/^(?:!!!|doctype) *([^\n]+)?/,"doctype")},id:function(){return this.scan(/^#([\w-]+)/,"id")},className:function(){return this.scan(/^\.([\w-]+)/,"class")},text:function(){return this.scan(/^(?:\| ?| ?)?([^\n]+)/,"text")},"extends":function(){return this.scan(/^extends? +([^\n]+)/,"extends")},prepend:function(){var captures;if(captures=/^prepend +([^\n]+)/.exec(this.input)){this.consume(captures[0].length);var mode="prepend",name=captures[1],tok=this.tok("block",name);return tok.mode=mode,tok}},append:function(){var captures;if(captures=/^append +([^\n]+)/.exec(this.input)){this.consume(captures[0].length);var mode="append",name=captures[1],tok=this.tok("block",name);return tok.mode=mode,tok}},block:function(){var captures;if(captures=/^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)){this.consume(captures[0].length);var mode=captures[1]||"replace",name=captures[2],tok=this.tok("block",name);return tok.mode=mode,tok}},yield:function(){return this.scan(/^yield */,"yield")},include:function(){return this.scan(/^include +([^\n]+)/,"include")},"case":function(){return this.scan(/^case +([^\n]+)/,"case")},when:function(){return this.scan(/^when +([^:\n]+)/,"when")},"default":function(){return this.scan(/^default */,"default")},assignment:function(){var captures;if(captures=/^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)){this.consume(captures[0].length);var name=captures[1],val=captures[2];return this.tok("code","var "+name+" = ("+val+");")}},call:function(){var captures;if(captures=/^\+([-\w]+)/.exec(this.input)){this.consume(captures[0].length);var tok=this.tok("call",captures[1]);if(captures=/^ *\((.*?)\)/.exec(this.input))/^ *[-\w]+ *=/.test(captures[1])||(this.consume(captures[0].length),tok.args=captures[1]);return tok}},mixin:function(){var captures;if(captures=/^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)){this.consume(captures[0].length);var tok=this.tok("mixin",captures[1]);return tok.args=captures[2],tok}},conditional:function(){var captures;if(captures=/^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)){this.consume(captures[0].length);var type=captures[1],js=captures[2];switch(type){case"if":js="if ("+js+")";break;case"unless":js="if (!("+js+"))";break;case"else if":js="else if ("+js+")";break;case"else":js="else"}return this.tok("code",js)}},"while":function(){var captures;if(captures=/^while +([^\n]+)/.exec(this.input))return this.consume(captures[0].length),this.tok("code","while ("+captures[1]+")")},each:function(){var captures;if(captures=/^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)){this.consume(captures[0].length);var tok=this.tok("each",captures[1]);return tok.key=captures[2]||"$index",tok.code=captures[3],tok}},code:function(){var captures;if(captures=/^(!?=|-)([^\n]+)/.exec(this.input)){this.consume(captures[0].length);var flags=captures[1];captures[1]=captures[2];var tok=this.tok("code",captures[1]);return tok.escape=flags[0]==="=",tok.buffer=flags[0]==="="||flags[1]==="=",tok}},attrs:function(){if("("==this.input.charAt(0)){var index=this.indexOfDelimiters("(",")"),str=this.input.substr(1,index-1),tok=this.tok("attrs"),len=str.length,colons=this.colons,states=["key"],escapedAttr,key="",val="",quote,c,p;function state(){return states[states.length-1]}function interpolate(attr){return attr.replace(/#\{([^}]+)\}/g,function(_,expr){return quote+" + ("+expr+") + "+quote})}this.consume(index+1),tok.attrs={},tok.escaped={};function parse(c){var real=c;colons&&":"==c&&(c="=");switch(c){case",":case"\n":switch(state()){case"expr":case"array":case"string":case"object":val+=c;break;default:states.push("key"),val=val.trim(),key=key.trim();if(""==key)return;key=key.replace(/^['"]|['"]$/g,"").replace("!",""),tok.escaped[key]=escapedAttr,tok.attrs[key]=""==val?!0:interpolate(val),key=val=""}break;case"=":switch(state()){case"key char":key+=real;break;case"val":case"expr":case"array":case"string":case"object":val+=real;break;default:escapedAttr="!"!=p,states.push("val")}break;case"(":("val"==state()||"expr"==state())&&states.push("expr"),val+=c;break;case")":("expr"==state()||"val"==state())&&states.pop(),val+=c;break;case"{":"val"==state()&&states.push("object"),val+=c;break;case"}":"object"==state()&&states.pop(),val+=c;break;case"[":"val"==state()&&states.push("array"),val+=c;break;case"]":"array"==state()&&states.pop(),val+=c;break;case'"':case"'":switch(state()){case"key":states.push("key char");break;case"key char":states.pop();break;case"string":c==quote&&states.pop(),val+=c;break;default:states.push("string"),val+=c,quote=c}break;case"":break;default:switch(state()){case"key":case"key char":key+=c;break;default:val+=c}}p=c}for(var i=0;i<len;++i)parse(str.charAt(i));return parse(","),"/"==this.input.charAt(0)&&(this.consume(1),tok.selfClosing=!0),tok}},indent:function(){var captures,re;this.indentRe?captures=this.indentRe.exec(this.input):(re=/^\n(\t*) */,captures=re.exec(this.input),captures&&!captures[1].length&&(re=/^\n( *)/,captures=re.exec(this.input)),captures&&captures[1].length&&(this.indentRe=re));if(captures){var tok,indents=captures[1].length;++this.lineno,this.consume(indents+1);if(" "==this.input[0]||"\t"==this.input[0])throw new Error("Invalid indentation, you can use tabs or spaces but not both");if("\n"==this.input[0])return this.tok("newline");if(this.indentStack.length&&indents<this.indentStack[0]){while(this.indentStack.length&&this.indentStack[0]>indents)this.stash.push(this.tok("outdent")),this.indentStack.shift();tok=this.stash.pop()}else indents&&indents!=this.indentStack[0]?(this.indentStack.unshift(indents),tok=this.tok("indent",indents)):tok=this.tok("newline");return tok}},pipelessText:function(){if(this.pipeless){if("\n"==this.input[0])return;var i=this.input.indexOf("\n");-1==i&&(i=this.input.length);var str=this.input.substr(0,i);return this.consume(str.length),this.tok("text",str)}},colon:function(){return this.scan(/^: */,":")},advance:function(){return this.stashed()||this.next()},next:function(){return this.deferred()||this.blank()||this.eos()||this.pipelessText()||this.yield()||this.doctype()||this.interpolation()||this["case"]()||this.when()||this["default"]()||this["extends"]()||this.append()||this.prepend()||this.block()||this.include()||this.mixin()||this.call()||this.conditional()||this.each()||this["while"]()||this.assignment()||this.tag()||this.filter()||this.code()||this.id()||this.className()||this.attrs()||this.indent()||this.comment()||this.colon()||this.text()}}}),require.register("nodes/attrs.js",function(module,exports,require){var Node=require("./node"),Block=require("./block"),Attrs=module.exports=function Attrs(){this.attrs=[]};Attrs.prototype=new Node,Attrs.prototype.constructor=Attrs,Attrs.prototype.setAttribute=function(name,val,escaped){return this.attrs.push({name:name,val:val,escaped:escaped}),this},Attrs.prototype.removeAttribute=function(name){for(var i=0,len=this.attrs.length;i<len;++i)this.attrs[i]&&this.attrs[i].name==name&&delete this.attrs[i]},Attrs.prototype.getAttribute=function(name){for(var i=0,len=this.attrs.length;i<len;++i)if(this.attrs[i]&&this.attrs[i].name==name)return this.attrs[i].val}}),require.register("nodes/block-comment.js",function(module,exports,require){var Node=require("./node"),BlockComment=module.exports=function BlockComment(val,block,buffer){this.block=block,this.val=val,this.buffer=buffer};BlockComment.prototype=new Node,BlockComment.prototype.constructor=BlockComment}),require.register("nodes/block.js",function(module,exports,require){var Node=require("./node"),Block=module.exports=function Block(node){this.nodes=[],node&&this.push(node)};Block.prototype=new Node,Block.prototype.constructor=Block,Block.prototype.isBlock=!0,Block.prototype.replace=function(other){other.nodes=this.nodes},Block.prototype.push=function(node){return this.nodes.push(node)},Block.prototype.isEmpty=function(){return 0==this.nodes.length},Block.prototype.unshift=function(node){return this.nodes.unshift(node)},Block.prototype.includeBlock=function(){var ret=this,node;for(var i=0,len=this.nodes.length;i<len;++i){node=this.nodes[i];if(node.yield)return node;if(node.textOnly)continue;node.includeBlock?ret=node.includeBlock():node.block&&!node.block.isEmpty()&&(ret=node.block.includeBlock())}return ret},Block.prototype.clone=function(){var clone=new Block;for(var i=0,len=this.nodes.length;i<len;++i)clone.push(this.nodes[i].clone());return clone}}),require.register("nodes/case.js",function(module,exports,require){var Node=require("./node"),Case=exports=module.exports=function Case(expr,block){this.expr=expr,this.block=block};Case.prototype=new Node,Case.prototype.constructor=Case;var When=exports.When=function When(expr,block){this.expr=expr,this.block=block,this.debug=!1};When.prototype=new Node,When.prototype.constructor=When}),require.register("nodes/code.js",function(module,exports,require){var Node=require("./node"),Code=module.exports=function Code(val,buffer,escape){this.val=val,this.buffer=buffer,this.escape=escape,val.match(/^ *else/)&&(this.debug=!1)};Code.prototype=new Node,Code.prototype.constructor=Code}),require.register("nodes/comment.js",function(module,exports,require){var Node=require("./node"),Comment=module.exports=function Comment(val,buffer){this.val=val,this.buffer=buffer};Comment.prototype=new Node,Comment.prototype.constructor=Comment}),require.register("nodes/doctype.js",function(module,exports,require){var Node=require("./node"),Doctype=module.exports=function Doctype(val){this.val=val};Doctype.prototype=new Node,Doctype.prototype.constructor=Doctype}),require.register("nodes/each.js",function(module,exports,require){var Node=require("./node"),Each=module.exports=function Each(obj,val,key,block){this.obj=obj,this.val=val,this.key=key,this.block=block};Each.prototype=new Node,Each.prototype.constructor=Each}),require.register("nodes/filter.js",function(module,exports,require){var Node=require("./node"),Block=require("./block"),Filter=module.exports=function Filter(name,block,attrs){this.name=name,this.block=block,this.attrs=attrs,this.isASTFilter=!block.nodes.every(function(node){return node.isText})};Filter.prototype=new Node,Filter.prototype.constructor=Filter}),require.register("nodes/index.js",function(module,exports,require){exports.Node=require("./node"),exports.Tag=require("./tag"),exports.Code=require("./code"),exports.Each=require("./each"),exports.Case=require("./case"),exports.Text=require("./text"),exports.Block=require("./block"),exports.Mixin=require("./mixin"),exports.Filter=require("./filter"),exports.Comment=require("./comment"),exports.Literal=require("./literal"),exports.BlockComment=require("./block-comment"),exports.Doctype=require("./doctype")}),require.register("nodes/literal.js",function(module,exports,require){var Node=require("./node"),Literal=module.exports=function Literal(str){this.str=str.replace(/\\/g,"\\\\").replace(/\n|\r\n/g,"\\n").replace(/'/g,"\\'")};Literal.prototype=new Node,Literal.prototype.constructor=Literal}),require.register("nodes/mixin.js",function(module,exports,require){var Attrs=require("./attrs"),Mixin=module.exports=function Mixin(name,args,block,call){this.name=name,this.args=args,this.block=block,this.attrs=[],this.call=call};Mixin.prototype=new Attrs,Mixin.prototype.constructor=Mixin}),require.register("nodes/node.js",function(module,exports,require){var Node=module.exports=function Node(){};Node.prototype.clone=function(){return this}}),require.register("nodes/tag.js",function(module,exports,require){var Attrs=require("./attrs"),Block=require("./block"),inlineTags=require("../inline-tags"),Tag=module.exports=function Tag(name,block){this.name=name,this.attrs=[],this.block=block||new Block};Tag.prototype=new Attrs,Tag.prototype.constructor=Tag,Tag.prototype.clone=function(){var clone=new Tag(this.name,this.block.clone());return clone.line=this.line,clone.attrs=this.attrs,clone.textOnly=this.textOnly,clone},Tag.prototype.isInline=function(){return~inlineTags.indexOf(this.name)},Tag.prototype.canInline=function(){var nodes=this.block.nodes;function isInline(node){return node.isBlock?node.nodes.every(isInline):node.isText||node.isInline&&node.isInline()}if(!nodes.length)return!0;if(1==nodes.length)return isInline(nodes[0]);if(this.block.nodes.every(isInline)){for(var i=1,len=nodes.length;i<len;++i)if(nodes[i-1].isText&&nodes[i].isText)return!1;return!0}return!1}}),require.register("nodes/text.js",function(module,exports,require){var Node=require("./node"),Text=module.exports=function Text(line){this.val="","string"==typeof line&&(this.val=line)};Text.prototype=new Node,Text.prototype.constructor=Text,Text.prototype.isText=!0}),require.register("parser.js",function(module,exports,require){var Lexer=require("./lexer"),nodes=require("./nodes"),Parser=exports=module.exports=function Parser(str,filename,options){this.input=str,this.lexer=new Lexer(str,options),this.filename=filename,this.blocks={},this.mixins={},this.options=options,this.contexts=[this]},textOnly=exports.textOnly=["script","style"];Parser.prototype={context:function(parser){if(!parser)return this.contexts.pop();this.contexts.push(parser)},advance:function(){return this.lexer.advance()},skip:function(n){while(n--)this.advance()},peek:function(){return this.lookahead(1)},line:function(){return this.lexer.lineno},lookahead:function(n){return this.lexer.lookahead(n)},parse:function(){var block=new nodes.Block,parser;block.line=this.line();while("eos"!=this.peek().type)"newline"==this.peek().type?this.advance():block.push(this.parseExpr());if(parser=this.extending){this.context(parser);var ast=parser.parse();this.context();for(var name in this.mixins)ast.unshift(this.mixins[name]);return ast}return block},expect:function(type){if(this.peek().type===type)return this.advance();throw new Error('expected "'+type+'", but got "'+this.peek().type+'"')},accept:function(type){if(this.peek().type===type)return this.advance()},parseExpr:function(){switch(this.peek().type){case"tag":return this.parseTag();case"mixin":return this.parseMixin();case"block":return this.parseBlock();case"case":return this.parseCase();case"when":return this.parseWhen();case"default":return this.parseDefault();case"extends":return this.parseExtends();case"include":return this.parseInclude();case"doctype":return this.parseDoctype();case"filter":return this.parseFilter();case"comment":return this.parseComment();case"text":return this.parseText();case"each":return this.parseEach();case"code":return this.parseCode();case"call":return this.parseCall();case"interpolation":return this.parseInterpolation();case"yield":this.advance();var block=new nodes.Block;return block.yield=!0,block;case"id":case"class":var tok=this.advance();return this.lexer.defer(this.lexer.tok("tag","div")),this.lexer.defer(tok),this.parseExpr();default:throw new Error('unexpected token "'+this.peek().type+'"')}},parseText:function(){var tok=this.expect("text"),node=new nodes.Text(tok.val);return node.line=this.line(),node},parseBlockExpansion:function(){return":"==this.peek().type?(this.advance(),new nodes.Block(this.parseExpr())):this.block()},parseCase:function(){var val=this.expect("case").val,node=new nodes.Case(val);return node.line=this.line(),node.block=this.block(),node},parseWhen:function(){var val=this.expect("when").val;return new nodes.Case.When(val,this.parseBlockExpansion())},parseDefault:function(){return this.expect("default"),new nodes.Case.When("default",this.parseBlockExpansion())},parseCode:function(){var tok=this.expect("code"),node=new nodes.Code(tok.val,tok.buffer,tok.escape),block,i=1;node.line=this.line();while(this.lookahead(i)&&"newline"==this.lookahead(i).type)++i;return block="indent"==this.lookahead(i).type,block&&(this.skip(i-1),node.block=this.block()),node},parseComment:function(){var tok=this.expect("comment"),node;return"indent"==this.peek().type?node=new nodes.BlockComment(tok.val,this.block(),tok.buffer):node=new nodes.Comment(tok.val,tok.buffer),node.line=this.line(),node},parseDoctype:function(){var tok=this.expect("doctype"),node=new nodes.Doctype(tok.val);return node.line=this.line(),node},parseFilter:function(){var block,tok=this.expect("filter"),attrs=this.accept("attrs");this.lexer.pipeless=!0,block=this.parseTextBlock(),this.lexer.pipeless=!1;var node=new nodes.Filter(tok.val,block,attrs&&attrs.attrs);return node
-.line=this.line(),node},parseASTFilter:function(){var block,tok=this.expect("tag"),attrs=this.accept("attrs");this.expect(":"),block=this.block();var node=new nodes.Filter(tok.val,block,attrs&&attrs.attrs);return node.line=this.line(),node},parseEach:function(){var tok=this.expect("each"),node=new nodes.Each(tok.code,tok.val,tok.key);return node.line=this.line(),node.block=this.block(),node},parseExtends:function(){var path=require("path"),fs=require("fs"),dirname=path.dirname,basename=path.basename,join=path.join;if(!this.filename)throw new Error('the "filename" option is required to extend templates');var path=this.expect("extends").val.trim(),dir=dirname(this.filename),path=join(dir,path+".jade"),str=fs.readFileSync(path,"utf8"),parser=new Parser(str,path,this.options);return parser.blocks=this.blocks,parser.contexts=this.contexts,this.extending=parser,new nodes.Literal("")},parseBlock:function(){var block=this.expect("block"),mode=block.mode,name=block.val.trim();block="indent"==this.peek().type?this.block():new nodes.Block(new nodes.Literal(""));var prev=this.blocks[name];if(prev)switch(prev.mode){case"append":block.nodes=block.nodes.concat(prev.nodes),prev=block;break;case"prepend":block.nodes=prev.nodes.concat(block.nodes),prev=block}return block.mode=mode,this.blocks[name]=prev||block},parseInclude:function(){var path=require("path"),fs=require("fs"),dirname=path.dirname,basename=path.basename,join=path.join,path=this.expect("include").val.trim(),dir=dirname(this.filename);if(!this.filename)throw new Error('the "filename" option is required to use includes');~basename(path).indexOf(".")||(path+=".jade");if(".jade"!=path.substr(-5)){var path=join(dir,path),str=fs.readFileSync(path,"utf8");return new nodes.Literal(str)}var path=join(dir,path),str=fs.readFileSync(path,"utf8"),parser=new Parser(str,path,this.options);parser.blocks=this.blocks,parser.mixins=this.mixins,this.context(parser);var ast=parser.parse();return this.context(),ast.filename=path,"indent"==this.peek().type&&ast.includeBlock().push(this.block()),ast},parseCall:function(){var tok=this.expect("call"),name=tok.val,args=tok.args,mixin=new nodes.Mixin(name,args,new nodes.Block,!0);return this.tag(mixin),mixin.block.isEmpty()&&(mixin.block=null),mixin},parseMixin:function(){var tok=this.expect("mixin"),name=tok.val,args=tok.args,mixin;return"indent"==this.peek().type?(mixin=new nodes.Mixin(name,args,this.block(),!1),this.mixins[name]=mixin,mixin):new nodes.Mixin(name,args,null,!0)},parseTextBlock:function(){var block=new nodes.Block;block.line=this.line();var spaces=this.expect("indent").val;null==this._spaces&&(this._spaces=spaces);var indent=Array(spaces-this._spaces+1).join(" ");while("outdent"!=this.peek().type)switch(this.peek().type){case"newline":this.advance();break;case"indent":this.parseTextBlock().nodes.forEach(function(node){block.push(node)});break;default:var text=new nodes.Text(indent+this.advance().val);text.line=this.line(),block.push(text)}return spaces==this._spaces&&(this._spaces=null),this.expect("outdent"),block},block:function(){var block=new nodes.Block;block.line=this.line(),this.expect("indent");while("outdent"!=this.peek().type)"newline"==this.peek().type?this.advance():block.push(this.parseExpr());return this.expect("outdent"),block},parseInterpolation:function(){var tok=this.advance(),tag=new nodes.Tag(tok.val);return tag.buffer=!0,this.tag(tag)},parseTag:function(){var i=2;"attrs"==this.lookahead(i).type&&++i;if(":"==this.lookahead(i).type&&"indent"==this.lookahead(++i).type)return this.parseASTFilter();var tok=this.advance(),tag=new nodes.Tag(tok.val);return tag.selfClosing=tok.selfClosing,this.tag(tag)},tag:function(tag){var dot;tag.line=this.line();out:for(;;)switch(this.peek().type){case"id":case"class":var tok=this.advance();tag.setAttribute(tok.type,"'"+tok.val+"'");continue;case"attrs":var tok=this.advance(),obj=tok.attrs,escaped=tok.escaped,names=Object.keys(obj);tok.selfClosing&&(tag.selfClosing=!0);for(var i=0,len=names.length;i<len;++i){var name=names[i],val=obj[name];tag.setAttribute(name,val,escaped[name])}continue;default:break out}"."==this.peek().val&&(dot=tag.textOnly=!0,this.advance());switch(this.peek().type){case"text":tag.block.push(this.parseText());break;case"code":tag.code=this.parseCode();break;case":":this.advance(),tag.block=new nodes.Block,tag.block.push(this.parseExpr())}while("newline"==this.peek().type)this.advance();tag.textOnly=tag.textOnly||~textOnly.indexOf(tag.name);if("script"==tag.name){var type=tag.getAttribute("type");!dot&&type&&"text/javascript"!=type.replace(/^['"]|['"]$/g,"")&&(tag.textOnly=!1)}if("indent"==this.peek().type)if(tag.textOnly)this.lexer.pipeless=!0,tag.block=this.parseTextBlock(),this.lexer.pipeless=!1;else{var block=this.block();if(tag.block)for(var i=0,len=block.nodes.length;i<len;++i)tag.block.push(block.nodes[i]);else tag.block=block}return tag}}}),require.register("runtime.js",function(module,exports,require){Array.isArray||(Array.isArray=function(arr){return"[object Array]"==Object.prototype.toString.call(arr)}),Object.keys||(Object.keys=function(obj){var arr=[];for(var key in obj)obj.hasOwnProperty(key)&&arr.push(key);return arr}),exports.merge=function merge(a,b){var ac=a["class"],bc=b["class"];if(ac||bc)ac=ac||[],bc=bc||[],Array.isArray(ac)||(ac=[ac]),Array.isArray(bc)||(bc=[bc]),ac=ac.filter(nulls),bc=bc.filter(nulls),a["class"]=ac.concat(bc).join(" ");for(var key in b)key!="class"&&(a[key]=b[key]);return a};function nulls(val){return val!=null}exports.attrs=function attrs(obj,escaped){var buf=[],terse=obj.terse;delete obj.terse;var keys=Object.keys(obj),len=keys.length;if(len){buf.push("");for(var i=0;i<len;++i){var key=keys[i],val=obj[key];"boolean"==typeof val||null==val?val&&(terse?buf.push(key):buf.push(key+'="'+key+'"')):0==key.indexOf("data")&&"string"!=typeof val?buf.push(key+"='"+JSON.stringify(val)+"'"):"class"==key&&Array.isArray(val)?buf.push(key+'="'+exports.escape(val.join(" "))+'"'):escaped&&escaped[key]?buf.push(key+'="'+exports.escape(val)+'"'):buf.push(key+'="'+val+'"')}}return buf.join(" ")},exports.escape=function escape(html){return String(html).replace(/&(?!(\w+|\#\d+);)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")},exports.rethrow=function rethrow(err,filename,lineno){if(!filename)throw err;var context=3,str=require("fs").readFileSync(filename,"utf8"),lines=str.split("\n"),start=Math.max(lineno-context,0),end=Math.min(lines.length,lineno+context),context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" > ":" ")+curr+"| "+line}).join("\n");throw err.path=filename,err.message=(filename||"Jade")+":"+lineno+"\n"+context+"\n\n"+err.message,err}}),require.register("self-closing.js",function(module,exports,require){module.exports=["meta","img","link","input","source","area","base","col","br","hr"]}),require.register("utils.js",function(module,exports,require){var interpolate=exports.interpolate=function(str){return str.replace(/(\\)?([#!]){(.*?)}/g,function(str,escape,flag,code){return escape?str:"' + "+("!"==flag?"":"escape")+"((interp = "+code.replace(/\\'/g,"'")+") == null ? '' : interp) + '"})},escape=exports.escape=function(str){return str.replace(/'/g,"\\'")};exports.text=function(str){return interpolate(escape(str))}}),window.jade=require("jade")})(); \ No newline at end of file
diff --git a/node_modules/jade/lib/compiler.js b/node_modules/jade/lib/compiler.js
deleted file mode 100644
index 516ac83dd..000000000
--- a/node_modules/jade/lib/compiler.js
+++ /dev/null
@@ -1,642 +0,0 @@
-
-/*!
- * Jade - Compiler
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var nodes = require('./nodes')
- , filters = require('./filters')
- , doctypes = require('./doctypes')
- , selfClosing = require('./self-closing')
- , runtime = require('./runtime')
- , utils = require('./utils');
-
-// if browser
-//
-// if (!Object.keys) {
-// Object.keys = function(obj){
-// var arr = [];
-// for (var key in obj) {
-// if (obj.hasOwnProperty(key)) {
-// arr.push(key);
-// }
-// }
-// return arr;
-// }
-// }
-//
-// if (!String.prototype.trimLeft) {
-// String.prototype.trimLeft = function(){
-// return this.replace(/^\s+/, '');
-// }
-// }
-//
-// end
-
-
-/**
- * Initialize `Compiler` with the given `node`.
- *
- * @param {Node} node
- * @param {Object} options
- * @api public
- */
-
-var Compiler = module.exports = function Compiler(node, options) {
- this.options = options = options || {};
- this.node = node;
- this.hasCompiledDoctype = false;
- this.hasCompiledTag = false;
- this.pp = options.pretty || false;
- this.debug = false !== options.compileDebug;
- this.indents = 0;
- this.parentIndents = 0;
- if (options.doctype) this.setDoctype(options.doctype);
-};
-
-/**
- * Compiler prototype.
- */
-
-Compiler.prototype = {
-
- /**
- * Compile parse tree to JavaScript.
- *
- * @api public
- */
-
- compile: function(){
- this.buf = ['var interp;'];
- if (this.pp) this.buf.push("var __indent = [];");
- this.lastBufferedIdx = -1;
- this.visit(this.node);
- return this.buf.join('\n');
- },
-
- /**
- * Sets the default doctype `name`. Sets terse mode to `true` when
- * html 5 is used, causing self-closing tags to end with ">" vs "/>",
- * and boolean attributes are not mirrored.
- *
- * @param {string} name
- * @api public
- */
-
- setDoctype: function(name){
- var doctype = doctypes[(name || 'default').toLowerCase()];
- doctype = doctype || '<!DOCTYPE ' + name + '>';
- this.doctype = doctype;
- this.terse = '5' == name || 'html' == name;
- this.xml = 0 == this.doctype.indexOf('<?xml');
- },
-
- /**
- * Buffer the given `str` optionally escaped.
- *
- * @param {String} str
- * @param {Boolean} esc
- * @api public
- */
-
- buffer: function(str, esc){
- if (esc) str = utils.escape(str);
-
- if (this.lastBufferedIdx == this.buf.length) {
- this.lastBuffered += str;
- this.buf[this.lastBufferedIdx - 1] = "buf.push('" + this.lastBuffered + "');"
- } else {
- this.buf.push("buf.push('" + str + "');");
- this.lastBuffered = str;
- this.lastBufferedIdx = this.buf.length;
- }
- },
-
- /**
- * Buffer an indent based on the current `indent`
- * property and an additional `offset`.
- *
- * @param {Number} offset
- * @param {Boolean} newline
- * @api public
- */
-
- prettyIndent: function(offset, newline){
- offset = offset || 0;
- newline = newline ? '\\n' : '';
- this.buffer(newline + Array(this.indents + offset).join(' '));
- if (this.parentIndents)
- this.buf.push("buf.push.apply(buf, __indent);");
- },
-
- /**
- * Visit `node`.
- *
- * @param {Node} node
- * @api public
- */
-
- visit: function(node){
- var debug = this.debug;
-
- if (debug) {
- this.buf.push('__jade.unshift({ lineno: ' + node.line
- + ', filename: ' + (node.filename
- ? JSON.stringify(node.filename)
- : '__jade[0].filename')
- + ' });');
- }
-
- // Massive hack to fix our context
- // stack for - else[ if] etc
- if (false === node.debug && this.debug) {
- this.buf.pop();
- this.buf.pop();
- }
-
- this.visitNode(node);
-
- if (debug) this.buf.push('__jade.shift();');
- },
-
- /**
- * Visit `node`.
- *
- * @param {Node} node
- * @api public
- */
-
- visitNode: function(node){
- var name = node.constructor.name
- || node.constructor.toString().match(/function ([^(\s]+)()/)[1];
- return this['visit' + name](node);
- },
-
- /**
- * Visit case `node`.
- *
- * @param {Literal} node
- * @api public
- */
-
- visitCase: function(node){
- var _ = this.withinCase;
- this.withinCase = true;
- this.buf.push('switch (' + node.expr + '){');
- this.visit(node.block);
- this.buf.push('}');
- this.withinCase = _;
- },
-
- /**
- * Visit when `node`.
- *
- * @param {Literal} node
- * @api public
- */
-
- visitWhen: function(node){
- if ('default' == node.expr) {
- this.buf.push('default:');
- } else {
- this.buf.push('case ' + node.expr + ':');
- }
- this.visit(node.block);
- this.buf.push(' break;');
- },
-
- /**
- * Visit literal `node`.
- *
- * @param {Literal} node
- * @api public
- */
-
- visitLiteral: function(node){
- var str = node.str.replace(/\n/g, '\\\\n');
- this.buffer(str);
- },
-
- /**
- * Visit all nodes in `block`.
- *
- * @param {Block} block
- * @api public
- */
-
- visitBlock: function(block){
- var len = block.nodes.length
- , escape = this.escape
- , pp = this.pp
-
- // Block keyword has a special meaning in mixins
- if (this.parentIndents && block.mode) {
- if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');")
- this.buf.push('block && block();');
- if (pp) this.buf.push("__indent.pop();")
- return;
- }
-
- // Pretty print multi-line text
- if (pp && len > 1 && !escape && block.nodes[0].isText && block.nodes[1].isText)
- this.prettyIndent(1, true);
-
- for (var i = 0; i < len; ++i) {
- // Pretty print text
- if (pp && i > 0 && !escape && block.nodes[i].isText && block.nodes[i-1].isText)
- this.prettyIndent(1, false);
-
- this.visit(block.nodes[i]);
- // Multiple text nodes are separated by newlines
- if (block.nodes[i+1] && block.nodes[i].isText && block.nodes[i+1].isText)
- this.buffer('\\n');
- }
- },
-
- /**
- * Visit `doctype`. Sets terse mode to `true` when html 5
- * is used, causing self-closing tags to end with ">" vs "/>",
- * and boolean attributes are not mirrored.
- *
- * @param {Doctype} doctype
- * @api public
- */
-
- visitDoctype: function(doctype){
- if (doctype && (doctype.val || !this.doctype)) {
- this.setDoctype(doctype.val || 'default');
- }
-
- if (this.doctype) this.buffer(this.doctype);
- this.hasCompiledDoctype = true;
- },
-
- /**
- * Visit `mixin`, generating a function that
- * may be called within the template.
- *
- * @param {Mixin} mixin
- * @api public
- */
-
- visitMixin: function(mixin){
- var name = mixin.name.replace(/-/g, '_') + '_mixin'
- , args = mixin.args || ''
- , block = mixin.block
- , attrs = mixin.attrs
- , pp = this.pp;
-
- if (mixin.call) {
- if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');")
- if (block || attrs.length) {
-
- this.buf.push(name + '.call({');
-
- if (block) {
- this.buf.push('block: function(){');
-
- // Render block with no indents, dynamically added when rendered
- this.parentIndents++;
- var _indents = this.indents;
- this.indents = 0;
- this.visit(mixin.block);
- this.indents = _indents;
- this.parentIndents--;
-
- if (attrs.length) {
- this.buf.push('},');
- } else {
- this.buf.push('}');
- }
- }
-
- if (attrs.length) {
- var val = this.attrs(attrs);
- if (val.inherits) {
- this.buf.push('attributes: merge({' + val.buf
- + '}, attributes), escaped: merge(' + val.escaped + ', escaped, true)');
- } else {
- this.buf.push('attributes: {' + val.buf + '}, escaped: ' + val.escaped);
- }
- }
-
- if (args) {
- this.buf.push('}, ' + args + ');');
- } else {
- this.buf.push('});');
- }
-
- } else {
- this.buf.push(name + '(' + args + ');');
- }
- if (pp) this.buf.push("__indent.pop();")
- } else {
- this.buf.push('var ' + name + ' = function(' + args + '){');
- this.buf.push('var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};');
- this.parentIndents++;
- this.visit(block);
- this.parentIndents--;
- this.buf.push('};');
- }
- },
-
- /**
- * Visit `tag` buffering tag markup, generating
- * attributes, visiting the `tag`'s code and block.
- *
- * @param {Tag} tag
- * @api public
- */
-
- visitTag: function(tag){
- this.indents++;
- var name = tag.name
- , pp = this.pp;
-
- if (tag.buffer) name = "' + (" + name + ") + '";
-
- if (!this.hasCompiledTag) {
- if (!this.hasCompiledDoctype && 'html' == name) {
- this.visitDoctype();
- }
- this.hasCompiledTag = true;
- }
-
- // pretty print
- if (pp && !tag.isInline())
- this.prettyIndent(0, true);
-
- if ((~selfClosing.indexOf(name) || tag.selfClosing) && !this.xml) {
- this.buffer('<' + name);
- this.visitAttributes(tag.attrs);
- this.terse
- ? this.buffer('>')
- : this.buffer('/>');
- } else {
- // Optimize attributes buffering
- if (tag.attrs.length) {
- this.buffer('<' + name);
- if (tag.attrs.length) this.visitAttributes(tag.attrs);
- this.buffer('>');
- } else {
- this.buffer('<' + name + '>');
- }
- if (tag.code) this.visitCode(tag.code);
- this.escape = 'pre' == tag.name;
- this.visit(tag.block);
-
- // pretty print
- if (pp && !tag.isInline() && 'pre' != tag.name && !tag.canInline())
- this.prettyIndent(0, true);
-
- this.buffer('</' + name + '>');
- }
- this.indents--;
- },
-
- /**
- * Visit `filter`, throwing when the filter does not exist.
- *
- * @param {Filter} filter
- * @api public
- */
-
- visitFilter: function(filter){
- var fn = filters[filter.name];
-
- // unknown filter
- if (!fn) {
- if (filter.isASTFilter) {
- throw new Error('unknown ast filter "' + filter.name + ':"');
- } else {
- throw new Error('unknown filter ":' + filter.name + '"');
- }
- }
-
- if (filter.isASTFilter) {
- this.buf.push(fn(filter.block, this, filter.attrs));
- } else {
- var text = filter.block.nodes.map(function(node){ return node.val }).join('\n');
- filter.attrs = filter.attrs || {};
- filter.attrs.filename = this.options.filename;
- this.buffer(utils.text(fn(text, filter.attrs)));
- }
- },
-
- /**
- * Visit `text` node.
- *
- * @param {Text} text
- * @api public
- */
-
- visitText: function(text){
- text = utils.text(text.val.replace(/\\/g, '\\\\'));
- if (this.escape) text = escape(text);
- this.buffer(text);
- },
-
- /**
- * Visit a `comment`, only buffering when the buffer flag is set.
- *
- * @param {Comment} comment
- * @api public
- */
-
- visitComment: function(comment){
- if (!comment.buffer) return;
- if (this.pp) this.prettyIndent(1, true);
- this.buffer('<!--' + utils.escape(comment.val) + '-->');
- },
-
- /**
- * Visit a `BlockComment`.
- *
- * @param {Comment} comment
- * @api public
- */
-
- visitBlockComment: function(comment){
- if (!comment.buffer) return;
- if (0 == comment.val.trim().indexOf('if')) {
- this.buffer('<!--[' + comment.val.trim() + ']>');
- this.visit(comment.block);
- this.buffer('<![endif]-->');
- } else {
- this.buffer('<!--' + comment.val);
- this.visit(comment.block);
- this.buffer('-->');
- }
- },
-
- /**
- * Visit `code`, respecting buffer / escape flags.
- * If the code is followed by a block, wrap it in
- * a self-calling function.
- *
- * @param {Code} code
- * @api public
- */
-
- visitCode: function(code){
- // Wrap code blocks with {}.
- // we only wrap unbuffered code blocks ATM
- // since they are usually flow control
-
- // Buffer code
- if (code.buffer) {
- var val = code.val.trimLeft();
- this.buf.push('var __val__ = ' + val);
- val = 'null == __val__ ? "" : __val__';
- if (code.escape) val = 'escape(' + val + ')';
- this.buf.push("buf.push(" + val + ");");
- } else {
- this.buf.push(code.val);
- }
-
- // Block support
- if (code.block) {
- if (!code.buffer) this.buf.push('{');
- this.visit(code.block);
- if (!code.buffer) this.buf.push('}');
- }
- },
-
- /**
- * Visit `each` block.
- *
- * @param {Each} each
- * @api public
- */
-
- visitEach: function(each){
- this.buf.push(''
- + '// iterate ' + each.obj + '\n'
- + ';(function(){\n'
- + ' if (\'number\' == typeof ' + each.obj + '.length) {\n'
- + ' for (var ' + each.key + ' = 0, $$l = ' + each.obj + '.length; ' + each.key + ' < $$l; ' + each.key + '++) {\n'
- + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n');
-
- this.visit(each.block);
-
- this.buf.push(''
- + ' }\n'
- + ' } else {\n'
- + ' for (var ' + each.key + ' in ' + each.obj + ') {\n'
- // if browser
- // + ' if (' + each.obj + '.hasOwnProperty(' + each.key + ')){'
- // end
- + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n');
-
- this.visit(each.block);
-
- // if browser
- // this.buf.push(' }\n');
- // end
-
- this.buf.push(' }\n }\n}).call(this);\n');
- },
-
- /**
- * Visit `attrs`.
- *
- * @param {Array} attrs
- * @api public
- */
-
- visitAttributes: function(attrs){
- var val = this.attrs(attrs);
- if (val.inherits) {
- this.buf.push("buf.push(attrs(merge({ " + val.buf +
- " }, attributes), merge(" + val.escaped + ", escaped, true)));");
- } else if (val.constant) {
- eval('var buf={' + val.buf + '};');
- this.buffer(runtime.attrs(buf, JSON.parse(val.escaped)), true);
- } else {
- this.buf.push("buf.push(attrs({ " + val.buf + " }, " + val.escaped + "));");
- }
- },
-
- /**
- * Compile attributes.
- */
-
- attrs: function(attrs){
- var buf = []
- , classes = []
- , escaped = {}
- , constant = attrs.every(function(attr){ return isConstant(attr.val) })
- , inherits = false;
-
- if (this.terse) buf.push('terse: true');
-
- attrs.forEach(function(attr){
- if (attr.name == 'attributes') return inherits = true;
- escaped[attr.name] = attr.escaped;
- if (attr.name == 'class') {
- classes.push('(' + attr.val + ')');
- } else {
- var pair = "'" + attr.name + "':(" + attr.val + ')';
- buf.push(pair);
- }
- });
-
- if (classes.length) {
- classes = classes.join(" + ' ' + ");
- buf.push("class: " + classes);
- }
-
- return {
- buf: buf.join(', ').replace('class:', '"class":'),
- escaped: JSON.stringify(escaped),
- inherits: inherits,
- constant: constant
- };
- }
-};
-
-/**
- * Check if expression can be evaluated to a constant
- *
- * @param {String} expression
- * @return {Boolean}
- * @api private
- */
-
-function isConstant(val){
- // Check strings/literals
- if (/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val))
- return true;
-
- // Check numbers
- if (!isNaN(Number(val)))
- return true;
-
- // Check arrays
- var matches;
- if (matches = /^ *\[(.*)\] *$/.exec(val))
- return matches[1].split(',').every(isConstant);
-
- return false;
-}
-
-/**
- * Escape the given string of `html`.
- *
- * @param {String} html
- * @return {String}
- * @api private
- */
-
-function escape(html){
- return String(html)
- .replace(/&(?!\w+;)/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/"/g, '&quot;');
-} \ No newline at end of file
diff --git a/node_modules/jade/lib/doctypes.js b/node_modules/jade/lib/doctypes.js
deleted file mode 100644
index e87ca1e4c..000000000
--- a/node_modules/jade/lib/doctypes.js
+++ /dev/null
@@ -1,18 +0,0 @@
-
-/*!
- * Jade - doctypes
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-module.exports = {
- '5': '<!DOCTYPE html>'
- , 'default': '<!DOCTYPE html>'
- , 'xml': '<?xml version="1.0" encoding="utf-8" ?>'
- , 'transitional': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
- , 'strict': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
- , 'frameset': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">'
- , '1.1': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'
- , 'basic': '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">'
- , 'mobile': '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">'
-}; \ No newline at end of file
diff --git a/node_modules/jade/lib/filters.js b/node_modules/jade/lib/filters.js
deleted file mode 100644
index fdb634cb7..000000000
--- a/node_modules/jade/lib/filters.js
+++ /dev/null
@@ -1,97 +0,0 @@
-
-/*!
- * Jade - filters
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-module.exports = {
-
- /**
- * Wrap text with CDATA block.
- */
-
- cdata: function(str){
- return '<![CDATA[\\n' + str + '\\n]]>';
- },
-
- /**
- * Transform sass to css, wrapped in style tags.
- */
-
- sass: function(str){
- str = str.replace(/\\n/g, '\n');
- var sass = require('sass').render(str).replace(/\n/g, '\\n');
- return '<style type="text/css">' + sass + '</style>';
- },
-
- /**
- * Transform stylus to css, wrapped in style tags.
- */
-
- stylus: function(str, options){
- var ret;
- str = str.replace(/\\n/g, '\n');
- var stylus = require('stylus');
- stylus(str, options).render(function(err, css){
- if (err) throw err;
- ret = css.replace(/\n/g, '\\n');
- });
- return '<style type="text/css">' + ret + '</style>';
- },
-
- /**
- * Transform less to css, wrapped in style tags.
- */
-
- less: function(str){
- var ret;
- str = str.replace(/\\n/g, '\n');
- require('less').render(str, function(err, css){
- if (err) throw err;
- ret = '<style type="text/css">' + css.replace(/\n/g, '\\n') + '</style>';
- });
- return ret;
- },
-
- /**
- * Transform markdown to html.
- */
-
- markdown: function(str){
- var md;
-
- // support markdown / discount
- try {
- md = require('markdown');
- } catch (err){
- try {
- md = require('discount');
- } catch (err) {
- try {
- md = require('markdown-js');
- } catch (err) {
- try {
- md = require('marked');
- } catch (err) {
- throw new
- Error('Cannot find markdown library, install markdown, discount, or marked.');
- }
- }
- }
- }
-
- str = str.replace(/\\n/g, '\n');
- return md.parse(str).replace(/\n/g, '\\n').replace(/'/g,'&#39;');
- },
-
- /**
- * Transform coffeescript to javascript.
- */
-
- coffeescript: function(str){
- str = str.replace(/\\n/g, '\n');
- var js = require('coffee-script').compile(str).replace(/\\/g, '\\\\').replace(/\n/g, '\\n');
- return '<script type="text/javascript">\\n' + js + '</script>';
- }
-};
diff --git a/node_modules/jade/lib/inline-tags.js b/node_modules/jade/lib/inline-tags.js
deleted file mode 100644
index 491de0b51..000000000
--- a/node_modules/jade/lib/inline-tags.js
+++ /dev/null
@@ -1,28 +0,0 @@
-
-/*!
- * Jade - inline tags
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-module.exports = [
- 'a'
- , 'abbr'
- , 'acronym'
- , 'b'
- , 'br'
- , 'code'
- , 'em'
- , 'font'
- , 'i'
- , 'img'
- , 'ins'
- , 'kbd'
- , 'map'
- , 'samp'
- , 'small'
- , 'span'
- , 'strong'
- , 'sub'
- , 'sup'
-]; \ No newline at end of file
diff --git a/node_modules/jade/lib/jade.js b/node_modules/jade/lib/jade.js
deleted file mode 100644
index 00f0abb1d..000000000
--- a/node_modules/jade/lib/jade.js
+++ /dev/null
@@ -1,237 +0,0 @@
-/*!
- * Jade
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Parser = require('./parser')
- , Lexer = require('./lexer')
- , Compiler = require('./compiler')
- , runtime = require('./runtime')
-// if node
- , fs = require('fs');
-// end
-
-/**
- * Library version.
- */
-
-exports.version = '0.26.3';
-
-/**
- * Expose self closing tags.
- */
-
-exports.selfClosing = require('./self-closing');
-
-/**
- * Default supported doctypes.
- */
-
-exports.doctypes = require('./doctypes');
-
-/**
- * Text filters.
- */
-
-exports.filters = require('./filters');
-
-/**
- * Utilities.
- */
-
-exports.utils = require('./utils');
-
-/**
- * Expose `Compiler`.
- */
-
-exports.Compiler = Compiler;
-
-/**
- * Expose `Parser`.
- */
-
-exports.Parser = Parser;
-
-/**
- * Expose `Lexer`.
- */
-
-exports.Lexer = Lexer;
-
-/**
- * Nodes.
- */
-
-exports.nodes = require('./nodes');
-
-/**
- * Jade runtime helpers.
- */
-
-exports.runtime = runtime;
-
-/**
- * Template function cache.
- */
-
-exports.cache = {};
-
-/**
- * Parse the given `str` of jade and return a function body.
- *
- * @param {String} str
- * @param {Object} options
- * @return {String}
- * @api private
- */
-
-function parse(str, options){
- try {
- // Parse
- var parser = new Parser(str, options.filename, options);
-
- // Compile
- var compiler = new (options.compiler || Compiler)(parser.parse(), options)
- , js = compiler.compile();
-
- // Debug compiler
- if (options.debug) {
- console.error('\nCompiled Function:\n\n\033[90m%s\033[0m', js.replace(/^/gm, ' '));
- }
-
- return ''
- + 'var buf = [];\n'
- + (options.self
- ? 'var self = locals || {};\n' + js
- : 'with (locals || {}) {\n' + js + '\n}\n')
- + 'return buf.join("");';
- } catch (err) {
- parser = parser.context();
- runtime.rethrow(err, parser.filename, parser.lexer.lineno);
- }
-}
-
-/**
- * Compile a `Function` representation of the given jade `str`.
- *
- * Options:
- *
- * - `compileDebug` when `false` debugging code is stripped from the compiled template
- * - `client` when `true` the helper functions `escape()` etc will reference `jade.escape()`
- * for use with the Jade client-side runtime.js
- *
- * @param {String} str
- * @param {Options} options
- * @return {Function}
- * @api public
- */
-
-exports.compile = function(str, options){
- var options = options || {}
- , client = options.client
- , filename = options.filename
- ? JSON.stringify(options.filename)
- : 'undefined'
- , fn;
-
- if (options.compileDebug !== false) {
- fn = [
- 'var __jade = [{ lineno: 1, filename: ' + filename + ' }];'
- , 'try {'
- , parse(String(str), options)
- , '} catch (err) {'
- , ' rethrow(err, __jade[0].filename, __jade[0].lineno);'
- , '}'
- ].join('\n');
- } else {
- fn = parse(String(str), options);
- }
-
- if (client) {
- fn = 'attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n' + fn;
- }
-
- fn = new Function('locals, attrs, escape, rethrow, merge', fn);
-
- if (client) return fn;
-
- return function(locals){
- return fn(locals, runtime.attrs, runtime.escape, runtime.rethrow, runtime.merge);
- };
-};
-
-/**
- * Render the given `str` of jade and invoke
- * the callback `fn(err, str)`.
- *
- * Options:
- *
- * - `cache` enable template caching
- * - `filename` filename required for `include` / `extends` and caching
- *
- * @param {String} str
- * @param {Object|Function} options or fn
- * @param {Function} fn
- * @api public
- */
-
-exports.render = function(str, options, fn){
- // swap args
- if ('function' == typeof options) {
- fn = options, options = {};
- }
-
- // cache requires .filename
- if (options.cache && !options.filename) {
- return fn(new Error('the "filename" option is required for caching'));
- }
-
- try {
- var path = options.filename;
- var tmpl = options.cache
- ? exports.cache[path] || (exports.cache[path] = exports.compile(str, options))
- : exports.compile(str, options);
- fn(null, tmpl(options));
- } catch (err) {
- fn(err);
- }
-};
-
-/**
- * Render a Jade file at the given `path` and callback `fn(err, str)`.
- *
- * @param {String} path
- * @param {Object|Function} options or callback
- * @param {Function} fn
- * @api public
- */
-
-exports.renderFile = function(path, options, fn){
- var key = path + ':string';
-
- if ('function' == typeof options) {
- fn = options, options = {};
- }
-
- try {
- options.filename = path;
- var str = options.cache
- ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8'))
- : fs.readFileSync(path, 'utf8');
- exports.render(str, options, fn);
- } catch (err) {
- fn(err);
- }
-};
-
-/**
- * Express support.
- */
-
-exports.__express = exports.renderFile;
diff --git a/node_modules/jade/lib/lexer.js b/node_modules/jade/lib/lexer.js
deleted file mode 100644
index bca314a9f..000000000
--- a/node_modules/jade/lib/lexer.js
+++ /dev/null
@@ -1,771 +0,0 @@
-
-/*!
- * Jade - Lexer
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Initialize `Lexer` with the given `str`.
- *
- * Options:
- *
- * - `colons` allow colons for attr delimiters
- *
- * @param {String} str
- * @param {Object} options
- * @api private
- */
-
-var Lexer = module.exports = function Lexer(str, options) {
- options = options || {};
- this.input = str.replace(/\r\n|\r/g, '\n');
- this.colons = options.colons;
- this.deferredTokens = [];
- this.lastIndents = 0;
- this.lineno = 1;
- this.stash = [];
- this.indentStack = [];
- this.indentRe = null;
- this.pipeless = false;
-};
-
-/**
- * Lexer prototype.
- */
-
-Lexer.prototype = {
-
- /**
- * Construct a token with the given `type` and `val`.
- *
- * @param {String} type
- * @param {String} val
- * @return {Object}
- * @api private
- */
-
- tok: function(type, val){
- return {
- type: type
- , line: this.lineno
- , val: val
- }
- },
-
- /**
- * Consume the given `len` of input.
- *
- * @param {Number} len
- * @api private
- */
-
- consume: function(len){
- this.input = this.input.substr(len);
- },
-
- /**
- * Scan for `type` with the given `regexp`.
- *
- * @param {String} type
- * @param {RegExp} regexp
- * @return {Object}
- * @api private
- */
-
- scan: function(regexp, type){
- var captures;
- if (captures = regexp.exec(this.input)) {
- this.consume(captures[0].length);
- return this.tok(type, captures[1]);
- }
- },
-
- /**
- * Defer the given `tok`.
- *
- * @param {Object} tok
- * @api private
- */
-
- defer: function(tok){
- this.deferredTokens.push(tok);
- },
-
- /**
- * Lookahead `n` tokens.
- *
- * @param {Number} n
- * @return {Object}
- * @api private
- */
-
- lookahead: function(n){
- var fetch = n - this.stash.length;
- while (fetch-- > 0) this.stash.push(this.next());
- return this.stash[--n];
- },
-
- /**
- * Return the indexOf `start` / `end` delimiters.
- *
- * @param {String} start
- * @param {String} end
- * @return {Number}
- * @api private
- */
-
- indexOfDelimiters: function(start, end){
- var str = this.input
- , nstart = 0
- , nend = 0
- , pos = 0;
- for (var i = 0, len = str.length; i < len; ++i) {
- if (start == str.charAt(i)) {
- ++nstart;
- } else if (end == str.charAt(i)) {
- if (++nend == nstart) {
- pos = i;
- break;
- }
- }
- }
- return pos;
- },
-
- /**
- * Stashed token.
- */
-
- stashed: function() {
- return this.stash.length
- && this.stash.shift();
- },
-
- /**
- * Deferred token.
- */
-
- deferred: function() {
- return this.deferredTokens.length
- && this.deferredTokens.shift();
- },
-
- /**
- * end-of-source.
- */
-
- eos: function() {
- if (this.input.length) return;
- if (this.indentStack.length) {
- this.indentStack.shift();
- return this.tok('outdent');
- } else {
- return this.tok('eos');
- }
- },
-
- /**
- * Blank line.
- */
-
- blank: function() {
- var captures;
- if (captures = /^\n *\n/.exec(this.input)) {
- this.consume(captures[0].length - 1);
- if (this.pipeless) return this.tok('text', '');
- return this.next();
- }
- },
-
- /**
- * Comment.
- */
-
- comment: function() {
- var captures;
- if (captures = /^ *\/\/(-)?([^\n]*)/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok = this.tok('comment', captures[2]);
- tok.buffer = '-' != captures[1];
- return tok;
- }
- },
-
- /**
- * Interpolated tag.
- */
-
- interpolation: function() {
- var captures;
- if (captures = /^#\{(.*?)\}/.exec(this.input)) {
- this.consume(captures[0].length);
- return this.tok('interpolation', captures[1]);
- }
- },
-
- /**
- * Tag.
- */
-
- tag: function() {
- var captures;
- if (captures = /^(\w[-:\w]*)(\/?)/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok, name = captures[1];
- if (':' == name[name.length - 1]) {
- name = name.slice(0, -1);
- tok = this.tok('tag', name);
- this.defer(this.tok(':'));
- while (' ' == this.input[0]) this.input = this.input.substr(1);
- } else {
- tok = this.tok('tag', name);
- }
- tok.selfClosing = !! captures[2];
- return tok;
- }
- },
-
- /**
- * Filter.
- */
-
- filter: function() {
- return this.scan(/^:(\w+)/, 'filter');
- },
-
- /**
- * Doctype.
- */
-
- doctype: function() {
- return this.scan(/^(?:!!!|doctype) *([^\n]+)?/, 'doctype');
- },
-
- /**
- * Id.
- */
-
- id: function() {
- return this.scan(/^#([\w-]+)/, 'id');
- },
-
- /**
- * Class.
- */
-
- className: function() {
- return this.scan(/^\.([\w-]+)/, 'class');
- },
-
- /**
- * Text.
- */
-
- text: function() {
- return this.scan(/^(?:\| ?| ?)?([^\n]+)/, 'text');
- },
-
- /**
- * Extends.
- */
-
- "extends": function() {
- return this.scan(/^extends? +([^\n]+)/, 'extends');
- },
-
- /**
- * Block prepend.
- */
-
- prepend: function() {
- var captures;
- if (captures = /^prepend +([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var mode = 'prepend'
- , name = captures[1]
- , tok = this.tok('block', name);
- tok.mode = mode;
- return tok;
- }
- },
-
- /**
- * Block append.
- */
-
- append: function() {
- var captures;
- if (captures = /^append +([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var mode = 'append'
- , name = captures[1]
- , tok = this.tok('block', name);
- tok.mode = mode;
- return tok;
- }
- },
-
- /**
- * Block.
- */
-
- block: function() {
- var captures;
- if (captures = /^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)) {
- this.consume(captures[0].length);
- var mode = captures[1] || 'replace'
- , name = captures[2]
- , tok = this.tok('block', name);
-
- tok.mode = mode;
- return tok;
- }
- },
-
- /**
- * Yield.
- */
-
- yield: function() {
- return this.scan(/^yield */, 'yield');
- },
-
- /**
- * Include.
- */
-
- include: function() {
- return this.scan(/^include +([^\n]+)/, 'include');
- },
-
- /**
- * Case.
- */
-
- "case": function() {
- return this.scan(/^case +([^\n]+)/, 'case');
- },
-
- /**
- * When.
- */
-
- when: function() {
- return this.scan(/^when +([^:\n]+)/, 'when');
- },
-
- /**
- * Default.
- */
-
- "default": function() {
- return this.scan(/^default */, 'default');
- },
-
- /**
- * Assignment.
- */
-
- assignment: function() {
- var captures;
- if (captures = /^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)) {
- this.consume(captures[0].length);
- var name = captures[1]
- , val = captures[2];
- return this.tok('code', 'var ' + name + ' = (' + val + ');');
- }
- },
-
- /**
- * Call mixin.
- */
-
- call: function(){
- var captures;
- if (captures = /^\+([-\w]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok = this.tok('call', captures[1]);
-
- // Check for args (not attributes)
- if (captures = /^ *\((.*?)\)/.exec(this.input)) {
- if (!/^ *[-\w]+ *=/.test(captures[1])) {
- this.consume(captures[0].length);
- tok.args = captures[1];
- }
- }
-
- return tok;
- }
- },
-
- /**
- * Mixin.
- */
-
- mixin: function(){
- var captures;
- if (captures = /^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok = this.tok('mixin', captures[1]);
- tok.args = captures[2];
- return tok;
- }
- },
-
- /**
- * Conditional.
- */
-
- conditional: function() {
- var captures;
- if (captures = /^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)) {
- this.consume(captures[0].length);
- var type = captures[1]
- , js = captures[2];
-
- switch (type) {
- case 'if': js = 'if (' + js + ')'; break;
- case 'unless': js = 'if (!(' + js + '))'; break;
- case 'else if': js = 'else if (' + js + ')'; break;
- case 'else': js = 'else'; break;
- }
-
- return this.tok('code', js);
- }
- },
-
- /**
- * While.
- */
-
- "while": function() {
- var captures;
- if (captures = /^while +([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- return this.tok('code', 'while (' + captures[1] + ')');
- }
- },
-
- /**
- * Each.
- */
-
- each: function() {
- var captures;
- if (captures = /^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var tok = this.tok('each', captures[1]);
- tok.key = captures[2] || '$index';
- tok.code = captures[3];
- return tok;
- }
- },
-
- /**
- * Code.
- */
-
- code: function() {
- var captures;
- if (captures = /^(!?=|-)([^\n]+)/.exec(this.input)) {
- this.consume(captures[0].length);
- var flags = captures[1];
- captures[1] = captures[2];
- var tok = this.tok('code', captures[1]);
- tok.escape = flags[0] === '=';
- tok.buffer = flags[0] === '=' || flags[1] === '=';
- return tok;
- }
- },
-
- /**
- * Attributes.
- */
-
- attrs: function() {
- if ('(' == this.input.charAt(0)) {
- var index = this.indexOfDelimiters('(', ')')
- , str = this.input.substr(1, index-1)
- , tok = this.tok('attrs')
- , len = str.length
- , colons = this.colons
- , states = ['key']
- , escapedAttr
- , key = ''
- , val = ''
- , quote
- , c
- , p;
-
- function state(){
- return states[states.length - 1];
- }
-
- function interpolate(attr) {
- return attr.replace(/#\{([^}]+)\}/g, function(_, expr){
- return quote + " + (" + expr + ") + " + quote;
- });
- }
-
- this.consume(index + 1);
- tok.attrs = {};
- tok.escaped = {};
-
- function parse(c) {
- var real = c;
- // TODO: remove when people fix ":"
- if (colons && ':' == c) c = '=';
- switch (c) {
- case ',':
- case '\n':
- switch (state()) {
- case 'expr':
- case 'array':
- case 'string':
- case 'object':
- val += c;
- break;
- default:
- states.push('key');
- val = val.trim();
- key = key.trim();
- if ('' == key) return;
- key = key.replace(/^['"]|['"]$/g, '').replace('!', '');
- tok.escaped[key] = escapedAttr;
- tok.attrs[key] = '' == val
- ? true
- : interpolate(val);
- key = val = '';
- }
- break;
- case '=':
- switch (state()) {
- case 'key char':
- key += real;
- break;
- case 'val':
- case 'expr':
- case 'array':
- case 'string':
- case 'object':
- val += real;
- break;
- default:
- escapedAttr = '!' != p;
- states.push('val');
- }
- break;
- case '(':
- if ('val' == state()
- || 'expr' == state()) states.push('expr');
- val += c;
- break;
- case ')':
- if ('expr' == state()
- || 'val' == state()) states.pop();
- val += c;
- break;
- case '{':
- if ('val' == state()) states.push('object');
- val += c;
- break;
- case '}':
- if ('object' == state()) states.pop();
- val += c;
- break;
- case '[':
- if ('val' == state()) states.push('array');
- val += c;
- break;
- case ']':
- if ('array' == state()) states.pop();
- val += c;
- break;
- case '"':
- case "'":
- switch (state()) {
- case 'key':
- states.push('key char');
- break;
- case 'key char':
- states.pop();
- break;
- case 'string':
- if (c == quote) states.pop();
- val += c;
- break;
- default:
- states.push('string');
- val += c;
- quote = c;
- }
- break;
- case '':
- break;
- default:
- switch (state()) {
- case 'key':
- case 'key char':
- key += c;
- break;
- default:
- val += c;
- }
- }
- p = c;
- }
-
- for (var i = 0; i < len; ++i) {
- parse(str.charAt(i));
- }
-
- parse(',');
-
- if ('/' == this.input.charAt(0)) {
- this.consume(1);
- tok.selfClosing = true;
- }
-
- return tok;
- }
- },
-
- /**
- * Indent | Outdent | Newline.
- */
-
- indent: function() {
- var captures, re;
-
- // established regexp
- if (this.indentRe) {
- captures = this.indentRe.exec(this.input);
- // determine regexp
- } else {
- // tabs
- re = /^\n(\t*) */;
- captures = re.exec(this.input);
-
- // spaces
- if (captures && !captures[1].length) {
- re = /^\n( *)/;
- captures = re.exec(this.input);
- }
-
- // established
- if (captures && captures[1].length) this.indentRe = re;
- }
-
- if (captures) {
- var tok
- , indents = captures[1].length;
-
- ++this.lineno;
- this.consume(indents + 1);
-
- if (' ' == this.input[0] || '\t' == this.input[0]) {
- throw new Error('Invalid indentation, you can use tabs or spaces but not both');
- }
-
- // blank line
- if ('\n' == this.input[0]) return this.tok('newline');
-
- // outdent
- if (this.indentStack.length && indents < this.indentStack[0]) {
- while (this.indentStack.length && this.indentStack[0] > indents) {
- this.stash.push(this.tok('outdent'));
- this.indentStack.shift();
- }
- tok = this.stash.pop();
- // indent
- } else if (indents && indents != this.indentStack[0]) {
- this.indentStack.unshift(indents);
- tok = this.tok('indent', indents);
- // newline
- } else {
- tok = this.tok('newline');
- }
-
- return tok;
- }
- },
-
- /**
- * Pipe-less text consumed only when
- * pipeless is true;
- */
-
- pipelessText: function() {
- if (this.pipeless) {
- if ('\n' == this.input[0]) return;
- var i = this.input.indexOf('\n');
- if (-1 == i) i = this.input.length;
- var str = this.input.substr(0, i);
- this.consume(str.length);
- return this.tok('text', str);
- }
- },
-
- /**
- * ':'
- */
-
- colon: function() {
- return this.scan(/^: */, ':');
- },
-
- /**
- * Return the next token object, or those
- * previously stashed by lookahead.
- *
- * @return {Object}
- * @api private
- */
-
- advance: function(){
- return this.stashed()
- || this.next();
- },
-
- /**
- * Return the next token object.
- *
- * @return {Object}
- * @api private
- */
-
- next: function() {
- return this.deferred()
- || this.blank()
- || this.eos()
- || this.pipelessText()
- || this.yield()
- || this.doctype()
- || this.interpolation()
- || this["case"]()
- || this.when()
- || this["default"]()
- || this["extends"]()
- || this.append()
- || this.prepend()
- || this.block()
- || this.include()
- || this.mixin()
- || this.call()
- || this.conditional()
- || this.each()
- || this["while"]()
- || this.assignment()
- || this.tag()
- || this.filter()
- || this.code()
- || this.id()
- || this.className()
- || this.attrs()
- || this.indent()
- || this.comment()
- || this.colon()
- || this.text();
- }
-};
diff --git a/node_modules/jade/lib/nodes/attrs.js b/node_modules/jade/lib/nodes/attrs.js
deleted file mode 100644
index 5de9b59cc..000000000
--- a/node_modules/jade/lib/nodes/attrs.js
+++ /dev/null
@@ -1,77 +0,0 @@
-
-/*!
- * Jade - nodes - Attrs
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node'),
- Block = require('./block');
-
-/**
- * Initialize a `Attrs` node.
- *
- * @api public
- */
-
-var Attrs = module.exports = function Attrs() {
- this.attrs = [];
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Attrs.prototype.__proto__ = Node.prototype;
-
-/**
- * Set attribute `name` to `val`, keep in mind these become
- * part of a raw js object literal, so to quote a value you must
- * '"quote me"', otherwise or example 'user.name' is literal JavaScript.
- *
- * @param {String} name
- * @param {String} val
- * @param {Boolean} escaped
- * @return {Tag} for chaining
- * @api public
- */
-
-Attrs.prototype.setAttribute = function(name, val, escaped){
- this.attrs.push({ name: name, val: val, escaped: escaped });
- return this;
-};
-
-/**
- * Remove attribute `name` when present.
- *
- * @param {String} name
- * @api public
- */
-
-Attrs.prototype.removeAttribute = function(name){
- for (var i = 0, len = this.attrs.length; i < len; ++i) {
- if (this.attrs[i] && this.attrs[i].name == name) {
- delete this.attrs[i];
- }
- }
-};
-
-/**
- * Get attribute value by `name`.
- *
- * @param {String} name
- * @return {String}
- * @api public
- */
-
-Attrs.prototype.getAttribute = function(name){
- for (var i = 0, len = this.attrs.length; i < len; ++i) {
- if (this.attrs[i] && this.attrs[i].name == name) {
- return this.attrs[i].val;
- }
- }
-};
diff --git a/node_modules/jade/lib/nodes/block-comment.js b/node_modules/jade/lib/nodes/block-comment.js
deleted file mode 100644
index 4f41e4a57..000000000
--- a/node_modules/jade/lib/nodes/block-comment.js
+++ /dev/null
@@ -1,33 +0,0 @@
-
-/*!
- * Jade - nodes - BlockComment
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `BlockComment` with the given `block`.
- *
- * @param {String} val
- * @param {Block} block
- * @param {Boolean} buffer
- * @api public
- */
-
-var BlockComment = module.exports = function BlockComment(val, block, buffer) {
- this.block = block;
- this.val = val;
- this.buffer = buffer;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-BlockComment.prototype.__proto__ = Node.prototype; \ No newline at end of file
diff --git a/node_modules/jade/lib/nodes/block.js b/node_modules/jade/lib/nodes/block.js
deleted file mode 100644
index bb00a1d9b..000000000
--- a/node_modules/jade/lib/nodes/block.js
+++ /dev/null
@@ -1,121 +0,0 @@
-
-/*!
- * Jade - nodes - Block
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a new `Block` with an optional `node`.
- *
- * @param {Node} node
- * @api public
- */
-
-var Block = module.exports = function Block(node){
- this.nodes = [];
- if (node) this.push(node);
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Block.prototype.__proto__ = Node.prototype;
-
-/**
- * Block flag.
- */
-
-Block.prototype.isBlock = true;
-
-/**
- * Replace the nodes in `other` with the nodes
- * in `this` block.
- *
- * @param {Block} other
- * @api private
- */
-
-Block.prototype.replace = function(other){
- other.nodes = this.nodes;
-};
-
-/**
- * Pust the given `node`.
- *
- * @param {Node} node
- * @return {Number}
- * @api public
- */
-
-Block.prototype.push = function(node){
- return this.nodes.push(node);
-};
-
-/**
- * Check if this block is empty.
- *
- * @return {Boolean}
- * @api public
- */
-
-Block.prototype.isEmpty = function(){
- return 0 == this.nodes.length;
-};
-
-/**
- * Unshift the given `node`.
- *
- * @param {Node} node
- * @return {Number}
- * @api public
- */
-
-Block.prototype.unshift = function(node){
- return this.nodes.unshift(node);
-};
-
-/**
- * Return the "last" block, or the first `yield` node.
- *
- * @return {Block}
- * @api private
- */
-
-Block.prototype.includeBlock = function(){
- var ret = this
- , node;
-
- for (var i = 0, len = this.nodes.length; i < len; ++i) {
- node = this.nodes[i];
- if (node.yield) return node;
- else if (node.textOnly) continue;
- else if (node.includeBlock) ret = node.includeBlock();
- else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock();
- }
-
- return ret;
-};
-
-/**
- * Return a clone of this block.
- *
- * @return {Block}
- * @api private
- */
-
-Block.prototype.clone = function(){
- var clone = new Block;
- for (var i = 0, len = this.nodes.length; i < len; ++i) {
- clone.push(this.nodes[i].clone());
- }
- return clone;
-};
-
diff --git a/node_modules/jade/lib/nodes/case.js b/node_modules/jade/lib/nodes/case.js
deleted file mode 100644
index 08ff03378..000000000
--- a/node_modules/jade/lib/nodes/case.js
+++ /dev/null
@@ -1,43 +0,0 @@
-
-/*!
- * Jade - nodes - Case
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a new `Case` with `expr`.
- *
- * @param {String} expr
- * @api public
- */
-
-var Case = exports = module.exports = function Case(expr, block){
- this.expr = expr;
- this.block = block;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Case.prototype.__proto__ = Node.prototype;
-
-var When = exports.When = function When(expr, block){
- this.expr = expr;
- this.block = block;
- this.debug = false;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-When.prototype.__proto__ = Node.prototype;
-
diff --git a/node_modules/jade/lib/nodes/code.js b/node_modules/jade/lib/nodes/code.js
deleted file mode 100644
index babc67598..000000000
--- a/node_modules/jade/lib/nodes/code.js
+++ /dev/null
@@ -1,35 +0,0 @@
-
-/*!
- * Jade - nodes - Code
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Code` node with the given code `val`.
- * Code may also be optionally buffered and escaped.
- *
- * @param {String} val
- * @param {Boolean} buffer
- * @param {Boolean} escape
- * @api public
- */
-
-var Code = module.exports = function Code(val, buffer, escape) {
- this.val = val;
- this.buffer = buffer;
- this.escape = escape;
- if (val.match(/^ *else/)) this.debug = false;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Code.prototype.__proto__ = Node.prototype; \ No newline at end of file
diff --git a/node_modules/jade/lib/nodes/comment.js b/node_modules/jade/lib/nodes/comment.js
deleted file mode 100644
index 2e1469e7e..000000000
--- a/node_modules/jade/lib/nodes/comment.js
+++ /dev/null
@@ -1,32 +0,0 @@
-
-/*!
- * Jade - nodes - Comment
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Comment` with the given `val`, optionally `buffer`,
- * otherwise the comment may render in the output.
- *
- * @param {String} val
- * @param {Boolean} buffer
- * @api public
- */
-
-var Comment = module.exports = function Comment(val, buffer) {
- this.val = val;
- this.buffer = buffer;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Comment.prototype.__proto__ = Node.prototype; \ No newline at end of file
diff --git a/node_modules/jade/lib/nodes/doctype.js b/node_modules/jade/lib/nodes/doctype.js
deleted file mode 100644
index b8f33e56c..000000000
--- a/node_modules/jade/lib/nodes/doctype.js
+++ /dev/null
@@ -1,29 +0,0 @@
-
-/*!
- * Jade - nodes - Doctype
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Doctype` with the given `val`.
- *
- * @param {String} val
- * @api public
- */
-
-var Doctype = module.exports = function Doctype(val) {
- this.val = val;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Doctype.prototype.__proto__ = Node.prototype; \ No newline at end of file
diff --git a/node_modules/jade/lib/nodes/each.js b/node_modules/jade/lib/nodes/each.js
deleted file mode 100644
index f54101f13..000000000
--- a/node_modules/jade/lib/nodes/each.js
+++ /dev/null
@@ -1,35 +0,0 @@
-
-/*!
- * Jade - nodes - Each
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize an `Each` node, representing iteration
- *
- * @param {String} obj
- * @param {String} val
- * @param {String} key
- * @param {Block} block
- * @api public
- */
-
-var Each = module.exports = function Each(obj, val, key, block) {
- this.obj = obj;
- this.val = val;
- this.key = key;
- this.block = block;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Each.prototype.__proto__ = Node.prototype; \ No newline at end of file
diff --git a/node_modules/jade/lib/nodes/filter.js b/node_modules/jade/lib/nodes/filter.js
deleted file mode 100644
index 851a0040a..000000000
--- a/node_modules/jade/lib/nodes/filter.js
+++ /dev/null
@@ -1,35 +0,0 @@
-
-/*!
- * Jade - nodes - Filter
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node')
- , Block = require('./block');
-
-/**
- * Initialize a `Filter` node with the given
- * filter `name` and `block`.
- *
- * @param {String} name
- * @param {Block|Node} block
- * @api public
- */
-
-var Filter = module.exports = function Filter(name, block, attrs) {
- this.name = name;
- this.block = block;
- this.attrs = attrs;
- this.isASTFilter = !block.nodes.every(function(node){ return node.isText });
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Filter.prototype.__proto__ = Node.prototype; \ No newline at end of file
diff --git a/node_modules/jade/lib/nodes/index.js b/node_modules/jade/lib/nodes/index.js
deleted file mode 100644
index 386ad2f9d..000000000
--- a/node_modules/jade/lib/nodes/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-
-/*!
- * Jade - nodes
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-exports.Node = require('./node');
-exports.Tag = require('./tag');
-exports.Code = require('./code');
-exports.Each = require('./each');
-exports.Case = require('./case');
-exports.Text = require('./text');
-exports.Block = require('./block');
-exports.Mixin = require('./mixin');
-exports.Filter = require('./filter');
-exports.Comment = require('./comment');
-exports.Literal = require('./literal');
-exports.BlockComment = require('./block-comment');
-exports.Doctype = require('./doctype');
diff --git a/node_modules/jade/lib/nodes/literal.js b/node_modules/jade/lib/nodes/literal.js
deleted file mode 100644
index fde586be0..000000000
--- a/node_modules/jade/lib/nodes/literal.js
+++ /dev/null
@@ -1,32 +0,0 @@
-
-/*!
- * Jade - nodes - Literal
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Literal` node with the given `str.
- *
- * @param {String} str
- * @api public
- */
-
-var Literal = module.exports = function Literal(str) {
- this.str = str
- .replace(/\\/g, "\\\\")
- .replace(/\n|\r\n/g, "\\n")
- .replace(/'/g, "\\'");
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Literal.prototype.__proto__ = Node.prototype;
diff --git a/node_modules/jade/lib/nodes/mixin.js b/node_modules/jade/lib/nodes/mixin.js
deleted file mode 100644
index 8407bc792..000000000
--- a/node_modules/jade/lib/nodes/mixin.js
+++ /dev/null
@@ -1,36 +0,0 @@
-
-/*!
- * Jade - nodes - Mixin
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Attrs = require('./attrs');
-
-/**
- * Initialize a new `Mixin` with `name` and `block`.
- *
- * @param {String} name
- * @param {String} args
- * @param {Block} block
- * @api public
- */
-
-var Mixin = module.exports = function Mixin(name, args, block, call){
- this.name = name;
- this.args = args;
- this.block = block;
- this.attrs = [];
- this.call = call;
-};
-
-/**
- * Inherit from `Attrs`.
- */
-
-Mixin.prototype.__proto__ = Attrs.prototype;
-
diff --git a/node_modules/jade/lib/nodes/node.js b/node_modules/jade/lib/nodes/node.js
deleted file mode 100644
index e98f042c5..000000000
--- a/node_modules/jade/lib/nodes/node.js
+++ /dev/null
@@ -1,25 +0,0 @@
-
-/*!
- * Jade - nodes - Node
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Initialize a `Node`.
- *
- * @api public
- */
-
-var Node = module.exports = function Node(){};
-
-/**
- * Clone this node (return itself)
- *
- * @return {Node}
- * @api private
- */
-
-Node.prototype.clone = function(){
- return this;
-};
diff --git a/node_modules/jade/lib/nodes/tag.js b/node_modules/jade/lib/nodes/tag.js
deleted file mode 100644
index 4b6728adc..000000000
--- a/node_modules/jade/lib/nodes/tag.js
+++ /dev/null
@@ -1,95 +0,0 @@
-
-/*!
- * Jade - nodes - Tag
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Attrs = require('./attrs'),
- Block = require('./block'),
- inlineTags = require('../inline-tags');
-
-/**
- * Initialize a `Tag` node with the given tag `name` and optional `block`.
- *
- * @param {String} name
- * @param {Block} block
- * @api public
- */
-
-var Tag = module.exports = function Tag(name, block) {
- this.name = name;
- this.attrs = [];
- this.block = block || new Block;
-};
-
-/**
- * Inherit from `Attrs`.
- */
-
-Tag.prototype.__proto__ = Attrs.prototype;
-
-/**
- * Clone this tag.
- *
- * @return {Tag}
- * @api private
- */
-
-Tag.prototype.clone = function(){
- var clone = new Tag(this.name, this.block.clone());
- clone.line = this.line;
- clone.attrs = this.attrs;
- clone.textOnly = this.textOnly;
- return clone;
-};
-
-/**
- * Check if this tag is an inline tag.
- *
- * @return {Boolean}
- * @api private
- */
-
-Tag.prototype.isInline = function(){
- return ~inlineTags.indexOf(this.name);
-};
-
-/**
- * Check if this tag's contents can be inlined. Used for pretty printing.
- *
- * @return {Boolean}
- * @api private
- */
-
-Tag.prototype.canInline = function(){
- var nodes = this.block.nodes;
-
- function isInline(node){
- // Recurse if the node is a block
- if (node.isBlock) return node.nodes.every(isInline);
- return node.isText || (node.isInline && node.isInline());
- }
-
- // Empty tag
- if (!nodes.length) return true;
-
- // Text-only or inline-only tag
- if (1 == nodes.length) return isInline(nodes[0]);
-
- // Multi-line inline-only tag
- if (this.block.nodes.every(isInline)) {
- for (var i = 1, len = nodes.length; i < len; ++i) {
- if (nodes[i-1].isText && nodes[i].isText)
- return false;
- }
- return true;
- }
-
- // Mixed tag
- return false;
-}; \ No newline at end of file
diff --git a/node_modules/jade/lib/nodes/text.js b/node_modules/jade/lib/nodes/text.js
deleted file mode 100644
index 3b5dd5573..000000000
--- a/node_modules/jade/lib/nodes/text.js
+++ /dev/null
@@ -1,36 +0,0 @@
-
-/*!
- * Jade - nodes - Text
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Node = require('./node');
-
-/**
- * Initialize a `Text` node with optional `line`.
- *
- * @param {String} line
- * @api public
- */
-
-var Text = module.exports = function Text(line) {
- this.val = '';
- if ('string' == typeof line) this.val = line;
-};
-
-/**
- * Inherit from `Node`.
- */
-
-Text.prototype.__proto__ = Node.prototype;
-
-/**
- * Flag as text.
- */
-
-Text.prototype.isText = true; \ No newline at end of file
diff --git a/node_modules/jade/lib/parser.js b/node_modules/jade/lib/parser.js
deleted file mode 100644
index 92f2af0cd..000000000
--- a/node_modules/jade/lib/parser.js
+++ /dev/null
@@ -1,710 +0,0 @@
-
-/*!
- * Jade - Parser
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var Lexer = require('./lexer')
- , nodes = require('./nodes');
-
-/**
- * Initialize `Parser` with the given input `str` and `filename`.
- *
- * @param {String} str
- * @param {String} filename
- * @param {Object} options
- * @api public
- */
-
-var Parser = exports = module.exports = function Parser(str, filename, options){
- this.input = str;
- this.lexer = new Lexer(str, options);
- this.filename = filename;
- this.blocks = {};
- this.mixins = {};
- this.options = options;
- this.contexts = [this];
-};
-
-/**
- * Tags that may not contain tags.
- */
-
-var textOnly = exports.textOnly = ['script', 'style'];
-
-/**
- * Parser prototype.
- */
-
-Parser.prototype = {
-
- /**
- * Push `parser` onto the context stack,
- * or pop and return a `Parser`.
- */
-
- context: function(parser){
- if (parser) {
- this.contexts.push(parser);
- } else {
- return this.contexts.pop();
- }
- },
-
- /**
- * Return the next token object.
- *
- * @return {Object}
- * @api private
- */
-
- advance: function(){
- return this.lexer.advance();
- },
-
- /**
- * Skip `n` tokens.
- *
- * @param {Number} n
- * @api private
- */
-
- skip: function(n){
- while (n--) this.advance();
- },
-
- /**
- * Single token lookahead.
- *
- * @return {Object}
- * @api private
- */
-
- peek: function() {
- return this.lookahead(1);
- },
-
- /**
- * Return lexer lineno.
- *
- * @return {Number}
- * @api private
- */
-
- line: function() {
- return this.lexer.lineno;
- },
-
- /**
- * `n` token lookahead.
- *
- * @param {Number} n
- * @return {Object}
- * @api private
- */
-
- lookahead: function(n){
- return this.lexer.lookahead(n);
- },
-
- /**
- * Parse input returning a string of js for evaluation.
- *
- * @return {String}
- * @api public
- */
-
- parse: function(){
- var block = new nodes.Block, parser;
- block.line = this.line();
-
- while ('eos' != this.peek().type) {
- if ('newline' == this.peek().type) {
- this.advance();
- } else {
- block.push(this.parseExpr());
- }
- }
-
- if (parser = this.extending) {
- this.context(parser);
- var ast = parser.parse();
- this.context();
- // hoist mixins
- for (var name in this.mixins)
- ast.unshift(this.mixins[name]);
- return ast;
- }
-
- return block;
- },
-
- /**
- * Expect the given type, or throw an exception.
- *
- * @param {String} type
- * @api private
- */
-
- expect: function(type){
- if (this.peek().type === type) {
- return this.advance();
- } else {
- throw new Error('expected "' + type + '", but got "' + this.peek().type + '"');
- }
- },
-
- /**
- * Accept the given `type`.
- *
- * @param {String} type
- * @api private
- */
-
- accept: function(type){
- if (this.peek().type === type) {
- return this.advance();
- }
- },
-
- /**
- * tag
- * | doctype
- * | mixin
- * | include
- * | filter
- * | comment
- * | text
- * | each
- * | code
- * | yield
- * | id
- * | class
- * | interpolation
- */
-
- parseExpr: function(){
- switch (this.peek().type) {
- case 'tag':
- return this.parseTag();
- case 'mixin':
- return this.parseMixin();
- case 'block':
- return this.parseBlock();
- case 'case':
- return this.parseCase();
- case 'when':
- return this.parseWhen();
- case 'default':
- return this.parseDefault();
- case 'extends':
- return this.parseExtends();
- case 'include':
- return this.parseInclude();
- case 'doctype':
- return this.parseDoctype();
- case 'filter':
- return this.parseFilter();
- case 'comment':
- return this.parseComment();
- case 'text':
- return this.parseText();
- case 'each':
- return this.parseEach();
- case 'code':
- return this.parseCode();
- case 'call':
- return this.parseCall();
- case 'interpolation':
- return this.parseInterpolation();
- case 'yield':
- this.advance();
- var block = new nodes.Block;
- block.yield = true;
- return block;
- case 'id':
- case 'class':
- var tok = this.advance();
- this.lexer.defer(this.lexer.tok('tag', 'div'));
- this.lexer.defer(tok);
- return this.parseExpr();
- default:
- throw new Error('unexpected token "' + this.peek().type + '"');
- }
- },
-
- /**
- * Text
- */
-
- parseText: function(){
- var tok = this.expect('text')
- , node = new nodes.Text(tok.val);
- node.line = this.line();
- return node;
- },
-
- /**
- * ':' expr
- * | block
- */
-
- parseBlockExpansion: function(){
- if (':' == this.peek().type) {
- this.advance();
- return new nodes.Block(this.parseExpr());
- } else {
- return this.block();
- }
- },
-
- /**
- * case
- */
-
- parseCase: function(){
- var val = this.expect('case').val
- , node = new nodes.Case(val);
- node.line = this.line();
- node.block = this.block();
- return node;
- },
-
- /**
- * when
- */
-
- parseWhen: function(){
- var val = this.expect('when').val
- return new nodes.Case.When(val, this.parseBlockExpansion());
- },
-
- /**
- * default
- */
-
- parseDefault: function(){
- this.expect('default');
- return new nodes.Case.When('default', this.parseBlockExpansion());
- },
-
- /**
- * code
- */
-
- parseCode: function(){
- var tok = this.expect('code')
- , node = new nodes.Code(tok.val, tok.buffer, tok.escape)
- , block
- , i = 1;
- node.line = this.line();
- while (this.lookahead(i) && 'newline' == this.lookahead(i).type) ++i;
- block = 'indent' == this.lookahead(i).type;
- if (block) {
- this.skip(i-1);
- node.block = this.block();
- }
- return node;
- },
-
- /**
- * comment
- */
-
- parseComment: function(){
- var tok = this.expect('comment')
- , node;
-
- if ('indent' == this.peek().type) {
- node = new nodes.BlockComment(tok.val, this.block(), tok.buffer);
- } else {
- node = new nodes.Comment(tok.val, tok.buffer);
- }
-
- node.line = this.line();
- return node;
- },
-
- /**
- * doctype
- */
-
- parseDoctype: function(){
- var tok = this.expect('doctype')
- , node = new nodes.Doctype(tok.val);
- node.line = this.line();
- return node;
- },
-
- /**
- * filter attrs? text-block
- */
-
- parseFilter: function(){
- var block
- , tok = this.expect('filter')
- , attrs = this.accept('attrs');
-
- this.lexer.pipeless = true;
- block = this.parseTextBlock();
- this.lexer.pipeless = false;
-
- var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs);
- node.line = this.line();
- return node;
- },
-
- /**
- * tag ':' attrs? block
- */
-
- parseASTFilter: function(){
- var block
- , tok = this.expect('tag')
- , attrs = this.accept('attrs');
-
- this.expect(':');
- block = this.block();
-
- var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs);
- node.line = this.line();
- return node;
- },
-
- /**
- * each block
- */
-
- parseEach: function(){
- var tok = this.expect('each')
- , node = new nodes.Each(tok.code, tok.val, tok.key);
- node.line = this.line();
- node.block = this.block();
- return node;
- },
-
- /**
- * 'extends' name
- */
-
- parseExtends: function(){
- var path = require('path')
- , fs = require('fs')
- , dirname = path.dirname
- , basename = path.basename
- , join = path.join;
-
- if (!this.filename)
- throw new Error('the "filename" option is required to extend templates');
-
- var path = this.expect('extends').val.trim()
- , dir = dirname(this.filename);
-
- var path = join(dir, path + '.jade')
- , str = fs.readFileSync(path, 'utf8')
- , parser = new Parser(str, path, this.options);
-
- parser.blocks = this.blocks;
- parser.contexts = this.contexts;
- this.extending = parser;
-
- // TODO: null node
- return new nodes.Literal('');
- },
-
- /**
- * 'block' name block
- */
-
- parseBlock: function(){
- var block = this.expect('block')
- , mode = block.mode
- , name = block.val.trim();
-
- block = 'indent' == this.peek().type
- ? this.block()
- : new nodes.Block(new nodes.Literal(''));
-
- var prev = this.blocks[name];
-
- if (prev) {
- switch (prev.mode) {
- case 'append':
- block.nodes = block.nodes.concat(prev.nodes);
- prev = block;
- break;
- case 'prepend':
- block.nodes = prev.nodes.concat(block.nodes);
- prev = block;
- break;
- }
- }
-
- block.mode = mode;
- return this.blocks[name] = prev || block;
- },
-
- /**
- * include block?
- */
-
- parseInclude: function(){
- var path = require('path')
- , fs = require('fs')
- , dirname = path.dirname
- , basename = path.basename
- , join = path.join;
-
- var path = this.expect('include').val.trim()
- , dir = dirname(this.filename);
-
- if (!this.filename)
- throw new Error('the "filename" option is required to use includes');
-
- // no extension
- if (!~basename(path).indexOf('.')) {
- path += '.jade';
- }
-
- // non-jade
- if ('.jade' != path.substr(-5)) {
- var path = join(dir, path)
- , str = fs.readFileSync(path, 'utf8');
- return new nodes.Literal(str);
- }
-
- var path = join(dir, path)
- , str = fs.readFileSync(path, 'utf8')
- , parser = new Parser(str, path, this.options);
- parser.blocks = this.blocks;
- parser.mixins = this.mixins;
-
- this.context(parser);
- var ast = parser.parse();
- this.context();
- ast.filename = path;
-
- if ('indent' == this.peek().type) {
- ast.includeBlock().push(this.block());
- }
-
- return ast;
- },
-
- /**
- * call ident block
- */
-
- parseCall: function(){
- var tok = this.expect('call')
- , name = tok.val
- , args = tok.args
- , mixin = new nodes.Mixin(name, args, new nodes.Block, true);
-
- this.tag(mixin);
- if (mixin.block.isEmpty()) mixin.block = null;
- return mixin;
- },
-
- /**
- * mixin block
- */
-
- parseMixin: function(){
- var tok = this.expect('mixin')
- , name = tok.val
- , args = tok.args
- , mixin;
-
- // definition
- if ('indent' == this.peek().type) {
- mixin = new nodes.Mixin(name, args, this.block(), false);
- this.mixins[name] = mixin;
- return mixin;
- // call
- } else {
- return new nodes.Mixin(name, args, null, true);
- }
- },
-
- /**
- * indent (text | newline)* outdent
- */
-
- parseTextBlock: function(){
- var block = new nodes.Block;
- block.line = this.line();
- var spaces = this.expect('indent').val;
- if (null == this._spaces) this._spaces = spaces;
- var indent = Array(spaces - this._spaces + 1).join(' ');
- while ('outdent' != this.peek().type) {
- switch (this.peek().type) {
- case 'newline':
- this.advance();
- break;
- case 'indent':
- this.parseTextBlock().nodes.forEach(function(node){
- block.push(node);
- });
- break;
- default:
- var text = new nodes.Text(indent + this.advance().val);
- text.line = this.line();
- block.push(text);
- }
- }
-
- if (spaces == this._spaces) this._spaces = null;
- this.expect('outdent');
- return block;
- },
-
- /**
- * indent expr* outdent
- */
-
- block: function(){
- var block = new nodes.Block;
- block.line = this.line();
- this.expect('indent');
- while ('outdent' != this.peek().type) {
- if ('newline' == this.peek().type) {
- this.advance();
- } else {
- block.push(this.parseExpr());
- }
- }
- this.expect('outdent');
- return block;
- },
-
- /**
- * interpolation (attrs | class | id)* (text | code | ':')? newline* block?
- */
-
- parseInterpolation: function(){
- var tok = this.advance();
- var tag = new nodes.Tag(tok.val);
- tag.buffer = true;
- return this.tag(tag);
- },
-
- /**
- * tag (attrs | class | id)* (text | code | ':')? newline* block?
- */
-
- parseTag: function(){
- // ast-filter look-ahead
- var i = 2;
- if ('attrs' == this.lookahead(i).type) ++i;
- if (':' == this.lookahead(i).type) {
- if ('indent' == this.lookahead(++i).type) {
- return this.parseASTFilter();
- }
- }
-
- var tok = this.advance()
- , tag = new nodes.Tag(tok.val);
-
- tag.selfClosing = tok.selfClosing;
-
- return this.tag(tag);
- },
-
- /**
- * Parse tag.
- */
-
- tag: function(tag){
- var dot;
-
- tag.line = this.line();
-
- // (attrs | class | id)*
- out:
- while (true) {
- switch (this.peek().type) {
- case 'id':
- case 'class':
- var tok = this.advance();
- tag.setAttribute(tok.type, "'" + tok.val + "'");
- continue;
- case 'attrs':
- var tok = this.advance()
- , obj = tok.attrs
- , escaped = tok.escaped
- , names = Object.keys(obj);
-
- if (tok.selfClosing) tag.selfClosing = true;
-
- for (var i = 0, len = names.length; i < len; ++i) {
- var name = names[i]
- , val = obj[name];
- tag.setAttribute(name, val, escaped[name]);
- }
- continue;
- default:
- break out;
- }
- }
-
- // check immediate '.'
- if ('.' == this.peek().val) {
- dot = tag.textOnly = true;
- this.advance();
- }
-
- // (text | code | ':')?
- switch (this.peek().type) {
- case 'text':
- tag.block.push(this.parseText());
- break;
- case 'code':
- tag.code = this.parseCode();
- break;
- case ':':
- this.advance();
- tag.block = new nodes.Block;
- tag.block.push(this.parseExpr());
- break;
- }
-
- // newline*
- while ('newline' == this.peek().type) this.advance();
-
- tag.textOnly = tag.textOnly || ~textOnly.indexOf(tag.name);
-
- // script special-case
- if ('script' == tag.name) {
- var type = tag.getAttribute('type');
- if (!dot && type && 'text/javascript' != type.replace(/^['"]|['"]$/g, '')) {
- tag.textOnly = false;
- }
- }
-
- // block?
- if ('indent' == this.peek().type) {
- if (tag.textOnly) {
- this.lexer.pipeless = true;
- tag.block = this.parseTextBlock();
- this.lexer.pipeless = false;
- } else {
- var block = this.block();
- if (tag.block) {
- for (var i = 0, len = block.nodes.length; i < len; ++i) {
- tag.block.push(block.nodes[i]);
- }
- } else {
- tag.block = block;
- }
- }
- }
-
- return tag;
- }
-};
diff --git a/node_modules/jade/lib/runtime.js b/node_modules/jade/lib/runtime.js
deleted file mode 100644
index fb711f5e0..000000000
--- a/node_modules/jade/lib/runtime.js
+++ /dev/null
@@ -1,174 +0,0 @@
-
-/*!
- * Jade - runtime
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Lame Array.isArray() polyfill for now.
- */
-
-if (!Array.isArray) {
- Array.isArray = function(arr){
- return '[object Array]' == Object.prototype.toString.call(arr);
- };
-}
-
-/**
- * Lame Object.keys() polyfill for now.
- */
-
-if (!Object.keys) {
- Object.keys = function(obj){
- var arr = [];
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- arr.push(key);
- }
- }
- return arr;
- }
-}
-
-/**
- * Merge two attribute objects giving precedence
- * to values in object `b`. Classes are special-cased
- * allowing for arrays and merging/joining appropriately
- * resulting in a string.
- *
- * @param {Object} a
- * @param {Object} b
- * @return {Object} a
- * @api private
- */
-
-exports.merge = function merge(a, b) {
- var ac = a['class'];
- var bc = b['class'];
-
- if (ac || bc) {
- ac = ac || [];
- bc = bc || [];
- if (!Array.isArray(ac)) ac = [ac];
- if (!Array.isArray(bc)) bc = [bc];
- ac = ac.filter(nulls);
- bc = bc.filter(nulls);
- a['class'] = ac.concat(bc).join(' ');
- }
-
- for (var key in b) {
- if (key != 'class') {
- a[key] = b[key];
- }
- }
-
- return a;
-};
-
-/**
- * Filter null `val`s.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
-function nulls(val) {
- return val != null;
-}
-
-/**
- * Render the given attributes object.
- *
- * @param {Object} obj
- * @param {Object} escaped
- * @return {String}
- * @api private
- */
-
-exports.attrs = function attrs(obj, escaped){
- var buf = []
- , terse = obj.terse;
-
- delete obj.terse;
- var keys = Object.keys(obj)
- , len = keys.length;
-
- if (len) {
- buf.push('');
- for (var i = 0; i < len; ++i) {
- var key = keys[i]
- , val = obj[key];
-
- if ('boolean' == typeof val || null == val) {
- if (val) {
- terse
- ? buf.push(key)
- : buf.push(key + '="' + key + '"');
- }
- } else if (0 == key.indexOf('data') && 'string' != typeof val) {
- buf.push(key + "='" + JSON.stringify(val) + "'");
- } else if ('class' == key && Array.isArray(val)) {
- buf.push(key + '="' + exports.escape(val.join(' ')) + '"');
- } else if (escaped && escaped[key]) {
- buf.push(key + '="' + exports.escape(val) + '"');
- } else {
- buf.push(key + '="' + val + '"');
- }
- }
- }
-
- return buf.join(' ');
-};
-
-/**
- * Escape the given string of `html`.
- *
- * @param {String} html
- * @return {String}
- * @api private
- */
-
-exports.escape = function escape(html){
- return String(html)
- .replace(/&(?!(\w+|\#\d+);)/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/"/g, '&quot;');
-};
-
-/**
- * Re-throw the given `err` in context to the
- * the jade in `filename` at the given `lineno`.
- *
- * @param {Error} err
- * @param {String} filename
- * @param {String} lineno
- * @api private
- */
-
-exports.rethrow = function rethrow(err, filename, lineno){
- if (!filename) throw err;
-
- var context = 3
- , str = require('fs').readFileSync(filename, 'utf8')
- , lines = str.split('\n')
- , start = Math.max(lineno - context, 0)
- , end = Math.min(lines.length, lineno + context);
-
- // Error context
- var context = lines.slice(start, end).map(function(line, i){
- var curr = i + start + 1;
- return (curr == lineno ? ' > ' : ' ')
- + curr
- + '| '
- + line;
- }).join('\n');
-
- // Alter exception message
- err.path = filename;
- err.message = (filename || 'Jade') + ':' + lineno
- + '\n' + context + '\n\n' + err.message;
- throw err;
-};
diff --git a/node_modules/jade/lib/self-closing.js b/node_modules/jade/lib/self-closing.js
deleted file mode 100644
index 054877121..000000000
--- a/node_modules/jade/lib/self-closing.js
+++ /dev/null
@@ -1,19 +0,0 @@
-
-/*!
- * Jade - self closing tags
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-module.exports = [
- 'meta'
- , 'img'
- , 'link'
- , 'input'
- , 'source'
- , 'area'
- , 'base'
- , 'col'
- , 'br'
- , 'hr'
-]; \ No newline at end of file
diff --git a/node_modules/jade/lib/utils.js b/node_modules/jade/lib/utils.js
deleted file mode 100644
index ff46d022d..000000000
--- a/node_modules/jade/lib/utils.js
+++ /dev/null
@@ -1,49 +0,0 @@
-
-/*!
- * Jade - utils
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Convert interpolation in the given string to JavaScript.
- *
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-var interpolate = exports.interpolate = function(str){
- return str.replace(/(\\)?([#!]){(.*?)}/g, function(str, escape, flag, code){
- return escape
- ? str
- : "' + "
- + ('!' == flag ? '' : 'escape')
- + "((interp = " + code.replace(/\\'/g, "'")
- + ") == null ? '' : interp) + '";
- });
-};
-
-/**
- * Escape single quotes in `str`.
- *
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-var escape = exports.escape = function(str) {
- return str.replace(/'/g, "\\'");
-};
-
-/**
- * Interpolate, and escape the given `str`.
- *
- * @param {String} str
- * @return {String}
- * @api private
- */
-
-exports.text = function(str){
- return interpolate(escape(str));
-}; \ No newline at end of file
diff --git a/node_modules/jade/node_modules/commander/.npmignore b/node_modules/jade/node_modules/commander/.npmignore
deleted file mode 100644
index f1250e584..000000000
--- a/node_modules/jade/node_modules/commander/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-support
-test
-examples
-*.sock
diff --git a/node_modules/jade/node_modules/commander/.travis.yml b/node_modules/jade/node_modules/commander/.travis.yml
deleted file mode 100644
index f1d0f13c8..000000000
--- a/node_modules/jade/node_modules/commander/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
- - 0.4
- - 0.6
diff --git a/node_modules/jade/node_modules/commander/History.md b/node_modules/jade/node_modules/commander/History.md
deleted file mode 100644
index 4961d2e27..000000000
--- a/node_modules/jade/node_modules/commander/History.md
+++ /dev/null
@@ -1,107 +0,0 @@
-
-0.6.1 / 2012-06-01
-==================
-
- * Added: append (yes or no) on confirmation
- * Added: allow node.js v0.7.x
-
-0.6.0 / 2012-04-10
-==================
-
- * Added `.prompt(obj, callback)` support. Closes #49
- * Added default support to .choose(). Closes #41
- * Fixed the choice example
-
-0.5.1 / 2011-12-20
-==================
-
- * Fixed `password()` for recent nodes. Closes #36
-
-0.5.0 / 2011-12-04
-==================
-
- * Added sub-command option support [itay]
-
-0.4.3 / 2011-12-04
-==================
-
- * Fixed custom help ordering. Closes #32
-
-0.4.2 / 2011-11-24
-==================
-
- * Added travis support
- * Fixed: line-buffered input automatically trimmed. Closes #31
-
-0.4.1 / 2011-11-18
-==================
-
- * Removed listening for "close" on --help
-
-0.4.0 / 2011-11-15
-==================
-
- * Added support for `--`. Closes #24
-
-0.3.3 / 2011-11-14
-==================
-
- * Fixed: wait for close event when writing help info [Jerry Hamlet]
-
-0.3.2 / 2011-11-01
-==================
-
- * Fixed long flag definitions with values [felixge]
-
-0.3.1 / 2011-10-31
-==================
-
- * Changed `--version` short flag to `-V` from `-v`
- * Changed `.version()` so it's configurable [felixge]
-
-0.3.0 / 2011-10-31
-==================
-
- * Added support for long flags only. Closes #18
-
-0.2.1 / 2011-10-24
-==================
-
- * "node": ">= 0.4.x < 0.7.0". Closes #20
-
-0.2.0 / 2011-09-26
-==================
-
- * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
-
-0.1.0 / 2011-08-24
-==================
-
- * Added support for custom `--help` output
-
-0.0.5 / 2011-08-18
-==================
-
- * Changed: when the user enters nothing prompt for password again
- * Fixed issue with passwords beginning with numbers [NuckChorris]
-
-0.0.4 / 2011-08-15
-==================
-
- * Fixed `Commander#args`
-
-0.0.3 / 2011-08-15
-==================
-
- * Added default option value support
-
-0.0.2 / 2011-08-15
-==================
-
- * Added mask support to `Command#password(str[, mask], fn)`
- * Added `Command#password(str, fn)`
-
-0.0.1 / 2010-01-03
-==================
-
- * Initial release
diff --git a/node_modules/jade/node_modules/commander/Makefile b/node_modules/jade/node_modules/commander/Makefile
deleted file mode 100644
index 007462553..000000000
--- a/node_modules/jade/node_modules/commander/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-
-TESTS = $(shell find test/test.*.js)
-
-test:
- @./test/run $(TESTS)
-
-.PHONY: test \ No newline at end of file
diff --git a/node_modules/jade/node_modules/commander/Readme.md b/node_modules/jade/node_modules/commander/Readme.md
deleted file mode 100644
index b8328c375..000000000
--- a/node_modules/jade/node_modules/commander/Readme.md
+++ /dev/null
@@ -1,262 +0,0 @@
-# Commander.js
-
- The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).
-
- [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)
-
-## Installation
-
- $ npm install commander
-
-## Option parsing
-
- Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .version('0.0.1')
- .option('-p, --peppers', 'Add peppers')
- .option('-P, --pineapple', 'Add pineapple')
- .option('-b, --bbq', 'Add bbq sauce')
- .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
- .parse(process.argv);
-
-console.log('you ordered a pizza with:');
-if (program.peppers) console.log(' - peppers');
-if (program.pineapple) console.log(' - pineappe');
-if (program.bbq) console.log(' - bbq');
-console.log(' - %s cheese', program.cheese);
-```
-
- Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
-
-## Automated --help
-
- The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
-
-```
- $ ./examples/pizza --help
-
- Usage: pizza [options]
-
- Options:
-
- -V, --version output the version number
- -p, --peppers Add peppers
- -P, --pineapple Add pineappe
- -b, --bbq Add bbq sauce
- -c, --cheese <type> Add the specified type of cheese [marble]
- -h, --help output usage information
-
-```
-
-## Coercion
-
-```js
-function range(val) {
- return val.split('..').map(Number);
-}
-
-function list(val) {
- return val.split(',');
-}
-
-program
- .version('0.0.1')
- .usage('[options] <file ...>')
- .option('-i, --integer <n>', 'An integer argument', parseInt)
- .option('-f, --float <n>', 'A float argument', parseFloat)
- .option('-r, --range <a>..<b>', 'A range', range)
- .option('-l, --list <items>', 'A list', list)
- .option('-o, --optional [value]', 'An optional value')
- .parse(process.argv);
-
-console.log(' int: %j', program.integer);
-console.log(' float: %j', program.float);
-console.log(' optional: %j', program.optional);
-program.range = program.range || [];
-console.log(' range: %j..%j', program.range[0], program.range[1]);
-console.log(' list: %j', program.list);
-console.log(' args: %j', program.args);
-```
-
-## Custom help
-
- You can display arbitrary `-h, --help` information
- by listening for "--help". Commander will automatically
- exit once you are done so that the remainder of your program
- does not execute causing undesired behaviours, for example
- in the following executable "stuff" will not output when
- `--help` is used.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('../');
-
-function list(val) {
- return val.split(',').map(Number);
-}
-
-program
- .version('0.0.1')
- .option('-f, --foo', 'enable some foo')
- .option('-b, --bar', 'enable some bar')
- .option('-B, --baz', 'enable some baz');
-
-// must be before .parse() since
-// node's emit() is immediate
-
-program.on('--help', function(){
- console.log(' Examples:');
- console.log('');
- console.log(' $ custom-help --help');
- console.log(' $ custom-help -h');
- console.log('');
-});
-
-program.parse(process.argv);
-
-console.log('stuff');
-```
-
-yielding the following help output:
-
-```
-
-Usage: custom-help [options]
-
-Options:
-
- -h, --help output usage information
- -V, --version output the version number
- -f, --foo enable some foo
- -b, --bar enable some bar
- -B, --baz enable some baz
-
-Examples:
-
- $ custom-help --help
- $ custom-help -h
-
-```
-
-## .prompt(msg, fn)
-
- Single-line prompt:
-
-```js
-program.prompt('name: ', function(name){
- console.log('hi %s', name);
-});
-```
-
- Multi-line prompt:
-
-```js
-program.prompt('description:', function(name){
- console.log('hi %s', name);
-});
-```
-
- Coercion:
-
-```js
-program.prompt('Age: ', Number, function(age){
- console.log('age: %j', age);
-});
-```
-
-```js
-program.prompt('Birthdate: ', Date, function(date){
- console.log('date: %s', date);
-});
-```
-
-## .password(msg[, mask], fn)
-
-Prompt for password without echoing:
-
-```js
-program.password('Password: ', function(pass){
- console.log('got "%s"', pass);
- process.stdin.destroy();
-});
-```
-
-Prompt for password with mask char "*":
-
-```js
-program.password('Password: ', '*', function(pass){
- console.log('got "%s"', pass);
- process.stdin.destroy();
-});
-```
-
-## .confirm(msg, fn)
-
- Confirm with the given `msg`:
-
-```js
-program.confirm('continue? ', function(ok){
- console.log(' got %j', ok);
-});
-```
-
-## .choose(list, fn)
-
- Let the user choose from a `list`:
-
-```js
-var list = ['tobi', 'loki', 'jane', 'manny', 'luna'];
-
-console.log('Choose the coolest pet:');
-program.choose(list, function(i){
- console.log('you chose %d "%s"', i, list[i]);
-});
-```
-
-## Links
-
- - [API documentation](http://visionmedia.github.com/commander.js/)
- - [ascii tables](https://github.com/LearnBoost/cli-table)
- - [progress bars](https://github.com/visionmedia/node-progress)
- - [more progress bars](https://github.com/substack/node-multimeter)
- - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2011 TJ Holowaychuk &lt;tj@vision-media.ca&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/node_modules/jade/node_modules/commander/index.js b/node_modules/jade/node_modules/commander/index.js
deleted file mode 100644
index 06ec1e4bc..000000000
--- a/node_modules/jade/node_modules/commander/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-
-module.exports = require('./lib/commander'); \ No newline at end of file
diff --git a/node_modules/jade/node_modules/commander/lib/commander.js b/node_modules/jade/node_modules/commander/lib/commander.js
deleted file mode 100644
index 5ba87ebb8..000000000
--- a/node_modules/jade/node_modules/commander/lib/commander.js
+++ /dev/null
@@ -1,1026 +0,0 @@
-
-/*!
- * commander
- * Copyright(c) 2011 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter
- , path = require('path')
- , tty = require('tty')
- , basename = path.basename;
-
-/**
- * Expose the root command.
- */
-
-exports = module.exports = new Command;
-
-/**
- * Expose `Command`.
- */
-
-exports.Command = Command;
-
-/**
- * Expose `Option`.
- */
-
-exports.Option = Option;
-
-/**
- * Initialize a new `Option` with the given `flags` and `description`.
- *
- * @param {String} flags
- * @param {String} description
- * @api public
- */
-
-function Option(flags, description) {
- this.flags = flags;
- this.required = ~flags.indexOf('<');
- this.optional = ~flags.indexOf('[');
- this.bool = !~flags.indexOf('-no-');
- flags = flags.split(/[ ,|]+/);
- if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
- this.long = flags.shift();
- this.description = description;
-}
-
-/**
- * Return option name.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.name = function(){
- return this.long
- .replace('--', '')
- .replace('no-', '');
-};
-
-/**
- * Check if `arg` matches the short or long flag.
- *
- * @param {String} arg
- * @return {Boolean}
- * @api private
- */
-
-Option.prototype.is = function(arg){
- return arg == this.short
- || arg == this.long;
-};
-
-/**
- * Initialize a new `Command`.
- *
- * @param {String} name
- * @api public
- */
-
-function Command(name) {
- this.commands = [];
- this.options = [];
- this.args = [];
- this.name = name;
-}
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-
-Command.prototype.__proto__ = EventEmitter.prototype;
-
-/**
- * Add command `name`.
- *
- * The `.action()` callback is invoked when the
- * command `name` is specified via __ARGV__,
- * and the remaining arguments are applied to the
- * function for access.
- *
- * When the `name` is "*" an un-matched command
- * will be passed as the first arg, followed by
- * the rest of __ARGV__ remaining.
- *
- * Examples:
- *
- * program
- * .version('0.0.1')
- * .option('-C, --chdir <path>', 'change the working directory')
- * .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
- * .option('-T, --no-tests', 'ignore test hook')
- *
- * program
- * .command('setup')
- * .description('run remote setup commands')
- * .action(function(){
- * console.log('setup');
- * });
- *
- * program
- * .command('exec <cmd>')
- * .description('run the given remote command')
- * .action(function(cmd){
- * console.log('exec "%s"', cmd);
- * });
- *
- * program
- * .command('*')
- * .description('deploy the given env')
- * .action(function(env){
- * console.log('deploying "%s"', env);
- * });
- *
- * program.parse(process.argv);
- *
- * @param {String} name
- * @return {Command} the new command
- * @api public
- */
-
-Command.prototype.command = function(name){
- var args = name.split(/ +/);
- var cmd = new Command(args.shift());
- this.commands.push(cmd);
- cmd.parseExpectedArgs(args);
- cmd.parent = this;
- return cmd;
-};
-
-/**
- * Parse expected `args`.
- *
- * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parseExpectedArgs = function(args){
- if (!args.length) return;
- var self = this;
- args.forEach(function(arg){
- switch (arg[0]) {
- case '<':
- self.args.push({ required: true, name: arg.slice(1, -1) });
- break;
- case '[':
- self.args.push({ required: false, name: arg.slice(1, -1) });
- break;
- }
- });
- return this;
-};
-
-/**
- * Register callback `fn` for the command.
- *
- * Examples:
- *
- * program
- * .command('help')
- * .description('display verbose help')
- * .action(function(){
- * // output help here
- * });
- *
- * @param {Function} fn
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.action = function(fn){
- var self = this;
- this.parent.on(this.name, function(args, unknown){
- // Parse any so-far unknown options
- unknown = unknown || [];
- var parsed = self.parseOptions(unknown);
-
- // Output help if necessary
- outputHelpIfNecessary(self, parsed.unknown);
-
- // If there are still any unknown options, then we simply
- // die, unless someone asked for help, in which case we give it
- // to them, and then we die.
- if (parsed.unknown.length > 0) {
- self.unknownOption(parsed.unknown[0]);
- }
-
- self.args.forEach(function(arg, i){
- if (arg.required && null == args[i]) {
- self.missingArgument(arg.name);
- }
- });
-
- // Always append ourselves to the end of the arguments,
- // to make sure we match the number of arguments the user
- // expects
- if (self.args.length) {
- args[self.args.length] = self;
- } else {
- args.push(self);
- }
-
- fn.apply(this, args);
- });
- return this;
-};
-
-/**
- * Define option with `flags`, `description` and optional
- * coercion `fn`.
- *
- * The `flags` string should contain both the short and long flags,
- * separated by comma, a pipe or space. The following are all valid
- * all will output this way when `--help` is used.
- *
- * "-p, --pepper"
- * "-p|--pepper"
- * "-p --pepper"
- *
- * Examples:
- *
- * // simple boolean defaulting to false
- * program.option('-p, --pepper', 'add pepper');
- *
- * --pepper
- * program.pepper
- * // => Boolean
- *
- * // simple boolean defaulting to false
- * program.option('-C, --no-cheese', 'remove cheese');
- *
- * program.cheese
- * // => true
- *
- * --no-cheese
- * program.cheese
- * // => true
- *
- * // required argument
- * program.option('-C, --chdir <path>', 'change the working directory');
- *
- * --chdir /tmp
- * program.chdir
- * // => "/tmp"
- *
- * // optional argument
- * program.option('-c, --cheese [type]', 'add cheese [marble]');
- *
- * @param {String} flags
- * @param {String} description
- * @param {Function|Mixed} fn or default
- * @param {Mixed} defaultValue
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.option = function(flags, description, fn, defaultValue){
- var self = this
- , option = new Option(flags, description)
- , oname = option.name()
- , name = camelcase(oname);
-
- // default as 3rd arg
- if ('function' != typeof fn) defaultValue = fn, fn = null;
-
- // preassign default value only for --no-*, [optional], or <required>
- if (false == option.bool || option.optional || option.required) {
- // when --no-* we make sure default is true
- if (false == option.bool) defaultValue = true;
- // preassign only if we have a default
- if (undefined !== defaultValue) self[name] = defaultValue;
- }
-
- // register the option
- this.options.push(option);
-
- // when it's passed assign the value
- // and conditionally invoke the callback
- this.on(oname, function(val){
- // coercion
- if (null != val && fn) val = fn(val);
-
- // unassigned or bool
- if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) {
- // if no value, bool true, and we have a default, then use it!
- if (null == val) {
- self[name] = option.bool
- ? defaultValue || true
- : false;
- } else {
- self[name] = val;
- }
- } else if (null !== val) {
- // reassign
- self[name] = val;
- }
- });
-
- return this;
-};
-
-/**
- * Parse `argv`, settings options and invoking commands when defined.
- *
- * @param {Array} argv
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parse = function(argv){
- // store raw args
- this.rawArgs = argv;
-
- // guess name
- if (!this.name) this.name = basename(argv[1]);
-
- // process argv
- var parsed = this.parseOptions(this.normalize(argv.slice(2)));
- this.args = parsed.args;
- return this.parseArgs(this.args, parsed.unknown);
-};
-
-/**
- * Normalize `args`, splitting joined short flags. For example
- * the arg "-abc" is equivalent to "-a -b -c".
- *
- * @param {Array} args
- * @return {Array}
- * @api private
- */
-
-Command.prototype.normalize = function(args){
- var ret = []
- , arg;
-
- for (var i = 0, len = args.length; i < len; ++i) {
- arg = args[i];
- if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) {
- arg.slice(1).split('').forEach(function(c){
- ret.push('-' + c);
- });
- } else {
- ret.push(arg);
- }
- }
-
- return ret;
-};
-
-/**
- * Parse command `args`.
- *
- * When listener(s) are available those
- * callbacks are invoked, otherwise the "*"
- * event is emitted and those actions are invoked.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api private
- */
-
-Command.prototype.parseArgs = function(args, unknown){
- var cmds = this.commands
- , len = cmds.length
- , name;
-
- if (args.length) {
- name = args[0];
- if (this.listeners(name).length) {
- this.emit(args.shift(), args, unknown);
- } else {
- this.emit('*', args);
- }
- } else {
- outputHelpIfNecessary(this, unknown);
-
- // If there were no args and we have unknown options,
- // then they are extraneous and we need to error.
- if (unknown.length > 0) {
- this.unknownOption(unknown[0]);
- }
- }
-
- return this;
-};
-
-/**
- * Return an option matching `arg` if any.
- *
- * @param {String} arg
- * @return {Option}
- * @api private
- */
-
-Command.prototype.optionFor = function(arg){
- for (var i = 0, len = this.options.length; i < len; ++i) {
- if (this.options[i].is(arg)) {
- return this.options[i];
- }
- }
-};
-
-/**
- * Parse options from `argv` returning `argv`
- * void of these options.
- *
- * @param {Array} argv
- * @return {Array}
- * @api public
- */
-
-Command.prototype.parseOptions = function(argv){
- var args = []
- , len = argv.length
- , literal
- , option
- , arg;
-
- var unknownOptions = [];
-
- // parse options
- for (var i = 0; i < len; ++i) {
- arg = argv[i];
-
- // literal args after --
- if ('--' == arg) {
- literal = true;
- continue;
- }
-
- if (literal) {
- args.push(arg);
- continue;
- }
-
- // find matching Option
- option = this.optionFor(arg);
-
- // option is defined
- if (option) {
- // requires arg
- if (option.required) {
- arg = argv[++i];
- if (null == arg) return this.optionMissingArgument(option);
- if ('-' == arg[0]) return this.optionMissingArgument(option, arg);
- this.emit(option.name(), arg);
- // optional arg
- } else if (option.optional) {
- arg = argv[i+1];
- if (null == arg || '-' == arg[0]) {
- arg = null;
- } else {
- ++i;
- }
- this.emit(option.name(), arg);
- // bool
- } else {
- this.emit(option.name());
- }
- continue;
- }
-
- // looks like an option
- if (arg.length > 1 && '-' == arg[0]) {
- unknownOptions.push(arg);
-
- // If the next argument looks like it might be
- // an argument for this option, we pass it on.
- // If it isn't, then it'll simply be ignored
- if (argv[i+1] && '-' != argv[i+1][0]) {
- unknownOptions.push(argv[++i]);
- }
- continue;
- }
-
- // arg
- args.push(arg);
- }
-
- return { args: args, unknown: unknownOptions };
-};
-
-/**
- * Argument `name` is missing.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.missingArgument = function(name){
- console.error();
- console.error(" error: missing required argument `%s'", name);
- console.error();
- process.exit(1);
-};
-
-/**
- * `Option` is missing an argument, but received `flag` or nothing.
- *
- * @param {String} option
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.optionMissingArgument = function(option, flag){
- console.error();
- if (flag) {
- console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag);
- } else {
- console.error(" error: option `%s' argument missing", option.flags);
- }
- console.error();
- process.exit(1);
-};
-
-/**
- * Unknown option `flag`.
- *
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.unknownOption = function(flag){
- console.error();
- console.error(" error: unknown option `%s'", flag);
- console.error();
- process.exit(1);
-};
-
-/**
- * Set the program version to `str`.
- *
- * This method auto-registers the "-V, --version" flag
- * which will print the version number when passed.
- *
- * @param {String} str
- * @param {String} flags
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.version = function(str, flags){
- if (0 == arguments.length) return this._version;
- this._version = str;
- flags = flags || '-V, --version';
- this.option(flags, 'output the version number');
- this.on('version', function(){
- console.log(str);
- process.exit(0);
- });
- return this;
-};
-
-/**
- * Set the description `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.description = function(str){
- if (0 == arguments.length) return this._description;
- this._description = str;
- return this;
-};
-
-/**
- * Set / get the command usage `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.usage = function(str){
- var args = this.args.map(function(arg){
- return arg.required
- ? '<' + arg.name + '>'
- : '[' + arg.name + ']';
- });
-
- var usage = '[options'
- + (this.commands.length ? '] [command' : '')
- + ']'
- + (this.args.length ? ' ' + args : '');
- if (0 == arguments.length) return this._usage || usage;
- this._usage = str;
-
- return this;
-};
-
-/**
- * Return the largest option length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestOptionLength = function(){
- return this.options.reduce(function(max, option){
- return Math.max(max, option.flags.length);
- }, 0);
-};
-
-/**
- * Return help for options.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.optionHelp = function(){
- var width = this.largestOptionLength();
-
- // Prepend the help information
- return [pad('-h, --help', width) + ' ' + 'output usage information']
- .concat(this.options.map(function(option){
- return pad(option.flags, width)
- + ' ' + option.description;
- }))
- .join('\n');
-};
-
-/**
- * Return command help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.commandHelp = function(){
- if (!this.commands.length) return '';
- return [
- ''
- , ' Commands:'
- , ''
- , this.commands.map(function(cmd){
- var args = cmd.args.map(function(arg){
- return arg.required
- ? '<' + arg.name + '>'
- : '[' + arg.name + ']';
- }).join(' ');
-
- return cmd.name
- + (cmd.options.length
- ? ' [options]'
- : '') + ' ' + args
- + (cmd.description()
- ? '\n' + cmd.description()
- : '');
- }).join('\n\n').replace(/^/gm, ' ')
- , ''
- ].join('\n');
-};
-
-/**
- * Return program help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.helpInformation = function(){
- return [
- ''
- , ' Usage: ' + this.name + ' ' + this.usage()
- , '' + this.commandHelp()
- , ' Options:'
- , ''
- , '' + this.optionHelp().replace(/^/gm, ' ')
- , ''
- , ''
- ].join('\n');
-};
-
-/**
- * Prompt for a `Number`.
- *
- * @param {String} str
- * @param {Function} fn
- * @api private
- */
-
-Command.prototype.promptForNumber = function(str, fn){
- var self = this;
- this.promptSingleLine(str, function parseNumber(val){
- val = Number(val);
- if (isNaN(val)) return self.promptSingleLine(str + '(must be a number) ', parseNumber);
- fn(val);
- });
-};
-
-/**
- * Prompt for a `Date`.
- *
- * @param {String} str
- * @param {Function} fn
- * @api private
- */
-
-Command.prototype.promptForDate = function(str, fn){
- var self = this;
- this.promptSingleLine(str, function parseDate(val){
- val = new Date(val);
- if (isNaN(val.getTime())) return self.promptSingleLine(str + '(must be a date) ', parseDate);
- fn(val);
- });
-};
-
-/**
- * Single-line prompt.
- *
- * @param {String} str
- * @param {Function} fn
- * @api private
- */
-
-Command.prototype.promptSingleLine = function(str, fn){
- if ('function' == typeof arguments[2]) {
- return this['promptFor' + (fn.name || fn)](str, arguments[2]);
- }
-
- process.stdout.write(str);
- process.stdin.setEncoding('utf8');
- process.stdin.once('data', function(val){
- fn(val.trim());
- }).resume();
-};
-
-/**
- * Multi-line prompt.
- *
- * @param {String} str
- * @param {Function} fn
- * @api private
- */
-
-Command.prototype.promptMultiLine = function(str, fn){
- var buf = [];
- console.log(str);
- process.stdin.setEncoding('utf8');
- process.stdin.on('data', function(val){
- if ('\n' == val || '\r\n' == val) {
- process.stdin.removeAllListeners('data');
- fn(buf.join('\n'));
- } else {
- buf.push(val.trimRight());
- }
- }).resume();
-};
-
-/**
- * Prompt `str` and callback `fn(val)`
- *
- * Commander supports single-line and multi-line prompts.
- * To issue a single-line prompt simply add white-space
- * to the end of `str`, something like "name: ", whereas
- * for a multi-line prompt omit this "description:".
- *
- *
- * Examples:
- *
- * program.prompt('Username: ', function(name){
- * console.log('hi %s', name);
- * });
- *
- * program.prompt('Description:', function(desc){
- * console.log('description was "%s"', desc.trim());
- * });
- *
- * @param {String|Object} str
- * @param {Function} fn
- * @api public
- */
-
-Command.prototype.prompt = function(str, fn){
- var self = this;
-
- if ('string' == typeof str) {
- if (/ $/.test(str)) return this.promptSingleLine.apply(this, arguments);
- this.promptMultiLine(str, fn);
- } else {
- var keys = Object.keys(str)
- , obj = {};
-
- function next() {
- var key = keys.shift()
- , label = str[key];
-
- if (!key) return fn(obj);
- self.prompt(label, function(val){
- obj[key] = val;
- next();
- });
- }
-
- next();
- }
-};
-
-/**
- * Prompt for password with `str`, `mask` char and callback `fn(val)`.
- *
- * The mask string defaults to '', aka no output is
- * written while typing, you may want to use "*" etc.
- *
- * Examples:
- *
- * program.password('Password: ', function(pass){
- * console.log('got "%s"', pass);
- * process.stdin.destroy();
- * });
- *
- * program.password('Password: ', '*', function(pass){
- * console.log('got "%s"', pass);
- * process.stdin.destroy();
- * });
- *
- * @param {String} str
- * @param {String} mask
- * @param {Function} fn
- * @api public
- */
-
-Command.prototype.password = function(str, mask, fn){
- var self = this
- , buf = '';
-
- // default mask
- if ('function' == typeof mask) {
- fn = mask;
- mask = '';
- }
-
- process.stdin.resume();
- tty.setRawMode(true);
- process.stdout.write(str);
-
- // keypress
- process.stdin.on('keypress', function(c, key){
- if (key && 'enter' == key.name) {
- console.log();
- process.stdin.removeAllListeners('keypress');
- tty.setRawMode(false);
- if (!buf.trim().length) return self.password(str, mask, fn);
- fn(buf);
- return;
- }
-
- if (key && key.ctrl && 'c' == key.name) {
- console.log('%s', buf);
- process.exit();
- }
-
- process.stdout.write(mask);
- buf += c;
- }).resume();
-};
-
-/**
- * Confirmation prompt with `str` and callback `fn(bool)`
- *
- * Examples:
- *
- * program.confirm('continue? ', function(ok){
- * console.log(' got %j', ok);
- * process.stdin.destroy();
- * });
- *
- * @param {String} str
- * @param {Function} fn
- * @api public
- */
-
-
-Command.prototype.confirm = function(str, fn, verbose){
- var self = this;
- this.prompt(str, function(ok){
- if (!ok.trim()) {
- if (!verbose) str += '(yes or no) ';
- return self.confirm(str, fn, true);
- }
- fn(parseBool(ok));
- });
-};
-
-/**
- * Choice prompt with `list` of items and callback `fn(index, item)`
- *
- * Examples:
- *
- * var list = ['tobi', 'loki', 'jane', 'manny', 'luna'];
- *
- * console.log('Choose the coolest pet:');
- * program.choose(list, function(i){
- * console.log('you chose %d "%s"', i, list[i]);
- * process.stdin.destroy();
- * });
- *
- * @param {Array} list
- * @param {Number|Function} index or fn
- * @param {Function} fn
- * @api public
- */
-
-Command.prototype.choose = function(list, index, fn){
- var self = this
- , hasDefault = 'number' == typeof index;
-
- if (!hasDefault) {
- fn = index;
- index = null;
- }
-
- list.forEach(function(item, i){
- if (hasDefault && i == index) {
- console.log('* %d) %s', i + 1, item);
- } else {
- console.log(' %d) %s', i + 1, item);
- }
- });
-
- function again() {
- self.prompt(' : ', function(val){
- val = parseInt(val, 10) - 1;
- if (hasDefault && isNaN(val)) val = index;
-
- if (null == list[val]) {
- again();
- } else {
- fn(val, list[val]);
- }
- });
- }
-
- again();
-};
-
-/**
- * Camel-case the given `flag`
- *
- * @param {String} flag
- * @return {String}
- * @api private
- */
-
-function camelcase(flag) {
- return flag.split('-').reduce(function(str, word){
- return str + word[0].toUpperCase() + word.slice(1);
- });
-}
-
-/**
- * Parse a boolean `str`.
- *
- * @param {String} str
- * @return {Boolean}
- * @api private
- */
-
-function parseBool(str) {
- return /^y|yes|ok|true$/i.test(str);
-}
-
-/**
- * Pad `str` to `width`.
- *
- * @param {String} str
- * @param {Number} width
- * @return {String}
- * @api private
- */
-
-function pad(str, width) {
- var len = Math.max(0, width - str.length);
- return str + Array(len + 1).join(' ');
-}
-
-/**
- * Output help information if necessary
- *
- * @param {Command} command to output help for
- * @param {Array} array of options to search for -h or --help
- * @api private
- */
-
-function outputHelpIfNecessary(cmd, options) {
- options = options || [];
- for (var i = 0; i < options.length; i++) {
- if (options[i] == '--help' || options[i] == '-h') {
- process.stdout.write(cmd.helpInformation());
- cmd.emit('--help');
- process.exit(0);
- }
- }
-}
diff --git a/node_modules/jade/node_modules/commander/package.json b/node_modules/jade/node_modules/commander/package.json
deleted file mode 100644
index 7161a8b70..000000000
--- a/node_modules/jade/node_modules/commander/package.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "name": "commander"
- , "version": "0.6.1"
- , "description": "the complete solution for node.js command-line programs"
- , "keywords": ["command", "option", "parser", "prompt", "stdin"]
- , "author": "TJ Holowaychuk <tj@vision-media.ca>"
- , "repository": { "type": "git", "url": "https://github.com/visionmedia/commander.js.git" }
- , "dependencies": {}
- , "devDependencies": { "should": ">= 0.0.1" }
- , "scripts": { "test": "make test" }
- , "main": "index"
- , "engines": { "node": ">= 0.4.x" }
-} \ No newline at end of file
diff --git a/node_modules/jade/node_modules/mkdirp/.gitignore b/node_modules/jade/node_modules/mkdirp/.gitignore
deleted file mode 100644
index 9303c347e..000000000
--- a/node_modules/jade/node_modules/mkdirp/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules/
-npm-debug.log \ No newline at end of file
diff --git a/node_modules/jade/node_modules/mkdirp/.gitignore.orig b/node_modules/jade/node_modules/mkdirp/.gitignore.orig
deleted file mode 100644
index 9303c347e..000000000
--- a/node_modules/jade/node_modules/mkdirp/.gitignore.orig
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules/
-npm-debug.log \ No newline at end of file
diff --git a/node_modules/jade/node_modules/mkdirp/.gitignore.rej b/node_modules/jade/node_modules/mkdirp/.gitignore.rej
deleted file mode 100644
index 69244ff87..000000000
--- a/node_modules/jade/node_modules/mkdirp/.gitignore.rej
+++ /dev/null
@@ -1,5 +0,0 @@
---- /dev/null
-+++ .gitignore
-@@ -0,0 +1,2 @@
-+node_modules/
-+npm-debug.log \ No newline at end of file
diff --git a/node_modules/jade/node_modules/mkdirp/LICENSE b/node_modules/jade/node_modules/mkdirp/LICENSE
deleted file mode 100644
index 432d1aeb0..000000000
--- a/node_modules/jade/node_modules/mkdirp/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright 2010 James Halliday (mail@substack.net)
-
-This project is free software released under the MIT/X11 license:
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/node_modules/jade/node_modules/mkdirp/README.markdown b/node_modules/jade/node_modules/mkdirp/README.markdown
deleted file mode 100644
index b4dd75fdc..000000000
--- a/node_modules/jade/node_modules/mkdirp/README.markdown
+++ /dev/null
@@ -1,54 +0,0 @@
-mkdirp
-======
-
-Like `mkdir -p`, but in node.js!
-
-example
-=======
-
-pow.js
-------
- var mkdirp = require('mkdirp');
-
- mkdirp('/tmp/foo/bar/baz', function (err) {
- if (err) console.error(err)
- else console.log('pow!')
- });
-
-Output
- pow!
-
-And now /tmp/foo/bar/baz exists, huzzah!
-
-methods
-=======
-
-var mkdirp = require('mkdirp');
-
-mkdirp(dir, mode, cb)
----------------------
-
-Create a new directory and any necessary subdirectories at `dir` with octal
-permission string `mode`.
-
-If `mode` isn't specified, it defaults to `0777 & (~process.umask())`.
-
-mkdirp.sync(dir, mode)
-----------------------
-
-Synchronously create a new directory and any necessary subdirectories at `dir`
-with octal permission string `mode`.
-
-If `mode` isn't specified, it defaults to `0777 & (~process.umask())`.
-
-install
-=======
-
-With [npm](http://npmjs.org) do:
-
- npm install mkdirp
-
-license
-=======
-
-MIT/X11
diff --git a/node_modules/jade/node_modules/mkdirp/examples/pow.js b/node_modules/jade/node_modules/mkdirp/examples/pow.js
deleted file mode 100644
index e6924212e..000000000
--- a/node_modules/jade/node_modules/mkdirp/examples/pow.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var mkdirp = require('mkdirp');
-
-mkdirp('/tmp/foo/bar/baz', function (err) {
- if (err) console.error(err)
- else console.log('pow!')
-});
diff --git a/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig b/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig
deleted file mode 100644
index 774146221..000000000
--- a/node_modules/jade/node_modules/mkdirp/examples/pow.js.orig
+++ /dev/null
@@ -1,6 +0,0 @@
-var mkdirp = require('mkdirp');
-
-mkdirp('/tmp/foo/bar/baz', 0755, function (err) {
- if (err) console.error(err)
- else console.log('pow!')
-});
diff --git a/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej b/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej
deleted file mode 100644
index 81e7f4311..000000000
--- a/node_modules/jade/node_modules/mkdirp/examples/pow.js.rej
+++ /dev/null
@@ -1,19 +0,0 @@
---- examples/pow.js
-+++ examples/pow.js
-@@ -1,6 +1,15 @@
--var mkdirp = require('mkdirp').mkdirp;
-+var mkdirp = require('../').mkdirp,
-+ mkdirpSync = require('../').mkdirpSync;
-
- mkdirp('/tmp/foo/bar/baz', 0755, function (err) {
- if (err) console.error(err)
- else console.log('pow!')
- });
-+
-+try {
-+ mkdirpSync('/tmp/bar/foo/baz', 0755);
-+ console.log('double pow!');
-+}
-+catch (ex) {
-+ console.log(ex);
-+} \ No newline at end of file
diff --git a/node_modules/jade/node_modules/mkdirp/index.js b/node_modules/jade/node_modules/mkdirp/index.js
deleted file mode 100644
index 25f43adfa..000000000
--- a/node_modules/jade/node_modules/mkdirp/index.js
+++ /dev/null
@@ -1,79 +0,0 @@
-var path = require('path');
-var fs = require('fs');
-
-module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
-
-function mkdirP (p, mode, f) {
- if (typeof mode === 'function' || mode === undefined) {
- f = mode;
- mode = 0777 & (~process.umask());
- }
-
- var cb = f || function () {};
- if (typeof mode === 'string') mode = parseInt(mode, 8);
- p = path.resolve(p);
-
- fs.mkdir(p, mode, function (er) {
- if (!er) return cb();
- switch (er.code) {
- case 'ENOENT':
- mkdirP(path.dirname(p), mode, function (er) {
- if (er) cb(er);
- else mkdirP(p, mode, cb);
- });
- break;
-
- case 'EEXIST':
- fs.stat(p, function (er2, stat) {
- // if the stat fails, then that's super weird.
- // let the original EEXIST be the failure reason.
- if (er2 || !stat.isDirectory()) cb(er)
- else cb();
- });
- break;
-
- default:
- cb(er);
- break;
- }
- });
-}
-
-mkdirP.sync = function sync (p, mode) {
- if (mode === undefined) {
- mode = 0777 & (~process.umask());
- }
-
- if (typeof mode === 'string') mode = parseInt(mode, 8);
- p = path.resolve(p);
-
- try {
- fs.mkdirSync(p, mode)
- }
- catch (err0) {
- switch (err0.code) {
- case 'ENOENT' :
- var err1 = sync(path.dirname(p), mode)
- if (err1) throw err1;
- else return sync(p, mode);
- break;
-
- case 'EEXIST' :
- var stat;
- try {
- stat = fs.statSync(p);
- }
- catch (err1) {
- throw err0
- }
- if (!stat.isDirectory()) throw err0;
- else return null;
- break;
- default :
- throw err0
- break;
- }
- }
-
- return null;
-};
diff --git a/node_modules/jade/node_modules/mkdirp/package.json b/node_modules/jade/node_modules/mkdirp/package.json
deleted file mode 100644
index 1bf9ac782..000000000
--- a/node_modules/jade/node_modules/mkdirp/package.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "name" : "mkdirp",
- "description" : "Recursively mkdir, like `mkdir -p`",
- "version" : "0.3.0",
- "author" : "James Halliday <mail@substack.net> (http://substack.net)",
- "main" : "./index",
- "keywords" : [
- "mkdir",
- "directory"
- ],
- "repository" : {
- "type" : "git",
- "url" : "http://github.com/substack/node-mkdirp.git"
- },
- "scripts" : {
- "test" : "tap test/*.js"
- },
- "devDependencies" : {
- "tap" : "0.0.x"
- },
- "license" : "MIT/X11",
- "engines": { "node": "*" }
-}
diff --git a/node_modules/jade/node_modules/mkdirp/test/chmod.js b/node_modules/jade/node_modules/mkdirp/test/chmod.js
deleted file mode 100644
index 520dcb8e9..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/chmod.js
+++ /dev/null
@@ -1,38 +0,0 @@
-var mkdirp = require('../').mkdirp;
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-var ps = [ '', 'tmp' ];
-
-for (var i = 0; i < 25; i++) {
- var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- ps.push(dir);
-}
-
-var file = ps.join('/');
-
-test('chmod-pre', function (t) {
- var mode = 0744
- mkdirp(file, mode, function (er) {
- t.ifError(er, 'should not error');
- fs.stat(file, function (er, stat) {
- t.ifError(er, 'should exist');
- t.ok(stat && stat.isDirectory(), 'should be directory');
- t.equal(stat && stat.mode & 0777, mode, 'should be 0744');
- t.end();
- });
- });
-});
-
-test('chmod', function (t) {
- var mode = 0755
- mkdirp(file, mode, function (er) {
- t.ifError(er, 'should not error');
- fs.stat(file, function (er, stat) {
- t.ifError(er, 'should exist');
- t.ok(stat && stat.isDirectory(), 'should be directory');
- t.end();
- });
- });
-});
diff --git a/node_modules/jade/node_modules/mkdirp/test/clobber.js b/node_modules/jade/node_modules/mkdirp/test/clobber.js
deleted file mode 100644
index 0eb709987..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/clobber.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var mkdirp = require('../').mkdirp;
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-var ps = [ '', 'tmp' ];
-
-for (var i = 0; i < 25; i++) {
- var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- ps.push(dir);
-}
-
-var file = ps.join('/');
-
-// a file in the way
-var itw = ps.slice(0, 3).join('/');
-
-
-test('clobber-pre', function (t) {
- console.error("about to write to "+itw)
- fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.');
-
- fs.stat(itw, function (er, stat) {
- t.ifError(er)
- t.ok(stat && stat.isFile(), 'should be file')
- t.end()
- })
-})
-
-test('clobber', function (t) {
- t.plan(2);
- mkdirp(file, 0755, function (err) {
- t.ok(err);
- t.equal(err.code, 'ENOTDIR');
- t.end();
- });
-});
diff --git a/node_modules/jade/node_modules/mkdirp/test/mkdirp.js b/node_modules/jade/node_modules/mkdirp/test/mkdirp.js
deleted file mode 100644
index b07cd70c1..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/mkdirp.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('woo', function (t) {
- t.plan(2);
- var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-
- var file = '/tmp/' + [x,y,z].join('/');
-
- mkdirp(file, 0755, function (err) {
- if (err) t.fail(err);
- else path.exists(file, function (ex) {
- if (!ex) t.fail('file not created')
- else fs.stat(file, function (err, stat) {
- if (err) t.fail(err)
- else {
- t.equal(stat.mode & 0777, 0755);
- t.ok(stat.isDirectory(), 'target not a directory');
- t.end();
- }
- })
- })
- });
-});
diff --git a/node_modules/jade/node_modules/mkdirp/test/perm.js b/node_modules/jade/node_modules/mkdirp/test/perm.js
deleted file mode 100644
index 23a7abbd2..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/perm.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('async perm', function (t) {
- t.plan(2);
- var file = '/tmp/' + (Math.random() * (1<<30)).toString(16);
-
- mkdirp(file, 0755, function (err) {
- if (err) t.fail(err);
- else path.exists(file, function (ex) {
- if (!ex) t.fail('file not created')
- else fs.stat(file, function (err, stat) {
- if (err) t.fail(err)
- else {
- t.equal(stat.mode & 0777, 0755);
- t.ok(stat.isDirectory(), 'target not a directory');
- t.end();
- }
- })
- })
- });
-});
-
-test('async root perm', function (t) {
- mkdirp('/tmp', 0755, function (err) {
- if (err) t.fail(err);
- t.end();
- });
- t.end();
-});
diff --git a/node_modules/jade/node_modules/mkdirp/test/perm_sync.js b/node_modules/jade/node_modules/mkdirp/test/perm_sync.js
deleted file mode 100644
index f685f6090..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/perm_sync.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('sync perm', function (t) {
- t.plan(2);
- var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json';
-
- mkdirp.sync(file, 0755);
- path.exists(file, function (ex) {
- if (!ex) t.fail('file not created')
- else fs.stat(file, function (err, stat) {
- if (err) t.fail(err)
- else {
- t.equal(stat.mode & 0777, 0755);
- t.ok(stat.isDirectory(), 'target not a directory');
- t.end();
- }
- })
- });
-});
-
-test('sync root perm', function (t) {
- t.plan(1);
-
- var file = '/tmp';
- mkdirp.sync(file, 0755);
- path.exists(file, function (ex) {
- if (!ex) t.fail('file not created')
- else fs.stat(file, function (err, stat) {
- if (err) t.fail(err)
- else {
- t.ok(stat.isDirectory(), 'target not a directory');
- t.end();
- }
- })
- });
-});
diff --git a/node_modules/jade/node_modules/mkdirp/test/race.js b/node_modules/jade/node_modules/mkdirp/test/race.js
deleted file mode 100644
index 96a044763..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/race.js
+++ /dev/null
@@ -1,41 +0,0 @@
-var mkdirp = require('../').mkdirp;
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('race', function (t) {
- t.plan(4);
- var ps = [ '', 'tmp' ];
-
- for (var i = 0; i < 25; i++) {
- var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- ps.push(dir);
- }
- var file = ps.join('/');
-
- var res = 2;
- mk(file, function () {
- if (--res === 0) t.end();
- });
-
- mk(file, function () {
- if (--res === 0) t.end();
- });
-
- function mk (file, cb) {
- mkdirp(file, 0755, function (err) {
- if (err) t.fail(err);
- else path.exists(file, function (ex) {
- if (!ex) t.fail('file not created')
- else fs.stat(file, function (err, stat) {
- if (err) t.fail(err)
- else {
- t.equal(stat.mode & 0777, 0755);
- t.ok(stat.isDirectory(), 'target not a directory');
- if (cb) cb();
- }
- })
- })
- });
- }
-});
diff --git a/node_modules/jade/node_modules/mkdirp/test/rel.js b/node_modules/jade/node_modules/mkdirp/test/rel.js
deleted file mode 100644
index 79858243a..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/rel.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('rel', function (t) {
- t.plan(2);
- var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-
- var cwd = process.cwd();
- process.chdir('/tmp');
-
- var file = [x,y,z].join('/');
-
- mkdirp(file, 0755, function (err) {
- if (err) t.fail(err);
- else path.exists(file, function (ex) {
- if (!ex) t.fail('file not created')
- else fs.stat(file, function (err, stat) {
- if (err) t.fail(err)
- else {
- process.chdir(cwd);
- t.equal(stat.mode & 0777, 0755);
- t.ok(stat.isDirectory(), 'target not a directory');
- t.end();
- }
- })
- })
- });
-});
diff --git a/node_modules/jade/node_modules/mkdirp/test/sync.js b/node_modules/jade/node_modules/mkdirp/test/sync.js
deleted file mode 100644
index e0e389dea..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/sync.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('sync', function (t) {
- t.plan(2);
- var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-
- var file = '/tmp/' + [x,y,z].join('/');
-
- var err = mkdirp.sync(file, 0755);
- if (err) t.fail(err);
- else path.exists(file, function (ex) {
- if (!ex) t.fail('file not created')
- else fs.stat(file, function (err, stat) {
- if (err) t.fail(err)
- else {
- t.equal(stat.mode & 0777, 0755);
- t.ok(stat.isDirectory(), 'target not a directory');
- t.end();
- }
- })
- })
-});
diff --git a/node_modules/jade/node_modules/mkdirp/test/umask.js b/node_modules/jade/node_modules/mkdirp/test/umask.js
deleted file mode 100644
index 64ccafe22..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/umask.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('implicit mode from umask', function (t) {
- t.plan(2);
- var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-
- var file = '/tmp/' + [x,y,z].join('/');
-
- mkdirp(file, function (err) {
- if (err) t.fail(err);
- else path.exists(file, function (ex) {
- if (!ex) t.fail('file not created')
- else fs.stat(file, function (err, stat) {
- if (err) t.fail(err)
- else {
- t.equal(stat.mode & 0777, 0777 & (~process.umask()));
- t.ok(stat.isDirectory(), 'target not a directory');
- t.end();
- }
- })
- })
- });
-});
diff --git a/node_modules/jade/node_modules/mkdirp/test/umask_sync.js b/node_modules/jade/node_modules/mkdirp/test/umask_sync.js
deleted file mode 100644
index 83cba560f..000000000
--- a/node_modules/jade/node_modules/mkdirp/test/umask_sync.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('umask sync modes', function (t) {
- t.plan(2);
- var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
- var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-
- var file = '/tmp/' + [x,y,z].join('/');
-
- var err = mkdirp.sync(file);
- if (err) t.fail(err);
- else path.exists(file, function (ex) {
- if (!ex) t.fail('file not created')
- else fs.stat(file, function (err, stat) {
- if (err) t.fail(err)
- else {
- t.equal(stat.mode & 0777, (0777 & (~process.umask())));
- t.ok(stat.isDirectory(), 'target not a directory');
- t.end();
- }
- })
- })
-});
diff --git a/node_modules/jade/package.json b/node_modules/jade/package.json
deleted file mode 100644
index e91d8ac59..000000000
--- a/node_modules/jade/package.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "name": "jade",
- "description": "Jade template engine",
- "version": "0.26.3",
- "author": "TJ Holowaychuk <tj@vision-media.ca>",
- "repository": "git://github.com/visionmedia/jade",
- "main": "./index.js",
- "bin": { "jade": "./bin/jade" },
- "man": "./jade.1",
- "dependencies": {
- "commander": "0.6.1",
- "mkdirp": "0.3.0"
- },
- "devDependencies": {
- "mocha": "*",
- "markdown": "*",
- "stylus": "*",
- "uubench": "*",
- "should": "*",
- "less": "*",
- "uglify-js": "*"
- },
- "component": {
- "scripts": {
- "jade": "runtime.js"
- }
- },
- "scripts" : { "prepublish" : "npm prune" }
-}
diff --git a/node_modules/jade/runtime.js b/node_modules/jade/runtime.js
deleted file mode 100644
index 0f5490778..000000000
--- a/node_modules/jade/runtime.js
+++ /dev/null
@@ -1,179 +0,0 @@
-
-jade = (function(exports){
-/*!
- * Jade - runtime
- * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
- * MIT Licensed
- */
-
-/**
- * Lame Array.isArray() polyfill for now.
- */
-
-if (!Array.isArray) {
- Array.isArray = function(arr){
- return '[object Array]' == Object.prototype.toString.call(arr);
- };
-}
-
-/**
- * Lame Object.keys() polyfill for now.
- */
-
-if (!Object.keys) {
- Object.keys = function(obj){
- var arr = [];
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- arr.push(key);
- }
- }
- return arr;
- }
-}
-
-/**
- * Merge two attribute objects giving precedence
- * to values in object `b`. Classes are special-cased
- * allowing for arrays and merging/joining appropriately
- * resulting in a string.
- *
- * @param {Object} a
- * @param {Object} b
- * @return {Object} a
- * @api private
- */
-
-exports.merge = function merge(a, b) {
- var ac = a['class'];
- var bc = b['class'];
-
- if (ac || bc) {
- ac = ac || [];
- bc = bc || [];
- if (!Array.isArray(ac)) ac = [ac];
- if (!Array.isArray(bc)) bc = [bc];
- ac = ac.filter(nulls);
- bc = bc.filter(nulls);
- a['class'] = ac.concat(bc).join(' ');
- }
-
- for (var key in b) {
- if (key != 'class') {
- a[key] = b[key];
- }
- }
-
- return a;
-};
-
-/**
- * Filter null `val`s.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
-function nulls(val) {
- return val != null;
-}
-
-/**
- * Render the given attributes object.
- *
- * @param {Object} obj
- * @param {Object} escaped
- * @return {String}
- * @api private
- */
-
-exports.attrs = function attrs(obj, escaped){
- var buf = []
- , terse = obj.terse;
-
- delete obj.terse;
- var keys = Object.keys(obj)
- , len = keys.length;
-
- if (len) {
- buf.push('');
- for (var i = 0; i < len; ++i) {
- var key = keys[i]
- , val = obj[key];
-
- if ('boolean' == typeof val || null == val) {
- if (val) {
- terse
- ? buf.push(key)
- : buf.push(key + '="' + key + '"');
- }
- } else if (0 == key.indexOf('data') && 'string' != typeof val) {
- buf.push(key + "='" + JSON.stringify(val) + "'");
- } else if ('class' == key && Array.isArray(val)) {
- buf.push(key + '="' + exports.escape(val.join(' ')) + '"');
- } else if (escaped && escaped[key]) {
- buf.push(key + '="' + exports.escape(val) + '"');
- } else {
- buf.push(key + '="' + val + '"');
- }
- }
- }
-
- return buf.join(' ');
-};
-
-/**
- * Escape the given string of `html`.
- *
- * @param {String} html
- * @return {String}
- * @api private
- */
-
-exports.escape = function escape(html){
- return String(html)
- .replace(/&(?!(\w+|\#\d+);)/g, '&amp;')
- .replace(/</g, '&lt;')
- .replace(/>/g, '&gt;')
- .replace(/"/g, '&quot;');
-};
-
-/**
- * Re-throw the given `err` in context to the
- * the jade in `filename` at the given `lineno`.
- *
- * @param {Error} err
- * @param {String} filename
- * @param {String} lineno
- * @api private
- */
-
-exports.rethrow = function rethrow(err, filename, lineno){
- if (!filename) throw err;
-
- var context = 3
- , str = require('fs').readFileSync(filename, 'utf8')
- , lines = str.split('\n')
- , start = Math.max(lineno - context, 0)
- , end = Math.min(lines.length, lineno + context);
-
- // Error context
- var context = lines.slice(start, end).map(function(line, i){
- var curr = i + start + 1;
- return (curr == lineno ? ' > ' : ' ')
- + curr
- + '| '
- + line;
- }).join('\n');
-
- // Alter exception message
- err.path = filename;
- err.message = (filename || 'Jade') + ':' + lineno
- + '\n' + context + '\n\n' + err.message;
- throw err;
-};
-
- return exports;
-
-})({});
diff --git a/node_modules/jade/runtime.min.js b/node_modules/jade/runtime.min.js
deleted file mode 100644
index 1714efb00..000000000
--- a/node_modules/jade/runtime.min.js
+++ /dev/null
@@ -1 +0,0 @@
-jade=function(exports){Array.isArray||(Array.isArray=function(arr){return"[object Array]"==Object.prototype.toString.call(arr)}),Object.keys||(Object.keys=function(obj){var arr=[];for(var key in obj)obj.hasOwnProperty(key)&&arr.push(key);return arr}),exports.merge=function merge(a,b){var ac=a["class"],bc=b["class"];if(ac||bc)ac=ac||[],bc=bc||[],Array.isArray(ac)||(ac=[ac]),Array.isArray(bc)||(bc=[bc]),ac=ac.filter(nulls),bc=bc.filter(nulls),a["class"]=ac.concat(bc).join(" ");for(var key in b)key!="class"&&(a[key]=b[key]);return a};function nulls(val){return val!=null}return exports.attrs=function attrs(obj,escaped){var buf=[],terse=obj.terse;delete obj.terse;var keys=Object.keys(obj),len=keys.length;if(len){buf.push("");for(var i=0;i<len;++i){var key=keys[i],val=obj[key];"boolean"==typeof val||null==val?val&&(terse?buf.push(key):buf.push(key+'="'+key+'"')):0==key.indexOf("data")&&"string"!=typeof val?buf.push(key+"='"+JSON.stringify(val)+"'"):"class"==key&&Array.isArray(val)?buf.push(key+'="'+exports.escape(val.join(" "))+'"'):escaped&&escaped[key]?buf.push(key+'="'+exports.escape(val)+'"'):buf.push(key+'="'+val+'"')}}return buf.join(" ")},exports.escape=function escape(html){return String(html).replace(/&(?!(\w+|\#\d+);)/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")},exports.rethrow=function rethrow(err,filename,lineno){if(!filename)throw err;var context=3,str=require("fs").readFileSync(filename,"utf8"),lines=str.split("\n"),start=Math.max(lineno-context,0),end=Math.min(lines.length,lineno+context),context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" > ":" ")+curr+"| "+line}).join("\n");throw err.path=filename,err.message=(filename||"Jade")+":"+lineno+"\n"+context+"\n\n"+err.message,err},exports}({}); \ No newline at end of file
diff --git a/node_modules/jade/test.jade b/node_modules/jade/test.jade
deleted file mode 100644
index b3a898895..000000000
--- a/node_modules/jade/test.jade
+++ /dev/null
@@ -1,7 +0,0 @@
-p.
- This is a large
- body of text for
- this tag.
-
- Nothing too
- exciting. \ No newline at end of file
diff --git a/node_modules/jade/testing/head.jade b/node_modules/jade/testing/head.jade
deleted file mode 100644
index 851540622..000000000
--- a/node_modules/jade/testing/head.jade
+++ /dev/null
@@ -1,5 +0,0 @@
-head
- script(src='/jquery.js')
- yield
- if false
- script(src='/jquery.ui.js')
diff --git a/node_modules/jade/testing/index.jade b/node_modules/jade/testing/index.jade
deleted file mode 100644
index 1032c5faf..000000000
--- a/node_modules/jade/testing/index.jade
+++ /dev/null
@@ -1,22 +0,0 @@
-
-tag = 'p'
-foo = 'bar'
-
-#{tag} value
-#{tag}(foo='bar') value
-#{foo ? 'a' : 'li'}(something) here
-
-mixin item(icon)
- li
- if attributes.href
- a(attributes)
- img.icon(src=icon)
- block
- else
- span(attributes)
- img.icon(src=icon)
- block
-
-ul
- +item('contact') Contact
- +item(href='/contact') Contact
diff --git a/node_modules/jade/testing/index.js b/node_modules/jade/testing/index.js
deleted file mode 100644
index 226e8c010..000000000
--- a/node_modules/jade/testing/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var jade = require('../');
-
-jade.renderFile('testing/index.jade', { pretty: true, debug: true, compileDebug: false }, function(err, str){
- if (err) throw err;
- console.log(str);
-}); \ No newline at end of file
diff --git a/node_modules/jade/testing/layout.jade b/node_modules/jade/testing/layout.jade
deleted file mode 100644
index 6923cf15e..000000000
--- a/node_modules/jade/testing/layout.jade
+++ /dev/null
@@ -1,6 +0,0 @@
-html
- include head
- script(src='/caustic.js')
- script(src='/app.js')
- body
- block content \ No newline at end of file
diff --git a/node_modules/jade/testing/user.jade b/node_modules/jade/testing/user.jade
deleted file mode 100644
index 3c636b7c9..000000000
--- a/node_modules/jade/testing/user.jade
+++ /dev/null
@@ -1,7 +0,0 @@
-h1 Tobi
-p Is a ferret
-
-ul
- li: a foo
- li: a bar
- li: a baz \ No newline at end of file
diff --git a/node_modules/jade/testing/user.js b/node_modules/jade/testing/user.js
deleted file mode 100644
index 2ecc45eda..000000000
--- a/node_modules/jade/testing/user.js
+++ /dev/null
@@ -1,27 +0,0 @@
-function anonymous(locals, attrs, escape, rethrow) {
-var attrs = jade.attrs, escape = jade.escape, rethrow = jade.rethrow;
-var __jade = [{ lineno: 1, filename: "testing/user.jade" }];
-try {
-var buf = [];
-with (locals || {}) {
-var interp;
-__jade.unshift({ lineno: 1, filename: __jade[0].filename });
-__jade.unshift({ lineno: 1, filename: __jade[0].filename });
-buf.push('<h1>Tobi');
-__jade.unshift({ lineno: undefined, filename: __jade[0].filename });
-__jade.shift();
-buf.push('</h1>');
-__jade.shift();
-__jade.unshift({ lineno: 2, filename: __jade[0].filename });
-buf.push('<p>Is a ferret');
-__jade.unshift({ lineno: undefined, filename: __jade[0].filename });
-__jade.shift();
-buf.push('</p>');
-__jade.shift();
-__jade.shift();
-}
-return buf.join("");
-} catch (err) {
- rethrow(err, __jade[0].filename, __jade[0].lineno);
-}
-} \ No newline at end of file