Hex Parser

By Vaer Last update Feb 1, 2009 — Installed 61 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0

There are 6 previous versions of this script.

// ==UserScript==
// @name Hex Parser
// @author Veridis
// @namespace http://www.veridis.com/HexParser
// @description Parses the page for Hex values and colours them
// @license Creative Commons Attribution License
// @version 1.3
// @include *
// @released 2009-01-31
// @compatible Greasemonkey
// ==/UserScript==

//unsafeWindow = window;
//start = new Date().getTime();

Object.create = function (o) {
	function F() {}
	F.prototype = o;
	return new F();
};

color = function(){
	
	var _name = 'black',
		_hex = '#000000',
		_red = 0,
		_green = 0,
		_blue = 0,
		colorNames = {
			'f0f8ff': 'aliceblue',
			'faebd7': 'antiquewhite',
			'00ffff': 'aqua',
			'7fffd4': 'aquamarine',
			'f0ffff': 'azure',
			'f5f5dc': 'beige',
			'ffe4c4': 'bisque',
			'000000': 'black',
			'ffebcd': 'blanchedalmond',
			'0000ff': 'blue',
			'8a2be2': 'blueviolet',
			'a52a2a': 'brown',
			'deb887': 'burlywood',
			'5f9ea0': 'cadetblue',
			'7fff00': 'chartreuse',
			'd2691e': 'chocolate',
			'ff7f50': 'coral',
			'6495ed': 'cornflowerblue',
			'fff8dc': 'cornsilk',
			'dc143c': 'crimson',
			'00ffff': 'cyan',
			'00008b': 'darkblue',
			'008b8b': 'darkcyan',
			'b8860b': 'darkgoldenrod',
			'a9a9a9': 'darkgray',
			'006400': 'darkgreen',
			'a9a9a9': 'darkgrey',
			'bdb76b': 'darkkhaki',
			'8b008b': 'darkmagenta',
			'556b2f': 'darkolivegreen',
			'ff8c00': 'darkorange',
			'9932cc': 'darkorchid',
			'8b0000': 'darkred',
			'e9967a': 'darksalmon',
			'8fbc8f': 'darkseagreen',
			'483d8b': 'darkslateblue',
			'2f4f4f': 'darkslategray',
			'2f4f4f': 'darkslategrey',
			'00ced1': 'darkturquoise',
			'9400d3': 'darkviolet',
			'ff1493': 'deeppink',
			'00bfff': 'deepskyblue',
			'696969': 'dimgray',
			'696969': 'dimgrey',
			'1e90ff': 'dodgerblue',
			'b22222': 'firebrick',
			'fffaf0': 'floralwhite',
			'228b22': 'forestgreen',
			'ff00ff': 'fuchsia',
			'dcdcdc': 'gainsboro',
			'f8f8ff': 'ghostwhite',
			'ffd700': 'gold',
			'daa520': 'goldenrod',
			'808080': 'gray',
			'008000': 'green',
			'adff2f': 'greenyellow',
			'808080': 'grey',
			'f0fff0': 'honeydew',
			'ff69b4': 'hotpink',
			'cd5c5c': 'indianred',
			'4b0082': 'indigo',
			'fffff0': 'ivory',
			'f0e68c': 'khaki',
			'e6e6fa': 'lavender',
			'fff0f5': 'lavenderblush',
			'7cfc00': 'lawngreen',
			'fffacd': 'lemonchiffon',
			'add8e6': 'lightblue',
			'f08080': 'lightcoral',
			'e0ffff': 'lightcyan',
			'fafad2': 'lightgoldenrodyellow',
			'd3d3d3': 'lightgray',
			'90ee90': 'lightgreen',
			'd3d3d3': 'lightgrey',
			'ffb6c1': 'lightpink',
			'ffa07a': 'lightsalmon',
			'20b2aa': 'lightseagreen',
			'87cefa': 'lightskyblue',
			'778899': 'lightslategray',
			'778899': 'lightslategrey',
			'b0c4de': 'lightsteelblue',
			'ffffe0': 'lightyellow',
			'00ff00': 'lime',
			'32cd32': 'limegreen',
			'faf0e6': 'linen',
			'ff00ff': 'magenta',
			'800000': 'maroon',
			'66cdaa': 'mediumaquamarine',
			'0000cd': 'mediumblue',
			'ba55d3': 'mediumorchid',
			'9370db': 'mediumpurple',
			'3cb371': 'mediumseagreen',
			'7b68ee': 'mediumslateblue',
			'00fa9a': 'mediumspringgreen',
			'48d1cc': 'mediumturquoise',
			'c71585': 'mediumvioletred',
			'191970': 'midnightblue',
			'f5fffa': 'mintcream',
			'ffe4e1': 'mistyrose',
			'ffe4b5': 'moccasin',
			'ffdead': 'navajowhite',
			'000080': 'navy',
			'fdf5e6': 'oldlace',
			'808000': 'olive',
			'6b8e23': 'olivedrab',
			'ffa500': 'orange',
			'ff4500': 'orangered',
			'da70d6': 'orchid',
			'eee8aa': 'palegoldenrod',
			'98fb98': 'palegreen',
			'afeeee': 'paleturquoise',
			'db7093': 'palevioletred',
			'ffefd5': 'papayawhip',
			'ffdab9': 'peachpuff',
			'cd853f': 'peru',
			'ffc0cb': 'pink',
			'dda0dd': 'plum',
			'b0e0e6': 'powderblue',
			'800080': 'purple',
			'ff0000': 'red',
			'bc8f8f': 'rosybrown',
			'4169e1': 'royalblue',
			'8b4513': 'saddlebrown',
			'fa8072': 'salmon',
			'f4a460': 'sandybrown',
			'2e8b57': 'seagreen',
			'fff5ee': 'seashell',
			'a0522d': 'sienna',
			'c0c0c0': 'silver',
			'87ceeb': 'skyblue',
			'6a5acd': 'slateblue',
			'708090': 'slategray',
			'fffafa': 'snow',
			'00ff7f': 'springgreen',
			'4682b4': 'steelblue',
			'd2b48c': 'tan',
			'008080': 'teal',
			'd8bfd8': 'thistle',
			'ff6347': 'tomato',
			'40e0d0': 'turquoise',
			'ee82ee': 'violet',
			'f5deb3': 'wheat',
			'ffffff': 'white',
			'f5f5f5': 'whitesmoke',
			'ffff00': 'yellow',
			'9acd32': 'yellowgreen'
		};
	
	var hexFromRGB = function(rgb) {
		var hex = [
			rgb[0].toString(16),
			rgb[1].toString(16),
			rgb[2].toString(16)
		];
		for (h in hex) {
			if (hex[h].length == 1) {
				hex[h] = '0' + hex[h];
			}
		}
		
		return '#' + hex.join('').toUpperCase();
	};
	
	var hexFromColorName = function(colorName) {
		for (hex in colorNames) {
			if (colorNames[hex] === colorName) {
				return '#' + hex;
			}
		}
	};
	
	var RGBFromHex = function(hex) {
		hex = hex.substr(1);
		
		return [
			parseInt(hex.substr(0, 2),16),
			parseInt(hex.substr(2, 2),16),
			parseInt(hex.substr(4, 2),16)
		];
	};

	var colorNameFromHex = function(hex) {
		return colorNames[hex.substr(1)] | hex;
	};
	
	var parseHex = function(hex) {
		hex = hex.toUpperCase();
		if(hex.length === 4){
			return '#' + hex[1] + hex[1] + hex[2] + hex[2] + hex[3] + hex[3];
		}
		return hex;
	};

	
	return {
		name: function( name ){
			if ( !name ) {
				return _name;
			}
			_name = name;
			_hex = hexFromColorName(_name);
			[_red, _green, _blue] = RGBFromHex(_hex);
			return this;
		},
		hex: function( hex ){
			if ( !hex ) {
				return _hex;
			}
			_hex = parseHex(hex);
			_name = colorNameFromHex(_hex);
			[_red, _green, _blue] = RGBFromHex(_hex);
			return this;
		},
		red: function( red ){
			if ( !red ) {
				return _red;
			}
			_red = parseInt(red,10);
			_hex = hexFromRGB([_red,_green,_blue]);
			_name = colorNameFromHex(_hex);
			return this;
		},
		green: function( green ){
			if ( !green ) {
				return _green;
			}
			_green = parseInt(green,10);
			_hex = hexFromRGB([_red,_green,_blue]);
			_name = colorNameFromHex(_hex);
			return this;
		},
		blue: function( blue ){
			if ( !blue ) {
				return _blue;
			}
			_blue = parseInt(blue,10);
			_hex = hexFromRGB([_red,_green,_blue]);
			_name = colorNameFromHex(_hex);
			return this;
		},
		rgb: function( rgb ){
			if ( !rgb ) {
				return [_red, _green, _blue];
			}
			_hex = hexFromRGB(rgb);
			_name = colorNameFromHex(_hex);
			[_red, _green, _blue] = rgb;
			return this;
		},
		blackWhite: function( threshold ){
			
			var grey = (_red + _green + _blue) / 3;
			if ( grey > (threshold|0x7F) ){
				this.hex('#FFFFFF');
			}
			else {
				this.hex('#000000');
			}
			return this;
		},
		invert: function(){
		
			this.rgb([
				0xff - _red,
				0xff - _green,
				0xff - _blue
			]);
			
			return this;
		}
	}
}();

parseTextNode = function(textNode) {
	var match = re(textNode.data);
		
	if (match === null) {
		return;
	}
	
	var rightTextNode = textNode.splitText(match.index);
	
	var hexValue = rightTextNode.data.substr(0,match[0].length),
		hexColor = Object.create(color).hex( hexValue ),
		span = document.createElement('span');
	
	span.innerHTML = hexValue;
	span.style.backgroundColor = hexColor.hex();
	span.style.color = hexColor.invert().blackWhite().hex();
	span.className = 'hex';
	
	rightTextNode.parentNode.insertBefore(span, rightTextNode);
	rightTextNode.data = rightTextNode.data.substr(match[0].length);
	delete span, hexValue, hexColor;//does this help? it might.
	parseTextNode(rightTextNode);
}

var elems = Array.prototype.slice.call(document.body.getElementsByTagName('*')),
	re = /#([\da-f]{3})([\da-f]{3})?/i,
	elem,
	child;
	
while (elem = elems.shift()) {
	var children = Array.prototype.slice.call(elem.childNodes);
	while (child = children.shift()) {
		if (
			child.nodeType === unsafeWindow.Node.TEXT_NODE 
			&& child.parentNode.className !== 'hex'
			&& child.parentNode.nodeName !== 'TEXTAREA'
			&& child.parentNode.nodeName !== 'SCRIPT'
			&& child.parentNode.nodeName !== 'STYLE' 
		) {
			parseTextNode(child);
		}
	}
}


//end = new Date().getTime() - start;