mirror of
https://github.com/honojs/hono.git
synced 2024-11-29 17:46:30 +01:00
a7ad89ccef
Close #445
45 lines
1.1 KiB
TypeScript
45 lines
1.1 KiB
TypeScript
export type HtmlEscaped = { isEscaped: true }
|
|
export type HtmlEscapedString = string & HtmlEscaped
|
|
export type StringBuffer = [string]
|
|
|
|
// The `escapeToBuffer` implementation is based on code from the MIT licensed `react-dom` package.
|
|
// https://github.com/facebook/react/blob/main/packages/react-dom/src/server/escapeTextForBrowser.js
|
|
|
|
const escapeRe = /[&<>"]/
|
|
|
|
export const escapeToBuffer = (str: string, buffer: StringBuffer): void => {
|
|
const match = str.search(escapeRe)
|
|
if (match === -1) {
|
|
buffer[0] += str
|
|
return
|
|
}
|
|
|
|
let escape
|
|
let index
|
|
let lastIndex = 0
|
|
|
|
for (index = match; index < str.length; index++) {
|
|
switch (str.charCodeAt(index)) {
|
|
case 34: // "
|
|
escape = '"'
|
|
break
|
|
case 38: // &
|
|
escape = '&'
|
|
break
|
|
case 60: // <
|
|
escape = '<'
|
|
break
|
|
case 62: // >
|
|
escape = '>'
|
|
break
|
|
default:
|
|
continue
|
|
}
|
|
|
|
buffer[0] += str.substring(lastIndex, index) + escape
|
|
lastIndex = index + 1
|
|
}
|
|
|
|
buffer[0] += str.substring(lastIndex, index)
|
|
}
|