воскресенье, 4 ноября 2012 г.

Чистота — залог здоровья

Одна из задач, присутствующих в моём pet-project — очистка фрагментов HTML поступающих из внешних источников (RSS, Atom) от мусора. Сначала я использовал замечательную библиотеку html5lib и всё меня в ней устраивало. HTML очищался, пользователи радовались.

Но однажды процесс оптимизации проекта привёл меня к тому, что очистка HTML стала самой трудоёмкой задачей и потребляющей не менее 50% времени.

Взор мой пал на замечательную библиотеку cl-sanitize. Но, поскольку, мне требовалась возможность использования её из программы на python, я решил написать свою на C.

Таким образом появилась на свет libsanitize. Сначала это был перевод с лиспа на на си один-к-одному. Но потребовалась функциональность, которой оригинальная библиотека не обладала.

Вместо указания допустимого протокола для атрибутов со ссылками (href, src и т. п.) добавил возможность задавать регулярное выражение. Логика перешла из кода в данные. Вот пример, задающий правила для ссылок.

<a href="^(ftp:|http:|https:|mailto:)" href.not="^[^/]+[[:space:]]*:"/>

Ещё одна функция — переименование тегов. Используется для замены всяческих aside, header, nav на старый добрый div. Это позволяет писать меньше CSS.

Безусловное добавление атрибутов показалось избыточным и было удалено.

В качестве внешнего формата для хранения настроек очень органично вписался XML. Пример такого файла: relaxed.xml. Выглядит почти как простое перечисление тегов.

Замеры показали, что запросы стали работать на порядок быстрее. Время сократилось с 200 мс до 12-15 мс. Теперь самое слабое звено — база данных.