このリポジトリには、テキストの実行をテキストプレゼンテーションとemoji-PreSentationの実行にセグメント化するためのレーゲル文法と生成されたCコードが含まれています。現在、ChromiumやPangoなどのプロジェクトで使用されています。
目標は、Unicode Technical Standard#51の文法定義に非常に近いままでいることです。
emoji_presentation_scanner.cファイルを含めることにより、次のAPIを呼び出すことができます
scan_emoji_presentation (emoji_text_iter_t p,
const emoji_text_iter_t pe,
bool* is_emoji,
bool* has_vs)
このAPI呼び出しは、次の文法トークンのためにemoji_text_iter_t pをスキャンし、次のトークンの終わりを指すイテレーターを返します。スキャナーがこれと比較し、どこで停止するかを把握できるように、エンドイテレーターをpeとして指定する必要があります。参照パラメーターis_emojiでは、このトークンが絵文字を持っているかどうかを返します。トークンにバリエーションセレクターが含まれている場合、 has_vs trueに設定されます。
文法トークンは、テキストプレゼンテーション用の絵文字とバリエーションセレクター15、絵文字プレゼンテーションシーケンス(絵文字 + vs16)、絵文字のプレゼンテーション絵文字または絵文字シーケンス、または単一のテキストプレゼンテーション文字の組み合わせです。
emoji_text_iter_t 、 EMOJI 、 EMOJI_TEXT_PRESENTATION 、 REGIONAL_INDICATOR 、 KEYCAP_BASEなど、レーゲルファイルの先頭で定義されているキャラクタークラスのバッファー上の反復タイプです。
emoji_text_iter_t独自のIteratorタイプにtypedef'sef's emody型にすることにより、エンコードで入力テキストバッファーを反復するアダプタークラスを実装できます。また、測定すると、次のUnicode文字クラスに類似したものを実装することで正しいレーゲルクラスを返します。
char EmojiSegmentationCategory(UChar32 codepoint) {
// Specific ones first.
if (codepoint == kCombiningEnclosingKeycapCharacter)
return COMBINING_ENCLOSING_KEYCAP;
if (codepoint == kCombiningEnclosingCircleBackslashCharacter)
return COMBINING_ENCLOSING_CIRCLE_BACKSLASH;
if (codepoint == kZeroWidthJoinerCharacter)
return ZWJ;
if (codepoint == kVariationSelector15Character)
return VS15;
if (codepoint == kVariationSelector16Character)
return VS16;
if (codepoint == 0x1F3F4)
return TAG_BASE;
if ((codepoint >= 0xE0030 && codepoint <= 0xE0039) ||
(codepoint >= 0xE0061 && codepoint <= 0xE007A))
return TAG_SEQUENCE;
if (codepoint == 0xE007F)
return TAG_TERM;
if (Character::IsEmojiModifierBase(codepoint))
return EMOJI_MODIFIER_BASE;
if (Character::IsModifier(codepoint))
return EMOJI_MODIFIER;
if (Character::IsRegionalIndicator(codepoint))
return REGIONAL_INDICATOR;
if (Character::IsEmojiKeycapBase(codepoint))
return KEYCAP_BASE;
if (Character::IsEmojiEmojiDefault(codepoint))
return EMOJI_EMOJI_PRESENTATION;
if (Character::IsEmojiTextDefault(codepoint))
return EMOJI_TEXT_PRESENTATION;
if (Character::IsEmoji(codepoint))
return EMOJI;
// Ragel state machine will interpret unknown category as "any".
return kMaxEmojiScannerCategory;
}
文法を変更し、新しいCファイルを出力として生成する場合は、Ragelをインストールする必要があります。
apt-get install ragel
その後、実行します
make
emoji_presentation_scanner.cおよびemoji_presentation_scanner_vs.c出力Cソースファイルを更新するには。
貢献方法については、converting.mdファイルを参照してください。