Бессетевой синтаксический анализатор возвращает пустую строку - программирование
Подтвердить что ты не робот

Бессетевой синтаксический анализатор возвращает пустую строку

ASP.Net MVC4 + Bootstrap (LESS) + dotLess.

Цель состоит в том, чтобы преобразовать файлы Bootstrap .less в один пучок .css, и я столкнулся с проблемами showstopper.

Bundle.config

var bootstrapStyles = new Bundle("~/bundle/style/bootstrap").Include("~/Content/less/*.less");
bootstrapStyles.Transforms.Add(new LessTransform());
bootstrapStyles.Transforms.Add(new CssMinify());
bundles.Add(bootstrapStyles);

Только bootstrap меньше файлов, у которых не должно быть проблем с синтаксисом красного флага.

Следующим шагом было создание этого трансформаторного класса LessTransform для создания css.

Класс трансформатора реализует Process(), а проблемный код существует внутри... здесь оба сценария и их проблемы:

Сценарий 1: статический Less.Parse()

var parsedLess = Less.Parse(bundle.Content);
bundle.Content = parsedLess;

// Throws a FileNotFoundException
// "You are importing a file ending in .less that cannot be found."
// reset.less and it definitely exists in that folder. 

Сценарий 2: LessEngine.TransformToCss()

var content = new StringBuilder();
var engine = new LessEngine();

foreach (var file in bundle.Files)
{
    // text is extracted correctly.
    var text = File.ReadAllText(file.FullName);
    // transform function returns an empty string, no errors
    var css = engine.TransformToCss(text, file.FullName);
    content.AppendLine(css);
}
bundle.Content = content.ToString();

Вопрос

У кого-нибудь есть понимание любой из этих ошибок? Знать какие-либо решения? Для меня это не имеет смысла. Спасибо.

4b9b3361

Ответ 1

Ничего себе! То, что много обручей прыгает, чтобы найти источник проблемы.

Хорошей стратегией для таких проблем является очистка слоев от простейшего случая. Вы не видите сообщений об ошибках, потому что что-то в процессе связывания ходит без прерывания записи сообщений, которые следует рассматривать отдельно. Это предполагает, что вы включили бесконтактный журнал ошибок.

Вместо этого:

@Styles.Render( "~/пакет/стиль/самозагрузки" )

использовать

<link rel="stylesheet/less" href="~/Content/style/bootstrap.less" type="text/css" />

При попытке просмотреть меньшее количество файлов в браузере вы должны получить следующее сообщение:

блок директивы с непризнанным форматом в строке 253 в файле '/Content/Themes/bootstrap/mixins.less':

[252]://Множество теневых решений из http://toekneestuck.com/blog/2012/05/15/less-css-arguments-variable/[253]: @props: ~ "@{arguments}".replace(/[\[\]]|\,\sX/g, '');        - ^ [254]: -webkit-box-shadow: @props;

Источником этой проблемы является взлом в бутстрапе, который не играет хорошо с бесчисленными. Чтобы устранить эту проблему, замените следующие строки в mixins.less:

// Drop shadows
.box-shadow(@shadowA, @shadowB:X, ...){
  // Multiple shadow solution from http://toekneestuck.com/blog/2012/05/15/less-css-arguments-variable/
  @props: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`;
  -webkit-box-shadow: @props;
     -moz-box-shadow: @props;
          box-shadow: @props;
}

со следующими строками:

// Drop shadows
.box-shadow(@shadow){
  -webkit-box-shadow: @shadow;
     -moz-box-shadow: @shadow;
          box-shadow: @shadow;
}
.box-shadow(@shadow1, @shadow2) {
  -webkit-box-shadow: @shadow1, @shadow2;
     -moz-box-shadow: @shadow1, @shadow2;
          box-shadow: @shadow1, @shadow2;
}
.box-shadow(@shadow1, @shadow2, @shadow3) {
  -webkit-box-shadow: @shadow1, @shadow2, @shadow3;
     -moz-box-shadow: @shadow1, @shadow2, @shadow3;
          box-shadow: @shadow1, @shadow2, @shadow3;
}

Надеюсь, это сработает для вас.

Ответ 2

Сценарий 1 (разрешенный)

Оказывается, на самом деле это не было "reset.less", но на "bootstrap.less", первая строка которого является оператором импорта "reset.less". Реализация решателя пути в цикле исправила эту проблему.

// let them throw exceptions on casting because they should never be null.
var importer = (Importer)lessParser.Importer;
var filereader = (FileReader)importer.FileReader;
// "As" casting here ensures if the path resolver is another type that we cannot cast 
// (ex. RelativePathResolver) that we get a null rather than an exception.
var pathresolver = filereader.PathResolver as ImportedFilePathResolver;
if (pathresolver != null)
    pathresolver.CurrentFilePath = currentFilePath;
else
    filereader.PathResolver = new ImportedFilePathResolver(currentFilePath);

Сценарий 2 (все еще разбитый)

См. ответ Джоэла выше. Верно. Одно дело отметить, что этот Tony Stark взломает из Bootstrap 2.1.2, за углом: https://github.com/twitter/bootstrap/issues/5079