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;
 | |
| }());
 |