40 lines
1.3 KiB
JavaScript
40 lines
1.3 KiB
JavaScript
import { getEmojiRegex } from './emojiRegex'
|
|
|
|
// \ufe0f is a variation selector, which seems to appear for some reason in e.g. ™
|
|
let NON_EMOJI_REGEX = new RegExp('^[0-9#*™®\ufe0f]+$')
|
|
|
|
// replace emoji in HTML with something else, safely skipping HTML tags
|
|
export function replaceEmoji (string, replacer) {
|
|
let output = ''
|
|
let leftAngleBracketIdx = string.indexOf('<')
|
|
let currentIdx = 0
|
|
let emojiRegex = getEmojiRegex()
|
|
|
|
function safeReplacer (substring) {
|
|
// emoji regex matches digits and pound sign https://git.io/fpl6J
|
|
if (substring.match(NON_EMOJI_REGEX)) {
|
|
return substring
|
|
}
|
|
return replacer(substring)
|
|
}
|
|
|
|
while (leftAngleBracketIdx !== -1) {
|
|
let substring = string.substring(currentIdx, leftAngleBracketIdx)
|
|
|
|
output += substring.replace(emojiRegex, safeReplacer)
|
|
|
|
let rightAngleBracketIdx = string.indexOf('>', leftAngleBracketIdx + 1)
|
|
if (rightAngleBracketIdx === -1) { // broken HTML, abort
|
|
output += string.substring(leftAngleBracketIdx, string.length)
|
|
return output
|
|
}
|
|
output += string.substring(leftAngleBracketIdx, rightAngleBracketIdx) + '>'
|
|
currentIdx = rightAngleBracketIdx + 1
|
|
leftAngleBracketIdx = string.indexOf('<', currentIdx)
|
|
}
|
|
|
|
output += string.substring(currentIdx, string.length).replace(emojiRegex, safeReplacer)
|
|
|
|
return output
|
|
}
|