index.js
2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
'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;