Home | History | Annotate | Download | only in text
      1 /* GENERATED SOURCE. DO NOT MODIFY. */
      2 //  2016 and later: Unicode, Inc. and others.
      3 // License & terms of use: http://www.unicode.org/copyright.html#License
      4 /*
      5  *******************************************************************************
      6  * Copyright (C) 2010-2011, Google, International Business Machines            *
      7  * Corporation and others. All Rights Reserved.                                *
      8  *******************************************************************************
      9  */
     10 package android.icu.text;
     11 
     12 import java.util.HashSet;
     13 import java.util.Set;
     14 
     15 import android.icu.lang.CharSequences;
     16 
     17 /**
     18  * Simple internal utility class for helping with getSource/TargetSet
     19  */
     20 class SourceTargetUtility {
     21     final Transform<String, String> transform;
     22     final UnicodeSet sourceCache;
     23     final Set<String> sourceStrings;
     24     static final UnicodeSet NON_STARTERS = new UnicodeSet("[:^ccc=0:]").freeze();
     25     static Normalizer2 NFC = Normalizer2.getNFCInstance();
     26     //static final UnicodeSet TRAILING_COMBINING = new UnicodeSet();
     27 
     28     public SourceTargetUtility(Transform<String, String> transform) {
     29         this(transform, null);
     30     }
     31 
     32     public SourceTargetUtility(Transform<String, String> transform, Normalizer2 normalizer) {
     33         this.transform = transform;
     34         if (normalizer != null) {
     35 //            synchronized (SourceTargetUtility.class) {
     36 //                if (NFC == null) {
     37 //                    NFC = Normalizer2.getInstance(null, "nfc", Mode.COMPOSE);
     38 //                    for (int i = 0; i <= 0x10FFFF; ++i) {
     39 //                        String d = NFC.getDecomposition(i);
     40 //                        if (d == null) {
     41 //                            continue;
     42 //                        }
     43 //                        String s = NFC.normalize(d);
     44 //                        if (!CharSequences.equals(i, s)) {
     45 //                            continue;
     46 //                        }
     47 //                        // composes
     48 //                        boolean first = false;
     49 //                        for (int trailing : CharSequences.codePoints(d)) {
     50 //                            if (first) {
     51 //                                first = false;
     52 //                            } else {
     53 //                                TRAILING_COMBINING.add(trailing);
     54 //                            }
     55 //                        }
     56 //                    }
     57 //                }
     58 //            }
     59             sourceCache = new UnicodeSet("[:^ccc=0:]");
     60         } else {
     61             sourceCache = new UnicodeSet();
     62         }
     63         sourceStrings = new HashSet<String>();
     64         for (int i = 0; i <= 0x10FFFF; ++i) {
     65             String s = transform.transform(UTF16.valueOf(i));
     66             boolean added = false;
     67             if (!CharSequences.equals(i, s)) {
     68                 sourceCache.add(i);
     69                 added = true;
     70             }
     71             if (normalizer == null) {
     72                 continue;
     73             }
     74             String d = NFC.getDecomposition(i);
     75             if (d == null) {
     76                 continue;
     77             }
     78             s = transform.transform(d);
     79             if (!d.equals(s)) {
     80                 sourceStrings.add(d);
     81             }
     82             if (added) {
     83                 continue;
     84             }
     85             if (!normalizer.isInert(i)) {
     86                 sourceCache.add(i);
     87                 continue;
     88             }
     89             // see if any of the non-starters change s; if so, add i
     90 //            for (String ns : TRAILING_COMBINING) {
     91 //                String s2 = transform.transform(s + ns);
     92 //                if (!s2.startsWith(s)) {
     93 //                    sourceCache.add(i);
     94 //                    break;
     95 //                }
     96 //            }
     97 
     98             // int endOfFirst = CharSequences.onCharacterBoundary(d, 1) ? 1 : 2;
     99             // if (endOfFirst >= d.length()) {
    100             // continue;
    101             // }
    102             // // now add all initial substrings
    103             // for (int j = 1; j < d.length(); ++j) {
    104             // if (!CharSequences.onCharacterBoundary(d, j)) {
    105             // continue;
    106             // }
    107             // String dd = d.substring(0,j);
    108             // s = transform.transform(dd);
    109             // if (!dd.equals(s)) {
    110             // sourceStrings.add(dd);
    111             // }
    112             // }
    113         }
    114         sourceCache.freeze();
    115     }
    116 
    117     public void addSourceTargetSet(Transliterator transliterator, UnicodeSet inputFilter, UnicodeSet sourceSet,
    118             UnicodeSet targetSet) {
    119         UnicodeSet myFilter = transliterator.getFilterAsUnicodeSet(inputFilter);
    120         UnicodeSet affectedCharacters = new UnicodeSet(sourceCache).retainAll(myFilter);
    121         sourceSet.addAll(affectedCharacters);
    122         for (String s : affectedCharacters) {
    123             targetSet.addAll(transform.transform(s));
    124         }
    125         for (String s : sourceStrings) {
    126             if (myFilter.containsAll(s)) {
    127                 String t = transform.transform(s);
    128                 if (!s.equals(t)) {
    129                     targetSet.addAll(t);
    130                     sourceSet.addAll(s);
    131                 }
    132             }
    133         }
    134     }
    135 }
    136