يحتوي هذا المستودع على قواعد RAGEL ورمز C الذي تم إنشاؤه لتجهيزات التقسيم إلى النص في تقديم النص وعرض العرض. يتم استخدامه حاليًا في مشاريع مثل Chromium و Pango لتحديد أي عرض أو لون أو نص مفضل ، يجب أن يكون هناك مجموعة من النص.
الهدف من ذلك هو البقاء بالقرب من تعريفات القواعد في Unicode Technical Standard #51.
من خلال تضمين ملف emoji_presentation_scanner.c ، ستتمكن من استدعاء واجهة برمجة التطبيقات التالية
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 للـ Grammar-Token التالي وإرجاع Iterator يشير إلى نهاية الرمز المميز التالي. يجب تحديد مُحتاج إلى IDERATOR كـ pe حتى يتمكن الماسح الضوئي من المقارنة مع هذا ويعرف أين التوقف. في المعلمة المرجعية is_emoji فإنه يعيد ما إذا كان هذا الرمز المميز لديه عرض نص عرض ، يتم تعيين has_vs على صحيح إذا كان الرمز المميز يحتوي على محدد تباين.
الرمز المميز للقواعد هو إما مزيج من محدد التباين في الرموز التعبيرية 15 لعرض النص التقديمي ، أو تسلسل عرض تعبيري (Emoji + VS16) ، أو عرض تعاطي تعبيري رموز تعبيرية أو تسلسل رموز تعبيرية ، أو حرف عرض نص واحد.
emoji_text_iter_t هو نوع التكرار على مخزن مؤقت لفئات الأحرف التي يتم تعريفها في بداية ملف ragel ، على سبيل المثال EMOJI ، EMOJI_TEXT_PRESENTATION ، REGIONAL_INDICATOR ، KEYCAP_BASE ، إلخ.
بواسطة typedef'ing emoji_text_iter_t إلى نوع التكرار الخاص بك ، يمكنك تنفيذ فئة محول تتكرر على مخزن المؤسسة النصية في أي ترميز ، وعلى إزالة الإرهاق ، يعيد فئة Ragel الصحي
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 ملف مصدر الإخراج c.
انظر ملف المساهمة. md لمعرفة كيفية المساهمة.