該存儲庫包含一個Ragel語法和生成的C代碼,用於將文本運行分割為文本表現和表情表現運行。目前,它用於Chromium和Pango等項目中,以決定哪種首選呈現,顏色或文本,文本應該具有。
目標是在Unicode技術標準#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是在ragel文件開頭REGIONAL_INDICATOR的字符EMOJI的緩衝區EMOJI_TEXT_PRESENTATION KEYCAP_BASE迭代器類型
通過typedef'ing emoji_text_iter_t到您自己的迭代器類型,您可以實現一個適配器類,該類別通過任何編碼中的輸入文本緩衝區在輸入文本緩衝區上進行迭代,並且在退化上返回正確的ragel類,通過實現與以下Unicode Class類相似的ragel類映射的示例,從Chromium中取出的示例來實現類似的東西,
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 output c源文件。
有關如何貢獻,請參見貢獻。