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