17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert********************************************************************** 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Copyright (c) 2002-2010, International Business Machines Corporation 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* and others. All Rights Reserved. 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert********************************************************************** 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Date Name Description 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* 01/14/2002 aliu Creation. 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert********************************************************************** 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/ 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.text; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * A replacer that calls a transliterator to generate its output text. 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The input text to the transliterator is the output of another 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * UnicodeReplacer object. That is, this replacer wraps another 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * replacer with a transliterator. 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Alan Liu 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertclass FunctionReplacer implements UnicodeReplacer { 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The transliterator. Must not be null. 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private Transliterator translit; 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The replacer object. This generates text that is then 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * processed by 'translit'. Must not be null. 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private UnicodeReplacer replacer; 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Construct a replacer that takes the output of the given 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * replacer, passes it through the given transliterator, and emits 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the result as output. 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public FunctionReplacer(Transliterator theTranslit, 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert UnicodeReplacer theReplacer) { 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert translit = theTranslit; 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert replacer = theReplacer; 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * UnicodeReplacer API 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int replace(Replaceable text, 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int start, 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int limit, 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int[] cursor) { 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // First delegate to subordinate replacer 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int len = replacer.replace(text, start, limit, cursor); 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert limit = start + len; 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Now transliterate 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert limit = translit.transliterate(text, start, limit); 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return limit - start; 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * UnicodeReplacer API 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String toReplacerPattern(boolean escapeUnprintable) { 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuilder rule = new StringBuilder("&"); 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rule.append(translit.getID()); 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rule.append("( "); 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rule.append(replacer.toReplacerPattern(escapeUnprintable)); 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert rule.append(" )"); 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return rule.toString(); 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Union the set of all characters that may output by this object 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * into the given set. 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param toUnionTo the set into which to union the output characters 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void addReplacementSetTo(UnicodeSet toUnionTo) { 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert toUnionTo.addAll(translit.getTargetSet()); 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//eof 85