const fallbackNamedHtmlEntities = {
amp: '&',
apos: "'",
darr: '\u2193',
gt: '>',
laquo: '\u00ab',
larr: '\u2190',
nbsp: '\u00a0',
quot: '"',
raquo: '\u00bb',
rarr: '\u2192',
uarr: '\u2191',
}
export function decodeHtmlEntities(text) {
if (typeof document !== 'undefined') {
const textarea = document.createElement('textarea')
textarea.innerHTML = text
return textarea.value
}
return text.replace(/([0-9a-fA-F]+);?/g, (_, hex) => {
const codePoint = Number.parseInt(hex, 16)
return Number.isFinite(codePoint) ? String.fromCodePoint(codePoint) : ''
}).replace(/(\d+);?/g, (_, decimal) => {
const codePoint = Number.parseInt(decimal, 10)
return Number.isFinite(codePoint) ? String.fromCodePoint(codePoint) : ''
}).replace(/&([a-zA-Z][a-zA-Z0-9]+);?/g, (entity, name) => {
return fallbackNamedHtmlEntities[name] ?? entity
})
}
export function glyphLooksLikeHtml(text) {
const trimmedText = text.trim()
return trimmedText.startsWith('<') || /![]()