Spaces:
Paused
Paused
| ; | |
| 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.get(charCode); | |
| if (namedEscape) { | |
| return namedEscape; | |
| } | |
| if (charCode >= 256) { | |
| return '&#' + charCode + ';'; | |
| } | |
| const hexValue = charCode.toString(16).padStart(2, '0'); | |
| return `&#x${hexValue};`; | |
| }; | |
| internals.isSafe = function (charCode) { | |
| return internals.safeCharCodes.has(charCode); | |
| }; | |
| internals.namedHtml = new Map([ | |
| [38, '&'], | |
| [60, '<'], | |
| [62, '>'], | |
| [34, '"'], | |
| [160, ' '], | |
| [162, '¢'], | |
| [163, '£'], | |
| [164, '¤'], | |
| [169, '©'], | |
| [174, '®'] | |
| ]); | |
| internals.safeCharCodes = (function () { | |
| const safe = new Set(); | |
| 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.add(i); | |
| } | |
| } | |
| return safe; | |
| }()); | |