| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | 'use strict';var colornames = require('colornames');/** * Kuler: Color text using CSS colors * * @constructor * @param {String} text The text that needs to be styled * @param {String} color Optional color for alternate API. * @api public */function Kuler(text, color) {  if (color) return (new Kuler(text)).style(color);  if (!(this instanceof Kuler)) return new Kuler(text);  this.text = text;}/** * ANSI color codes. * * @type {String} * @private */Kuler.prototype.prefix = '\x1b[';Kuler.prototype.suffix = 'm';/** * Parse a hex color string and parse it to it's RGB equiv. * * @param {String} color * @returns {Array} * @api private */Kuler.prototype.hex = function hex(color) {  color = color[0] === '#' ? color.substring(1) : color;  //  // Pre-parse for shorthand hex colors.  //  if (color.length === 3) {    color = color.split('');    color[5] = color[2]; // F60##0    color[4] = color[2]; // F60#00    color[3] = color[1]; // F60600    color[2] = color[1]; // F66600    color[1] = color[0]; // FF6600    color = color.join('');  }  var r = color.substring(0, 2)    , g = color.substring(2, 4)    , b = color.substring(4, 6);  return [ parseInt(r, 16), parseInt(g, 16), parseInt(b, 16) ];};/** * Transform a 255 RGB value to an RGV code. * * @param {Number} r Red color channel. * @param {Number} g Green color channel. * @param {Number} b Blue color channel. * @returns {String} * @api public */Kuler.prototype.rgb = function rgb(r, g, b) {  var red = r / 255 * 5    , green = g / 255 * 5    , blue = b / 255 * 5;  return this.ansi(red, green, blue);};/** * Turns RGB 0-5 values into a single ANSI code. * * @param {Number} r Red color channel. * @param {Number} g Green color channel. * @param {Number} b Blue color channel. * @returns {String} * @api public */Kuler.prototype.ansi = function ansi(r, g, b) {  var red = Math.round(r)    , green = Math.round(g)    , blue = Math.round(b);  return 16 + (red * 36) + (green * 6) + blue;};/** * Marks an end of color sequence. * * @returns {String} Reset sequence. * @api public */Kuler.prototype.reset = function reset() {  return this.prefix +'39;49'+ this.suffix;};/** * Colour the terminal using CSS. * * @param {String} color The HEX color code. * @returns {String} the escape code. * @api public */Kuler.prototype.style = function style(color) {  //  // We've been supplied a CSS color name instead of a hex color format so we  // need to transform it to proper CSS color and continue with our execution  // flow.  //  if (!/^#?(?:[0-9a-fA-F]{3}){1,2}$/.test(color)) {    color = colornames(color);  }  return this.prefix +'38;5;'+ this.rgb.apply(this, this.hex(color)) + this.suffix + this.text + this.reset();};//// Expose the actual interface.//module.exports = Kuler;
 |