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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, {
|
||||||
|
|||||||
Reference in New Issue
Block a user