Ce référentiel contient une grammaire RATEL et du code C généré pour segmenter des exécutions de texte en Text-présentation et Emoji-Presentation Exécutions. Il est actuellement utilisé dans des projets tels que Chromium et Pango pour décider quelle présentation, couleur ou texte préférée, une série de texte devrait avoir.
L'objectif est de rester très proche des définitions de grammaire dans la norme technique Unicode # 51.
En incluant le fichier emoji_presentation_scanner.c , vous pourrez appeler l'API suivante
scan_emoji_presentation (emoji_text_iter_t p,
const emoji_text_iter_t pe,
bool* is_emoji,
bool* has_vs)
Cet appel API scannera emoji_text_iter_t p pour le prochain grammaire et renverra un itérateur qui pointe vers la fin du token suivant. Un itérateur final doit être spécifié en tant pe afin que le scanner puisse se comparer à cela et sait où s'arrêter. Dans le paramètre de référence is_emoji il renvoie si ce jeton a une présentation de texte Emoji-présentation, has_vs est défini sur True si le jeton contient un sélecteur de variation.
Un jeton de grammaire est soit une combinaison d'un sélecteur de variation emoji plus 15 pour la présentation de texte, une séquence de présentation des emoji (emoji + vs16), une séquence emoji ou emoji de présentation des emoji.
emoji_text_iter_t est un type itérateur sur un tampon des classes de caractères définies au début du fichier ragel, par exemple EMOJI , EMOJI_TEXT_PRESENTATION , REGIONAL_INDICATOR , KEYCAP_BASE , etc.
Par typedef'ing emoji_text_iter_t à votre propre type itérateur, vous pouvez implémenter une classe d'adaptateur qui itère sur un tampon de texte d'entrée dans n'importe quel codage, et sur la déréférence renvoie la classe RAGEL correcte en implémentant quelque chose de similaire à la classe de caractères Unicode suivante vers la classe de classe RAGEL, l'exemple de chrome: le chrome:
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;
}
Vous devez installer RATEL si vous souhaitez modifier la grammaire et générer un nouveau fichier C en tant que sortie.
apt-get install ragel
Puis courez
make
Pour mettre à jour le emoji_presentation_scanner.c et emoji_presentation_scanner_vs.c Fichier source C.
Voir le fichier contribution.md pour la façon de contribuer.