1. C++ / Говнокод #12611

    +28

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    if ( _It->m_sOpenText.substr( 0, 3 ) == "<tr" ||
    		 _It->m_sOpenText.substr( 0, 3 ) == "<th" ||
    		 _It->m_sOpenText.substr( 0, 3 ) == "<td" ||
    		 _It->m_sOpenText.substr( 0, 6 ) == "<thead" ||
    		 _It->m_sOpenText.substr( 0, 6 ) == "<tbody" ||
    		 _It->m_sOpenText.substr( 0, 6 ) == "<tfoot" ||
    		 _It->m_sOpenText.substr( 0, 8 ) == "<caption" ||
    		 _It->m_sOpenText.substr( 0, 4 ) == "<col" ||
    		 _It->m_sOpenText.substr( 0, 9 ) == "<colgroup" )
    		return; // TODO: я пишу ТАКОЙ код, убейте меня...

    Продолжаем неделю свитчей  — HTML-препроцессор!

    Запостил: Yuuri, 19 Февраля 2013

    Комментарии (18) RSS

    • ну префиксное дерево это оверкилл, но тем не менее, составить контейнер "что искать" и написать функцию, которая бы матчила (где, что) - уже и решение
      Ответить
      • > ну префиксное дерево это оверкилл

        потому что до сих пор ни в бусте, ни в стандарте.

        я radix tree/patricia trie уже пару раз писал, включая раз на битовом уровне. удовольствия мало. уже как лет 7-8 с последнего раза прошло - и никакой штатной реализации так до сих пор и не появилось.
        Ответить
        • да, в бусте бы видеть хотелось, например
          чтобы в редких случаях получить необходимое значительное ускорение, а в остальных - незначительное

          но в данном примере, кстати, достаточно было бы unordered_set:
          после имени html тега явно идёт пробел
          значит легко вычленить name() из тега (если это до сих пор не сделал богоугодный парсер) - т.е. 1 конструктор std::string и сделать find оного в сете
          Ответить
          • > После имени html тега явно идёт пробел
            Не факт:
            <td>some content</td>

            Лучше ориентироваться на первый не алфавитно-цифровой символ.
            Ответить
            • да, согласен
              привык к хорошему, давно не приходилось парсить xml/html вручную, и надеюсь, never again :)
              Ответить
              • > парсить xml/html вручную
                Последний (он же первый) раз, парсил xml вручную года 4 назад из-за совместимости с другим ёбнутым на голову велосипедистским парсером\генератором, который экранировал символы совсем не так, как это положено делать в настоящем xml...

                Искренне надеюсь, что больше такого не потребуется :)
                Ответить
                • А нельзя было препроцесснуть экранированные символы, а потом скормить фабричному парсеру?
                  Ответить
                  • Насколько помню основная проблема там была с кавычками и < >. Корректная экранировка этих символов только в нужных местах была бы эквивалентна парсингу, поэтому я и выбрал парсинг ;) Давно это было, не помню уже подробностей этого ужаса.
                    Ответить
    • Дёргай std::string и ~std::string по поводу и без повода, создавай десятки временных объектов, доминируй, властвуй.
      Ответить
      • Кстати в Qt, который многие считают еретическим из-за самопильных не std классов для строк и контейнеров, есть очень удобный метод QString::startsWith():
        if (s.startsWith("<td") ||
            s.startsWith("<th") ||
            ...
        P.S. В бусте, емнип, тоже есть boost::starts_with(), но это только подчеркивает неюзабельность STL без дополнительных либ.
        Ответить
    • лексический анализатор? парсер? не, не слышал
      Ответить
    • Близко к теме, лесенки в QtCreator: goo.gl/jwUST
      Ответить
    • еще один, спавший на лекциях по конечным автоматам?
      Ответить

    Добавить комментарий