27cm
@27cm
TODO: Написать статус

Какие есть паттерны или алгоритмы для обработки текста?

Собираюсь написать библиотеку, которая будет выполнять большое число различных преобразований с HTML текстом:
1. Преобразовывать кодировку текста в UTF-8, нормализовывать Unicode;
2. Оборачивать все ссылки в HTML теги <a>...</a> (если ссылка ещё не в тегах);
3. Расставлять пропущенные не закрытые HTML теги;
4. Расставлять неразрывные пробелы после предлогов;
5. Заменять дефисы на тире там, где это необходимо;
6. Удалять запрещенные HTML теги;
7. Заменять некоторых комбинаций символов на изображения (для смайликов);
...и сотни других преобразований.

Как видно, некоторое преобразования осуществляются на уровне всего текста, другие на уровне отдельных HTML тегов, третьи — на уровне отдельных символов. Для некоторых правил важен порядок их применения: одни правила должны выполняться раньше других.

На выходе должна получиться некая смесь типографа и известного многим HTML Purifier. Код должно быть легко расширять (добавлять собственные преобразования) сторонними плагинами.

Самое простое решение — каждое преобразование выполнять отдельно в нужном порядке: в каких-то случаях найти нужные символы в тексте и заменить их (пример из типографа Муравьева), в каких-то случаях использовать регулярные выражения (пример). То есть каждое правило берет и тем или иным образом обрабатывает весь текст целиком. С одной стороны такой код легко понять, легко поддерживать, но тяжело расширять и при большом числе преобразований работает всё очень медленно. А самое ужасное, что при таком подходе внесение изменений в одно преобразование может повлиять на другие и приходится разбивать преобразование на разные стадии.

Как можно архитектурно правильно построить такую библиотеку? Может быть, есть какие-то паттерны для этого?
  • Вопрос задан
  • 1020 просмотров
Пригласить эксперта
Ответы на вопрос 3
  • @D3lphi
    Предложу вот такой порядок действий:
    1. Лексический анализатор разбивает поток входящих лексем на токены.
    2. Далее, набор токенов подается на вход парсеру, который выполняет построение "сырого" DOM-дерева, в котором могут присутствовать невалидные теги и тд.
    3. Производится обход сырого DOM-дерева и его нормализация. Изменяем имена тегов на максимально приближенные к ним валидные имена, проставляем пропущенные теги, удаляем запрещенные и т.д.
    4. По нормализованному дереву теперь можно делать обход и преобразовывать текст.
    5. Преобразовываем готовое дерево в html-документ.
    Ответ написан
  • @asd111
    Судя по тому чему вы хотите научится я бы советовал изучить ANTLR. Это очень качественный генератор лексеров и парсеров, правда он на java, но это не проблема.
    Там уже есть готовая грамматика для html . Если она не устраивает, то можно сделать свою.
    По этой грамматике он строит дерево и для обхода дерева можно быстро написать visitor или что то попроще. Также там нетрудно написать обработку ошибок(отсутствие закрывающего тега и т.п.) .
    Ответ написан
  • xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.ru
    1. Вначале нужно "собрать" корректное/валидное DOM-дерево.
    2. Затем, добавить все нужные теги
    3. Удалить все запрещённые теги
    4. Затем, рекурсивно обойти все ветки DOM-"дерева", выполнив текстовые преобразования.

    Порядок в общем виде (строго соблюдая последовательность действий!):
    Валидация структуры, добавление нужных элементов, удаление запрещённых элементов, модификация "тела" оставшихся элементов.
    Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы