Одна из задач, присутствующих в моём pet-project — очистка фрагментов HTML поступающих из внешних источников (RSS, Atom) от мусора. Сначала я использовал замечательную библиотеку html5lib и всё меня в ней устраивало. HTML очищался, пользователи радовались.
Но однажды процесс оптимизации проекта привёл меня к тому, что очистка HTML стала самой трудоёмкой задачей и потребляющей не менее 50% времени.
Взор мой пал на замечательную библиотеку cl-sanitize. Но, поскольку, мне требовалась возможность использования её из программы на python, я решил написать свою на C.
Таким образом появилась на свет libsanitize. Сначала это был перевод с лиспа на на си один-к-одному. Но потребовалась функциональность, которой оригинальная библиотека не обладала.
Вместо указания допустимого протокола для атрибутов со ссылками (href, src и т. п.) добавил возможность задавать регулярное выражение. Логика перешла из кода в данные. Вот пример, задающий правила для ссылок.
Ещё одна функция — переименование тегов. Используется для замены всяческих aside, header, nav на старый добрый div. Это позволяет писать меньше CSS.
Безусловное добавление атрибутов показалось избыточным и было удалено.
В качестве внешнего формата для хранения настроек очень органично вписался XML. Пример такого файла: relaxed.xml. Выглядит почти как простое перечисление тегов.
Замеры показали, что запросы стали работать на порядок быстрее. Время сократилось с 200 мс до 12-15 мс. Теперь самое слабое звено — база данных.