Merge 0b6b8b3da3 into a84564d1a8
This commit is contained in:
commit
934c687e93
|
|
@ -58,6 +58,7 @@ function OutputStream(options) {
|
|||
quote_keys : false,
|
||||
space_colon : true,
|
||||
ascii_only : false,
|
||||
xml_safe : false,
|
||||
unescape_regexps : false,
|
||||
inline_script : false,
|
||||
width : 80,
|
||||
|
|
@ -125,8 +126,10 @@ function OutputStream(options) {
|
|||
|
||||
function make_string(str, quote) {
|
||||
var dq = 0, sq = 0;
|
||||
str = str.replace(/[\\\b\f\n\r\v\t\x22\x27\u2028\u2029\0\ufeff]/g,
|
||||
function(s, i){
|
||||
var re = options.xml_safe ?
|
||||
/[\x00-\x1f\x22\x27\u2028\u2029\0\ud800-\udfff\ufeff\ufffe\uffff]/g :
|
||||
/[\\\b\f\n\r\v\t\x22\x27\u2028\u2029\0\ufeff]/g;
|
||||
str = str.replace(re, function(s, i){
|
||||
switch (s) {
|
||||
case '"': ++dq; return '"';
|
||||
case "'": ++sq; return "'";
|
||||
|
|
@ -137,13 +140,10 @@ function OutputStream(options) {
|
|||
case "\b": return "\\b";
|
||||
case "\f": return "\\f";
|
||||
case "\x0B": return options.screw_ie8 ? "\\v" : "\\x0B";
|
||||
case "\u2028": return "\\u2028";
|
||||
case "\u2029": return "\\u2029";
|
||||
case "\ufeff": return "\\ufeff";
|
||||
case "\0":
|
||||
return /[0-7]/.test(str.charAt(i+1)) ? "\\x00" : "\\0";
|
||||
}
|
||||
return s;
|
||||
return to_ascii(s);
|
||||
});
|
||||
function quote_single() {
|
||||
return "'" + str.replace(/\x27/g, "\\'") + "'";
|
||||
|
|
@ -1293,7 +1293,24 @@ function OutputStream(options) {
|
|||
}
|
||||
});
|
||||
|
||||
function regexp_safe_literal(code) {
|
||||
var xml_unsafe = [
|
||||
// all C0 characters except tab, newline and return are invalid
|
||||
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||
0x08, 0x0c, 0x0e, 0x0f,
|
||||
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
|
||||
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
|
||||
0xfffe, 0xffff
|
||||
];
|
||||
|
||||
function regexp_safe_literal(code, xml_safe) {
|
||||
if (xml_safe) {
|
||||
if (xml_unsafe.indexOf(code) >= 0)
|
||||
return false;
|
||||
// C1 (except 0x85) and surrogate pair code points are invalid
|
||||
if ((code >= 0x7f && code != 0x85 && code <= 0x9f)
|
||||
|| (code >= 0xd800 && code <= 0xdfff))
|
||||
return false;
|
||||
}
|
||||
return [
|
||||
0x5c , // \
|
||||
0x2f , // /
|
||||
|
|
@ -1326,10 +1343,11 @@ function OutputStream(options) {
|
|||
if (output.option("ascii_only")) {
|
||||
str = output.to_ascii(str);
|
||||
} else if (output.option("unescape_regexps")) {
|
||||
var xml_safe = output.option("xml_safe");
|
||||
str = str.split("\\\\").map(function(str){
|
||||
return str.replace(/\\u[0-9a-fA-F]{4}|\\x[0-9a-fA-F]{2}/g, function(s){
|
||||
var code = parseInt(s.substr(2), 16);
|
||||
return regexp_safe_literal(code) ? String.fromCharCode(code) : s;
|
||||
return regexp_safe_literal(code, xml_safe) ? String.fromCharCode(code) : s;
|
||||
});
|
||||
}).join("\\\\");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,16 +10,18 @@ ascii_only_true: {
|
|||
return "\x000\x001\x007\x008\x00" +
|
||||
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
||||
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff" +
|
||||
"\u2028\u2029\ufeff\uffff";
|
||||
}
|
||||
}
|
||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\\uffff\'}'
|
||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\\x7f\\x80\\x81 ... \\xfe\\xff\\u0fff\'+"\\u2028\\u2029\\ufeff\\uffff"}'
|
||||
}
|
||||
|
||||
ascii_only_false: {
|
||||
options = {}
|
||||
beautify = {
|
||||
ascii_only : false,
|
||||
xml_safe : false,
|
||||
screw_ie8 : true,
|
||||
beautify : false,
|
||||
}
|
||||
|
|
@ -28,9 +30,29 @@ ascii_only_false: {
|
|||
return "\x000\x001\x007\x008\x00" +
|
||||
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
||||
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff\uffff";
|
||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff" +
|
||||
"\u2028\u2029\ufeff\uffff";
|
||||
}
|
||||
}
|
||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\v\\f\\r\x0e\x0f"+"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\uffff\'}'
|
||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\x01\x02\x03\x04\x05\x06\x07\\b\\t\\n\\v\\f\\r\x0e\x0f"+"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\'+"\\u2028\\u2029\\ufeff\uffff"}'
|
||||
}
|
||||
|
||||
xml_safe_true: {
|
||||
options = {}
|
||||
beautify = {
|
||||
ascii_only : false,
|
||||
xml_safe : true,
|
||||
screw_ie8 : true,
|
||||
beautify : false,
|
||||
}
|
||||
input: {
|
||||
function f() {
|
||||
return "\x000\x001\x007\x008\x00" +
|
||||
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" +
|
||||
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" +
|
||||
"\x20\x21\x22\x23 ... \x7d\x7e\x7f\x80\x81 ... \xfe\xff\u0fff" +
|
||||
"\u2028\u2029\ufeff\ufffe\uffff";
|
||||
}
|
||||
}
|
||||
expect_exact: 'function f(){return"\\x000\\x001\\x007\\08\\0"+"\\0\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\b\\t\\n\\v\\f\\r\\x0e\\x0f"+"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\\x1f"+\' !"# ... }~\x7f\x80\x81 ... \xfe\xff\u0fff\'+"\\u2028\\u2029\\ufeff\\ufffe\\uffff"}'
|
||||
}
|
||||
|
|
|
|||
50
test/compress/regexp.js
Normal file
50
test/compress/regexp.js
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
regexp: {
|
||||
options = {}
|
||||
beautify = {
|
||||
ascii_only : false,
|
||||
xml_safe : false,
|
||||
unescape_regexps : true,
|
||||
screw_ie8 : true,
|
||||
beautify : false,
|
||||
}
|
||||
input: {
|
||||
function f() {
|
||||
return /[\x00\x0d\x1f \x61\u0fff\ud800\ufffe\uffff]/;
|
||||
}
|
||||
}
|
||||
expect_exact: 'function f(){return/[\\x00\\x0d\x1f a\u0fff\ud800\ufffe\uffff]/}'
|
||||
}
|
||||
|
||||
regexp_ascii_only_true: {
|
||||
options = {}
|
||||
beautify = {
|
||||
ascii_only : true,
|
||||
xml_safe : false,
|
||||
unescape_regexps : true,
|
||||
screw_ie8 : true,
|
||||
beautify : false,
|
||||
}
|
||||
input: {
|
||||
function f() {
|
||||
return /[\x00\x0d\x1f \x61\u0fff\ud800\ufffe\uffff]/;
|
||||
}
|
||||
}
|
||||
expect_exact: 'function f(){return/[\\x00\\x0d\\x1f \\x61\\u0fff\\ud800\\ufffe\\uffff]/}'
|
||||
}
|
||||
|
||||
regexp_xml_safe_true: {
|
||||
options = {}
|
||||
beautify = {
|
||||
ascii_only : false,
|
||||
xml_safe : true,
|
||||
unescape_regexps : true,
|
||||
screw_ie8 : true,
|
||||
beautify : false,
|
||||
}
|
||||
input: {
|
||||
function f() {
|
||||
return /[\x00\x0d\x1f \x61\u0fff\ud800\ufffe\uffff]/;
|
||||
}
|
||||
}
|
||||
expect_exact: 'function f(){return/[\\x00\\x0d\\x1f a\u0fff\\ud800\\ufffe\\uffff]/}'
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user