该存储库包含一个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源文件。
有关如何贡献,请参见贡献。