Relz / OOP

Лабораторные работы по Объектно-ориентированному программированию (IDE - Visual Studio 2015)
0 stars 0 forks source link

Замечания по HTML Decode #5

Open alexey-malov opened 8 years ago

alexey-malov commented 8 years ago
alexey-malov commented 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);
}

Вы не можете "проверить", что программа не упадет.

alexey-malov commented 8 years ago
// Проверка строки с содержанием html-сущностей, стоящих друг за другом
BOOST_AUTO_TEST_CASE(program_work_correctly_with_html_entities_without_another_words)
{
    string strWithoutHtmlEntities = "<>""&'";
    BOOST_CHECK_EQUAL(HtmlDecode(strWithoutHtmlEntities), "<>\"\"&’");
}
alexey-malov commented 8 years ago
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/

alexey-malov commented 8 years ago