]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/layout/ScriptData.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / layout / ScriptData.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1998-2010, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.tool.layout;\r
8 \r
9 import java.util.Vector;\r
10 \r
11 import com.ibm.icu.impl.Utility;\r
12 import com.ibm.icu.lang.UCharacter;\r
13 import com.ibm.icu.lang.UProperty;\r
14 import com.ibm.icu.lang.UScript;\r
15 import com.ibm.icu.text.UnicodeSet;\r
16 import com.ibm.icu.text.UnicodeSetIterator;\r
17 \r
18 public class ScriptData extends TagValueData\r
19 {\r
20     public static class Record\r
21     {\r
22         private int startChar;\r
23         private int endChar;\r
24         private int scriptCode;\r
25         \r
26         Record()\r
27         {\r
28             // nothing?\r
29         }\r
30         \r
31         Record(int theChar, int theScriptCode)\r
32         {\r
33             this(theChar, theChar, theScriptCode);\r
34         }\r
35         \r
36         Record(int theStartChar, int theEndChar, int theScriptCode)\r
37         {\r
38             startChar = theStartChar;\r
39             endChar = theEndChar;\r
40             scriptCode = theScriptCode;\r
41         }\r
42         \r
43         public int startChar()\r
44         {\r
45             return startChar;\r
46         }\r
47         \r
48         public int endChar()\r
49         {\r
50             return endChar;\r
51         }\r
52         \r
53         public int scriptCode()\r
54         {\r
55             return scriptCode;\r
56         }\r
57         \r
58         public int compareTo(Record that)\r
59         {\r
60             return this.startChar - that.startChar;\r
61         }\r
62         \r
63         public String toString()\r
64         {\r
65             return "[" +  Utility.hex(startChar, 6) + ".." +\r
66                    Utility.hex(endChar, 6) + ", " +\r
67                    UScript.getShortName(scriptCode).toLowerCase() + "ScriptCode]";\r
68         }\r
69     }\r
70     \r
71     // TODO: Exceptions could be generated algorithmically\r
72     private static class TagException\r
73     {\r
74         private String icuTag;\r
75         private String otTag;\r
76         \r
77         public TagException(String icu, String ot)\r
78         {\r
79             icuTag = icu;\r
80             otTag  = ot;\r
81         }\r
82         \r
83         public String getICUTag()\r
84         {\r
85             return icuTag;\r
86         }\r
87         \r
88         public String getOTTag()\r
89         {\r
90             return otTag;\r
91         }\r
92     }\r
93     \r
94     // TODO: short name longer than long name, replace repeated chars w/ space...\r
95     private ScriptData.TagException exceptions[] = {\r
96             new ScriptData.TagException("laoo", "lao "),\r
97             new ScriptData.TagException("nkoo", "nko "), // New code from ISO 15924, not sure this will be OT tag\r
98             new ScriptData.TagException("vaii", "vai "), // New code from ISO 15924, not sure this will be OT tag\r
99             new ScriptData.TagException("yiii", "yi  ")\r
100         };\r
101         \r
102     \r
103     // TODO: binary search the exceptions list?\r
104     private String getException(String icu)\r
105     {\r
106         for(int i = 0; i < exceptions.length; i += 1) {\r
107             if (exceptions[i].getICUTag().equals(icu)) {\r
108                 return exceptions[i].getOTTag();\r
109             }\r
110         }\r
111         \r
112         return icu;\r
113     }\r
114         \r
115     //\r
116     // Straight insertion sort from Knuth vol. III, pg. 81\r
117     //\r
118     private void sort()\r
119     {\r
120         for (int j = 1; j < fRecords.length; j += 1) {\r
121             int i;\r
122             Record v = fRecords[j];\r
123 \r
124             for (i = j - 1; i >= 0; i -= 1) {\r
125                 if (v.compareTo(fRecords[i]) >= 0) {\r
126                     break;\r
127                 }\r
128 \r
129                 fRecords[i + 1] = fRecords[i];\r
130             }\r
131 \r
132             fRecords[i + 1] = v;\r
133         }\r
134     }\r
135 \r
136     ScriptData()\r
137     {\r
138         int commonScript = UCharacter.getPropertyValueEnum(UProperty.SCRIPT, "COMMON");\r
139         int scriptCount;\r
140         Vector rv = new Vector();\r
141         \r
142         fMinScript  = UCharacter.getIntPropertyMinValue(UProperty.SCRIPT);\r
143         fMaxScript  = UCharacter.getIntPropertyMaxValue(UProperty.SCRIPT);\r
144         scriptCount = fMaxScript - fMinScript + 1;\r
145         \r
146         System.out.println("Collecting script data for " + scriptCount + " scripts...");\r
147         \r
148         fScriptNames = new String[scriptCount];\r
149         fScriptTags  = new String[scriptCount];\r
150         \r
151         for (int script = fMinScript; script <= fMaxScript; script += 1) {\r
152             fScriptNames[script - fMinScript] = UScript.getName(script).toUpperCase();\r
153             fScriptTags[script - fMinScript]  = UScript.getShortName(script).toLowerCase();\r
154             \r
155             if (script != commonScript) {\r
156                 UnicodeSet scriptSet  = new UnicodeSet("\\p{" + fScriptTags[script - fMinScript] + "}");\r
157                 UnicodeSetIterator it = new UnicodeSetIterator(scriptSet);\r
158             \r
159                 while (it.nextRange()) {\r
160                     Record record = new Record(it.codepoint, it.codepointEnd, script);\r
161                     \r
162                     rv.addElement(record);\r
163                 }\r
164             }\r
165         }\r
166         \r
167         fRecords = new Record[rv.size()];\r
168         \r
169         for (int i = 0; i < rv.size(); i += 1) {\r
170             fRecords[i] = (Record) rv.elementAt(i);\r
171         }\r
172         \r
173         System.out.println("Collected " + rv.size() + " records. Sorting...");\r
174         sort();\r
175         \r
176         System.out.println("Done.");\r
177     }\r
178     \r
179     public int getMinValue()\r
180     {\r
181         return fMinScript;\r
182     }\r
183     \r
184     public int getMaxValue()\r
185     {\r
186         return fMaxScript;\r
187     }\r
188     \r
189     public int getRecordCount()\r
190     {\r
191         return fRecords.length;\r
192     }\r
193     \r
194     public String getTag(int value)\r
195     {\r
196         if (value >= fMinScript && value <= fMaxScript) {\r
197             return getException(fScriptTags[value - fMinScript]);\r
198         }\r
199         \r
200         return "zyyx";\r
201     }\r
202     \r
203     public String getTagLabel(int value)\r
204     {\r
205         if (value >= fMinScript && value <= fMaxScript) {\r
206             return fScriptTags[value - fMinScript];\r
207         }\r
208         \r
209         return "zyyx";\r
210     }\r
211     \r
212     public String makeTag(int value)\r
213     {\r
214         if (value >= fMinScript && value <= fMaxScript) {\r
215             String tag = getException(fScriptTags[value - fMinScript]);\r
216             \r
217             return TagUtilities.makeTag(tag);\r
218         } else {\r
219             return "0x00000000";\r
220         }\r
221     }\r
222     \r
223     public String getName(int value)\r
224     {\r
225         if (value >= fMinScript && value <= fMaxScript) {\r
226             return fScriptNames[value - fMinScript];\r
227         }\r
228         \r
229         return "COMMON";\r
230     }\r
231     \r
232     public Record getRecord(int index)\r
233     {\r
234         if (fRecords != null && index < fRecords.length) {\r
235             return fRecords[index];\r
236         }\r
237         \r
238         return null;\r
239     }\r
240     \r
241     private int fMinScript;\r
242     private int fMaxScript;\r
243     private String fScriptNames[];\r
244     private String fScriptTags[];\r
245     private Record fRecords[];\r
246 }\r