พื้นที่เก็บข้อมูลนี้มีไวยากรณ์ ragel และสร้างรหัส C สำหรับการแบ่งส่วนการรันของข้อความลงในข้อความนำเสนอและอีโมจี-นำเสนอ ปัจจุบันใช้ในโครงการเช่นโครเมียมและ 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 จะถูกตั้งค่าเป็นจริงหรือไม่หากโทเค็นมีตัวเลือกการเปลี่ยนแปลง
โทเค็นไวยากรณ์คือการรวมกันของอิโมจิบวกตัวเลือกการเปลี่ยนแปลง 15 สำหรับการนำเสนอข้อความลำดับการนำเสนออิโมจิ (Emoji + VS16), Emoji Presentation Emoji หรือ Emoji Sequence หรือตัวละครการนำเสนอข้อความเดียว
emoji_text_iter_t เป็นตัววนซ้ำมากกว่าบัฟเฟอร์ของคลาสอักขระที่กำหนดไว้ที่จุดเริ่มต้นของไฟล์ ragel เช่น EMOJI , EMOJI_TEXT_PRESENTATION , REGIONAL_INDICATOR , KEYCAP_BASE ฯลฯ
โดย Typedef'ing emoji_text_iter_t เป็นประเภทตัววนซ้ำของคุณเองคุณสามารถใช้คลาสอะแดปเตอร์ที่วนซ้ำผ่านบัฟเฟอร์ข้อความอินพุตในการเข้ารหัสใด ๆ
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;
}
คุณต้องติดตั้ง Ragel หากคุณต้องการแก้ไขไวยากรณ์และสร้างไฟล์ C ใหม่เป็นเอาต์พุต
apt-get install ragel
จากนั้นวิ่ง
make
ในการอัปเดต emoji_presentation_scanner.c และ emoji_presentation_scanner_vs.c ไฟล์แหล่งที่มา
ดูไฟล์ MD ที่มีส่วนร่วมสำหรับวิธีการมีส่วนร่วม