Permalink
Browse files

Provide closest basic color when xterm not supported

  • Loading branch information...
medikoo committed Aug 29, 2012
1 parent fa5429c commit 6570093e32fbf6367cc658d3cb5403029a9ada4e
Showing with 106 additions and 3 deletions.
  1. +89 −0 lib/_xterm-match.js
  2. +8 −3 lib/index.js
  3. +9 −0 test/_xterm-match.js
View
@@ -0,0 +1,89 @@
+'use strict';
+
+var push = Array.prototype.push, reduce = Array.prototype.reduce, abs = Math.abs
+ , colors, match, result, i;
+
+colors = [
+ "000000", "800000", "008000", "808000", "000080", "800080", "008080", "c0c0c0",
+ "808080", "ff0000", "00ff00", "ffff00", "0000ff", "ff00ff", "00ffff", "ffffff",
+
+ "000000", "00005f", "000087", "0000af", "0000d7", "0000ff",
+ "005f00", "005f5f", "005f87", "005faf", "005fd7", "005fff",
+ "008700", "00875f", "008787", "0087af", "0087d7", "0087ff",
+ "00af00", "00af5f", "00af87", "00afaf", "00afd7", "00afff",
+ "00d700", "00d75f", "00d787", "00d7af", "00d7d7", "00d7ff",
+ "00ff00", "00ff5f", "00ff87", "00ffaf", "00ffd7", "00ffff",
+
+ "5f0000", "5f005f", "5f0087", "5f00af", "5f00d7", "5f00ff",
+ "5f5f00", "5f5f5f", "5f5f87", "5f5faf", "5f5fd7", "5f5fff",
+ "5f8700", "5f875f", "5f8787", "5f87af", "5f87d7", "5f87ff",
+ "5faf00", "5faf5f", "5faf87", "5fafaf", "5fafd7", "5fafff",
+ "5fd700", "5fd75f", "5fd787", "5fd7af", "5fd7d7", "5fd7ff",
+ "5fff00", "5fff5f", "5fff87", "5fffaf", "5fffd7", "5fffff",
+
+ "870000", "87005f", "870087", "8700af", "8700d7", "8700ff",
+ "875f00", "875f5f", "875f87", "875faf", "875fd7", "875fff",
+ "878700", "87875f", "878787", "8787af", "8787d7", "8787ff",
+ "87af00", "87af5f", "87af87", "87afaf", "87afd7", "87afff",
+ "87d700", "87d75f", "87d787", "87d7af", "87d7d7", "87d7ff",
+ "87ff00", "87ff5f", "87ff87", "87ffaf", "87ffd7", "87ffff",
+
+ "af0000", "af005f", "af0087", "af00af", "af00d7", "af00ff",
+ "af5f00", "af5f5f", "af5f87", "af5faf", "af5fd7", "af5fff",
+ "af8700", "af875f", "af8787", "af87af", "af87d7", "af87ff",
+ "afaf00", "afaf5f", "afaf87", "afafaf", "afafd7", "afafff",
+ "afd700", "afd75f", "afd787", "afd7af", "afd7d7", "afd7ff",
+ "afff00", "afff5f", "afff87", "afffaf", "afffd7", "afffff",
+
+ "d70000", "d7005f", "d70087", "d700af", "d700d7", "d700ff",
+ "d75f00", "d75f5f", "d75f87", "d75faf", "d75fd7", "d75fff",
+ "d78700", "d7875f", "d78787", "d787af", "d787d7", "d787ff",
+ "d7af00", "d7af5f", "d7af87", "d7afaf", "d7afd7", "d7afff",
+ "d7d700", "d7d75f", "d7d787", "d7d7af", "d7d7d7", "d7d7ff",
+ "d7ff00", "d7ff5f", "d7ff87", "d7ffaf", "d7ffd7", "d7ffff",
+
+ "ff0000", "ff005f", "ff0087", "ff00af", "ff00d7", "ff00ff",
+ "ff5f00", "ff5f5f", "ff5f87", "ff5faf", "ff5fd7", "ff5fff",
+ "ff8700", "ff875f", "ff8787", "ff87af", "ff87d7", "ff87ff",
+ "ffaf00", "ffaf5f", "ffaf87", "ffafaf", "ffafd7", "ffafff",
+ "ffd700", "ffd75f", "ffd787", "ffd7af", "ffd7d7", "ffd7ff",
+ "ffff00", "ffff5f", "ffff87", "ffffaf", "ffffd7", "ffffff",
+
+ "080808", "121212", "1c1c1c", "262626", "303030", "3a3a3a",
+ "444444", "4e4e4e", "585858", "606060", "666666", "767676",
+ "808080", "8a8a8a", "949494", "9e9e9e", "a8a8a8", "b2b2b2",
+ "bcbcbc", "c6c6c6", "d0d0d0", "dadada", "e4e4e4", "eeeeee"
+].map(function (color) {
+ return {
+ r: parseInt(color.slice(0, 2), 16),
+ g: parseInt(color.slice(2, 4), 16),
+ b: parseInt(color.slice(4), 16)
+ };
+});
+
+match = colors.slice(0, 16);
+
+module.exports = result = [];
+
+i = 0;
+while (i < 8) {
+ result.push(30 + i++);
+}
+i = 0;
+while (i < 8) {
+ result.push(90 + i++);
+}
+push.apply(result, colors.slice(16).map(function (data) {
+ var index, diff = Infinity;
+ match.every(function (match, i) {
+ var ndiff = reduce.call('rgb', function (diff, channel) {
+ return diff += abs(match[channel] - data[channel]);
+ }, 0);
+ if (ndiff < diff) {
+ index = i;
+ diff = ndiff;
+ }
+ return ndiff;
+ });
+ return result[index];
+}));
View
@@ -9,7 +9,7 @@ var d = require('es5-ext/lib/Object/descriptor')
, abs = Math.abs, floor = Math.floor, max = Math.max, min = Math.min
, round = Math.round
- , toString, codes, properties, init, color, getMove, rgb, hex;
+ , toString, codes, properties, init, color, getMove, rgb, hex, xtermMatch;
toString = function (code, str) {
return '\x1b[' + code[0] + 'm' + (str || "") + '\x1b[' + code[1] + 'm';
@@ -49,6 +49,10 @@ properties.bgBright = d.gs('ce', function () {
return this;
});
+if (process.platform === 'win32') {
+ xtermMatch = require('./_xterm-match');
+}
+
color = function (n) {
return round((isNaN(n) ? 0 : max(min(n, 255), 0)) / 255 * 5);
};
@@ -76,12 +80,13 @@ properties.hex = d('cew', hex(38));
properties.bgHex = d('cew', hex(48));
properties.xterm = d('cew', function (code) {
code = isNaN(code) ? 255 : min(max(code, 0), 255);
- this.style.push(['38;5;' + code, 39]);
+ this.style.push([xtermMatch ? xtermMatch[code] : ('38;5;' + code), 39]);
return this;
});
properties.bgXterm = d('cew', function (code) {
code = isNaN(code) ? 255 : min(max(code, 0), 255);
- this.style.push(['48;5;' + code, 49]);
+ this.style.push([xtermMatch ? (xtermMatch[code] + 10) : ('48;5;' + code),
+ 49]);
return this;
});
View
@@ -0,0 +1,9 @@
+'use strict';
+
+module.exports = function (t, a) {
+ a(t.length, 256, "Length");
+ t.forEach(function (data, index) {
+ a(((data >= 30) && (data <= 37)) || ((data >= 90) && (data <= 97)), true,
+ "In range #" + index);
+ });
+};

0 comments on commit 6570093

Please sign in to comment.