jsbin/public/js/processors/processor.js
2012-06-21 12:50:34 +01:00

110 lines
2.5 KiB
JavaScript

var Processor = function (url, init, handler) {
if (typeof handler === 'undefined') {
handler = init;
init = null;
}
$.getScript(url, function () {
if (init) init();
callback = handler;
});
var callback = function () {
console.warn('Processor is not ready yet');
return '';
};
return function () {
return callback.apply(this, arguments);
};
};
var processors = jsbin.processors = {
coffeescript: function () {
if (!jsbin.settings.processors) {
jsbin.settings.processors = {};
}
jsbin.settings.processors.javascript = 'coffeescript';
var html = jsbin.panels.panels.html.getCode();
if (html.indexOf('coffee-script.js') === -1) {
// force select the traceur in the client HTML
$('#library').val( $('#library').find(':contains("CoffeeScript")').val() ).trigger('change');
}
return function (source) { return source; };
},
jade: function () {
return new Processor(jsbin.root + '/js/vendor/jade.js', function () {
// init and expose jade
window.jade = require('jade');
}, function (source) {
return jade.compile(source, { pretty: true })();
});
},
less: function () {
return new Processor(jsbin.root + '/js/vendor/less-1.3.0.min.js', function (source) {
var css = '';
less.Parser().parse(source, function (err, result) {
if (err) {
console.error(err);
return;
}
css = $.trim(result.toCSS());
});
return css;
});
},
stylus: function () {
return new Processor(jsbin.root + '/js/vendor/stylus.js', function (source) {
var css = '';
stylus(source).render(function (err, result) {
if (err) {
console.error(err);
return;
}
css = $.trim(result);
});
return css;
});
},
traceur: function () {
if (!jsbin.settings.processors) {
jsbin.settings.processors = {};
}
jsbin.settings.processors.javascript = 'traceur';
// force select the traceur in the client HTML
$('#library').val( $('#library').find(':contains("Traceur")').val() ).trigger('change');
return function (source) { return source; };
}
};
processors.set = function (panel, preprocessor) {
if (jsbin.panels.panels[panel]) {
if (preprocessor && processors[preprocessor]) {
jsbin.panels.panels[panel].processor = processors[preprocessor]();
} else {
// remove the preprocessor
jsbin.panels.panels[panel].processor = function (source) {
return source;
};
}
}
};