Я надеюсь, что вы помните одну из наших забав, где мы писали парсер для дескриптивного HTML? Если помните, тогда я за вас рад и предлагаю вам перейти к созданию нечто аналогичного, а именно дескриптивного CSS.
Постоянные читатели блога знают, что иногда мне прям хочется сделать что-нибудь такое, что будет интересно самому себе и абсолютно не имеет значения, найдут ли такие наработки пользу в будущем или настоящем или же не найдут. В таких статьях важно другое, а именно их существование, их поднаготный смысл, их очарование, в чём-то. Но предлагаю от пафоса перейти к разбору объекта статьи. Вперёд.
Теоретический смысл
Когда мы с Денисом в последнем выпуске W3Cast`а говорили о принципах благоприятного климата CSS-файлов, мне пришла в голову одна интересная идея, которая была связана с обсуждением соблюдения иерархичности блоков CSS-стилей. Я придерживаюсь такой позиции, что CSS не создан для логичного отображения структуры CSS-блоков, то есть с помощью него или каких-то ухищрений достаточно сложно показать саму структуру иерархии CSS-блоков. Пусть данная идея может показаться навя(зч/щ)ивой, но она мне настолько понравилась, что я не пожалел времени реализовать парсер-конвертер из DCSS в CSS.
Я уверен, что вы хотите взглянуть на то, как же собственно выглядит DCSS-файл. Тогда встречайте наш файл-пример:
Посмотрите же: документ выглядит полностью иерархично, с соблюдением всех канонов вложенности одного уровня иерархии в другой. Замечательно! Данный DCSS-файл в итоге должен превратиться в обычный CSS-файл с подобным содержимым:
Причём, у DCSS-парсера есть определённый наращиваемый потенциал в области документирования CSS-файлов и в области генерации последних. Так как при обработке DCSS-файла создаётся его структура, её можно вывести в качестве справочного материала в шапке генерируемого CSS-файла, а также создать комментарии-документацию к большинству узлов будущего CSS-файла. Мне кажется, что такие возможности были бы полезны в сложных системах, где важно не запутаться и не допустить каких бы то ни было ошибок. Сегодня мы в качестве примера реализуем объектно-ориентированную систему обработки DCSS-файлов. Читать дальше следует лишь тем, кто хочет заглянуть в непосредственное устройство системы обработки и конвертации.
Технический смысл
Технически говоря, парсер DCSS-файлов очень сильно напоминает парсер файлов дескриптивного HTML. Но мы не будем использовать созданные тогда классы, а попытаемся создать более объектную систему.
Всякая объектная система начинается с самого низа. В самом низу нашей системы у нас расположены узлы дерева (иерархии) DCSS-документа, которое образуется в результате парсинга. Именно поэтому для начала давайте сделаем класс DCSSHierarchyElement:
Абстракция готова. Теперь на основе данной абстракции (которая, теоретически, уже может создавать на основе себя дерево любых размеров) мы можем создать класс CSS-блока, расширив наш класс элемента иерархии необходимыми нам свойствами:
Готово! Теперь параллельно данному классу нам нужен ещё один класс, но он будет, логически, на один уровень выше предыдущего. Чтобы ответить на вопрос «почему на один уровень выше?», нужно ответить на вопрос «что из себя составляют несколько CSS-блоков?». Ответ очевиден: они составляют CSS-файл, с которым мы и должны работать:
Данный класс включает в себя метод обработки DCSS-файла в обычную структуру DCSS-блоков с помощью ранее созданного класса. Если мы будем двигатсья далее и следовать всё той же логике, мы увидим, что экспорт DCSS-файлов — это совсем иная природа действия и мы просто должны вынести данную функциональность в совершенно другой, логически параллельный, класс, что и сделаем:
Вот и всё. Представим, что исходный DCSS находится в файле sample.dcss, тогда мы можем сделать файл sample.dcss.css с конвертированными данными с помощью такой конструкции:
Я думаю, что проще не бывает. Вы со мной согласны?
Заключение
Сегодня в рамках «забав» мы рассмотрели дескриптивный CSS. Такая информация нам была полезна с нескольких сторон: мы знаем, как можем улучшить CSS, чтобы не запутаться в нём при работе в крупных проектах. Помимо этого, мы теперь знаем, как можно обрабатывать чётко-структурированные файлы с особыми обособленными сущностями. Думаю, данные знания никогда не станут лишними, но мы не будем останавливаться на достигнутом и продолжим покорение вершин логичности. Удачи всем.