diff options
author | devin ivy <devinivy@gmail.com> | 2024-06-27 13:02:29 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-27 13:02:29 -0400 |
commit | 49396451ec8c877aebd27299a98c1b9e5b1e6cd4 (patch) | |
tree | c424c554a431c9594896a09bf422c737c2341e62 /bskyogcard/src/util.ts | |
parent | f6b138f709bcf52248e3f0c5a1ef67abe96bef9c (diff) | |
download | voidsky-49396451ec8c877aebd27299a98c1b9e5b1e6cd4.tar.zst |
bskyogcard: support emoji, more languages, long starter pack names (#4668)
Diffstat (limited to 'bskyogcard/src/util.ts')
-rw-r--r-- | bskyogcard/src/util.ts | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/bskyogcard/src/util.ts b/bskyogcard/src/util.ts new file mode 100644 index 000000000..2b86ded06 --- /dev/null +++ b/bskyogcard/src/util.ts @@ -0,0 +1,37 @@ +import twemoji from 'twemoji' + +import {renderLogger} from './logger.js' + +const U200D = String.fromCharCode(0x200d) +const UFE0F_REGEXP = /\uFE0F/g + +export async function loadEmojiAsSvg(chars: string) { + const cached = emojiCache.get(chars) + if (cached) return cached + const iconCode = twemoji.convert.toCodePoint( + chars.indexOf(U200D) < 0 ? chars.replace(UFE0F_REGEXP, '') : chars, + ) + const res = await fetch(getEmojiUrl(iconCode)) + const body = await res.arrayBuffer() + if (!res.ok) { + renderLogger.warn( + {status: res.status, err: Buffer.from(body).toString()}, + 'could not fetch emoji', + ) + return + } + const svg = + 'data:image/svg+xml;base64,' + Buffer.from(body).toString('base64') + emojiCache.set(chars, svg) + return svg +} + +const emojiCache = new Map<string, string>() + +function getEmojiUrl(code: string) { + return ( + 'https://cdnjs.cloudflare.com/ajax/libs/twemoji/14.0.2/svg/' + + code.toLowerCase() + + '.svg' + ) +} |