function get_escaped_char1(char) {
switch (char) {
case '"': return '\\"';
case '<': return '\\u003C';
case '\\': return '\\\\';
case '\n': return '\\n';
case '\r': return '\\r';
case '\t': return '\\t';
case '\b': return '\\b';
case '\f': return '\\f';
case '\u2028': return '\\u2028';
case '\u2029': return '\\u2029';
default:
return char < ' '
? `\\u${char.charCodeAt(0).toString(16).padStart(4, '0')}`
: '';
}
}
function stringify_string1(str) {
let result = '';
let last_pos = 0;
const len = str.length;
for (let i = 0; i < len; i += 1) {
const char = str[i];
const replacement = get_escaped_char1(char);
if (replacement) {
result += str.slice(last_pos, i) + replacement;
last_pos = i + 1;
}
}
return `"${last_pos === 0 ? str : result + str.slice(last_pos)}"`;
}
function get_escaped_char2(char) {
switch (char) {
case '"': return '\\"';
case '<': return '\\u003C';
case '\\': return '\\\\';
case '\n': return '\\n';
case '\r': return '\\r';
case '\t': return '\\t';
case '\b': return '\\b';
case '\f': return '\\f';
case '\u2028': return '\\u2028';
case '\u2029': return '\\u2029';
default:
return char < ' '
? `\\u${char.charCodeAt(0).toString(16).padStart(4, '0')}`
: char;
}
}
const reg = /["<\\\n\r\t\b\f\u2028\u2029\x00-\x1f]/g
function stringify_string2(str) {
return reg.test(str) ? `"${str.replace(reg, get_escaped_char2)}"` : `"${str}"`;
}
const m = {
'<': '\\u003C',
'\u2028': '\\u2028',
'\u2029': '\\u2029'
}
const preg = /[<\u2028\u2029]/g;
function stringify_string3(str) {
return JSON.stringify(str).replace(preg, char => m[char]);
}
function stringify_string4(str) {
return reg.test(str) ? JSON.stringify(str).replace(preg, char => m[char]) : `"${str}"`;
}
const tests = [
'short',
'<blah>',
];