173 lines
3.5 KiB
JavaScript
173 lines
3.5 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
var chalk = require("chalk");
|
||
|
var parser = require("./lib/parser");
|
||
|
var dlv = require("dlv");
|
||
|
|
||
|
/**
|
||
|
* Stateless compiler.
|
||
|
* @param {String} string
|
||
|
* @param {Object} [custom] - Any custom methods
|
||
|
* @param {Object} [opts] - Options
|
||
|
* @returns {String}
|
||
|
*/
|
||
|
function compile(string, custom, opts) {
|
||
|
opts = opts || {};
|
||
|
return parseAst(createAst(parser, string), custom, function (err) {
|
||
|
if (err) {
|
||
|
if (opts.logErrors) {
|
||
|
console.log(err.msg);
|
||
|
}
|
||
|
if (opts.failOnError) {
|
||
|
throw Error(err.msg);
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param parser
|
||
|
* @param string
|
||
|
* @returns {*}
|
||
|
*/
|
||
|
function createAst(parser, string) {
|
||
|
return parser.parse(string);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param ast
|
||
|
* @param custom
|
||
|
* @param {Function} cb
|
||
|
*/
|
||
|
function parseAst(ast, custom, cb) {
|
||
|
|
||
|
var colors = [];
|
||
|
|
||
|
return ast.reduce(function (joined, item) {
|
||
|
|
||
|
var fn;
|
||
|
|
||
|
if (item.color) {
|
||
|
if (item.text) {
|
||
|
if (fn = resolveFun(item.color, custom)) {
|
||
|
colors.push(fn);
|
||
|
return joined + fn(item.text);
|
||
|
} else {
|
||
|
cb({
|
||
|
msg: "Method does not exist: " + item.color
|
||
|
});
|
||
|
return joined + item.text;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (item.buffer) {
|
||
|
return colors.length
|
||
|
? joined + colors[colors.length-1](item.buffer)
|
||
|
: joined + item.buffer;
|
||
|
}
|
||
|
|
||
|
if (item.reset) {
|
||
|
colors.pop();
|
||
|
if (item.text) {
|
||
|
return colors.length
|
||
|
? joined + colors[colors.length-1](item.text)
|
||
|
: joined + item.text;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return joined;
|
||
|
|
||
|
}, "");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param path
|
||
|
* @param custom
|
||
|
* @returns {*}
|
||
|
*/
|
||
|
function resolveFun(path, custom) {
|
||
|
|
||
|
var fn;
|
||
|
if (fn = getFun(custom, path)) {
|
||
|
return fn.bind({compile:compile});
|
||
|
}
|
||
|
|
||
|
return getFun(chalk, path);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a function from an object
|
||
|
*/
|
||
|
function getFun(obj, path) {
|
||
|
|
||
|
if (!obj) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return dlv(obj, path);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param {Object} [opts]
|
||
|
* @param {Object} custom
|
||
|
* @returns {Compiler}
|
||
|
*/
|
||
|
function Compiler(custom, opts) {
|
||
|
|
||
|
opts = opts || {};
|
||
|
custom = custom || {};
|
||
|
|
||
|
this.prefix = "";
|
||
|
|
||
|
if (typeof opts.prefix === "string") {
|
||
|
this.prefix = compile(opts.prefix, custom, opts);
|
||
|
}
|
||
|
|
||
|
if (typeof opts.prefix === "function") {
|
||
|
this.prefix = opts.prefix;
|
||
|
}
|
||
|
|
||
|
this.compile = function (string, noPrefix) {
|
||
|
|
||
|
var out = "";
|
||
|
|
||
|
if (!noPrefix) {
|
||
|
|
||
|
if (typeof this.prefix === "function") {
|
||
|
out = this.prefix.apply({compile: compile}, [string, opts]);
|
||
|
} else {
|
||
|
out = this.prefix;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return out + compile(string, custom, opts);
|
||
|
|
||
|
};
|
||
|
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
module.exports = compile;
|
||
|
module.exports.parse = function (string) {
|
||
|
return createAst(parser, string);
|
||
|
};
|
||
|
module.exports.clean = function (string) {
|
||
|
var ast = createAst(parser, string);
|
||
|
return ast.reduce(function (joined, item) {
|
||
|
if (item.color) {
|
||
|
if (item.text) {
|
||
|
return joined + item.text;
|
||
|
}
|
||
|
}
|
||
|
if (item.buffer) {
|
||
|
return joined + item.buffer;
|
||
|
}
|
||
|
if (item.reset) {
|
||
|
return joined + item.text;
|
||
|
}
|
||
|
return joined;
|
||
|
}, "");
|
||
|
};
|
||
|
module.exports.Compiler = Compiler;
|