jashkenas--coffeescript/lib/coffee_script/coffee-script.js

112 lines
3.6 KiB
JavaScript
Raw Normal View History

2010-01-30 03:51:51 +00:00
(function(){
var compiler, lexer, parser, path;
2010-02-13 21:23:03 +00:00
// Set up for both the browser and the server.
if ((typeof process !== "undefined" && process !== null)) {
process.mixin(require('./nodes'));
path = require('path');
lexer = new (require('./lexer').Lexer)();
parser = require('./parser').parser;
} else {
this.exports = this;
lexer = new Lexer();
parser = exports.parser;
}
// Thin wrapper for Jison compatibility around the real lexer.
parser.lexer = {
lex: function lex() {
var token;
token = this.tokens[this.pos] || [""];
this.pos += 1;
this.yylineno = token[2];
this.yytext = token[1];
return token[0];
},
setInput: function setInput(tokens) {
this.tokens = tokens;
return this.pos = 0;
},
upcomingInput: function upcomingInput() {
return "";
},
showPosition: function showPosition() {
return this.pos;
}
};
2010-02-13 21:23:03 +00:00
// Improved error messages.
// parser.parseError: (message, hash) ->
// throw new Error 'Unexpected ' + parser.terminals_[hash.token] + ' on line ' + hash.line
exports.VERSION = '0.5.0';
// Compile CoffeeScript to JavaScript, using the Coffee/Jison compiler.
exports.compile = function compile(code, options) {
return (parser.parse(lexer.tokenize(code))).compile(options);
2010-02-11 07:39:57 +00:00
};
// Just the tokens.
exports.tokenize = function tokenize(code) {
return lexer.tokenize(code);
};
// Just the nodes.
exports.tree = function tree(code) {
return parser.parse(lexer.tokenize(code));
};
// Pretty-print a token stream.
exports.print_tokens = function print_tokens(tokens) {
var _a, _b, _c, strings, token;
strings = (function() {
_a = []; _b = tokens;
for (_c = 0; _c < _b.length; _c++) {
token = _b[_c];
_a.push('[' + token[0] + ' ' + token[1].toString().replace(/\n/, '\\n') + ']');
}
return _a;
}).call(this);
return puts(strings.join(' '));
};
//---------- Below this line is obsolete, for the Ruby compiler. ----------------
// The path to the CoffeeScript executable.
compiler = function compiler() {
return path.normalize(path.dirname(__filename) + '/../../bin/coffee');
};
// Compile a string over stdin, with global variables, for the REPL.
exports.ruby_compile = function ruby_compile(code, callback) {
2010-01-30 03:51:51 +00:00
var coffee, js;
js = '';
coffee = process.createChildProcess(compiler(), ['--eval', '--no-wrap', '--globals']);
2010-01-30 03:51:51 +00:00
coffee.addListener('output', function(results) {
if ((typeof results !== "undefined" && results !== null)) {
return js += results;
}
});
coffee.addListener('exit', function() {
return callback(js);
});
coffee.write(code);
return coffee.close();
};
// Compile a list of CoffeeScript files on disk.
exports.ruby_compile_files = function ruby_compile_files(paths, callback) {
var coffee, exit_ran, js;
js = '';
coffee = process.createChildProcess(compiler(), ['--print'].concat(paths));
coffee.addListener('output', function(results) {
if ((typeof results !== "undefined" && results !== null)) {
return js += results;
}
});
// NB: we have to add a mutex to make sure it doesn't get called twice.
exit_ran = false;
coffee.addListener('exit', function() {
if (exit_ran) {
return null;
}
exit_ran = true;
return callback(js);
});
return coffee.addListener('error', function(message) {
if (!(message)) {
return null;
}
puts(message);
throw new Error("CoffeeScript compile error");
});
};
2010-01-30 03:51:51 +00:00
})();