くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

satoriでTwemoji(Twitter絵文字)も含めて画像化する

ほそぼそと作ってるゲームアプリで、
絵文字に対応したときの備忘録(*´ω`*)

なお、Twemojiの本家は、こちら

つくったOGPはこんな感じ

OGP生成の話はこちら
nitro+satori+sharpを使った方法

satoriでTwemojiを使う

SVGPNGなどをおいてある本家はjdecked/twemojiだけど、
Node.js/TypeScriptではうまくつかえず...

@twemoji/parserでパースをしつつ対応した

@twemoji/parserの使い方

まずはインストール
(v15.1.1以降でないと型定義がないので注意)

pnpm add @twemoji/parser

使い方はこんな感じ
文字列をパースすると、絵文字の部分だけの情報を返してくれる

import { parse } from '@twemoji/parser';
const entities = parse('I 🧡 Twemoji! 🥳');
/*
entities = [
  {
    url: 'https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f9e1.svg',
    indices: [ 2, 4 ],
    text: '🧡',
    type: 'emoji'
  },
  {
    url: 'https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f973.svg',
    indices: [ 12, 14 ],
    text: '🥳',
    type: 'emoji'
  }
]
*/

satoriでtwemojiを使う

流れとしては、

  • 文字列をパースして、
  • 絵文字の部分を<img src="">に置き換える

という形

今回は1文字だけなので、こんな感じ

import twemoji from "@twemoji/parser";

function toTwemoji(text: string, size: number): string | null {
  // 文字列をパースして、png形式のURLを取得
  const entites = twemoji.parse(text, { assetType: "png" });
  if (entites.length < 1) return null;
  // pngのURLを使って、<img />を組み立てる
  const emojiUrl = entites[0].url;
  return `<img src="${emojiUrl}" style="width: ${size}px; height: ${size}px;" />`;
}

あとは、いつも通り、satoriで処理すればOK

satoriのドキュメントだとうまくいかない

最初はREADMEにあるgraphemeImagesloadAdditionalAssetを試したけど、だめだった...

JSXではないからなのか、loadAdditionalAssetは呼ばれず、
うまく動作しないようだった...

SVGだとうまくいかない

最初はこんな感じで、デフォルトの形式であるSVGを渡すようにしていたけど、
うまく描画されなかった...

const entites = twemoji.parse(text);

PNG形式にしたところ、うまく描画されるけど、
サイズを指定する必要があり、width/heightを付けている感じ

twemojiのバージョンを指定する

デフォルトでは、twemoji@latestになっている。
指定したい場合は、これを置き換えればOK

const emojiUrl = entites[0].url;
// https://cdn.jsdelivr.net/gh/jdecked/twemoji@latest/assets/svg/1f973.svg

const TWEMOJI_VERSION = "14.1.2";
const emojiUrl2 = entites[0].url.replaceAll("@latest", `@${TWEMOJI_VERSION}`);
// https://cdn.jsdelivr.net/gh/jdecked/twemoji@14.1.2/assets/svg/1f973.svg

Flutter側のtwemoji_v2が、twemoji v14.1.2のため、
アプリ上とOGP上で異なる絵文字にならないように、バージョンを固定している


以上!! 試行錯誤したけど、なんとかなった(*´ω`*)