mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-12-22 17:49:43 +01:00
Add find_tag()
This simply finds a given tag in a buffer and returns what's inside that tag, making sure to parse XML entities and such.
This commit is contained in:
parent
9b4975e396
commit
b4f56d39d7
1 changed files with 51 additions and 0 deletions
|
@ -102,6 +102,57 @@ void replace_all(std::string& str, const std::string& from, const std::string& t
|
|||
}
|
||||
}
|
||||
|
||||
std::string find_tag(const std::string& buf, const std::string& start, const std::string& end)
|
||||
{
|
||||
size_t tag = buf.find(start);
|
||||
|
||||
if (tag == std::string::npos)
|
||||
{
|
||||
//No start tag
|
||||
return "";
|
||||
}
|
||||
|
||||
size_t tag_start = tag + start.size();
|
||||
size_t tag_close = buf.find(end, tag_start);
|
||||
|
||||
if (tag_close == std::string::npos)
|
||||
{
|
||||
//No close tag
|
||||
return "";
|
||||
}
|
||||
|
||||
size_t tag_len = tag_close - tag_start;
|
||||
std::string value(buf.substr(tag_start, tag_len));
|
||||
|
||||
//Encode special XML entities
|
||||
replace_all(value, """, "\"");
|
||||
replace_all(value, "&", "&");
|
||||
replace_all(value, "'", "'");
|
||||
replace_all(value, "<", "<");
|
||||
replace_all(value, ">", ">");
|
||||
|
||||
//Encode general XML entities
|
||||
size_t start_pos = 0;
|
||||
while ((start_pos = value.find("&#", start_pos)) != std::string::npos)
|
||||
{
|
||||
size_t end = value.find(';', start_pos);
|
||||
std::string number(value.substr(start_pos + 2, end - start_pos));
|
||||
|
||||
if (!is_positive_num(number))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
int character = atoi(number.c_str());
|
||||
int utf32[] = {character, 0};
|
||||
std::string utf8;
|
||||
utf8::unchecked::utf32to8(utf32, utf32 + 1, std::back_inserter(utf8));
|
||||
value.replace(start_pos, end - start_pos + 1, utf8);
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
void editorclass::getDirectoryData()
|
||||
{
|
||||
|
||||
|
|
Loading…
Reference in a new issue