| 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); |
| } |
| }; |
| }; |