Subtheme of barrio
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
3.5 KiB

2 years ago
"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;