55 lines
1.1 KiB
JavaScript
55 lines
1.1 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
const matchHtmlRegExp = /["'&<>]/;
|
||
|
|
||
|
/**
|
||
|
* @param {string} string raw HTML
|
||
|
* @returns {string} escaped HTML
|
||
|
*/
|
||
|
function escapeHtml(string) {
|
||
|
const str = `${string}`;
|
||
|
const match = matchHtmlRegExp.exec(str);
|
||
|
if (!match) {
|
||
|
return str;
|
||
|
}
|
||
|
let escape;
|
||
|
let html = "";
|
||
|
let index = 0;
|
||
|
let lastIndex = 0;
|
||
|
for (({
|
||
|
index
|
||
|
} = match); index < str.length; index++) {
|
||
|
switch (str.charCodeAt(index)) {
|
||
|
// "
|
||
|
case 34:
|
||
|
escape = """;
|
||
|
break;
|
||
|
// &
|
||
|
case 38:
|
||
|
escape = "&";
|
||
|
break;
|
||
|
// '
|
||
|
case 39:
|
||
|
escape = "'";
|
||
|
break;
|
||
|
// <
|
||
|
case 60:
|
||
|
escape = "<";
|
||
|
break;
|
||
|
// >
|
||
|
case 62:
|
||
|
escape = ">";
|
||
|
break;
|
||
|
default:
|
||
|
// eslint-disable-next-line no-continue
|
||
|
continue;
|
||
|
}
|
||
|
if (lastIndex !== index) {
|
||
|
html += str.substring(lastIndex, index);
|
||
|
}
|
||
|
lastIndex = index + 1;
|
||
|
html += escape;
|
||
|
}
|
||
|
return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
|
||
|
}
|
||
|
module.exports = escapeHtml;
|