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