UnicodeString& CompoundTransliterator::toRules(UnicodeString& rulesSource, UBool escapeUnprintable) const { // We do NOT call toRules() on our component transliterators, in // general. If we have several rule-based transliterators, this // yields a concatenation of the rules -- not what we want. We do // handle compound RBT transliterators specially -- those for which // compoundRBTIndex >= 0. For the transliterator at compoundRBTIndex, // we do call toRules() recursively. rulesSource.truncate(0); if (compoundRBTIndex >= 0 && getFilter() != NULL) { // If we are a compound RBT and if we have a global // filter, then emit it at the top. UnicodeString pat; rulesSource.append("::").append(getFilter()->toPattern(pat, escapeUnprintable)).append(ID_DELIM); } for (int32_t i=0; i<count; ++i) { UnicodeString rule; if (i == compoundRBTIndex) { trans[i]->toRules(rule, escapeUnprintable); } else { trans[i]->Transliterator::toRules(rule, escapeUnprintable); } _smartAppend(rulesSource, NEWLINE); rulesSource.append(rule); _smartAppend(rulesSource, ID_DELIM); } return rulesSource; }
UnicodeString& CompoundTransliterator::toRules(UnicodeString& rulesSource, UBool escapeUnprintable) const { // We do NOT call toRules() on our component transliterators, in // general. If we have several rule-based transliterators, this // yields a concatenation of the rules -- not what we want. We do // handle compound RBT transliterators specially -- those for which // compoundRBTIndex >= 0. For the transliterator at compoundRBTIndex, // we do call toRules() recursively. rulesSource.truncate(0); if (numAnonymousRBTs >= 1 && getFilter() != NULL) { // If we are a compound RBT and if we have a global // filter, then emit it at the top. UnicodeString pat; rulesSource.append(COLON_COLON, 2).append(getFilter()->toPattern(pat, escapeUnprintable)).append(ID_DELIM); } for (int32_t i=0; i<count; ++i) { UnicodeString rule; // Anonymous RuleBasedTransliterators (inline rules and // ::BEGIN/::END blocks) are given IDs that begin with // "%Pass": use toRules() to write all the rules to the output // (and insert "::Null;" if we have two in a row) if (trans[i]->getID().startsWith(PASS_STRING, 5)) { trans[i]->toRules(rule, escapeUnprintable); if (numAnonymousRBTs > 1 && i > 0 && trans[i - 1]->getID().startsWith(PASS_STRING, 5)) rule = UNICODE_STRING_SIMPLE("::Null;") + rule; // we also use toRules() on CompoundTransliterators (which we // check for by looking for a semicolon in the ID)-- this gets // the list of their child transliterators output in the right // format } else if (trans[i]->getID().indexOf(ID_DELIM) >= 0) { trans[i]->toRules(rule, escapeUnprintable); // for everything else, use Transliterator::toRules() } else { trans[i]->Transliterator::toRules(rule, escapeUnprintable); } _smartAppend(rulesSource, NEWLINE); rulesSource.append(rule); _smartAppend(rulesSource, ID_DELIM); } return rulesSource; }