46 lines
894 B
TypeScript
46 lines
894 B
TypeScript
|
const escapeRE = /["'&<>]/
|
||
|
|
||
|
export function escape(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
|
||
|
}
|