Open alexey-malov opened 8 years ago
// Программа не завершается с ошибкой, если строка содержит незавершенную HTML-сущеность, проверка которой привод алгоритм к концу строки
BOOST_AUTO_TEST_CASE(program_do_not_crash_if_input_string_has_wrong_html_entity_at_end_of_line)
{
string strWithoutHtmlEntities = "&apo";
BOOST_CHECK_EQUAL(HtmlDecode(strWithoutHtmlEntities), strWithoutHtmlEntities);
}
Вы не можете "проверить", что программа не упадет.
// Проверка строки с содержанием html-сущностей, стоящих друг за другом
BOOST_AUTO_TEST_CASE(program_work_correctly_with_html_entities_without_another_words)
{
string strWithoutHtmlEntities = "<>""&'";
BOOST_CHECK_EQUAL(HtmlDecode(strWithoutHtmlEntities), "<>\"\"&’");
}
std::string HtmlDecode(const std::string &text)
{
std::string result = "";
const std::map<std::string, char> htmlEntities =
{
{ "quot", '"' },
{ "apos", '’' },
{ "lt", '<' },
{ "gt", '>' },
{ "amp", '&' }
};
const std::vector<std::string> htmlEntitiesKeys =
{
{ "quot" },
{ "apos" },
{ "lt" },
{ "gt" },
{ "amp" }
};
for (unsigned textIndex = 0; textIndex < text.length(); ++textIndex)
{
if (text[textIndex] == '&')
{
std::vector<std::string> htmlEntitiesKeysCopy(htmlEntitiesKeys);
unsigned charPos = 0;
std::string savedStr = "";
savedStr += text[textIndex];
textIndex++;
while (textIndex < text.length() && text[textIndex] != ';' && text[textIndex] != '&' && htmlEntitiesKeysCopy.size() > 0)
{
savedStr += text[textIndex];
for (unsigned htmlEntitiesKeyIndex = 0; htmlEntitiesKeyIndex < htmlEntitiesKeysCopy.size(); ++htmlEntitiesKeyIndex)
{
if (text[textIndex] != htmlEntitiesKeysCopy.at(htmlEntitiesKeyIndex)[charPos])
{
htmlEntitiesKeysCopy.erase(htmlEntitiesKeysCopy.begin() + htmlEntitiesKeyIndex);
htmlEntitiesKeyIndex--;
}
}
charPos++;
textIndex++;
}
if (text[textIndex] == '&')
{
textIndex--;
}
else if (textIndex < text.length())
{
savedStr += text[textIndex];
}
if (htmlEntitiesKeysCopy.size() == 1 && text[textIndex] == ';')
{
result += htmlEntities.at(htmlEntitiesKeysCopy.at(0));
}
else
{
result += savedStr;
}
}
else
{
result += text[textIndex];
}
}
return result;
}
http://www.viva64.com/ru/w/V104/print/ http://www.viva64.com/ru/w/V108/print/