Как выдать ошибку в компиляторе LESS

Вопрос

Есть ли способ (программно) выдать ошибку в компиляторе LESS?

Почему?

Сегодня я возился с охранниками примесей, потому что я хотел сгенерировать свое поле CSS на основе размера элемента и количества элементов. Я подумал, что было бы круто сразу выдавать ошибку при компиляции, когда элементы не помещаются в обёртку.

Информация: я использую компилятор lessc для компиляции кода LESS в CSS. Я не использую какую-либо библиотеку Javascript для ее компиляции во время выполнения.

МЕНЬШЕ источник

// Variables
@wrapper-small:  830px;
@wrapper-big:   1200px;

.col-fixed(@size, @count, @wrapper)  when ((@size*@count) <= @wrapper)
{
    width: unit(@size, px);
    margin-right: unit( (@wrapper - @count * @size) / (@count - 1), px);    
}

.test_col_fixed {
    // will fail the mixin guard and output no generated CSS        
    .col-fixed(340, 3, @wrapper-small);

    // would work if not in comment
    // .col-fixed(340, 3, @wrapper-big);
}

Сгенерированный CSS (небольшая оболочка)

Нет вывода, потому что код не будет сгенерирован из-за несоответствующей защиты примеси when ((@size*@count) <= @wrapper) // 3*340 <= 830 is false.

Сгенерированный CSS (с рабочим решением, большая оболочка)

.test_col_fixed {
    width: 340px;
    margin-right: 90px;
}

person Smamatti    schedule 16.06.2015    source источник
comment
Охранники ошибок не выдают. Компилятор просто молча пропускает их при совпадении условия. Это связанный поток, но я не думаю, что вы могли бы применить сопоставление с образцом для своего кейс. Лучше всего было бы следовать последнему фрагменту в моем ответе (чтобы проверить условие «нет» и преднамеренно ввести ошибку). Или вы можете распечатать собственное сообщение и проверить его в скомпилированном CSS.   -  person Harry    schedule 16.06.2015
comment
Спасибо за ваше предложение, но допустимые значения и функция извлечения в этом случае не помогут.   -  person Smamatti    schedule 16.06.2015
comment
Я не имел в виду действительные значения или извлеченные фрагменты :) Пожалуйста, посмотрите на окончательный вариант с преднамеренной ошибкой (часть output: @bwahaha). Это, на мой взгляд, единственный способ заставить компилятор Less выйти из строя, когда никакая защита не соответствует.   -  person Harry    schedule 16.06.2015
comment
О, мой плохой. Теперь это работает. Вы можете опубликовать это как ответ.   -  person Smamatti    schedule 16.06.2015
comment
Ах, может показаться, что я дублирую свой ответ для представителя :( Если вам это нравится, я не возражаю против того, чтобы проголосовать там :)   -  person Harry    schedule 16.06.2015


Ответы (1)


Предлагаемое, но строго не рекомендуемое решение Гарри

.col-fixed(@size, @count, @wrapper) {
    & when ((@size*@count) <= @wrapper) {
        width: unit(@size, px);
        margin-right: unit( (@wrapper - @count * @size) / (@count - 1), px);  
    }
    & when ((@size*@count) > @wrapper) {
        /* there is no such variable and hence when the input value is not valid,
        compiler will complain that variable is undefined */
        output: @bwahahaha;
    }
}
person Smamatti    schedule 16.06.2015
comment
Хорошо, я собирался предложить перенести решение с вопроса на самостоятельный ответ, и спасибо :) - person Harry; 16.06.2015