Initial commit of litehtml_viewer
[claws.git] / src / plugins / litehtml_viewer / litehtml / html.cpp
1 #include "html.h"\r
2 #include "types.h"\r
3 #include "html_tag.h"\r
4 \r
5 void litehtml::trim(tstring &s) \r
6 {\r
7         tstring::size_type pos = s.find_first_not_of(_t(" \n\r\t"));\r
8         if(pos != tstring::npos)\r
9         {\r
10                 s.erase(s.begin(), s.begin() + pos);\r
11         }\r
12         pos = s.find_last_not_of(_t(" \n\r\t"));\r
13         if(pos != tstring::npos)\r
14         {\r
15                 s.erase(s.begin() + pos + 1, s.end());\r
16         }\r
17 }\r
18 \r
19 void litehtml::lcase(tstring &s) \r
20 {\r
21         for(tstring::iterator i = s.begin(); i != s.end(); i++)\r
22         {\r
23                 (*i) = t_tolower(*i);\r
24         }\r
25 }\r
26 \r
27 litehtml::tstring::size_type litehtml::find_close_bracket(const tstring &s, tstring::size_type off, tchar_t open_b, tchar_t close_b)\r
28 {\r
29         int cnt = 0;\r
30         for(tstring::size_type i = off; i < s.length(); i++)\r
31         {\r
32                 if(s[i] == open_b)\r
33                 {\r
34                         cnt++;\r
35                 } else if(s[i] == close_b)\r
36                 {\r
37                         cnt--;\r
38                         if(!cnt)\r
39                         {\r
40                                 return i;\r
41                         }\r
42                 }\r
43         }\r
44         return tstring::npos;\r
45 }\r
46 \r
47 int litehtml::value_index( const tstring& val, const tstring& strings, int defValue, tchar_t delim )\r
48 {\r
49         if(val.empty() || strings.empty() || !delim)\r
50         {\r
51                 return defValue;\r
52         }\r
53 \r
54         int idx = 0;\r
55         tstring::size_type delim_start  = 0;\r
56         tstring::size_type delim_end    = strings.find(delim, delim_start);\r
57         tstring::size_type item_len             = 0;\r
58         while(true)\r
59         {\r
60                 if(delim_end == tstring::npos)\r
61                 {\r
62                         item_len = strings.length() - delim_start;\r
63                 } else\r
64                 {\r
65                         item_len = delim_end - delim_start;\r
66                 }\r
67                 if(item_len == val.length())\r
68                 {\r
69                         if(val == strings.substr(delim_start, item_len))\r
70                         {\r
71                                 return idx;\r
72                         }\r
73                 }\r
74                 idx++;\r
75                 delim_start = delim_end;\r
76                 if(delim_start == tstring::npos) break;\r
77                 delim_start++;\r
78                 if(delim_start == strings.length()) break;\r
79                 delim_end = strings.find(delim, delim_start);\r
80         }\r
81         return defValue;\r
82 }\r
83 \r
84 bool litehtml::value_in_list( const tstring& val, const tstring& strings, tchar_t delim )\r
85 {\r
86         int idx = value_index(val, strings, -1, delim);\r
87         if(idx >= 0)\r
88         {\r
89                 return true;\r
90         }\r
91         return false;\r
92 }\r
93 \r
94 void litehtml::split_string(const tstring& str, string_vector& tokens, const tstring& delims, const tstring& delims_preserve, const tstring& quote)\r
95 {\r
96         if(str.empty() || (delims.empty() && delims_preserve.empty()))\r
97         {\r
98                 return;\r
99         }\r
100 \r
101         tstring all_delims = delims + delims_preserve + quote;\r
102 \r
103         tstring::size_type token_start  = 0;\r
104         tstring::size_type token_end    = str.find_first_of(all_delims, token_start);\r
105         tstring::size_type token_len    = 0;\r
106         tstring token;\r
107         while(true)\r
108         {\r
109                 while( token_end != tstring::npos && quote.find_first_of(str[token_end]) != tstring::npos )\r
110                 {\r
111                         if(str[token_end] == _t('('))\r
112                         {\r
113                                 token_end = find_close_bracket(str, token_end, _t('('), _t(')'));\r
114                         } else if(str[token_end] == _t('['))\r
115                         {\r
116                                 token_end = find_close_bracket(str, token_end, _t('['), _t(']'));\r
117                         } else if(str[token_end] == _t('{'))\r
118                         {\r
119                                 token_end = find_close_bracket(str, token_end, _t('{'), _t('}'));\r
120                         } else\r
121                         {\r
122                                 token_end = str.find_first_of(str[token_end], token_end + 1);\r
123                         }\r
124                         if(token_end != tstring::npos)\r
125                         {\r
126                                 token_end = str.find_first_of(all_delims, token_end + 1);\r
127                         }\r
128                 }\r
129 \r
130                 if(token_end == tstring::npos)\r
131                 {\r
132                         token_len = tstring::npos;\r
133                 } else\r
134                 {\r
135                         token_len = token_end - token_start;\r
136                 }\r
137 \r
138                 token = str.substr(token_start, token_len);\r
139                 if(!token.empty())\r
140                 {\r
141                         tokens.push_back( token );\r
142                 }\r
143                 if(token_end != tstring::npos && !delims_preserve.empty() && delims_preserve.find_first_of(str[token_end]) != tstring::npos)\r
144                 {\r
145                         tokens.push_back( str.substr(token_end, 1) );\r
146                 }\r
147 \r
148                 token_start = token_end;\r
149                 if(token_start == tstring::npos) break;\r
150                 token_start++;\r
151                 if(token_start == str.length()) break;\r
152                 token_end = str.find_first_of(all_delims, token_start);\r
153         }\r
154 }\r
155 \r
156 void litehtml::join_string(tstring& str, const string_vector& tokens, const tstring& delims)\r
157 {\r
158         tstringstream ss;\r
159         for(size_t i=0; i<tokens.size(); ++i)\r
160         {\r
161                 if(i != 0)\r
162                 {\r
163                         ss << delims;\r
164                 }\r
165                 ss << tokens[i];\r
166         }\r
167 \r
168         str = ss.str();\r
169 }\r