gem dartsass-sprockets вызывает исключение "expected selector." при обработке стилей
Ruby 4.0.6
Rails 8.1.3
gem "sprockets-rails" 3.5.2
gem "dartsass-sprockets" 3.2.1
gem dartsass-sprockets при включенной опции config.sass.style = :compressed вызывает исключение "expected selector."
/* this style raise error: */
span.rub {
content: " \20BD";
}
/* this also raise */
span.rub { content: "рублей"; }
/* this code solve problem: */
span.rub {
--ruble-sign: " \20BD";
content: var(--ruble-sign);
}
Самое неприятное, что в сообщении об ошибке нет вообще никакой полезной информации о том, где что-то не так — приходится искать методом исключения, и это отнимает время. Надеюсь, кому-то это поможет избежать напрасной траты времени и нервов на поиск причин, почему стили могут приводить к ошибке в обработке.
Похоже, что проблема заключается ещё и в двойном проходе, в попытке двойной компрессии таблиц стилей. В документации https://github.com/tablecheck/dartsass-sprockets сказано:
CSS Minification (Production)
This gem uses a Railtie to automatically set the following configuration in all environments except Development:
# set automatically by this gem
config.assets.css_compressor = :sassThis causes Sprockets to minify all CSS assets (both Sass and plain CSS) using Dart Sass. This minification is done as a second-pass after compiling the Sass to CSS, and is done irrespective of whether the
config.sass.styleoption is set to:compressed. To disable this behavior, setconfig.assets.css_compressor = false.
Для того, чтобы предотвратить повторную обработку (сжатие), необходимо установить следующие значения конфигурации (config/environments/production.rb):
config.assets.css_compressor = false
config.sass.style = :compressed
С данными настройками всё работает без всяких трюков с использованием var в стилях. Остаётся открытым вопрос — какой же всё-таки gem неправильно обрабатывает строку в кодироке кирилицы. Но глубже пока рыть не стал — у меня есть занятия и поинтереснее.