employ a better parser for command-line arguments

to support passing commas in strings in for example:

    uglifyjs2 -cd TEST="'a,b'" <<EOF
    console.log(TEST);
    EOF

    → console.log("a,b")

close #14
This commit is contained in:
Mihai Bazon
2012-10-17 15:56:45 +03:00
parent 8f66458598
commit a21f3c6cdd
2 changed files with 40 additions and 9 deletions

View File

@@ -97,9 +97,9 @@ if (ARGS.acorn) {
acorn = require("acorn"); acorn = require("acorn");
} }
var COMPRESS = getOptions("c"); var COMPRESS = getOptions("c", true);
var MANGLE = getOptions("m"); var MANGLE = getOptions("m", true);
var BEAUTIFY = getOptions("b"); var BEAUTIFY = getOptions("b", true);
if (COMPRESS && ARGS.d) { if (COMPRESS && ARGS.d) {
COMPRESS.global_defs = getOptions("d"); COMPRESS.global_defs = getOptions("d");
@@ -299,16 +299,36 @@ function normalize(o) {
} }
} }
function getOptions(x) { function getOptions(x, constants) {
x = ARGS[x]; x = ARGS[x];
if (!x) return null; if (!x) return null;
var ret = {}; var ret = {};
if (x !== true) { if (x !== true) {
x.replace(/^\s+|\s+$/g).split(/\s*,+\s*/).forEach(function(opt){ var ast;
var a = opt.split(/\s*[=:]\s*/); try {
ret[a[0]] = a.length > 1 ? new Function("return(" + a[1] + ")")() : true; ast = UglifyJS.parse(x);
}); } catch(ex) {
normalize(ret); if (ex instanceof UglifyJS.JS_Parse_Error) {
sys.error("Error parsing arguments in: " + x);
process.exit(1);
}
}
ast.walk(new UglifyJS.TreeWalker(function(node){
if (node instanceof UglifyJS.AST_Toplevel) return; // descend
if (node instanceof UglifyJS.AST_SimpleStatement) return; // descend
if (node instanceof UglifyJS.AST_Seq) return; // descend
if (node instanceof UglifyJS.AST_Assign) {
var name = node.left.print_to_string({ beautify: false }).replace(/-/g, "_");
var value = node.right;
if (constants)
value = new Function("return (" + value.print_to_string() + ")")();
ret[name] = value;
return true; // no descend
}
sys.error(node.TYPE)
sys.error("Error parsing arguments in: " + x);
process.exit(1);
}));
} }
return ret; return ret;
} }

View File

@@ -134,6 +134,17 @@ merge(Compressor.prototype, {
}; };
function make_node_from_constant(compressor, val, orig) { function make_node_from_constant(compressor, val, orig) {
// XXX: WIP.
// if (val instanceof AST_Node) return val.transform(new TreeTransformer(null, function(node){
// if (node instanceof AST_SymbolRef) {
// var scope = compressor.find_parent(AST_Scope);
// var def = scope.find_variable(node);
// node.thedef = def;
// return node;
// }
// })).transform(compressor);
if (val instanceof AST_Node) return val.transform(compressor);
switch (typeof val) { switch (typeof val) {
case "string": case "string":
return make_node(AST_String, orig, { return make_node(AST_String, orig, {