88 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
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;
 | 
						|
}());
 |