Spaces:
Sleeping
Sleeping
; | |
const internals = {}; | |
module.exports = function (input) { | |
if (!input) { | |
return ''; | |
} | |
let escaped = ''; | |
for (let i = 0; i < input.length; ++i) { | |
const charCode = input.charCodeAt(i); | |
if (internals.isSafe(charCode)) { | |
escaped += input[i]; | |
} | |
else { | |
escaped += internals.escapeHtmlChar(charCode); | |
} | |
} | |
return escaped; | |
}; | |
internals.escapeHtmlChar = function (charCode) { | |
const namedEscape = internals.namedHtml[charCode]; | |
if (typeof namedEscape !== 'undefined') { | |
return namedEscape; | |
} | |
if (charCode >= 256) { | |
return '&#' + charCode + ';'; | |
} | |
const hexValue = charCode.toString(16).padStart(2, '0'); | |
return `&#x${hexValue};`; | |
}; | |
internals.isSafe = function (charCode) { | |
return (typeof internals.safeCharCodes[charCode] !== 'undefined'); | |
}; | |
internals.namedHtml = { | |
'38': '&', | |
'60': '<', | |
'62': '>', | |
'34': '"', | |
'160': ' ', | |
'162': '¢', | |
'163': '£', | |
'164': '¤', | |
'169': '©', | |
'174': '®' | |
}; | |
internals.safeCharCodes = (function () { | |
const safe = {}; | |
for (let i = 32; i < 123; ++i) { | |
if ((i >= 97) || // a-z | |
(i >= 65 && i <= 90) || // A-Z | |
(i >= 48 && i <= 57) || // 0-9 | |
i === 32 || // space | |
i === 46 || // . | |
i === 44 || // , | |
i === 45 || // - | |
i === 58 || // : | |
i === 95) { // _ | |
safe[i] = null; | |
} | |
} | |
return safe; | |
}()); | |