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