Задать вопрос
27cm
@27cm
TODO: Написать статус

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

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

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

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

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

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

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

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

Похожие вопросы