111 lines
3.2 KiB
JavaScript
111 lines
3.2 KiB
JavaScript
var colors = require('./colors');
|
|
|
|
module['exports'] = function() {
|
|
//
|
|
// Extends prototype of native string object to allow for "foo".red syntax
|
|
//
|
|
var addProperty = function(color, func) {
|
|
String.prototype.__defineGetter__(color, func);
|
|
};
|
|
|
|
addProperty('strip', function() {
|
|
return colors.strip(this);
|
|
});
|
|
|
|
addProperty('stripColors', function() {
|
|
return colors.strip(this);
|
|
});
|
|
|
|
addProperty('trap', function() {
|
|
return colors.trap(this);
|
|
});
|
|
|
|
addProperty('zalgo', function() {
|
|
return colors.zalgo(this);
|
|
});
|
|
|
|
addProperty('zebra', function() {
|
|
return colors.zebra(this);
|
|
});
|
|
|
|
addProperty('rainbow', function() {
|
|
return colors.rainbow(this);
|
|
});
|
|
|
|
addProperty('random', function() {
|
|
return colors.random(this);
|
|
});
|
|
|
|
addProperty('america', function() {
|
|
return colors.america(this);
|
|
});
|
|
|
|
//
|
|
// Iterate through all default styles and colors
|
|
//
|
|
var x = Object.keys(colors.styles);
|
|
x.forEach(function(style) {
|
|
addProperty(style, function() {
|
|
return colors.stylize(this, style);
|
|
});
|
|
});
|
|
|
|
function applyTheme(theme) {
|
|
//
|
|
// Remark: This is a list of methods that exist
|
|
// on String that you should not overwrite.
|
|
//
|
|
var stringPrototypeBlacklist = [
|
|
'__defineGetter__', '__defineSetter__', '__lookupGetter__',
|
|
'__lookupSetter__', 'charAt', 'constructor', 'hasOwnProperty',
|
|
'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString',
|
|
'valueOf', 'charCodeAt', 'indexOf', 'lastIndexOf', 'length',
|
|
'localeCompare', 'match', 'repeat', 'replace', 'search', 'slice',
|
|
'split', 'substring', 'toLocaleLowerCase', 'toLocaleUpperCase',
|
|
'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight',
|
|
];
|
|
|
|
Object.keys(theme).forEach(function(prop) {
|
|
if (stringPrototypeBlacklist.indexOf(prop) !== -1) {
|
|
console.log('warn: '.red + ('String.prototype' + prop).magenta +
|
|
' is probably something you don\'t want to override. ' +
|
|
'Ignoring style name');
|
|
} else {
|
|
if (typeof(theme[prop]) === 'string') {
|
|
colors[prop] = colors[theme[prop]];
|
|
addProperty(prop, function() {
|
|
return colors[prop](this);
|
|
});
|
|
} else {
|
|
var themePropApplicator = function(str) {
|
|
var ret = str || this;
|
|
for (var t = 0; t < theme[prop].length; t++) {
|
|
ret = colors[theme[prop][t]](ret);
|
|
}
|
|
return ret;
|
|
};
|
|
addProperty(prop, themePropApplicator);
|
|
colors[prop] = function(str) {
|
|
return themePropApplicator(str);
|
|
};
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
colors.setTheme = function(theme) {
|
|
if (typeof theme === 'string') {
|
|
console.log('colors.setTheme now only accepts an object, not a string. ' +
|
|
'If you are trying to set a theme from a file, it is now your (the ' +
|
|
'caller\'s) responsibility to require the file. The old syntax ' +
|
|
'looked like colors.setTheme(__dirname + ' +
|
|
'\'/../themes/generic-logging.js\'); The new syntax looks like '+
|
|
'colors.setTheme(require(__dirname + ' +
|
|
'\'/../themes/generic-logging.js\'));');
|
|
return;
|
|
} else {
|
|
applyTheme(theme);
|
|
}
|
|
};
|
|
};
|