--- /dev/null
+#!/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'));
+}