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