1. JavaScript / Говнокод #5635

    +154

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    // Parse strings looking for color tuples [255,255,255]
    function getRGB(color) {
      var result;
      if (color && isArray(color) && color.length == 3)
        return color;
      if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
        return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];
      if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
        return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
      if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
        return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
      if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
        return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
    }

    Запостил: InstantI, 11 Февраля 2011

    Комментарии (5) RSS

    • > result[1]+result[1]
      > result[3]+result[2]
      > result[3]+result[3]

      лолшто?
      Ответить
      • Все правильно, там строки складываются, очевидно предполагалось, что формат будет таким: #XXX, где X - /[\da-f]/i. Регулярные выражения написаны коряво (без использования сокращений), а так ничего особенного...
        Другое дело, что можно было сначала привести все варианты к чисельному виду, а потом преобразовать в массив с тремя элементами...
        Ответить
    • Взято из JS ядра ВКонтакте.
      Ответить
    • От безделия и скуки по поводу наступающих выходных родился следующий альтернативный вариант (боже упаси вас так делать!).
      function testParseColor(color)
      {
      	color = color.replace(/[\r\n\s]+/g, "");
      	var rgb;
      	color.replace(/rgb\((\d+%?),(\d+%?),(\d+%?)\)|#([\da-f]+)/gi,
      	function()
      	{
      		var error = "Wrong input format";
      		var numString;
      		var component;
      		if (arguments[4])
      		{
      			numString = String(arguments[4]);
      			if (numString.length == 3)
      			{
      				rgb = parseInt(numString, 0x10);
      				rgb = rgb | ((rgb >>> 8) << 24) | ((rgb >>> 8) << 20);
      				rgb = rgb | (((rgb & 0xF0) >>> 4) << 16) | (((rgb & 0xF0) >>> 4) << 12);
      				rgb = rgb | ((rgb & 0xF) << 8) | (rgb & 0xF);
      			}
      			else if (numString.length == 6) rgb = parseInt(numString, 0x10);
      			else throw error;
      		}
      		else if (arguments[1] && arguments[2] && arguments[3])
      		{
      			for (var i = 1; i < 4; i++)
      			{
      				numString = arguments[i];
      				component = parseFloat(numString);
      				if (numString.indexOf("%") > -1)
      					rgb |= ((component * 2.25) << ((3 - i) * 8));
      				else  rgb |= (component << ((3 - i) * 8));
      			}
      		}
      		else throw error;
      		return arguments[0];
      	});
      	return [rgb >>> 16, (rgb >>> 8) & 0xFF, grb & 0xFF];
      }
      Ответить
      • Кхм... альтернативный... Да, это слово уместно.
        Ответить

    Добавить комментарий