mirror of
				https://github.com/flynx/colors.js.git
				synced 2025-10-31 12:00:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			231 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| colors.js
 | |
| 
 | |
| Copyright (c) 2010 Alexis Sellier (cloudhead) , Marak Squires
 | |
| 
 | |
| 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.
 | |
| 
 | |
| */
 | |
| 
 | |
| exports.mode = "console";
 | |
| 
 | |
| // prototypes the string object to have additional method calls that add terminal colors
 | |
| 
 | |
| var addProperty = function (color, func) {
 | |
|   exports[color] = function(str) {
 | |
|     return func.apply(str);
 | |
|   };
 | |
|   String.prototype.__defineGetter__(color, func);
 | |
| }
 | |
| 
 | |
| var isHeadless = (typeof module !== 'undefined');
 | |
| ['bold', 'underline', 'italic', 'inverse', 'grey', 'black', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta'].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 isHeadless ?
 | |
|              stylize(this, style) : // for those running in node (headless environments)
 | |
|              this.replace(/( )/, '$1'); // and for those running in browsers:
 | |
|              // re: ^ you'd think 'return this' works (but doesn't) so replace coerces the string to be a real string
 | |
|   });
 | |
| });
 | |
| 
 | |
| // prototypes string with method "rainbow"
 | |
| // rainbow will apply a the color spectrum to a string, changing colors every letter
 | |
| addProperty('rainbow', function () {
 | |
|   if (!isHeadless) {
 | |
|     return this.replace(/( )/, '$1');
 | |
|   }
 | |
|   var rainbowcolors = ['red','yellow','green','blue','magenta']; //RoY G BiV
 | |
|   var exploded = this.split("");
 | |
|   var i=0;
 | |
|   exploded = exploded.map(function(letter) {
 | |
|     if (letter==" ") {
 | |
|       return letter;
 | |
|     }
 | |
|     else {
 | |
|       return stylize(letter,rainbowcolors[i++ % rainbowcolors.length]);
 | |
|     }
 | |
|   });
 | |
|   return exploded.join("");
 | |
| });
 | |
| 
 | |
| 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,'');
 | |
| });
 |