Этот репозиторий содержит грамматику Ragel и сгенерировал C-код для сегментирования прогонов текста в текстовые предприятия, а смайлики-презентация. В настоящее время он используется в таких проектах, как Chromium и 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 устанавливается на true, если токен содержит селектор вариаций.
Грамматический токен представляет собой либо комбинацию из селектора VAIATION Plus Emoji Plus для текстового представления, последовательности представления эмодзи (Emoji + VS16), эмодзи -представления Emoji или последовательности смайликов или однократного характера представления текста.
emoji_text_iter_t - это тип итератора над буфером классов символов, которые определены в начале файла Ragel, например, EMOJI , EMOJI_TEXT_PRESENTATION , REGIONAL_INDICATOR , KEYCAP_BASE и т. Д.
При typedef'ing emoji_text_iter_t к вашему собственному типу итератора вы можете реализовать класс адаптера, который итерации в входном текстовом буфере в любом кодировании, и при выборочном привязке возвращает правильный класс Ragel, реализуя что -то похожее на следующий класс символов Unicode, чтобы картирование класса Ragel, пример, взятый из 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;
}
Вам нужно установить Ragel, если вы хотите изменить грамматику и генерировать новый файл C в качестве вывода.
apt-get install ragel
затем беги
make
Чтобы обновить emoji_presentation_scanner.c и emoji_presentation_scanner_vs.c Вывод C -исходный файл.
Смотрите файл appling.md для того, как внести свой вклад.