ractiveify
Version:
A ractive component/template browserify transform which allows for embedded transpilable languages for javascript or css (like livescript, coffeescript, and scss!).
139 lines (138 loc) • 4.38 kB
JavaScript
// Generated by LiveScript 1.3.1
(function(){
var through, tosource, Ractive, livescript, coffeescript, parseAndCompile, ractiveify, x$;
through = require('through');
tosource = require('tosource');
Ractive = require('ractive');
livescript = require(__dirname + '/compilers/livescript.js');
coffeescript = require(__dirname + '/compilers/coffeescript.js');
parseAndCompile = function(file, data, cb){
var parsed, links, scripts, styles, template, i, item, style, source, script, imports, res$, i$, len$, ref$, name, href, css, compiled, error;
try {
parsed = Ractive.parse(data, {
noStringify: true,
interpolate: {
script: false,
style: false
}
});
links = [];
scripts = [];
styles = [];
template = parsed.t;
i = template.length;
while (i--) {
item = template[i];
if (!(item && item.t === 7)) {
continue;
}
switch (item.e) {
case 'link':
if (item.a && item.a.rel === 'ractive') {
links.push(template.splice(i, 1)[0]);
}
break;
case 'style':
if (!item.a || !item.a.type) {
styles.push(template.splice(i, 1)[0]);
} else if (item.a.type === 'text/css') {
styles.push(template.splice(i, 1)[0]);
} else if (item.a.type in ractiveify.compilers) {
style = template.splice(i, 1)[0];
source = style.f[0];
style.f[0] = ractiveify.compilers[item.a.type](file, source);
styles.push(style);
} else if (ractiveify.removeUnsupported) {
template.splice(i, 1)[0];
}
break;
case 'script':
if (!item.a || !item.a.type) {
scripts.push(template.splice(i, 1)[0]);
} else if (item.a.type === 'text/javascript') {
scripts.push(template.splice(i, 1)[0]);
} else if (item.a.type in ractiveify.compilers) {
script = template.splice(i, 1)[0];
source = script.f[0];
script.f[0] = ractiveify.compilers[item.a.type](file, source);
scripts.push(script);
} else if (ractiveify.removeUnsupported) {
template.splice(i, 1)[0];
}
}
}
res$ = [];
for (i$ = 0, len$ = links.length; i$ < len$; ++i$) {
ref$ = links[i$].a, name = ref$.name, href = ref$.href;
res$.push({
name: name,
href: href
});
}
imports = res$;
script = (function(){
var i$, x$, ref$, len$, results$ = [];
for (i$ = 0, len$ = (ref$ = scripts).length; i$ < len$; ++i$) {
x$ = ref$[i$];
results$.push(x$.f);
}
return results$;
}()).join(';');
css = (function(){
var i$, x$, ref$, len$, results$ = [];
for (i$ = 0, len$ = (ref$ = styles).length; i$ < len$; ++i$) {
x$ = ref$[i$];
results$.push(x$.f);
}
return results$;
}()).join(' ');
compiled = "var component = module;\n\n";
compiled += script;
if (parsed) {
compiled += "\n\ncomponent.exports.template = " + tosource(parsed);
}
if (css) {
compiled += "\n\ncomponent.exports.css = " + tosource(css);
}
return cb(null, compiled);
} catch (e$) {
error = e$;
return cb(error);
}
};
ractiveify = function(file){
var data, pattern, regex, stream;
data = "";
pattern = "\\.(" + ractiveify.extensions.join("|") + ")$";
regex = new RegExp(pattern);
if (!regex.test(file)) {
return through();
}
stream = through(write, end);
return stream;
function write(buf){
data += buf;
}
function end(){
parseAndCompile(file, data, function(error, result){
if (error) {
stream.emit("error", error);
}
stream.queue(result);
stream.queue(null);
});
}
};
x$ = ractiveify;
x$.parse = parseAndCompile;
x$.extensions = ['ract', 'rtv'];
x$.removeUnsupported = true;
x$.compilers = {
"text/livescript": livescript,
"text/ls": livescript,
"text/coffeescript": coffeescript,
"text/coffee": coffeescript,
"text/coffee-script": coffeescript
};
module.exports = ractiveify;
}).call(this);