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