blob: 122490da42f9549a37c4440adadc0ebf46c72389 [file] [log] [blame]
package org.unicode.cldr.util;
import com.ibm.icu.text.BreakIterator;
import com.ibm.icu.util.ULocale;
public class RangeAbbreviator {
private BreakIterator breaker1;
private BreakIterator breaker2;
private String separator;
private StringBuilder buffer = new StringBuilder();
public RangeAbbreviator(BreakIterator breaker, String separator) {
this.breaker1 = (BreakIterator) breaker.clone();
this.breaker2 = (BreakIterator) breaker.clone();
this.separator = separator;
}
public RangeAbbreviator(ULocale breaker, String separator) {
this(BreakIterator.getWordInstance(breaker), separator);
}
public String abbreviate(String firstString, String secondString) {
if (firstString.equals(secondString)) {
return firstString;
}
buffer.setLength(0);
breaker1.setText(firstString);
breaker2.setText(secondString);
// find common initial section
// we use two offset variables, in case we want to have some kind of equivalence later.
int start1 = breaker1.first();
int start2 = breaker2.first();
while (true) {
breaker1.next();
final int current1 = breaker1.current();
if (current1 == BreakIterator.DONE) {
break;
}
breaker2.next();
final int current2 = breaker2.current();
if (current2 == BreakIterator.DONE) {
break;
}
if (!firstString.regionMatches(start1, secondString, start2, current1 - start1)) {
break;
}
start1 = current1;
start2 = current2;
}
// find common initial section
int end1 = breaker1.last();
while (true) {
breaker1.previous();
final int current1 = breaker1.current();
if (current1 == BreakIterator.DONE) {
break;
}
breaker2.previous();
final int current2 = breaker2.current();
if (current2 == BreakIterator.DONE) {
break;
}
if (!firstString.regionMatches(current1, secondString, current2, end1 - current1)) {
break;
}
end1 = current1;
}
return buffer.append(firstString.substring(0, end1)).append(separator).append(secondString.substring(start2))
.toString();
}
}