-#include "html.h"\r
-#include "web_color.h"\r
-#include <string.h>\r
-\r
-litehtml::def_color litehtml::g_def_colors[] = \r
-{\r
- {_t("transparent"),_t("rgba(0, 0, 0, 0)")},\r
- {_t("AliceBlue"),_t("#F0F8FF")},\r
- {_t("AntiqueWhite"),_t("#FAEBD7")},\r
- {_t("Aqua"),_t("#00FFFF")},\r
- {_t("Aquamarine"),_t("#7FFFD4")},\r
- {_t("Azure"),_t("#F0FFFF")},\r
- {_t("Beige"),_t("#F5F5DC")},\r
- {_t("Bisque"),_t("#FFE4C4")},\r
- {_t("Black"),_t("#000000")},\r
- {_t("BlanchedAlmond"),_t("#FFEBCD")},\r
- {_t("Blue"),_t("#0000FF")},\r
- {_t("BlueViolet"),_t("#8A2BE2")},\r
- {_t("Brown"),_t("#A52A2A")},\r
- {_t("BurlyWood"),_t("#DEB887")},\r
- {_t("CadetBlue"),_t("#5F9EA0")},\r
- {_t("Chartreuse"),_t("#7FFF00")},\r
- {_t("Chocolate"),_t("#D2691E")},\r
- {_t("Coral"),_t("#FF7F50")},\r
- {_t("CornflowerBlue"),_t("#6495ED")},\r
+#include "html.h"
+#include "web_color.h"
+#include <string.h>
+
+litehtml::def_color litehtml::g_def_colors[] =
+{
+ {_t("transparent"),_t("rgba(0, 0, 0, 0)")},
+ {_t("AliceBlue"),_t("#F0F8FF")},
+ {_t("AntiqueWhite"),_t("#FAEBD7")},
+ {_t("Aqua"),_t("#00FFFF")},
+ {_t("Aquamarine"),_t("#7FFFD4")},
+ {_t("Azure"),_t("#F0FFFF")},
+ {_t("Beige"),_t("#F5F5DC")},
+ {_t("Bisque"),_t("#FFE4C4")},
+ {_t("Black"),_t("#000000")},
+ {_t("BlanchedAlmond"),_t("#FFEBCD")},
+ {_t("Blue"),_t("#0000FF")},
+ {_t("BlueViolet"),_t("#8A2BE2")},
+ {_t("Brown"),_t("#A52A2A")},
+ {_t("BurlyWood"),_t("#DEB887")},
+ {_t("CadetBlue"),_t("#5F9EA0")},
+ {_t("Chartreuse"),_t("#7FFF00")},
+ {_t("Chocolate"),_t("#D2691E")},
+ {_t("Coral"),_t("#FF7F50")},
+ {_t("CornflowerBlue"),_t("#6495ED")},
{_t("Cornsilk"),_t("#FFF8DC")},
{_t("Crimson"),_t("#DC143C")},
{_t("Cyan"),_t("#00FFFF")},
{_t("White"),_t("#FFFFFF")},
{_t("WhiteSmoke"),_t("#F5F5F5")},
{_t("Yellow"),_t("#FFFF00")},
- {_t("YellowGreen"),_t("#9ACD32")},\r
- {0,0}\r
-};\r
-\r
-\r
-litehtml::web_color litehtml::web_color::from_string( const tchar_t* str )\r
-{\r
- if(!str)\r
- {\r
- return web_color(0, 0, 0);\r
- }\r
- if(str[0] == _t('#'))\r
- {\r
- tstring red = _t("");\r
- tstring green = _t("");\r
- tstring blue = _t("");\r
- if(t_strlen(str + 1) == 3)\r
- {\r
- red += str[1];\r
- red += str[1];\r
- green += str[2];\r
- green += str[2];\r
- blue += str[3];\r
- blue += str[3];\r
- } else if(t_strlen(str + 1) == 6)\r
- {\r
- red += str[1];\r
- red += str[2];\r
- green += str[3];\r
- green += str[4];\r
- blue += str[5];\r
- blue += str[6];\r
- }\r
- tchar_t* sss = 0;\r
- web_color clr;\r
- clr.red = (byte) t_strtol(red.c_str(), &sss, 16);\r
- clr.green = (byte) t_strtol(green.c_str(), &sss, 16);\r
- clr.blue = (byte) t_strtol(blue.c_str(), &sss, 16);\r
- return clr;\r
- } else if(!t_strncmp(str, _t("rgb"), 3))\r
- {\r
- tstring s = str;\r
-\r
- tstring::size_type pos = s.find_first_of(_t("("));\r
- if(pos != tstring::npos)\r
- {\r
- s.erase(s.begin(), s.begin() + pos + 1);\r
- }\r
- pos = s.find_last_of(_t(")"));\r
- if(pos != tstring::npos)\r
- {\r
- s.erase(s.begin() + pos, s.end());\r
- }\r
-\r
- std::vector<tstring> tokens;\r
- split_string(s, tokens, _t(", \t"));\r
-\r
- web_color clr;\r
-\r
- if(tokens.size() >= 1) clr.red = (byte) t_atoi(tokens[0].c_str());\r
- if(tokens.size() >= 2) clr.green = (byte) t_atoi(tokens[1].c_str());\r
- if(tokens.size() >= 3) clr.blue = (byte) t_atoi(tokens[2].c_str());\r
- if(tokens.size() >= 4) clr.alpha = (byte) (t_strtod(tokens[3].c_str(), 0) * 255.0);\r
-\r
- return clr;\r
- } else\r
- {\r
- const tchar_t* rgb = resolve_name(str);\r
- if(rgb)\r
- {\r
- return from_string(rgb);\r
- }\r
- }\r
- return web_color(0, 0, 0);\r
-}\r
-\r
-const litehtml::tchar_t* litehtml::web_color::resolve_name( const tchar_t* name )\r
-{\r
- for(int i=0; g_def_colors[i].name; i++)\r
- {\r
- if(!t_strcasecmp(name, g_def_colors[i].name))\r
- {\r
- return g_def_colors[i].rgb;\r
- }\r
- }\r
- return 0;\r
-}\r
-\r
-bool litehtml::web_color::is_color( const tchar_t* str )\r
-{\r
- if(!t_strncasecmp(str, _t("rgb"), 3) || str[0] == _t('#'))\r
- {\r
- return true;\r
- }\r
- if(resolve_name(str))\r
- {\r
- return true;\r
- }\r
- return false;\r
-}\r
+ {_t("YellowGreen"),_t("#9ACD32")},
+ {0,0}
+};
+
+
+litehtml::web_color litehtml::web_color::from_string(const tchar_t* str, litehtml::document_container* callback)
+{
+ if(!str || !str[0])
+ {
+ return web_color(0, 0, 0);
+ }
+ if(str[0] == _t('#'))
+ {
+ tstring red = _t("");
+ tstring green = _t("");
+ tstring blue = _t("");
+ if(t_strlen(str + 1) == 3)
+ {
+ red += str[1];
+ red += str[1];
+ green += str[2];
+ green += str[2];
+ blue += str[3];
+ blue += str[3];
+ } else if(t_strlen(str + 1) == 6)
+ {
+ red += str[1];
+ red += str[2];
+ green += str[3];
+ green += str[4];
+ blue += str[5];
+ blue += str[6];
+ }
+ tchar_t* sss = 0;
+ web_color clr;
+ clr.red = (byte) t_strtol(red.c_str(), &sss, 16);
+ clr.green = (byte) t_strtol(green.c_str(), &sss, 16);
+ clr.blue = (byte) t_strtol(blue.c_str(), &sss, 16);
+ return clr;
+ } else if(!t_strncmp(str, _t("rgb"), 3))
+ {
+ tstring s = str;
+
+ tstring::size_type pos = s.find_first_of(_t("("));
+ if(pos != tstring::npos)
+ {
+ s.erase(s.begin(), s.begin() + pos + 1);
+ }
+ pos = s.find_last_of(_t(")"));
+ if(pos != tstring::npos)
+ {
+ s.erase(s.begin() + pos, s.end());
+ }
+
+ std::vector<tstring> tokens;
+ split_string(s, tokens, _t(", \t"));
+
+ web_color clr;
+
+ if(tokens.size() >= 1) clr.red = (byte) t_atoi(tokens[0].c_str());
+ if(tokens.size() >= 2) clr.green = (byte) t_atoi(tokens[1].c_str());
+ if(tokens.size() >= 3) clr.blue = (byte) t_atoi(tokens[2].c_str());
+ if(tokens.size() >= 4) clr.alpha = (byte) (t_strtod(tokens[3].c_str(), 0) * 255.0);
+
+ return clr;
+ } else
+ {
+ tstring rgb = resolve_name(str, callback);
+ if(!rgb.empty())
+ {
+ return from_string(rgb.c_str(), callback);
+ }
+ }
+ return web_color(0, 0, 0);
+}
+
+litehtml::tstring litehtml::web_color::resolve_name(const tchar_t* name, litehtml::document_container* callback)
+{
+ for(int i=0; g_def_colors[i].name; i++)
+ {
+ if(!t_strcasecmp(name, g_def_colors[i].name))
+ {
+ return std::move(litehtml::tstring(g_def_colors[i].rgb));
+ }
+ }
+ if (callback)
+ {
+ litehtml::tstring clr = callback->resolve_color(name);
+ return std::move(clr);
+ }
+ return std::move(litehtml::tstring());
+}
+
+bool litehtml::web_color::is_color(const tchar_t* str)
+{
+ if(!t_strncasecmp(str, _t("rgb"), 3) || str[0] == _t('#'))
+ {
+ return true;
+ }
+ if (!t_isdigit(str[0]) && str[0] != _t('.'))
+ {
+ return true;
+ }
+ return false;
+}