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