You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
2.6 KiB
116 lines
2.6 KiB
#!/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')); |
|
}
|
|
|