function escape (value) {
const str = '' + value;
const res = str.replace(/[&<]/g, (char) => '&#' + char.charCodeAt(0) + ';');
return res;
}
const ATTR_REGEX = /[&"]/g;
const TEXT_REGEX = /[&<]/g;
function escape_new (value, is_attr = false) {
const str = '' + value;
const pattern = is_attr ? ATTR_REGEX : TEXT_REGEX;
pattern.lastIndex = 0;
let escaped = '';
let last = 0;
while (pattern.exec(str)) {
const idx = pattern.lastIndex - 1;
escaped += str.substring(last, idx) + ('&#' + str.charCodeAt(idx) + ';');
last = idx + 1;
}
return escaped + str.substring(last);
}
function escape_no_re (value, is_attr = false) {
const str = '' + value;
let escaped = '';
let last = 0;
for (let idx = 0, len = str.length; idx < len; idx++) {
const char = str.charCodeAt(idx);
if (char === 38 || char === (is_attr ? 34 : 60)) {
escaped += str.substring(last, idx) + ('&#' + char + ';');
last = idx + 1;
}
}
return escaped + str.substring(last);
}