forked from lix-project/lix-website
117 lines
2.6 KiB
JavaScript
117 lines
2.6 KiB
JavaScript
|
#!/usr/bin/env node
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
var parseArgs = require('minimist');
|
||
|
var gonzales = require('..');
|
||
|
var fs = require('fs');
|
||
|
var path = require('path');
|
||
|
|
||
|
var options = getOptions();
|
||
|
|
||
|
if (options.help) {
|
||
|
displayHelp();
|
||
|
process.exit(0);
|
||
|
}
|
||
|
|
||
|
if (isSTDIN()) {
|
||
|
processSTDIN();
|
||
|
} else {
|
||
|
processFile(options._[0]);
|
||
|
}
|
||
|
|
||
|
function getOptions() {
|
||
|
var parserOptions = {
|
||
|
boolean: ['silent', 'simple'],
|
||
|
alias: {
|
||
|
help: 'h',
|
||
|
syntax: 's',
|
||
|
context: 'c'
|
||
|
}
|
||
|
};
|
||
|
return parseArgs(process.argv.slice(2), parserOptions);
|
||
|
}
|
||
|
|
||
|
function isSTDIN() {
|
||
|
return options._.indexOf('-') !== -1;
|
||
|
}
|
||
|
|
||
|
function processSTDIN() {
|
||
|
var input = '';
|
||
|
process.stdin.resume();
|
||
|
process.stdin.setEncoding('utf8');
|
||
|
process.stdin.on('data', data => {
|
||
|
input += data;
|
||
|
});
|
||
|
process.stdin.on('end', () => {
|
||
|
processInputData(input);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function processFile(file) {
|
||
|
if (!file) process.exit(0);
|
||
|
if (!options.syntax) options.syntax = path.extname(file).substring(1);
|
||
|
var css = fs.readFileSync(file, 'utf-8').trim();
|
||
|
processInputData(css);
|
||
|
}
|
||
|
|
||
|
function processInputData(input) {
|
||
|
try {
|
||
|
var ast = gonzales.parse(input, {
|
||
|
syntax: options.syntax,
|
||
|
context: options.context
|
||
|
});
|
||
|
printTree(ast);
|
||
|
process.exit(0);
|
||
|
} catch (e) {
|
||
|
if (!options.silent) process.stderr.write(e.toString());
|
||
|
process.exit(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function printTree(ast) {
|
||
|
if (!options.simple) {
|
||
|
var tree = ast.toJson();
|
||
|
process.stdout.write(tree);
|
||
|
} else {
|
||
|
var lastLevel;
|
||
|
|
||
|
ast.traverse(function(node, i, parent, lastLevel) {
|
||
|
var type = node.type;
|
||
|
var spaces = new Array(lastLevel).join(' |');
|
||
|
if (typeof node.content === 'string') {
|
||
|
var content = JSON.stringify(node.content);
|
||
|
console.log(spaces, '->', type);
|
||
|
console.log(spaces, ' ', content);
|
||
|
} else {
|
||
|
console.log(spaces, '->', type);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
var spaces = new Array(lastLevel).join(' -');
|
||
|
console.log(spaces);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function displayHelp() {
|
||
|
var help = [
|
||
|
'NAME',
|
||
|
' gonzlaes-pe — Parse a css file and print its parse tree in JSON',
|
||
|
'',
|
||
|
'SYNOPSIS',
|
||
|
' gonzales-pe [options] file.js',
|
||
|
' cat file.js | gonzales-pe [options] -',
|
||
|
'',
|
||
|
'OPTIONS',
|
||
|
' -s, --syntax',
|
||
|
' Syntax name: css, less, sass or scss.',
|
||
|
' -c, --context',
|
||
|
' Context of code part. See docs on node types for more info.',
|
||
|
' --simple',
|
||
|
' Print a simplified parse tree structure instead of JSON.',
|
||
|
' --silent',
|
||
|
' Don\'t print any error messages.'
|
||
|
];
|
||
|
console.log(help.join('\n'));
|
||
|
}
|