👨‍👩‍👦

Kotlin Multiplatform Frameworkで使えるEmojiライブラリを作ったよという話

2022/12/19に公開

先日のKotlin Fest 2022にKotlin Multiplatform FrameworkとCompose Multiplatformについて発表しました。

その際@doyaaaaakenさんのOSSの普及戦略についての発表を見て、感銘を受けました。
特にCSVに詳しい人から怒りの長文コメントが来ても心が折れないところは印象深かったです。
https://www.youtube.com/watch?v=QZfE2ThlF2A

自分の発表でも、Kotlin Multiplatform Frameworkのライブラリが少ないから、みんなで興味持ってねという話をしましたし、自分でもMultiplatformのEmojiライブラリが無くてちょうど困っていたこともありました。
なので奮起してライブラリをリリースしてみました。
ライブラリ作成中は、@doyaaaaakenさんのkotlin-csvのgradleの設定はかなり参考にさせてもらい助かりました。
発表も含めて最後まで心が折れずに作業を続ける助けになりました、ありがとうございます。

余談ですが、Kotlin Multiplatform Frameworkはよく聞くMobileのKMMではなく、DesktopやWebを扱うものです。
Kotlin Multiplatform ProjectであるKMPも主にKMMを表す言葉として使われているし、KMFとは呼ばれてないので、早くいい名前を決めてくれないものでしょうか。
Compose MultiplatformもJetpack ComposeからJetpackを引いたものなので、検索性が恐ろしてく悪いので、別の名前を早く決めて欲しいです。この方も二年前からおっしゃっています

kemoji

作ったライブラリの名前はkemojiです。
kotlin-stdlib-commonにしか依存していない。pure Kotlin commonのライブラリです。

三年ほど更新されなくて最近のemojiには全く対応してない emoji-java をポーティングする形で実装しました。emoji-java はgithubのgemojiをemojiのデータ元として使っています。gemoji はgithubのライブラリなので、もちろんメンテナンスされています。
おそらくgithub emojiかgem emojiで gemoji とう名前なので、自分のライブラリはkotlin emojiで kemoji という名前にしました。
emojiがゲシュタルト崩壊しますね。

emoji-test.txt

gemoji は独自作成のemoji.jsonをDBとしてライブラリに同梱しています。それだけではなくユニコードコンソーシアムからemoji-test.txtを取得して、テストデータとして利用しています。
https://github.com/github/gemoji/blob/master/vendor/unicode-emoji-test.txt

emoji-javaはこの全Emoji情報でテストをパスするのを諦めて、テストをコメントアウトしていますが、自分の kemoji ではリスト中のunqualifiedなEmojiを除いたUnicode Emoji 14.0までの4441パターンの絵文字を判別できることを目指して実装しました。

ファイル読み込みはしたくない

kemoji では gemoji のemoji.jsonでは足りないデータをいくつか追加したりもして利用してしています。
ところがkotlin-stdlib-commonはファイル読み込みの機能がありませんので、通常はokioなどのライブラリを使うことになります。なるべくライブラリの依存を減らしたいという考えがあったため、emoji.jsonをDataクラスのリストのコードに変換する方法をとりました。具体的にはライブラリとは別のjvmモジュールを用意して、そこでjsonを読み込み、KotlinPoetで kemoji のモジュール内にコードを生成するという手法です。KotlinPoetに初めて挑戦してみましたが、本当に使いやすいライブラリで感動しました。

kemoji の詳しい使い方などの説明はここでは省きますが、是非READMEを読んで使ってみてください。

もしKotlin Multiplatform Frameworkに興味を持ったら

みなさんが最初にどんなことができるか理解しやすいようにsampleを今後も追加していく予定なので参考していただけると嬉しいです。
特にデイリーポータルZのレトロPCゲームのような写真が撮りたいという記事を参考した以下のサンプルは、ちょっと面白いものが出来たなと思っています。
https://twitter.com/seisuke/status/1601235248523939851
https://github.com/seisuke/compose_multiplatform_sample_js_canvas/blob/main/src/desktopMain/kotlin/RetroGameShaderSample.kt

Discussion