Home | History | Annotate | Download | only in layout
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html#License
      3 /*
      4  *******************************************************************************
      5  * Copyright (C) 1998-2004, International Business Machines Corporation and    *
      6  * others. All Rights Reserved.                                                *
      7  *******************************************************************************
      8  *
      9  * Created on Dec 3, 2003
     10  *
     11  *******************************************************************************
     12  */
     13 package com.ibm.icu.dev.tool.layout;
     14 
     15 import com.ibm.icu.lang.UCharacter;
     16 import com.ibm.icu.lang.UProperty;
     17 import com.ibm.icu.text.Normalizer;
     18 import com.ibm.icu.text.UnicodeSet;
     19 
     20 public class ArabicCharacterData
     21 {
     22     public class Record
     23     {
     24         public int getCodePoint()
     25         {
     26             return codePoint;
     27         }
     28 
     29         public int getGeneralCategory()
     30         {
     31             return generalCategory;
     32         }
     33 
     34         public int getDecompositionType()
     35         {
     36             return decompositionType;
     37         }
     38 
     39         public String getDecomposition()
     40         {
     41             return decomposition;
     42         }
     43 
     44         private Record(int character)
     45         {
     46             codePoint         = character;
     47             generalCategory   = UCharacter.getType(character);
     48             decompositionType = UCharacter.getIntPropertyValue(character, UProperty.DECOMPOSITION_TYPE);
     49 
     50             switch (decompositionType) {
     51             case UCharacter.DecompositionType.FINAL:
     52             case UCharacter.DecompositionType.INITIAL:
     53             case UCharacter.DecompositionType.ISOLATED:
     54             case UCharacter.DecompositionType.MEDIAL:
     55                 decomposition = Normalizer.compose(UCharacter.toString(character), true);
     56                 break;
     57 
     58             case UCharacter.DecompositionType.CANONICAL:
     59                 decomposition = Normalizer.decompose(UCharacter.toString(character), true);
     60                 break;
     61 
     62             default:
     63                 decomposition = null;
     64             }
     65         }
     66 
     67         private int codePoint;
     68         private int generalCategory;
     69         private int decompositionType;
     70         private String decomposition;
     71     }
     72 
     73     private ArabicCharacterData(int charCount)
     74     {
     75         records = new Record[charCount];
     76     }
     77 
     78     private void add(int character)
     79     {
     80         records[recordIndex++] = new Record(character);
     81     }
     82 
     83     public Record getRecord(int index)
     84     {
     85         if (index < 0 || index >= records.length) {
     86             return null;
     87         }
     88 
     89         return records[index];
     90     }
     91 
     92     public int countRecords()
     93     {
     94         return records.length;
     95     }
     96 
     97     // TODO: do we need to change this to use UnicodeSetIterator?
     98     // That will mean not knowing the number of characters until
     99     // after the iteration is done, so we'd have to use a vector
    100     // to hold the Records at first and copy it to an array
    101     // when we're done...
    102     public static ArabicCharacterData factory(UnicodeSet characterSet)
    103     {
    104         int charCount = characterSet.size();
    105         ArabicCharacterData data = new ArabicCharacterData(charCount);
    106 
    107         for (int i = 0; i < charCount; i += 1) {
    108             data.add(characterSet.charAt(i));
    109         }
    110 
    111         return data;
    112     }
    113 
    114     private Record[] records;
    115     private int recordIndex = 0;
    116 }
    117