Less.js: Programmatische Verwendung des Parsers

Erstellt am 17. Jan. 2016  ·  5Kommentare  ·  Quelle: less/less.js

Hi!
Ich arbeite an einem less2sass Konverter für meine Bachelorarbeit, später soll es auch ein sass2less Konverter werden. Ich suche nach einer Methode, um das AST aus einem weniger Projekt herauszuholen. Ich habe mit folgendem Code experimentiert:

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));
});

Ich bekomme den AST zurück, es sei denn, ich versuche nicht, eine andere weniger Datei zu importieren. Was ich aus dem Code verstanden habe ist, dass der Parser einen Parameter mit den verwendeten Importen erhalten soll, die vom importManager erstellt werden, der den Kontext als Parameter benötigt usw. Könnte ich einen Hinweis bekommen, wie man den AST eines Less bekommt? Projekt, wenn ich seine Quelldatei kenne?

needs info

Hilfreichster Kommentar

Danke Jungs. Problem gelöst :) Ich füge den eigentlichen Code hier ein, der funktioniert, um den AST zu erhalten, falls jemand vor der gleichen Hürde steht und auf dieses Problem stößt.

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));
});

Alle 5 Kommentare

Würde dir das helfen? https://github.com/matthew-dean/postcss-less/blob/master/lib/render.js

Auf diese Weise konnte ich den bewerteten AST-Baum erhalten, und ich glaube, der bewertete Baum enthält einen Verweis auf den nicht bewerteten Baum.

Ich bekomme den AST zurück, es sei denn, ich versuche nicht, eine andere weniger Datei zu importieren.

Bei Importen sollte es keinen Unterschied machen, aber nicht verpassen:

und legen Sie dann das Dateinamenfeld in den Optionen auf den Dateinamen der Hauptdatei fest. less übernimmt die gesamte Abwicklung der Importe.

in Programmatic-Usage (weitere Details in https://github.com/less/less.js/issues/2342#issuecomment-67596931).

dass der Parser bei den verwendeten Importen, die vom importManager erzeugt werden, einen Parameter bekommen soll, der den Kontext als Parameter benötigt usw.

Nicht wirklich. importManager ist (ungefähr) ein Teil des Parsers und alle Importe werden (normalerweise) innerhalb des Parsers selbst abgewickelt.

Danke Jungs. Problem gelöst :) Ich füge den eigentlichen Code hier ein, der funktioniert, um den AST zu erhalten, falls jemand vor der gleichen Hürde steht und auf dieses Problem stößt.

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));
});

Ist das möglich, dass die Parse-Funktion eine Option bietet, die den Import ignoriert? In meinem Fall habe ich einige spezielle Regeln für Importpfade, sodass der interne Importprozess von less.js nicht angepasst würde. Könnten wir die Zeichenfolge einfach ohne Auswertung nach AST analysieren?

Ich habe gerade den Quellcode gelesen und festgestellt, dass ich { processImports: false } , um den Importvorgang zu deaktivieren, es funktioniert für mich :)

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen