- PVSM.RU - https://www.pvsm.ru -
На этой неделе вышла новая версия CSScomb — инструмента, который делает CSS-код красивым. О том, как «расчёску» используют в Яндексе, недавно писал [1] Beyondtheclouds [2]. Я же расскажу, что нового появилось в третьей версии и что делать, если базовой функциональности не хватает. Например, как написать свой плагин или даже постпроцессор.
Сначала о новом.
Любители отступов теперь могут приводить в порядок sass-файлы.
// До:
.panda,.foo>span
border-color:$blue
+include button
color: darken($blue, 9%)
$blue : #3bbfce
padding:$margin / 2
$margin: 16px
margin: $margin / 2
// После:
.panda, .foo > span
$blue: #3bbfce
$margin: 16px
+button
padding: $margin / 2
margin: $margin / 2
border-color: $blue
color: darken($blue, 9%)
Stylus так и не появился и в ближайшее время не предвидится. Сложности возникли не столько с написанием кода, сколько с его поддержкой: не нашлось человека, который был бы готов следить за новинками в языке и обновлять препроцессор. Подробности можно прочитать в соответствующем таске [3].
Для порядка сортировки появилось новое ключевое слово: "..."
, которое означает «все остальные свойства, не перечисленные в списке». Использовать его удобно в двух случаях:
Пример выборочной сортировки:
// До:
.panda {
color: $color;
@include animal;
top: 0;
$color: white;
}
/**
* После применения этого конфига:
* {
* sort-order: [["$variable"], ["..."], ["$include"]]
* }
*/
.panda {
$color: white;
color: $color;
top: 0;
@include animal;
}
Спорить о том, какой порядок свойств лучше, можно бесконечно. Мы решили облегчить вам работу и добавили свойство sort-order-fallback
. Эта опция сортирует по алфавиту свойства, обозначенные в списке ключевым словом "..."
.
// До:
.panda {
background: salmon;
display: flex;
align-items: center;
color: white;
}
/**
* После применения этого конфига:
* {
* "sort-order": ["..."],
* "sort-order-fallback": "abc"
* }
*/
.panda {
align-items: center;
background: salmon;
color: white;
display: flex;
}
Это свойство можно также совмещать с выборочной сортировкой.
.panda {
background: salmon;
@include animal;
display: flex;
align-items: center;
color: white;
}
/**
* После применения этого конфига:
* {
* "sort-order": [[$include"], ["display"], ["..."]],
* "sort-order-fallback": "abc"
* }
*/
.panda {
@include animal;
display: flex;
align-items: center;
background: salmon;
color: white;
}
В третьей версии улучшена работа с пробелами. Некоторые настройки мы удалили (rule-indent
, stick-brace
). Некоторые разбили и переименовали. Так, combinator-space
превратилась в space-before-combinator
и space-after-combinator
, а colon-space
— в space-before-colon
и space-after-colon
.
А ещё мы добавили ряд новых опций:
tab-size
space-before-selector-delimiter
space-after-selector-delimiter
space-before-opening-brace
space-after-opening-brace
space-before-closing-brace
space-after-declaration
Полный список и примеры использования можно посмотреть на гитхабе [4].
CSScomb можно получить несколькими способами:
Кроме этого есть плагины для Gulp [9], для Brunch [10] и для Brackets [11], но они ещё не поддерживают версию 3.0.
Если вы используете CSScomb 2.0 и хотите перейти на третью версию, очень важно обновить конфиг. Со старым, к сожалению, не взлетит.
Чтобы вам не пришлось тратить время на переделку файла руками, мы сделали сервис по генерации конфигов [12]. Всё, что нужно сделать — это покликать на те варианты кода, которые вам нравятся. На выходе получится готовый к работе файл настроек.
CSScomb — прекрасный инструмент, но иногда хочется что-нибудь добавить. Поэтому мы постарались сделать код максимально модульным и легко расширяемым. Вы можете дополнить «расчёску» нужной функцией, не заморачиваясь с форком. Для этого есть три способа:
Проще всего использовать чей-то плагин. Например, вот опция [13], которая убирает пустую строку между группами деклараций, если деклараций в группе слишком мало. Подключить плагин довольно просто, для этого есть метод use()
:
var CSScomb = require('csscomb');
var groupSize = require('csscomb-group-size');
// Число 4 означает, что если в группе меньше 4 деклараций, между этой
// группой и предыдущей уберётся пустая строка-разделитель:
var config = { 'group-size': 4 };
// Создаём новый экземпляр «расчёски»:
var csscomb = new CSScomb().use(groupSize).configure(config);
// Творим чудеса:
csscomb.processPath('path/to/css');
Так как возможность писать плагины только-только появилась, особого разнообразия пока нет. Поэтому если вы точно знаете, чего вам не хватает, можете написать свою опцию.
Плагин — это обычный модуль с методами для обработки AST. С документацией можно ознакомиться на гитхабе [14]. В качестве парсера используется Gonzales PE [15], на гитхабе лежит документация по устройству дерева [16]. Вот самый простой пример плагина, который берёт CSS-код и заменяет в нём все комментарии на /* (╯°□°)╯︵ ┻━┻ */
:
module.exports = {
name: 'flip-comments',
syntax: ['css'],
accepts: {
boolean: [true]
},
process: function(nodeType, node) {
if (nodeType !== 'commentML') return;
node[0] = ' (╯°□°)╯︵ ┻━┻ ';
}
};
Тот же код, только с комментариями. [17]
Делайте свои опции и делитесь ссылками с сообществом. Если появятся вопросы, смело пишите в комментарии или сразу заводите задачу.
Если плагина недостаточно и нужно что-то гораздо большее, почему бы не написать свой постпроцессор? Мы вынесли ядро CSScomb в отдельный модуль, чтобы любой мог применить его для своего проекта. Поэтому если вам по душе принцип работы «расчёски», система плагинов и файлов настроек, обратите внимание на CSScomb Core [18]. Внутри этого модуля есть всё, что нужно:
Быстро разобраться поможет специальный шаблон, Flip Comb [19]. Это маленький постпроцессор, ничего лишего. Код можно форкнуть и изменить под свои нужды.
Основное направление дальнейших улучшений — линтер и CLI.
Мы постарались, чтобы опции можно было писать самим, не дожидаясь их появления в ядре. Поэтому новых настроек в ближайшем будущем ждать не стоить. Но если вы написали плагин и считаете, что другим он тоже пригодится, это очень круто, отправляйте ПР.
Если вам интересно поучаствовать в проекте, обратите внимание на задачи с тегом «help wanted» [20]. Stylus, например, по-прежнему ждёт своего героя.
CSScomb: https://github.com/csscomb/csscomb.js [21]
CSScomb Core: https://github.com/csscomb/core [18]
Шаблон постпроцессора на базе CSScomb Core: https://github.com/csscomb/core-template [19]
Сервис для генерации конфига: http://csscomb.com/config [12]
P.S.
Автор: tonyganch
Источник [25]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/css/65686
Ссылки в тексте:
[1] недавно писал: http://habrahabr.ru/company/yandex/blog/223503
[2] Beyondtheclouds: http://habrahabr.ru/users/beyondtheclouds/
[3] соответствующем таске: https://github.com/csscomb/csscomb.js/issues/159
[4] посмотреть на гитхабе: https://github.com/csscomb/csscomb.js/blob/master/doc/options.md
[5] npm-модуль: https://github.com/csscomb/csscomb.js/blob/master/doc/usage-node.md
[6] CLI: https://github.com/csscomb/csscomb.js/blob/master/doc/usage-cli.md
[7] плагин для Grunt: https://github.com/csscomb/grunt-csscomb
[8] плагин для Sublime Text: https://github.com/csscomb/sublime-csscomb
[9] для Gulp: https://github.com/koistya/gulp-csscomb
[10] для Brunch: https://github.com/garetht/csscomb-brunch
[11] для Brackets: https://github.com/i-akhmadullin/brackets-csscomb
[12] сервис по генерации конфигов: http://csscomb.com/config
[13] вот опция: https://github.com/tonyganch/csscomb-group-size
[14] ознакомиться на гитхабе: https://github.com/csscomb/core#writing-a-plugin
[15] Gonzales PE: https://github.com/tonyganch/gonzales-pe
[16] документация по устройству дерева: https://github.com/tonyganch/gonzales-pe/blob/master/doc/AST-Description.md
[17] Тот же код, только с комментариями.: https://github.com/csscomb/core-template/blob/master/lib/options/flip-comments.js
[18] CSScomb Core: https://github.com/csscomb/core
[19] Flip Comb: https://github.com/csscomb/core-template
[20] «help wanted»: https://github.com/csscomb/csscomb.js/issues?labels=help+wanted
[21] https://github.com/csscomb/csscomb.js: https://github.com/csscomb/csscomb.js
[22] Хостинг: https://www.reg.ru/?rlink=reflink-717
[23] csscomb.com: http://csscomb.com
[24] программы поддержки опенсорса: http://opensource.nodejitsu.com
[25] Источник: http://habrahabr.ru/post/230589/
Нажмите здесь для печати.