Less.js: Uso programático do analisador

Criado em 17 jan. 2016  ·  5Comentários  ·  Fonte: less/less.js

Olá!
Estou trabalhando em um conversor less2sass para minha tese de bacharelado, mais tarde ele deve se tornar um conversor sass2less também. Estou procurando um método para obter o AST de um projeto menos. Tenho experimentado o seguinte código:

var parser = new(less.Parser)({}, {contents: {}}, {});
var contents = ".foo {\
  background: #900;\
}\
<strong i="7">@import</strong> \"import/this-is-valid.less\";";
parser.parse(contents, function (e, tree) {
   console.log(JSON.stringify(tree, null, 2));
});

Recebo o AST de volta, a menos que não tente importar outro arquivo less. O que entendi do código é que o analisador deve obter um parâmetro com as importações usadas, que são criadas pelo importManager, que precisa do contexto como um parâmetro etc. projeto, se eu souber seu arquivo de origem?

needs info

Comentários muito úteis

Obrigado, pessoal. Problema resolvido :) Estou colocando o código real aqui, que funciona para obter o AST, caso alguém esteja enfrentando o mesmo obstáculo e se depara com esse problema.

var less = require('less')
  , fs = require('fs')
  , path = require('path');

var src = './test_import.less'; //some less source file
var result = less.parse(fs.readFileSync(src).toString(), {
  filename: path.resolve(src)
}, function(e, tree) {
  console.log(JSON.stringify(tree, null, 2));
});

Todos 5 comentários

Isso te ajudaria? https://github.com/matthew-dean/postcss-less/blob/master/lib/render.js

Consegui obter a árvore AST avaliada dessa maneira e acredito que a árvore avaliada contém uma referência à árvore não avaliada.

Recebo o AST de volta, a menos que não tente importar outro arquivo less.

Não deve haver diferença para as importações, apenas certifique-se de não perder:

e, em seguida, defina o campo do nome do arquivo nas opções para ser o nome do arquivo principal. less vai cuidar de todo o processamento das importações.

no uso programático (mais detalhes em https://github.com/less/less.js/issues/2342#issuecomment-67596931).

que o analisador deve obter um parâmetro com as importações utilizadas, que são criadas pelo importManager, que precisa do contexto como parâmetro, etc.

Na verdade. importManager é (aproximadamente) uma parte do analisador e todas as importações são (normalmente) tratadas dentro do próprio analisador.

Obrigado, pessoal. Problema resolvido :) Estou colocando o código real aqui, que funciona para obter o AST, caso alguém esteja enfrentando o mesmo obstáculo e se depara com esse problema.

var less = require('less')
  , fs = require('fs')
  , path = require('path');

var src = './test_import.less'; //some less source file
var result = less.parse(fs.readFileSync(src).toString(), {
  filename: path.resolve(src)
}, function(e, tree) {
  console.log(JSON.stringify(tree, null, 2));
});

É possível que a função de análise ofereça uma opção que ignora a importação? No meu caso, tenho algumas regras especiais para caminhos de importação, então o processo de importação interna de less.js não seria adequado. Poderíamos apenas analisar a string para AST sem qualquer avaliação?

Acabei de ler o código-fonte e descobri que poderia passar { processImports: false } para desabilitar o processo de importação, funciona para mim :)

less.parse(content, { processImports: false }, (e, tree) => {
  if (e) { return console.error(e) };
  return console.log(tree);
})

Esta página foi útil?
0 / 5 - 0 avaliações