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.
172 lines
3.5 KiB
172 lines
3.5 KiB
"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;
|
|
|