270 lines
7.5 KiB
JavaScript
270 lines
7.5 KiB
JavaScript
/*
|
|
colors.js
|
|
|
|
Copyright (c) 2010
|
|
|
|
Marak Squires
|
|
Alexis Sellier (cloudhead)
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
var isHeadless = false;
|
|
|
|
if (typeof module !== 'undefined') {
|
|
isHeadless = true;
|
|
}
|
|
|
|
if (!isHeadless) {
|
|
var exports = {};
|
|
var module = {};
|
|
var colors = exports;
|
|
exports.mode = "browser";
|
|
} else {
|
|
exports.mode = "console";
|
|
}
|
|
|
|
//
|
|
// Prototypes the string object to have additional method calls that add terminal colors
|
|
//
|
|
var addProperty = function (color, func) {
|
|
var allowOverride = ['bold'];
|
|
exports[color] = function(str) {
|
|
return func.apply(str);
|
|
};
|
|
String.prototype.__defineGetter__(color, func);
|
|
}
|
|
|
|
//
|
|
// Iterate through all default styles and colors
|
|
//
|
|
|
|
var x = ['bold', 'underline', 'italic', 'inverse', 'grey', 'black', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta'];
|
|
x.forEach(function (style) {
|
|
|
|
// __defineGetter__ at the least works in more browsers
|
|
// http://robertnyman.com/javascript/javascript-getters-setters.html
|
|
// Object.defineProperty only works in Chrome
|
|
addProperty(style, function () {
|
|
return stylize(this, style);
|
|
});
|
|
});
|
|
|
|
function sequencer(map) {
|
|
return function () {
|
|
if (!isHeadless) {
|
|
return this.replace(/( )/, '$1');
|
|
}
|
|
var exploded = this.split("");
|
|
var i = 0;
|
|
exploded = exploded.map(map);
|
|
return exploded.join("");
|
|
}
|
|
}
|
|
|
|
var rainbowMap = (function () {
|
|
var rainbowColors = ['red','yellow','green','blue','magenta']; //RoY G BiV
|
|
return function (letter, i, exploded) {
|
|
if (letter == " ") {
|
|
return letter;
|
|
} else {
|
|
return stylize(letter, rainbowColors[i++ % rainbowColors.length]);
|
|
}
|
|
}
|
|
})();
|
|
|
|
exports.addSequencer = function (name, map) {
|
|
addProperty(name, sequencer(map));
|
|
}
|
|
|
|
exports.addSequencer('rainbow', rainbowMap);
|
|
exports.addSequencer('zebra', function (letter, i, exploded) {
|
|
return i % 2 === 0 ? letter : letter.inverse;
|
|
});
|
|
|
|
exports.setTheme = function (theme) {
|
|
Object.keys(theme).forEach(function(prop){
|
|
addProperty(prop, function(){
|
|
return exports[theme[prop]](this);
|
|
});
|
|
});
|
|
}
|
|
|
|
function stylize(str, style) {
|
|
|
|
if (exports.mode == 'console') {
|
|
var styles = {
|
|
//styles
|
|
'bold' : ['\033[1m', '\033[22m'],
|
|
'italic' : ['\033[3m', '\033[23m'],
|
|
'underline' : ['\033[4m', '\033[24m'],
|
|
'inverse' : ['\033[7m', '\033[27m'],
|
|
//grayscale
|
|
'white' : ['\033[37m', '\033[39m'],
|
|
'grey' : ['\033[90m', '\033[39m'],
|
|
'black' : ['\033[30m', '\033[39m'],
|
|
//colors
|
|
'blue' : ['\033[34m', '\033[39m'],
|
|
'cyan' : ['\033[36m', '\033[39m'],
|
|
'green' : ['\033[32m', '\033[39m'],
|
|
'magenta' : ['\033[35m', '\033[39m'],
|
|
'red' : ['\033[31m', '\033[39m'],
|
|
'yellow' : ['\033[33m', '\033[39m']
|
|
};
|
|
} else if (exports.mode == 'browser') {
|
|
var styles = {
|
|
//styles
|
|
'bold' : ['<b>', '</b>'],
|
|
'italic' : ['<i>', '</i>'],
|
|
'underline' : ['<u>', '</u>'],
|
|
'inverse' : ['<span style="background-color:black;color:white;">', '</span>'],
|
|
//grayscale
|
|
'white' : ['<span style="color:white;">', '</span>'],
|
|
'grey' : ['<span style="color:grey;">', '</span>'],
|
|
'black' : ['<span style="color:black;">', '</span>'],
|
|
//colors
|
|
'blue' : ['<span style="color:blue;">', '</span>'],
|
|
'cyan' : ['<span style="color:cyan;">', '</span>'],
|
|
'green' : ['<span style="color:green;">', '</span>'],
|
|
'magenta' : ['<span style="color:magenta;">', '</span>'],
|
|
'red' : ['<span style="color:red;">', '</span>'],
|
|
'yellow' : ['<span style="color:yellow;">', '</span>']
|
|
};
|
|
} else if (exports.mode == 'none') {
|
|
return str;
|
|
} else {
|
|
console.log('unsupported mode, try "browser", "console" or "none"');
|
|
}
|
|
return styles[style][0] + str + styles[style][1];
|
|
};
|
|
|
|
// don't summon zalgo
|
|
addProperty('zalgo', function () {
|
|
return zalgo(this);
|
|
});
|
|
|
|
// please no
|
|
function zalgo(text, options) {
|
|
var soul = {
|
|
"up" : [
|
|
'̍','̎','̄','̅',
|
|
'̿','̑','̆','̐',
|
|
'͒','͗','͑','̇',
|
|
'̈','̊','͂','̓',
|
|
'̈','͊','͋','͌',
|
|
'̃','̂','̌','͐',
|
|
'̀','́','̋','̏',
|
|
'̒','̓','̔','̽',
|
|
'̉','ͣ','ͤ','ͥ',
|
|
'ͦ','ͧ','ͨ','ͩ',
|
|
'ͪ','ͫ','ͬ','ͭ',
|
|
'ͮ','ͯ','̾','͛',
|
|
'͆','̚'
|
|
],
|
|
"down" : [
|
|
'̖','̗','̘','̙',
|
|
'̜','̝','̞','̟',
|
|
'̠','̤','̥','̦',
|
|
'̩','̪','̫','̬',
|
|
'̭','̮','̯','̰',
|
|
'̱','̲','̳','̹',
|
|
'̺','̻','̼','ͅ',
|
|
'͇','͈','͉','͍',
|
|
'͎','͓','͔','͕',
|
|
'͖','͙','͚','̣'
|
|
],
|
|
"mid" : [
|
|
'̕','̛','̀','́',
|
|
'͘','̡','̢','̧',
|
|
'̨','̴','̵','̶',
|
|
'͜','͝','͞',
|
|
'͟','͠','͢','̸',
|
|
'̷','͡',' ҉'
|
|
]
|
|
},
|
|
all = [].concat(soul.up, soul.down, soul.mid),
|
|
zalgo = {};
|
|
|
|
function randomNumber(range) {
|
|
r = Math.floor(Math.random()*range);
|
|
return r;
|
|
};
|
|
|
|
function is_char(character) {
|
|
var bool = false;
|
|
all.filter(function(i){
|
|
bool = (i == character);
|
|
});
|
|
return bool;
|
|
}
|
|
|
|
function heComes(text, options){
|
|
result = '';
|
|
options = options || {};
|
|
options["up"] = options["up"] || true;
|
|
options["mid"] = options["mid"] || true;
|
|
options["down"] = options["down"] || true;
|
|
options["size"] = options["size"] || "maxi";
|
|
var counts;
|
|
text = text.split('');
|
|
for(var l in text){
|
|
if(is_char(l)) { continue; }
|
|
result = result + text[l];
|
|
|
|
counts = {"up" : 0, "down" : 0, "mid" : 0};
|
|
|
|
switch(options.size) {
|
|
case 'mini':
|
|
counts.up = randomNumber(8);
|
|
counts.min= randomNumber(2);
|
|
counts.down = randomNumber(8);
|
|
break;
|
|
case 'maxi':
|
|
counts.up = randomNumber(16) + 3;
|
|
counts.min = randomNumber(4) + 1;
|
|
counts.down = randomNumber(64) + 3;
|
|
break;
|
|
default:
|
|
counts.up = randomNumber(8) + 1;
|
|
counts.mid = randomNumber(6) / 2;
|
|
counts.down= randomNumber(8) + 1;
|
|
break;
|
|
}
|
|
|
|
var arr = ["up", "mid", "down"];
|
|
for(var d in arr){
|
|
var index = arr[d];
|
|
for (var i = 0 ; i <= counts[index]; i++)
|
|
{
|
|
if(options[index]) {
|
|
result = result + soul[index][randomNumber(soul[index].length)];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
return heComes(text);
|
|
}
|
|
|
|
addProperty('stripColors', function() {
|
|
return ("" + this).replace(/\u001b\[\d+m/g,'');
|
|
});
|