const htmlEntityCodeToCharacter = {
nbsp: ' ',
cent: '¢',
pound: '£',
yen: '¥',
euro: '€',
copy: '©',
reg: '®',
lt: '<',
gt: '>',
quot: '"',
amp: '&',
apos: '\'',
} as const;
const toString = (object: unknown): string =>
(object ? `${ object }` : '');
const isHtmlEntityCode = (htmlEntityCode: string): htmlEntityCode is keyof typeof htmlEntityCodeToCharacter =>
htmlEntityCode in htmlEntityCodeToCharacter;
export const unescapeHTML = (str: string): string =>
toString(str)
.replace(/\&([^;]{1,10});/g, (entity, htmlEntityCode) => {
let match;
if (isHtmlEntityCode(htmlEntityCode)) {
return htmlEntityCodeToCharacter[htmlEntityCode];
}
match = htmlEntityCode.match(/^#x([\da-fA-F]+)$/);
if (match) {
return String.fromCharCode(parseInt(match[1], 16));
}
match = htmlEntityCode.match(/^#(\d+)$/);
if (match) {
return String.fromCharCode(~~match[1]);
}
return entity;
});