blob: 9da1a098793d1c9292172c743ed8d1dafc3f21a6 [file] [log] [blame]
package org.unicode.cldr.tool;
import java.io.File;
import java.io.IOException;
import java.util.EnumMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;
import org.unicode.cldr.draft.FileUtilities;
import org.unicode.cldr.tool.FormattedFileWriter.Anchors;
import org.unicode.cldr.util.CLDRConfig;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.FileCopier;
import org.unicode.cldr.util.LanguageGroup;
import org.unicode.cldr.util.Pair;
import org.unicode.cldr.util.SimpleFactory;
import org.unicode.cldr.util.StandardCodes.LstrType;
import org.unicode.cldr.util.Validity;
import org.unicode.cldr.util.Validity.Status;
import com.ibm.icu.impl.Relation;
import com.ibm.icu.util.ULocale;
public class ChartSubdivisionNames extends Chart {
private static final String MAIN_HEADER = "<p>This chart shows the subdivision names. "
+ "Most of them (except in English and for a few others) are derived from wikidata, with some filtering.</p>";
private static final boolean DEBUG = false;
private static final String DIR = CLDRPaths.CHART_DIRECTORY + "subdivisionNames/";
public static void main(String[] args) {
new ChartSubdivisionNames().writeChart(null);
}
@Override
public String getDirectory() {
return DIR;
}
@Override
public String getTitle() {
return "Subdivision Name Charts";
}
@Override
public String getFileName() {
return "index";
}
@Override
public String getExplanation() {
return MAIN_HEADER + "<p>The charts are presented in groups of related languages, for easier comparison.<p>";
}
public void writeContents(FormattedFileWriter pw) throws IOException {
FileCopier.ensureDirectoryExists(DIR);
FileCopier.copy(Chart.class, "index.css", DIR);
FormattedFileWriter.Anchors anchors = new FormattedFileWriter.Anchors();
writeSubcharts(anchors);
pw.setIndex("Main Chart Index", "../index.html");
pw.write(anchors.toString());
}
public void writeSubcharts(Anchors anchors) throws IOException {
CLDRConfig cldrConfig = CLDRConfig.getInstance();
File[] paths = {
new File(CLDRPaths.SUBDIVISIONS_DIRECTORY) };
Factory factory = SimpleFactory.make(paths, ".*");
CLDRFile english = factory.make("en", true);
Set<String> subdivisions = Validity.getInstance().getStatusToCodes(LstrType.subdivision).get(Status.regular);
// set up right order for columns
Map<String, String> nameToCode = new LinkedHashMap<String, String>();
Relation<LanguageGroup, Pair<String, String>> groupToNameAndCodeSorted = Relation.of(
new EnumMap<LanguageGroup, Set<Pair<String, String>>>(LanguageGroup.class),
TreeSet.class);
Set<String> locales = factory.getAvailable();
for (String locale : locales) {
if (locale.equals("root")) {
continue;
}
if (locale.equals("en")) { // make first
continue;
}
if (locale.startsWith("en")) {
int debug = 0;
}
String name = ENGLISH.getName(locale, true);
int baseEnd = locale.indexOf('_');
ULocale loc = new ULocale(baseEnd < 0 ? locale : locale.substring(0, baseEnd));
LanguageGroup group = LanguageGroup.get(loc);
groupToNameAndCodeSorted.put(group, Pair.of(name, locale));
}
for (Entry<LanguageGroup, Set<Pair<String, String>>> groupPairs : groupToNameAndCodeSorted.keyValuesSet()) {
LanguageGroup group = groupPairs.getKey();
String ename = ENGLISH.getName("en", true);
nameToCode.clear();
nameToCode.put(ename, "en"); // always have english first
// add English variants if they exist
for (Pair<String, String> pair : groupPairs.getValue()) {
String name = pair.getFirst();
String locale = pair.getSecond();
if (locale.startsWith("en_")) {
nameToCode.put(name, locale);
}
}
for (Pair<String, String> pair : groupPairs.getValue()) {
String name = pair.getFirst();
String locale = pair.getSecond();
nameToCode.put(name, locale);
}
// now build table with right order for columns
double width = ((int) ((99.0 / (locales.size() + 1)) * 1000)) / 1000.0;
//String widthString = "class='source' width='"+ width + "%'";
String widthStringTarget = "class='target' width='" + width + "%'";
TablePrinter tablePrinter = new TablePrinter()
.addColumn("Code", "class='source' width='1%'", CldrUtility.getDoubleLinkMsg(), "class='source'", true)
//.addColumn("Formal Name", "class='source' width='" + width + "%'", null, "class='source'", true)
;
for (Entry<String, String> entry : nameToCode.entrySet()) {
String name = entry.getKey();
tablePrinter.addColumn(name, widthStringTarget, null, "class='target'", true);
}
// sort the characters
for (String code : subdivisions) {
tablePrinter
.addRow()
.addCell(code)
//.addCell(getName(cp))
;
for (Entry<String, String> nameAndLocale : nameToCode.entrySet()) {
String name = nameAndLocale.getKey();
String locale = nameAndLocale.getValue();
CLDRFile cldrFile = factory.make(locale, false);
String name2 = cldrFile.getStringValue("//ldml/localeDisplayNames/subdivisions/subdivision[@type=\"" + code
+ "\"]");
tablePrinter.addCell(name2 == null ? "" : name2);
}
tablePrinter.finishRow();
}
final String name = group.toString();
new Subchart(name + " Subdivision Names", FileUtilities.anchorize(name), tablePrinter).writeChart(anchors);
}
}
private class Subchart extends Chart {
String title;
String file;
private TablePrinter tablePrinter;
@Override
public boolean getShowDate() {
return false;
}
public Subchart(String title, String file, TablePrinter tablePrinter) {
super();
this.title = title;
this.file = file;
this.tablePrinter = tablePrinter;
}
@Override
public String getDirectory() {
return DIR;
}
@Override
public String getTitle() {
return title;
}
@Override
public String getFileName() {
return file;
}
@Override
public String getExplanation() {
return "<p>This table shows the subdivision names for a group of related languages (plus English) for easier comparison. "
+ "The coverage depends on the availability of data in wikidata for these names.</p>\n";
}
@Override
public void writeContents(FormattedFileWriter pw) throws IOException {
pw.write(tablePrinter.toTable());
}
}
}