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