blob: 6d0b1508f674066668877aeff8cfb6302ba8d38a [file] [log] [blame]
package org.unicode.cldr.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.google.common.collect.ImmutableMap;
import com.ibm.icu.lang.CharSequences;
import com.ibm.icu.text.ListFormatter;
import com.ibm.icu.text.SimpleFormatter;
import com.ibm.icu.text.UTF16;
public class XListFormatter {
public enum ListTypeLength {
AND_WIDE(""),
AND_SHORT("[@type=\"standard-short\"]"),
OR_WIDE("[@type=\"or\"]"),
UNIT_WIDE("[@type=\"unit\"]"),
UNIT_SHORT("[@type=\"unit-short\"]"),
UNIT_NARROW("[@type=\"unit-narrow\"]")
;
public static final ListTypeLength NORMAL = AND_WIDE;
final String typeString;
static final Map<String, ListTypeLength> stringToEnum;
static {
Map<String, ListTypeLength> _stringToEnum = new LinkedHashMap<>();
for (ListTypeLength value : values()) {
if (value != NORMAL) {
_stringToEnum.put(value.typeString.substring(value.typeString.indexOf('"')+1, value.typeString.lastIndexOf('"')), value);
}
}
stringToEnum = ImmutableMap.copyOf(_stringToEnum);
}
private ListTypeLength(String typeString) {
this.typeString = typeString;
}
public static ListTypeLength from(String listPatternType) {
if (listPatternType == null) {
return NORMAL;
}
return stringToEnum.get(listPatternType);
}
public String getPath() {
return "//ldml/listPatterns/listPattern"
+ typeString
+ "/listPatternPart[@type=\"{0}\"]";
}
}
private ListFormatter listFormatter;
public XListFormatter(CLDRFile cldrFile, ListTypeLength listTypeLength) {
SimpleFormatter listPathFormat = SimpleFormatter.compile(listTypeLength.getPath());
String doublePattern = cldrFile.getWinningValue(listPathFormat.format("2"));
String startPattern = cldrFile.getWinningValue(listPathFormat.format("start"));
String middlePattern = cldrFile.getWinningValue(listPathFormat.format("middle"));
String endPattern = cldrFile.getWinningValue(listPathFormat.format("end"));
listFormatter = new ListFormatter(doublePattern, startPattern, middlePattern, endPattern);
}
public String format(Object... items) {
return listFormatter.format(items);
}
public String format(Collection<?> items) {
return listFormatter.format(items);
}
public String formatCodePoints(String items) {
List<String> source = new ArrayList<>();
for (int sourceInt : CharSequences.codePoints(items)) { // TODO add utility in CharSequences
source.add(UTF16.valueOf(sourceInt));
}
return listFormatter.format(source);
}
}