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