Home | History | Annotate | Download | only in util
      1 package org.unicode.cldr.util;
      2 
      3 import com.ibm.icu.text.BreakIterator;
      4 import com.ibm.icu.util.ULocale;
      5 
      6 public class RangeAbbreviator {
      7     private BreakIterator breaker1;
      8     private BreakIterator breaker2;
      9     private String separator;
     10     private StringBuilder buffer = new StringBuilder();
     11 
     12     public RangeAbbreviator(BreakIterator breaker, String separator) {
     13         this.breaker1 = (BreakIterator) breaker.clone();
     14         this.breaker2 = (BreakIterator) breaker.clone();
     15         this.separator = separator;
     16     }
     17 
     18     public RangeAbbreviator(ULocale breaker, String separator) {
     19         this(BreakIterator.getWordInstance(breaker), separator);
     20     }
     21 
     22     public String abbreviate(String firstString, String secondString) {
     23         if (firstString.equals(secondString)) {
     24             return firstString;
     25         }
     26         buffer.setLength(0);
     27         breaker1.setText(firstString);
     28         breaker2.setText(secondString);
     29 
     30         // find common initial section
     31         // we use two offset variables, in case we want to have some kind of equivalence later.
     32         int start1 = breaker1.first();
     33         int start2 = breaker2.first();
     34         while (true) {
     35             breaker1.next();
     36             final int current1 = breaker1.current();
     37             if (current1 == BreakIterator.DONE) {
     38                 break;
     39             }
     40             breaker2.next();
     41             final int current2 = breaker2.current();
     42             if (current2 == BreakIterator.DONE) {
     43                 break;
     44             }
     45             if (!firstString.regionMatches(start1, secondString, start2, current1 - start1)) {
     46                 break;
     47             }
     48             start1 = current1;
     49             start2 = current2;
     50         }
     51 
     52         // find common initial section
     53         int end1 = breaker1.last();
     54         while (true) {
     55             breaker1.previous();
     56             final int current1 = breaker1.current();
     57             if (current1 == BreakIterator.DONE) {
     58                 break;
     59             }
     60             breaker2.previous();
     61             final int current2 = breaker2.current();
     62             if (current2 == BreakIterator.DONE) {
     63                 break;
     64             }
     65             if (!firstString.regionMatches(current1, secondString, current2, end1 - current1)) {
     66                 break;
     67             }
     68             end1 = current1;
     69         }
     70         return buffer.append(firstString.substring(0, end1)).append(separator).append(secondString.substring(start2))
     71             .toString();
     72     }
     73 }