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