Skip to content

Commit

Permalink
Added client-side support
Browse files Browse the repository at this point in the history
via:

   $ make jade.js
   $ make jade.min.js
  • Loading branch information
tj committed Mar 16, 2011
1 parent 6763ce2 commit 04204b1
Show file tree
Hide file tree
Showing 5 changed files with 174 additions and 2 deletions.
2 changes: 2 additions & 0 deletions .gitignore
@@ -1,3 +1,5 @@
.DS_Store
lib-cov
testing
jade.js
jade.min.js
14 changes: 13 additions & 1 deletion Makefile
@@ -1,5 +1,7 @@

TESTS = test/*.js
SRC = $(shell find lib -name "*.js" -type f)
UGLIFY_FLAGS = --no-mangle

test:
@./support/expresso/bin/expresso \
Expand All @@ -15,4 +17,14 @@ benchmark:
node benchmarks/haml2.js && \
node benchmarks/ejs.js

.PHONY: test benchmark
jade.js: $(SRC)
@node support/compile.js $^

jade.min.js: jade.js
@uglifyjs $(UGLIFY_FLAGS) $< > $@

clean:
rm -f jade.js
rm -f jade.min.js

.PHONY: test benchmark clean
2 changes: 1 addition & 1 deletion Readme.md
Expand Up @@ -6,7 +6,7 @@

## Features

- high performance parser
- client-side support
- great readability
- flexible indentation
- block-expansion
Expand Down
2 changes: 2 additions & 0 deletions lib/jade.js
Expand Up @@ -11,7 +11,9 @@

var Parser = require('./parser')
, Compiler = require('./compiler')
// if node
, fs = require('fs');
// end

/**
* Library version.
Expand Down
156 changes: 156 additions & 0 deletions support/compile.js
@@ -0,0 +1,156 @@

/**
* Module dependencies.
*/

var fs = require('fs');

/**
* Arguments.
*/

var args = process.argv.slice(2)
, pending = args.length
, files = {};

// note about uglify

console.log('');
console.log(' compiling jade.js');
console.log('');
console.log(' NOTE: to compile jade.min.js first `$ npm install uglify-js`');
console.log(' and then execute `$ make jade.min.js`.');
console.log('');

// parse arguments

args.forEach(function(file){
var mod = file.replace('lib/', '');
fs.readFile(file, 'utf8', function(err, js){
if (err) throw err;
console.log(' \033[90mcompile : \033[0m\033[36m%s\033[0m', file);
files[file] = parse(js);
--pending || compile();
});
});

/**
* Parse the given `js`, currently supporting:.
*
* 'if' ['node' | 'browser']
* 'end'
*
*/

function parse(js) {
var lines = js.split('\n')
, len = lines.length
, buffer = true
, buf = []
, line
, cond;

for (var i = 0; i < len; ++i) {
line = lines[i];
if (/^\/\/ *if *(node|browser)/gm.exec(line)) {
cond = RegExp.$1;
buffer = 'browser' == cond;
} else if (/^\/\/ *end/.test(line)) {
buffer = true;
} else if (buffer) {
buf.push(line);
}
}

return buf.join('\n');
}

/**
* Compile the files.
*/

function compile() {
var buf = '';
buf += '\n// CommonJS require()\n\n';
buf += browser.require + '\n\n';
buf += 'require.modules = {};\n\n';
buf += 'require.resolve = ' + browser.resolve + ';\n\n';
buf += 'require.register = ' + browser.register + ';\n\n';
buf += 'require.relative = ' + browser.relative + ';\n\n';
args.forEach(function(file){
var js = files[file];
file = file.replace('lib/', '');
buf += '\nrequire.register("' + file + '", function(module, exports, require){\n';
buf += js;
buf += '\n}); // module: ' + file + '\n';
});
fs.writeFile('jade.js', buf, function(err){
if (err) throw err;
console.log(' \033[90m create : \033[0m\033[36m%s\033[0m', 'jade.js');
console.log();
});
}

// refactored version of weepy's
// https://github.com/weepy/brequire/blob/master/browser/brequire.js

var browser = {

/**
* Require a module.
*/

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;
},

/**
* Resolve module path.
*/

resolve: function(path){
var orig = path
, reg = path + '.js'
, index = path + '/index.js';
return require.modules[reg] && reg
|| require.modules[index] && index
|| orig;
},

/**
* Return relative require().
*/

relative: function(parent) {
return function(p){
if ('.' != p[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('/'));
};
},

/**
* Register a module.
*/

register: function(path, fn){
require.modules[path] = fn;
}
};

0 comments on commit 04204b1

Please sign in to comment.