diff --git a/doc/UTIL_API.md b/doc/UTIL_API.md index d6e0028..055fc31 100644 --- a/doc/UTIL_API.md +++ b/doc/UTIL_API.md @@ -1083,6 +1083,21 @@ Escapes a string for insertion into HTML, replacing &, <, >, ", `, and ' charact escape('You & Me'); -> // -> 'You & Me' ``` +## escapeJsStr + +Escape string to be a valid JavaScript string literal between quotes. + +http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 + +|Name |Type |Desc | +|------|------|----------------| +|str |string|String to escape| +|return|string|Escaped string | + +```javascript +escapeJsStr('\"\n'); // -> '\\"\\\\n' +``` + ## escapeJsonStr Escape json string. diff --git a/eustia/escapeJsonStr.js b/eustia/escapeJsonStr.js index 59bb49f..549dfbb 100644 --- a/eustia/escapeJsonStr.js +++ b/eustia/escapeJsonStr.js @@ -1,9 +1,9 @@ /* Escape json string. */ +_('escapeJsStr'); + function exports(str) { - return str.replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\f|\n|\r|\t/g, ''); + return escapeJsStr(str).replace(/\\'/g, '\''); } diff --git a/src/lib/JsonViewer.js b/src/lib/JsonViewer.js index 13607b6..5f807e8 100644 --- a/src/lib/JsonViewer.js +++ b/src/lib/JsonViewer.js @@ -258,4 +258,4 @@ function objToArr(val) const LIGHTER_KEY = ['__proto__']; -let encode = str => escape(toStr(str)); +let encode = str => escape(toStr(str)).replace(/\n/g, '↵').replace(/\f|\r|\t/g, ''); diff --git a/src/lib/getAbstract.js b/src/lib/getAbstract.js index ebfad83..fc6c7b3 100644 --- a/src/lib/getAbstract.js +++ b/src/lib/getAbstract.js @@ -39,7 +39,7 @@ export default function getAbstract(obj, { strWrapper = '', boolWrapper = '', specialWrapper = '', - strEscape = str => escape(str), + strEscape = str => escape(str).replace(/\\n/g, '↵').replace(/\\f|\\r|\\t/g, '').replace(/\\/g, ''), wrapperEnd = ''; let wrapKey = key => keyWrapper + strEscape(key) + wrapperEnd, @@ -52,8 +52,6 @@ export default function getAbstract(obj, { { str = toStr(str); - str = str.replace(/\\/g, ''); - if (contain(SPECIAL_VAL, str) || startWith(str, 'Array[')) { return specialWrapper + strEscape(str) + wrapperEnd; diff --git a/src/lib/stringifyUtil.js b/src/lib/stringifyUtil.js index cb4ecd0..c197588 100644 --- a/src/lib/stringifyUtil.js +++ b/src/lib/stringifyUtil.js @@ -177,6 +177,90 @@ export var endWith = _.endWith = (function () return exports; })(); +/* ------------------------------ toStr ------------------------------ */ + +export var toStr = _.toStr = (function () +{ + /* Convert value to a string. + * + * |Name |Type |Desc | + * |------|------|----------------| + * |val |* |Value to convert| + * |return|string|Resulted string | + * + * ```javascript + * toStr(null); // -> '' + * toStr(1); // -> '1' + * toStr(false); // -> 'false' + * toStr([1, 2, 3]); // -> '1,2,3' + * ``` + */ + + /* module + * env: all + * test: all + */ + + function exports(val) + { + return val == null ? '' : val.toString(); + } + + return exports; +})(); + +/* ------------------------------ escapeJsStr ------------------------------ */ + +export var escapeJsStr = _.escapeJsStr = (function () +{ + /* Escape string to be a valid JavaScript string literal between quotes. + * + * http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 + * + * |Name |Type |Desc | + * |------|------|----------------| + * |str |string|String to escape| + * |return|string|Escaped string | + * + * ```javascript + * escapeJsStr('\"\n'); // -> '\\"\\\\n' + * ``` + */ + + /* module + * env: all + * test: all + */ + + /* dependencies + * toStr + */ + + function exports(str) + { + return toStr(str).replace(regEscapeChars, function (char) + { + switch (char) + { + case '"': + case '\'': + case '\\': + return '\\' + char; + case '\n': return '\\n'; + case '\r': return '\\r'; + // Line separator + case '\u2028': return '\\u2028'; + // Paragraph separator + case '\u2029': return '\\u2029'; + } + }); + } + + var regEscapeChars = /["'\\\n\r\u2028\u2029]/g; + + return exports; +})(); + /* ------------------------------ escapeJsonStr ------------------------------ */ export var escapeJsonStr = _.escapeJsonStr = (function () @@ -184,11 +268,13 @@ export var escapeJsonStr = _.escapeJsonStr = (function () /* Escape json string. */ + /* dependencies + * escapeJsStr + */ + function exports(str) { - return str.replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\f|\n|\r|\t/g, ''); + return escapeJsStr(str).replace(/\\'/g, '\''); } return exports; @@ -369,7 +455,7 @@ export var isArr = _.isArr = (function (exports) * * |Name |Type |Desc | * |------|-------|----------------------------------| - * |val |* |The value to check | + * |val |* |Value to check | * |return|boolean|True if value is an `Array` object| * * ```javascript @@ -1087,38 +1173,6 @@ export var filter = _.filter = (function () return exports; })(); -/* ------------------------------ toStr ------------------------------ */ - -export var toStr = _.toStr = (function () -{ - /* Convert value to a string. - * - * |Name |Type |Desc | - * |------|------|----------------| - * |val |* |Value to convert| - * |return|string|Resulted string | - * - * ```javascript - * toStr(null); // -> '' - * toStr(1); // -> '1' - * toStr(false); // -> 'false' - * toStr([1, 2, 3]); // -> '1,2,3' - * ``` - */ - - /* module - * env: all - * test: all - */ - - function exports(val) - { - return val == null ? '' : val.toString(); - } - - return exports; -})(); - /* ------------------------------ uniqId ------------------------------ */ export var uniqId = _.uniqId = (function () diff --git a/src/lib/util.js b/src/lib/util.js index 621c868..e8645ba 100644 --- a/src/lib/util.js +++ b/src/lib/util.js @@ -976,6 +976,58 @@ export var escape = _.escape = (function () return exports; })(); +/* ------------------------------ escapeJsStr ------------------------------ */ + +export var escapeJsStr = _.escapeJsStr = (function () +{ + /* Escape string to be a valid JavaScript string literal between quotes. + * + * http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 + * + * |Name |Type |Desc | + * |------|------|----------------| + * |str |string|String to escape| + * |return|string|Escaped string | + * + * ```javascript + * escapeJsStr('\"\n'); // -> '\\"\\\\n' + * ``` + */ + + /* module + * env: all + * test: all + */ + + /* dependencies + * toStr + */ + + function exports(str) + { + return toStr(str).replace(regEscapeChars, function (char) + { + switch (char) + { + case '"': + case '\'': + case '\\': + return '\\' + char; + case '\n': return '\\n'; + case '\r': return '\\r'; + // Line separator + case '\u2028': return '\\u2028'; + // Paragraph separator + case '\u2029': return '\\u2029'; + } + }); + } + + var regEscapeChars = /["'\\\n\r\u2028\u2029]/g; + + return exports; +})(); + /* ------------------------------ escapeJsonStr ------------------------------ */ export var escapeJsonStr = _.escapeJsonStr = (function () @@ -983,11 +1035,13 @@ export var escapeJsonStr = _.escapeJsonStr = (function () /* Escape json string. */ + /* dependencies + * escapeJsStr + */ + function exports(str) { - return str.replace(/\\/g, '\\\\') - .replace(/"/g, '\\"') - .replace(/\f|\n|\r|\t/g, ''); + return escapeJsStr(str).replace(/\\'/g, '\''); } return exports;