Token* TokenFactory::getGraphemePattern() { if (fGrapheme == 0) { Token* base_char = createRange(); // [{ASSIGNED}]-[{M},{C}] base_char->mergeRanges(getRange(fgUniAssigned)); base_char->subtractRanges(getRange(fgUniMark)); base_char->subtractRanges(getRange(fgUniControl)); Token* virama = createRange(); virama->addRange(0x094D, 0x094D); virama->addRange(0x09CD, 0x09CD); virama->addRange(0x0A4D, 0x0A4D); virama->addRange(0x0ACD, 0x0ACD); virama->addRange(0x0B4D, 0x0B4D); virama->addRange(0x0BCD, 0x0BCD); virama->addRange(0x0C4D, 0x0C4D); virama->addRange(0x0CCD, 0x0CCD); virama->addRange(0x0D4D, 0x0D4D); virama->addRange(0x0E3A, 0x0E3A); virama->addRange(0x0F84, 0x0F84); Token* combiner_wo_virama = createRange(); combiner_wo_virama->mergeRanges(getRange(fgUniMark)); combiner_wo_virama->addRange(0x1160, 0x11FF); // hangul_medial and hangul_final combiner_wo_virama->addRange(0xFF9F, 0xFF9F); // extras Token* left = TokenFactory::createUnion(); // base_char? left->addChild(base_char, this); left->addChild(createToken(Token::T_EMPTY), this); Token* foo = createUnion(); foo->addChild(TokenFactory::createConcat(virama,getRange(fgUniLetter)), this); foo->addChild(combiner_wo_virama, this); foo = createClosure(foo); foo = createConcat(left, foo); fGrapheme = foo; } return fGrapheme; }
Node* UnionModule::evaluate(Context* ctx) { return createUnion(ctx->getInputNodes()); }