about summary refs log tree commit diff
path: root/bskyogcard/src/util.ts
diff options
context:
space:
mode:
authordevin ivy <devinivy@gmail.com>2024-06-27 13:02:29 -0400
committerGitHub <noreply@github.com>2024-06-27 13:02:29 -0400
commit49396451ec8c877aebd27299a98c1b9e5b1e6cd4 (patch)
treec424c554a431c9594896a09bf422c737c2341e62 /bskyogcard/src/util.ts
parentf6b138f709bcf52248e3f0c5a1ef67abe96bef9c (diff)
downloadvoidsky-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.ts37
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'
+  )
+}