pinafore/src/routes/_utils/replaceEmoji.js
Nolan Lawson 4bd181d3cc
fix: update Sapper to latest (#775)
* fix: update to latest sapper

fixes #416

* fix error and debug pages

* requestIdleCallback makes column switching feel way nicer than double rAF

* add export feature

* add better csp info

* workaround for sapper sub-page issue

* clarify in readme about exporting

* fix now config

* switch from rIC to triple raf

* style-loader is no longer used

* update theming guide
2018-12-11 07:31:48 -08:00

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
}