iustoet
Version:
Ansi codes, figlet fonts, and ascii art. 100% JS
140 lines (130 loc) • 4.39 kB
JavaScript
(function (root, factory) { // UMD - returnExports
if (typeof define === 'function' && define.amd) {
define(['./ascii-art'], factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('./ascii-art'));
} else {
root.chalk = factory(function(){
return root.AsciiArtImage;
}, root.fs);
}
}(this, function(art) {
var map = {
reset : 'reset',
bold : 'bold',
dim : 'dim',
italic : 'italic',
underline : 'underline',
inverse : 'inverse',
hidden : 'hidden',
strikethrough : 'strikethrough',
black : 'black',
red : 'red',
green : 'green',
yellow : 'yellow',
blue : 'blue',
magenta : 'magenta',
cyan : 'cyan',
white : 'white',
gray : 'gray',
grey : 'gray',
bgBlack : 'black_bg',
bgRed : 'red_bg',
bgGreen : 'green_bg',
bgYellow : 'yellow_bg',
bgBlue : 'blue_bg',
bgMagenta : 'magenta_bg',
bgCyan : 'cyan_bg',
bgWhite : 'white_bg'
}
var colorNames = ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'gray', 'grey'];
var envClose = {
bold : '22',
dim : '22',
italic : '23',
underline : '24',
blink : '25',
framed : '54',
encircled : '54',
strikethrough : '29',
overlined : '53',
black : '39',
red : '39',
green : '39',
yellow : '39',
blue : '39',
magenta : '39',
cyan : '39',
white : '39',
gray : '39',
grey : '39',
bright_black : '39',
bright_red : '39',
bright_green : '39',
bright_yellow : '39',
bright_blue : '39',
bright_magenta : '39',
bright_cyan : '39',
bright_white : '39',
bright_gray : '39',
bright_grey : '39',
black_bg : '49',
red_bg : '49',
green_bg : '49',
yellow_bg : '49',
blue_bg : '49',
magenta_bg : '49',
cyan_bg : '49',
white_bg : '49'
}
var stack = [];
function makeClosers(parts){
var closer = '';
parts.reverse().forEach(function(part){
if(envClose[part]) closer += '\u001b['+envClose[part]+'m';
});
return closer;
}
var defaultMarker = '\u001b[39m';
function context(parent, key){
var arr = parent?parent.slice(0):[];
var ctx = function(arg){
stack.push(key);
var text = arguments.length === 1?arg+'':Array.prototype.slice.apply(arguments, [0]).join(' ');
if(arr.length == 1 && arr.indexOf('reset') !== -1) return '\u001b[0m'+text+'\u001b[0m';
if(!text) return text;
// in a radical depature from convention, ascii-art only uses openers and resets
// the result is more uniform output (especially on graphics)
// we implement closers here for symmetry with chalk / colors.js
var result = art.style(text, arr.join('+'))+makeClosers(arr);
var parents = stack.slice(0);
var index;
while(result.indexOf(defaultMarker) !== -1 && parents.length && result.indexOf(defaultMarker) !== result.lastIndexOf(defaultMarker)){
var env = map[parents.pop()];
var marker = art.style('', env);
var index = result.indexOf(defaultMarker);
if(index !== -1){
result = result.slice(0, index)+marker+result.slice(index+defaultMarker.length);
}
}
if(result.indexOf("\n") !== -1){
result = result.replace("\n", defaultMarker+"\n"+'\u001b[90m')
}
stack.pop(key);
return result;
};
Object.keys(map).forEach(function(key){
Object.defineProperty(ctx, key, {
get: function() {
var sub = arr.slice(0);
sub.push(map[key]);
return new context(sub, key);
},
enumerable: true,
configurable: false
});
});
return ctx;
}
return new context();
}));