Dieses Repository enthält eine Ragel-Grammatik und einen generierten C-Code für die Segmentierung von Textläufen in Textpräsentation und Emoji-Presentation-Läufe. Es wird derzeit in Projekten wie Chrom und Pango verwendet
Ziel ist es, den Grammatikdefinitionen in Unicode Technical Standard Nr. 51 sehr nahe zu bleiben.
Durch Einbeziehung der Datei emoji_presentation_scanner.c können Sie die folgende API aufrufen
scan_emoji_presentation (emoji_text_iter_t p,
const emoji_text_iter_t pe,
bool* is_emoji,
bool* has_vs)
Dieser API-Anruf scannt nach dem nächsten Grammatik-Token emoji_text_iter_t p und gibt einen Iterator zurück, der auf das Ende des nächsten Tokens verweist. Ein End -Iterator muss als pe angegeben werden, damit der Scanner damit vergleichen kann und weiß, wo er anhalten soll. Im Referenzparameter is_emoji gibt es zurück, ob dieses Token eine Emoji-Presentations-Textpräsentation hat. has_vs wird auf true gesetzt, wenn das Token einen Variationswählers enthält.
Ein Grammatik -Token ist entweder eine Kombination aus einem Emoji Plus -Variationswahl 15 für die Textpräsentation, eine Emoji -Präsentationssequenz (Emoji + VS16), eine Emoji -Präsentation Emoji oder Emoji -Sequenz oder ein einzelnes Textpräsentationscharakter.
emoji_text_iter_t ist ein Iteratortyp über einem Puffer der Zeichenklassen, die zu Beginn der Ragel -Datei definiert sind, z. B. EMOJI , EMOJI_TEXT_PRESENTATION , REGIONAL_INDICATOR , KEYCAP_BASE usw.
Durch typedef'ing emoji_text_iter_t zu Ihrem eigenen Iterator -Typ können Sie eine Adapterklasse implementieren, die in jeder Codierung einen Eingabettextpuffer iteriert, und bei der Derferenzung gibt die richtige Ragel -Klasse zurück, indem Sie etwas Ähnliches wie die folgende Unicode -Charakterklasse zu Ragel -Klassen -Mapping implementieren, beispielsweise von 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;
}
Sie müssen Ragel installieren lassen, wenn Sie die Grammatik ändern und eine neue C -Datei als Ausgabe erstellen möchten.
apt-get install ragel
dann rennen
make
So aktualisieren Sie die emoji_presentation_scanner.c und emoji_presentation_scanner_vs.c Ausgabe c Quelldatei.
Siehe die Datei mit beitragen.md für den Beitrag zur Verfügung.