blob: d86aad571cac0971a7499d604a2d6327263e1922 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 1998-2006, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.dev.tool.layout;
import java.util.*;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.lang.UScript;
import com.ibm.icu.lang.UProperty;
import com.ibm.icu.text.UnicodeSet;
import com.ibm.icu.text.UnicodeSetIterator;
import com.ibm.icu.impl.Utility;
public class ScriptData extends TagValueData
{
public static class Record
{
private int startChar;
private int endChar;
private int scriptCode;
Record()
{
// nothing?
}
Record(int theChar, int theScriptCode)
{
this(theChar, theChar, theScriptCode);
}
Record(int theStartChar, int theEndChar, int theScriptCode)
{
startChar = theStartChar;
endChar = theEndChar;
scriptCode = theScriptCode;
}
public int startChar()
{
return startChar;
}
public int endChar()
{
return endChar;
}
public int scriptCode()
{
return scriptCode;
}
public int compareTo(Record that)
{
return this.startChar - that.startChar;
}
public String toString()
{
return "[" + Utility.hex(startChar, 6) + ".." +
Utility.hex(endChar, 6) + ", " +
UScript.getShortName(scriptCode).toLowerCase() + "ScriptCode]";
}
}
// TODO: Exceptions could be generated algorithmically
private static class TagException
{
private String icuTag;
private String otTag;
public TagException(String icu, String ot)
{
icuTag = icu;
otTag = ot;
}
public String getICUTag()
{
return icuTag;
}
public String getOTTag()
{
return otTag;
}
}
// TODO: short name longer than long name, replace repeated chars w/ space...
private ScriptData.TagException exceptions[] = {
new ScriptData.TagException("laoo", "lao "),
new ScriptData.TagException("nkoo", "nko "), // New code from ISO 15924, not sure this will be OT tag
new ScriptData.TagException("vaii", "vai "), // New code from ISO 15924, not sure this will be OT tag
new ScriptData.TagException("yiii", "yi ")
};
// TODO: binary search the exceptions list?
private String getException(String icu)
{
for(int i = 0; i < exceptions.length; i += 1) {
if (exceptions[i].getICUTag().equals(icu)) {
return exceptions[i].getOTTag();
}
}
return icu;
}
//
// Straight insertion sort from Knuth vol. III, pg. 81
//
private void sort()
{
for (int j = 1; j < fRecords.length; j += 1) {
int i;
Record v = fRecords[j];
for (i = j - 1; i >= 0; i -= 1) {
if (v.compareTo(fRecords[i]) >= 0) {
break;
}
fRecords[i + 1] = fRecords[i];
}
fRecords[i + 1] = v;
}
}
ScriptData()
{
int commonScript = UCharacter.getPropertyValueEnum(UProperty.SCRIPT, "COMMON");
int scriptCount;
Vector rv = new Vector();
fMinScript = UCharacter.getIntPropertyMinValue(UProperty.SCRIPT);
fMaxScript = UCharacter.getIntPropertyMaxValue(UProperty.SCRIPT);
scriptCount = fMaxScript - fMinScript + 1;
System.out.println("Collecting script data for " + scriptCount + " scripts...");
fScriptNames = new String[scriptCount];
fScriptTags = new String[scriptCount];
for (int script = fMinScript; script <= fMaxScript; script += 1) {
fScriptNames[script - fMinScript] = UScript.getName(script).toUpperCase();
fScriptTags[script - fMinScript] = UScript.getShortName(script).toLowerCase();
if (script != commonScript) {
UnicodeSet scriptSet = new UnicodeSet("\\p{" + fScriptTags[script - fMinScript] + "}");
UnicodeSetIterator it = new UnicodeSetIterator(scriptSet);
while (it.nextRange()) {
Record record = new Record(it.codepoint, it.codepointEnd, script);
rv.addElement(record);
}
}
}
fRecords = new Record[rv.size()];
for (int i = 0; i < rv.size(); i += 1) {
fRecords[i] = (Record) rv.elementAt(i);
}
System.out.println("Collected " + rv.size() + " records. Sorting...");
sort();
System.out.println("Done.");
}
public int getMinValue()
{
return fMinScript;
}
public int getMaxValue()
{
return fMaxScript;
}
public int getRecordCount()
{
return fRecords.length;
}
public String getTag(int value)
{
if (value >= fMinScript && value <= fMaxScript) {
return getException(fScriptTags[value - fMinScript]);
}
return "zyyx";
}
public String getTagLabel(int value)
{
if (value >= fMinScript && value <= fMaxScript) {
return fScriptTags[value - fMinScript];
}
return "zyyx";
}
public String makeTag(int value)
{
if (value >= fMinScript && value <= fMaxScript) {
String tag = getException(fScriptTags[value - fMinScript]);
return TagUtilities.makeTag(tag);
} else {
return "0x00000000";
}
}
public String getName(int value)
{
if (value >= fMinScript && value <= fMaxScript) {
return fScriptNames[value - fMinScript];
}
return "COMMON";
}
public Record getRecord(int index)
{
if (fRecords != null && index < fRecords.length) {
return fRecords[index];
}
return null;
}
private int fMinScript;
private int fMaxScript;
private String fScriptNames[];
private String fScriptTags[];
private Record fRecords[];
}