46 lines
898 B
TypeScript
46 lines
898 B
TypeScript
const escapeRE = /["'&<>]/
|
|
|
|
export function escapeHtml(string: unknown) {
|
|
const str = '' + string
|
|
const match = escapeRE.exec(str)
|
|
|
|
if (!match) {
|
|
return str
|
|
}
|
|
|
|
let html = ''
|
|
let escaped: string
|
|
let index: number
|
|
let lastIndex = 0
|
|
for (index = match.index; index < str.length; index++) {
|
|
switch (str.charCodeAt(index)) {
|
|
case 34: // "
|
|
escaped = '"'
|
|
break
|
|
case 38: // &
|
|
escaped = '&'
|
|
break
|
|
case 39: // '
|
|
escaped = '''
|
|
break
|
|
case 60: // <
|
|
escaped = '<'
|
|
break
|
|
case 62: // >
|
|
escaped = '>'
|
|
break
|
|
default:
|
|
continue
|
|
}
|
|
|
|
if (lastIndex !== index) {
|
|
html += str.substring(lastIndex, index)
|
|
}
|
|
|
|
lastIndex = index + 1
|
|
html += escaped
|
|
}
|
|
|
|
return lastIndex !== index ? html + str.substring(lastIndex, index) : html
|
|
}
|