이 저장소에는 Ragel 문법이 포함되어 있으며 텍스트 실행을 텍스트-표현 및 이모티콘 예측 실행으로 분할하기위한 C 코드를 생성합니다. 현재 Chromium 및 Pango와 같은 프로젝트에서 선호하는 프레젠테이션, 색상 또는 텍스트, 텍스트 실행을 결정하는 데 사용됩니다.
목표는 유니 코드 기술 표준 #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로 설정됩니다.
문법 토큰은 텍스트 프리젠 테이션을위한 이모티콘 + 변형 선택기 15, 이모티콘 프리젠 테이션 시퀀스 (이모티콘 + VS16), 이모티콘 프리젠 테이션 이모티콘 또는 이모티콘 시퀀스 또는 단일 텍스트 표현 문자의 조합입니다.
emoji_text_iter_t 는 Ragel REGIONAL_INDICATOR EMOJI_TEXT_PRESENTATION 시작 부분에 정의 된 문자 클래스의 버퍼 KEYCAP_BASE 대한 반복자 유형입니다 EMOJI
Typedef'ming 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;
}
문법을 수정하고 출력으로 새 C 파일을 생성하려면 Ragel을 설치해야합니다.
apt-get install ragel
그런 다음 실행하십시오
make
emoji_presentation_scanner.c 및 emoji_presentation_scanner_vs.c output c 소스 파일을 업데이트합니다.
기여 방법은 Contributing.md 파일을 참조하십시오.