Home | History | Annotate | Download | only in text
      1 /* GENERATED SOURCE. DO NOT MODIFY. */
      2 //  2016 and later: Unicode, Inc. and others.
      3 // License & terms of use: http://www.unicode.org/copyright.html#License
      4 /*
      5  * Copyright (C) 1996-2010, International Business Machines Corporation and
      6  * others. All Rights Reserved.
      7  */
      8 package android.icu.text;
      9 import android.icu.lang.UCharacter;
     10 
     11 /**
     12  * A transliterator that performs character to name mapping.
     13  * It generates the Perl syntax \N{name}.
     14  * @author Alan Liu
     15  */
     16 class UnicodeNameTransliterator extends Transliterator {
     17 
     18     static final String _ID = "Any-Name";
     19 
     20     static final String OPEN_DELIM = "\\N{";
     21     static final char CLOSE_DELIM = '}';
     22     static final int OPEN_DELIM_LEN = 3;
     23 
     24     /**
     25      * System registration hook.
     26      */
     27     static void register() {
     28         Transliterator.registerFactory(_ID, new Transliterator.Factory() {
     29             @Override
     30             public Transliterator getInstance(String ID) {
     31                 return new UnicodeNameTransliterator(null);
     32             }
     33         });
     34     }
     35 
     36     /**
     37      * Constructs a transliterator.
     38      */
     39     public UnicodeNameTransliterator(UnicodeFilter filter) {
     40         super(_ID, filter);
     41     }
     42 
     43     /**
     44      * Implements {@link Transliterator#handleTransliterate}.
     45      */
     46     @Override
     47     protected void handleTransliterate(Replaceable text,
     48                                        Position offsets, boolean isIncremental) {
     49         int cursor = offsets.start;
     50         int limit = offsets.limit;
     51 
     52         StringBuilder str = new StringBuilder();
     53         str.append(OPEN_DELIM);
     54         int len;
     55         String name;
     56 
     57         while (cursor < limit) {
     58             int c = text.char32At(cursor);
     59             if ((name=UCharacter.getExtendedName(c)) != null) {
     60 
     61                 str.setLength(OPEN_DELIM_LEN);
     62                 str.append(name).append(CLOSE_DELIM);
     63 
     64                 int clen = UTF16.getCharCount(c);
     65                 text.replace(cursor, cursor+clen, str.toString());
     66                 len = str.length();
     67                 cursor += len; // advance cursor by 1 and adjust for new text
     68                 limit += len-clen; // change in length
     69             } else {
     70                 ++cursor;
     71             }
     72         }
     73 
     74         offsets.contextLimit += limit - offsets.limit;
     75         offsets.limit = limit;
     76         offsets.start = cursor;
     77     }
     78 
     79     /* (non-Javadoc)
     80      * @see android.icu.text.Transliterator#addSourceTargetSet(android.icu.text.UnicodeSet, android.icu.text.UnicodeSet, android.icu.text.UnicodeSet)
     81      */
     82     @Override
     83     public void addSourceTargetSet(UnicodeSet inputFilter, UnicodeSet sourceSet, UnicodeSet targetSet) {
     84         UnicodeSet myFilter = getFilterAsUnicodeSet(inputFilter);
     85         if (myFilter.size() > 0) {
     86             sourceSet.addAll(myFilter);
     87             targetSet.addAll('0', '9')
     88             .addAll('A', 'Z')
     89             .add('-')
     90             .add(' ')
     91             .addAll(OPEN_DELIM)
     92             .add(CLOSE_DELIM)
     93             .addAll('a', 'z') // for controls
     94             .add('<').add('>') // for controls
     95             .add('(').add(')') // for controls
     96             ;
     97         }
     98     }
     99 }
    100