]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-52_1/main/classes/translit/src/com/ibm/icu/text/LowercaseTransliterator.java
Upgrade ICU4J.
[Dictionary.git] / jars / icu4j-52_1 / main / classes / translit / src / com / ibm / icu / text / LowercaseTransliterator.java
1 /*
2  *******************************************************************************
3  * Copyright (C) 1996-2011, International Business Machines Corporation and    *
4  * others. All Rights Reserved.                                                *
5  *******************************************************************************
6  */
7 package com.ibm.icu.text;
8
9 import com.ibm.icu.impl.UCaseProps;
10 import com.ibm.icu.lang.UCharacter;
11 import com.ibm.icu.util.ULocale;
12
13 /**
14  * A transliterator that performs locale-sensitive toLower()
15  * case mapping.
16  */
17 class LowercaseTransliterator extends Transliterator{
18
19     /**
20      * Package accessible ID.
21      */
22     static final String _ID = "Any-Lower";
23     
24     // TODO: Add variants for tr, az, lt, default = default locale
25
26     /**
27      * System registration hook.
28      */
29     static void register() {
30         Transliterator.registerFactory(_ID, new Transliterator.Factory() {
31             public Transliterator getInstance(String ID) {
32                 return new LowercaseTransliterator(ULocale.US);
33             }
34         });
35
36         Transliterator.registerSpecialInverse("Lower", "Upper", true);
37     }
38
39     private ULocale locale;
40
41     private UCaseProps csp;
42     private ReplaceableContextIterator iter;
43     private StringBuilder result;
44     private int[] locCache;
45
46     /**
47      * Constructs a transliterator.
48      */
49
50     public LowercaseTransliterator(ULocale loc) {
51         super(_ID, null);
52         locale = loc;
53         csp=UCaseProps.INSTANCE;
54         iter=new ReplaceableContextIterator();
55         result = new StringBuilder();
56         locCache = new int[1];
57         locCache[0]=0;
58     }
59
60     /**
61      * Implements {@link Transliterator#handleTransliterate}.
62      */
63     protected synchronized void handleTransliterate(Replaceable text,
64                                        Position offsets, boolean isIncremental) {
65         if(csp==null) {
66             return;
67         }
68
69         if(offsets.start >= offsets.limit) {
70             return;
71         } 
72
73         iter.setText(text);
74         result.setLength(0);
75         int c, delta;
76
77         // Walk through original string
78         // If there is a case change, modify corresponding position in replaceable
79
80         iter.setIndex(offsets.start);
81         iter.setLimit(offsets.limit);
82         iter.setContextLimits(offsets.contextStart, offsets.contextLimit);
83         while((c=iter.nextCaseMapCP())>=0) {
84             c=csp.toFullLower(c, iter, result, locale, locCache);
85
86             if(iter.didReachLimit() && isIncremental) {
87                 // the case mapping function tried to look beyond the context limit
88                 // wait for more input
89                 offsets.start=iter.getCaseMapCPStart();
90                 return;
91             }
92
93             /* decode the result */
94             if(c<0) {
95                 /* c mapped to itself, no change */
96                 continue;
97             } else if(c<=UCaseProps.MAX_STRING_LENGTH) {
98                 /* replace by the mapping string */
99                 delta=iter.replace(result.toString());
100                 result.setLength(0);
101             } else {
102                 /* replace by single-code point mapping */
103                 delta=iter.replace(UTF16.valueOf(c));
104             }
105
106             if(delta!=0) {
107                 offsets.limit += delta;
108                 offsets.contextLimit += delta;
109             }
110         }
111         offsets.start = offsets.limit;
112     }
113     
114     // NOTE: normally this would be static, but because the results vary by locale....
115     SourceTargetUtility sourceTargetUtility = null;
116     
117     /* (non-Javadoc)
118      * @see com.ibm.icu.text.Transliterator#addSourceTargetSet(com.ibm.icu.text.UnicodeSet, com.ibm.icu.text.UnicodeSet, com.ibm.icu.text.UnicodeSet)
119      */
120     @Override
121     public void addSourceTargetSet(UnicodeSet inputFilter, UnicodeSet sourceSet, UnicodeSet targetSet) {
122         synchronized (this) {
123             if (sourceTargetUtility == null) {
124                 sourceTargetUtility = new SourceTargetUtility(new Transform<String,String>() {
125                     public String transform(String source) {
126                         return UCharacter.toLowerCase(locale, source);                    
127                     }
128                 });
129             }
130         }
131         sourceTargetUtility.addSourceTargetSet(this, inputFilter, sourceSet, targetSet);
132     }
133 }