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