• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 ohos.global.icu.text;
11 
12 import java.util.HashSet;
13 import java.util.Set;
14 
15 import ohos.global.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 
SourceTargetUtility(Transform<String, String> transform)28     public SourceTargetUtility(Transform<String, String> transform) {
29         this(transform, null);
30     }
31 
SourceTargetUtility(Transform<String, String> transform, Normalizer2 normalizer)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 
addSourceTargetSet(Transliterator transliterator, UnicodeSet inputFilter, UnicodeSet sourceSet, UnicodeSet targetSet)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