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