/* ******************************************************************************* * Copyright (C) 1998-2010, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ package com.ibm.icu.dev.tool.layout; import java.util.Vector; import com.ibm.icu.impl.Utility; import com.ibm.icu.lang.UCharacter; import com.ibm.icu.lang.UProperty; import com.ibm.icu.lang.UScript; import com.ibm.icu.text.UnicodeSet; import com.ibm.icu.text.UnicodeSetIterator; 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[]; }