Changeset 6139


Ignore:
Timestamp:
Aug 5, 2018, 6:53:07 PM (12 days ago)
Author:
cameron
Message:

Adding Hangul decomposition algorithm

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/re/Unicode/decomposition.cpp

    r6138 r6139  
    2929using namespace re;
    3030
     31// Constants for computation of Hangul decompositions, see Unicode Standard, section 3.12.
     32const codepoint_t Hangul_SBase = 0xAC00;
     33const codepoint_t Hangul_LBase = 0x1100;
     34const codepoint_t Hangul_VBase = 0x1161;
     35const codepoint_t Hangul_TBase = 0x11A7;
     36const unsigned Hangul_TCount = 28;
     37const unsigned Hangul_NCount = 588;
     38const unsigned Hangul_SCount = 11172;
     39static UnicodeSet HangulPrecomposed = UnicodeSet(Hangul_SBase, Hangul_SBase + Hangul_SCount - 1);
     40
     41static RE * HangulDecomposition(codepoint_t cp) {
     42    auto SIndex = cp - Hangul_SBase;
     43    auto LIndex = SIndex / Hangul_NCount;
     44    auto VIndex = (SIndex % Hangul_NCount) / Hangul_TCount;
     45    auto TIndex = SIndex % Hangul_TCount;
     46    auto L = makeCC(Hangul_LBase + LIndex);
     47    auto V = makeCC(Hangul_VBase + VIndex);
     48    if (TIndex > 0) {
     49        return makeSeq({L, V, makeCC(Hangul_TBase + TIndex)});
     50    } else {
     51        return makeSeq({L, V});
     52    }
     53}
     54
    3155RE * NFD_CC(CC * cc) {
    3256    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;
     
    3458    const auto & decompTypeObj = cast<EnumeratedPropertyObject>(property_object_table[dt]);
    3559    UnicodeSet canonicalMapped = decompTypeObj->GetCodepointSet(DT_ns::Can);
    36     UnicodeSet mappingRequired = *cc & canonicalMapped;
     60    UnicodeSet mappingRequired = *cc & (canonicalMapped + HangulPrecomposed);
    3761    if (mappingRequired.empty()) return cc;
    3862    std::vector<RE *> alts;
     
    4064    for (const interval_t & i : mappingRequired) {
    4165        for (codepoint_t cp = lo_codepoint(i); cp <= hi_codepoint(i); cp++) {
    42             std::u32string dms = conv.from_bytes(decompMappingObj->GetStringValue(cp));
    43             RE * dm = u32string2re(dms);
    44             if (Seq * s = dyn_cast<Seq>(dm)) {
    45                 if (s->size() == 1) {
    46                     finalCC = makeCC(finalCC, cast<CC>(s->front()));
     66            if (HangulPrecomposed.contains(cp)) {
     67                alts.push_back(HangulDecomposition(cp));
     68            } else {
     69                std::u32string dms = conv.from_bytes(decompMappingObj->GetStringValue(cp));
     70                RE * dm = u32string2re(dms);
     71                if (Seq * s = dyn_cast<Seq>(dm)) {
     72                    if (s->size() == 1) {
     73                        finalCC = makeCC(finalCC, cast<CC>(s->front()));
     74                    } else {
     75                        alts.push_back(s);
     76                    }
    4777                } else {
    48                     alts.push_back(s);
     78                    alts.push_back(dm);
    4979                }
    50             } else {
    51                 alts.push_back(dm);
    5280            }
    5381        }
     
    5684    return makeAlt(alts.begin(), alts.end());
    5785}
     86
    5887
    5988RE * NFKD_CC(CC * cc) {
    6089    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;
    6190    const auto & decompMappingObj = cast<StringPropertyObject>(property_object_table[dm]);
    62     UnicodeSet reflexiveSet = decompMappingObj->GetReflexiveSet();
     91    UnicodeSet reflexiveSet = decompMappingObj->GetReflexiveSet() - HangulPrecomposed;
    6392    UnicodeSet mappingRequired = *cc - reflexiveSet;
    6493    if (mappingRequired.empty()) return cc;
     
    6796    for (const interval_t & i : mappingRequired) {
    6897        for (codepoint_t cp = lo_codepoint(i); cp <= hi_codepoint(i); cp++) {
    69             std::u32string dms = conv.from_bytes(decompMappingObj->GetStringValue(cp));
    70             RE * dm = u32string2re(dms);
    71             if (Seq * s = dyn_cast<Seq>(dm)) {
    72                 if (s->size() == 1) {
    73                     finalCC = makeCC(finalCC, cast<CC>(s->front()));
     98            if (HangulPrecomposed.contains(cp)) {
     99                alts.push_back(HangulDecomposition(cp));
     100            } else {
     101                std::u32string dms = conv.from_bytes(decompMappingObj->GetStringValue(cp));
     102                RE * dm = u32string2re(dms);
     103                if (Seq * s = dyn_cast<Seq>(dm)) {
     104                    if (s->size() == 1) {
     105                        finalCC = makeCC(finalCC, cast<CC>(s->front()));
     106                    } else {
     107                        alts.push_back(s);
     108                    }
    74109                } else {
    75                     alts.push_back(s);
     110                    alts.push_back(dm);
    76111                }
    77             } else {
    78                 alts.push_back(dm);
    79112            }
    80113        }
Note: See TracChangeset for help on using the changeset viewer.