#include "html.h"
#include "types.h"
namespace litehtml
{
string& trim(string& s, const string& chars_to_trim)
{
string::size_type pos = s.find_first_not_of(chars_to_trim);
if(pos != string::npos)
{
s.erase(s.begin(), s.begin() + pos);
}
else
{
s = "";
return s;
}
pos = s.find_last_not_of(chars_to_trim);
if(pos != string::npos)
{
s.erase(s.begin() + pos + 1, s.end());
}
return s;
}
string trim(const string& s, const string& chars_to_trim)
{
string str = s;
trim(str, chars_to_trim);
return str;
}
string& lcase(string& s)
{
for(char & i : s)
{
i = (char)t_tolower(i);
}
return s;
}
string::size_type find_close_bracket(const string& s, string::size_type off, char open_b, char close_b)
{
int cnt = 0;
for(string::size_type i = off; i < s.length(); i++)
{
if(s[i] == open_b)
{
cnt++;
} else if(s[i] == close_b)
{
cnt--;
if(!cnt)
{
return i;
}
}
}
return string::npos;
}
string index_value(int index, const string& strings, char delim)
{
std::vector vals;
string delims;
delims.push_back(delim);
split_string(strings, vals, delims);
if(index >= 0 && index < (int) vals.size())
{
return vals[index];
}
return std::to_string(index);
}
int value_index( const string& val, const string& strings, int defValue, char delim )
{
if(val.empty() || strings.empty() || !delim)
{
return defValue;
}
int idx = 0;
string::size_type delim_start = 0;
string::size_type delim_end = strings.find(delim, delim_start);
string::size_type item_len;
while(true)
{
if(delim_end == string::npos)
{
item_len = strings.length() - delim_start;
} else
{
item_len = delim_end - delim_start;
}
if(item_len == val.length())
{
if(val == strings.substr(delim_start, item_len))
{
return idx;
}
}
idx++;
delim_start = delim_end;
if(delim_start == string::npos) break;
delim_start++;
if(delim_start == strings.length()) break;
delim_end = strings.find(delim, delim_start);
}
return defValue;
}
bool value_in_list( const string& val, const string& strings, char delim )
{
int idx = value_index(val, strings, -1, delim);
if(idx >= 0)
{
return true;
}
return false;
}
string_vector split_string(const string& str, const string& delims, const string& delims_preserve, const string& quote)
{
string_vector result;
split_string(str, result, delims, delims_preserve, quote);
return result;
}
void split_string(const string& str, string_vector& tokens, const string& delims, const string& delims_preserve, const string& quote)
{
if(str.empty() || (delims.empty() && delims_preserve.empty()))
{
return;
}
string all_delims = delims + delims_preserve + quote;
string::size_type token_start = 0;
string::size_type token_end = str.find_first_of(all_delims, token_start);
string::size_type token_len;
string token;
while(true)
{
while( token_end != string::npos && quote.find_first_of(str[token_end]) != string::npos )
{
if(str[token_end] == '(')
{
token_end = find_close_bracket(str, token_end, '(', ')');
} else if(str[token_end] == '[')
{
token_end = find_close_bracket(str, token_end, '[', ']');
} else if(str[token_end] == '{')
{
token_end = find_close_bracket(str, token_end, '{', '}');
} else
{
token_end = str.find_first_of(str[token_end], token_end + 1);
}
if(token_end != string::npos)
{
token_end = str.find_first_of(all_delims, token_end + 1);
}
}
if(token_end == string::npos)
{
token_len = string::npos;
} else
{
token_len = token_end - token_start;
}
token = str.substr(token_start, token_len);
if(!token.empty())
{
tokens.push_back( token );
}
if(token_end != string::npos && !delims_preserve.empty() && delims_preserve.find_first_of(str[token_end]) != string::npos)
{
tokens.push_back( str.substr(token_end, 1) );
}
token_start = token_end;
if(token_start == string::npos) break;
token_start++;
if(token_start == str.length()) break;
token_end = str.find_first_of(all_delims, token_start);
}
}
void join_string(string& str, const string_vector& tokens, const string& delims)
{
str = "";
for (size_t i = 0; i < tokens.size(); i++)
{
if (i != 0)
{
str += delims;
}
str += tokens[i];
}
}
int t_strcasecmp(const char *s1, const char *s2)
{
int i, d, c;
for (i = 0;; i++)
{
c = t_tolower((unsigned char)s1[i]);
d = c - t_tolower((unsigned char)s2[i]);
if (d < 0)
return -1;
else if (d > 0)
return 1;
else if (c == 0)
return 0;
}
}
int t_strncasecmp(const char *s1, const char *s2, size_t n)
{
int i, d, c;
for (i = 0; i < (int) n; i++)
{
c = t_tolower((unsigned char)s1[i]);
d = c - t_tolower((unsigned char)s2[i]);
if (d < 0)
return -1;
else if (d > 0)
return 1;
else if (c == 0)
return 0;
}
return 0;
}
string get_escaped_string(const string& in_str)
{
string ret;
for (auto ch : in_str)
{
switch (ch)
{
case '\'':
ret += "\\'";
break;
case '\"':
ret += "\\\"";
break;
case '\?':
ret += "\\?";
break;
case '\\':
ret += "\\\\";
break;
case '\a':
ret += "\\a";
break;
case '\b':
ret += "\\b";
break;
case '\f':
ret += "\\f";
break;
case '\n':
ret += "\\n";
break;
case '\r':
ret += "\\r";
break;
case '\t':
ret += "\\t";
break;
case '\v':
ret += "\\v";
break;
default:
ret += ch;
}
}
return ret;
}
bool is_number(const string& string, const bool allow_dot) {
for (auto ch : string)
{
if (!(t_isdigit(ch) || (allow_dot && ch == '.')))
{
return false;
}
}
return true;
}
} // namespace litehtml