]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/translit/src/com/ibm/icu/text/UnicodeNameTransliterator.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / translit / src / com / ibm / icu / text / UnicodeNameTransliterator.java
1 /*\r
2  * Copyright (C) 1996-2010, International Business Machines Corporation and\r
3  * others. All Rights Reserved.\r
4  */\r
5 package com.ibm.icu.text;\r
6 import com.ibm.icu.lang.UCharacter;\r
7 \r
8 /**\r
9  * A transliterator that performs character to name mapping.\r
10  * It generates the Perl syntax \N{name}.\r
11  * @author Alan Liu\r
12  */\r
13 class UnicodeNameTransliterator extends Transliterator {\r
14 \r
15     static final String _ID = "Any-Name";\r
16 \r
17     static final String OPEN_DELIM = "\\N{";\r
18     static final char CLOSE_DELIM = '}';\r
19     static final int OPEN_DELIM_LEN = 3;\r
20 \r
21     /**\r
22      * System registration hook.\r
23      */\r
24     static void register() {\r
25         Transliterator.registerFactory(_ID, new Transliterator.Factory() {\r
26             public Transliterator getInstance(String ID) {\r
27                 return new UnicodeNameTransliterator(null);\r
28             }\r
29         });\r
30     }\r
31 \r
32     /**\r
33      * Constructs a transliterator.\r
34      */\r
35     public UnicodeNameTransliterator(UnicodeFilter filter) {\r
36         super(_ID, filter);\r
37     }\r
38 \r
39     /**\r
40      * Implements {@link Transliterator#handleTransliterate}.\r
41      */\r
42     protected void handleTransliterate(Replaceable text,\r
43                                        Position offsets, boolean isIncremental) {\r
44         int cursor = offsets.start;\r
45         int limit = offsets.limit;\r
46         \r
47         StringBuilder str = new StringBuilder();\r
48         str.append(OPEN_DELIM);\r
49         int len;\r
50         String name;\r
51         \r
52         while (cursor < limit) {\r
53             int c = text.char32At(cursor);\r
54             if ((name=UCharacter.getExtendedName(c)) != null) {\r
55                 \r
56                 str.setLength(OPEN_DELIM_LEN);\r
57                 str.append(name).append(CLOSE_DELIM);\r
58 \r
59                 int clen = UTF16.getCharCount(c);\r
60                 text.replace(cursor, cursor+clen, str.toString());\r
61                 len = str.length();\r
62                 cursor += len; // advance cursor by 1 and adjust for new text\r
63                 limit += len-clen; // change in length\r
64             } else {\r
65                 ++cursor;\r
66             }\r
67         }\r
68 \r
69         offsets.contextLimit += limit - offsets.limit;\r
70         offsets.limit = limit;\r
71         offsets.start = cursor;\r
72     }\r
73 }\r