Repositori ini berisi tata bahasa ragel dan menghasilkan kode C untuk segmentasi menjalankan teks ke dalam presentasi teks dan proses presentasi emoji. Saat ini digunakan dalam proyek -proyek seperti kromium dan pango untuk memutuskan presentasi, warna atau teks yang lebih disukai, serangkaian teks yang seharusnya dimiliki.
Tujuannya adalah untuk tetap sangat dekat dengan definisi tata bahasa dalam standar teknis Unicode #51.
Dengan memasukkan file emoji_presentation_scanner.c , Anda akan dapat memanggil API berikut
scan_emoji_presentation (emoji_text_iter_t p,
const emoji_text_iter_t pe,
bool* is_emoji,
bool* has_vs)
Panggilan API ini akan memindai emoji_text_iter_t p untuk tata bahasa berikutnya dan mengembalikan iterator yang menunjuk ke akhir token berikutnya. Iterator akhir perlu ditentukan sebagai pe sehingga pemindai dapat membandingkan dengan ini dan tahu di mana harus berhenti. Dalam parameter referensi is_emoji itu kembali apakah token ini memiliki presentasi teks presentasi emoji, has_vs diatur ke true jika token berisi pemilih variasi.
Token tata bahasa adalah kombinasi dari emoji plus variation selector 15 untuk presentasi teks, urutan presentasi emoji (emoji + vs16), presentasi emoji emoji atau urutan emoji, atau karakter presentasi teks tunggal.
emoji_text_iter_t adalah jenis iterator di atas buffer kelas karakter yang didefinisikan pada awal file ragel, misalnya EMOJI , EMOJI_TEXT_PRESENTATION , REGIONAL_INDICATOR , KEYCAP_BASE , dll.
Dengan mengetik emoji_text_iter_t ke jenis iterator Anda sendiri, Anda dapat mengimplementasikan kelas adaptor yang berulang kali pada buffer teks input dalam pengkodean apa pun, dan pada dereferencing mengembalikan kelas ragel yang benar dengan menerapkan sesuatu yang mirip dengan kelas karakter unicode berikut ke pemetaan kelas ragel, contoh yang diambil dari kromium:
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;
}
Anda perlu menginstal ragel jika Anda ingin memodifikasi tata bahasa dan menghasilkan file C baru sebagai output.
apt-get install ragel
lalu jalankan
make
Untuk memperbarui emoji_presentation_scanner.c dan emoji_presentation_scanner_vs.c output file sumber C.
Lihat file contributing.md untuk cara berkontribusi.