7 |
import java.io.PrintWriter; |
import java.io.PrintWriter; |
8 |
import java.io.IOException; |
import java.io.IOException; |
9 |
import java.util.ArrayList; |
import java.util.ArrayList; |
10 |
|
import java.util.Collection; |
11 |
import java.util.Enumeration; |
import java.util.Enumeration; |
12 |
import java.util.Iterator; |
import java.util.Iterator; |
13 |
import java.util.Hashtable; |
import java.util.Hashtable; |
22 |
{ |
{ |
23 |
private static final int JAVA_HEXLENGTH = 4; |
private static final int JAVA_HEXLENGTH = 4; |
24 |
|
|
25 |
private Analyzer analyzer; |
private final Collection analyzers; |
26 |
private String inPackage; |
private final String locale; |
27 |
|
private final String inPackage; |
28 |
private ArrayList localeContents = new ArrayList(); |
private ArrayList localeContents = new ArrayList(); |
29 |
|
|
30 |
private static final String[] classpathDateFormats = |
private static final String[] classpathDateFormats = |
60 |
*/ |
*/ |
61 |
static String convertToJavaString(String s) |
static String convertToJavaString(String s) |
62 |
{ |
{ |
|
int lenOnLine = 0; |
|
|
|
|
63 |
if (s == null) |
if (s == null) |
64 |
return "null"; |
return "null"; |
65 |
|
|
70 |
char c = s.charAt(i); |
char c = s.charAt(i); |
71 |
// Transform non-ASCII character into an escaped unicode character. |
// Transform non-ASCII character into an escaped unicode character. |
72 |
if (c > 127) |
if (c > 127) |
73 |
{ |
{ |
74 |
buf.append("\\u"); |
buf.append("\\u"); |
75 |
String hexString = Integer.toHexString((int)c); |
String hexString = Integer.toHexString((int)c); |
76 |
for (int j = 0; j < JAVA_HEXLENGTH-hexString.length(); j++) |
for (int j = 0; j < JAVA_HEXLENGTH-hexString.length(); j++) |
77 |
buf.append('0'); |
buf.append('0'); |
78 |
buf.append(hexString); |
buf.append(hexString); |
79 |
} |
} |
80 |
else if (c == '"') |
else if (c == '"') |
81 |
{ |
{ |
82 |
buf.append("\\\""); |
buf.append("\\\""); |
87 |
} |
} |
88 |
else |
else |
89 |
buf.append(c); |
buf.append(c); |
|
|
|
|
if (lenOnLine >= 60) |
|
|
{ |
|
|
buf.append("\""); |
|
|
} |
|
|
|
|
90 |
} |
} |
91 |
return buf.toString(); |
return buf.toString(); |
92 |
} |
} |
167 |
{ |
{ |
168 |
if (charOnLine >= 60) |
if (charOnLine >= 60) |
169 |
{ |
{ |
170 |
o.println('"'); |
o.println("\" +"); |
171 |
o.print("\t\""); |
o.print("\t\""); |
172 |
charOnLine = 0; |
charOnLine = 0; |
173 |
} |
} |
410 |
* Main body of the Java Locale generator. |
* Main body of the Java Locale generator. |
411 |
*/ |
*/ |
412 |
|
|
413 |
public JavaGenerator(String inPackage, Analyzer analyzer) |
public JavaGenerator(String inPackage, Collection analyzers, String locale) |
414 |
{ |
{ |
415 |
this.analyzer = analyzer; |
this.analyzers = analyzers; |
416 |
this.inPackage = inPackage; |
this.inPackage = inPackage; |
417 |
|
this.locale = locale; |
418 |
} |
} |
419 |
|
|
420 |
public void addStringContent(Hashtable tree, String ref, String name) |
public void addStringContent(Hashtable tree, String ref, String name) |
520 |
} |
} |
521 |
} |
} |
522 |
|
|
|
private static String fixForRuleBasedCollator(String s) |
|
|
{ |
|
|
StringBuffer sbuf = null; |
|
|
boolean useSBUF = false; |
|
|
|
|
|
for (int i = 0; i < s.length(); i++) |
|
|
{ |
|
|
char c = s.charAt(i); |
|
|
|
|
|
if (!useSBUF) |
|
|
{ |
|
|
if ((c >= 0x0009 && c <= 0x000d) || (c >= 0x0020 && c <= 0x002F) |
|
|
|| (c >= 0x003A && c <= 0x0040) || (c >= 0x005B && c <= 0x0060) |
|
|
|| (c >= 0x007B && c <= 0x007E)) |
|
|
{ |
|
|
useSBUF = true; |
|
|
sbuf = new StringBuffer(); |
|
|
sbuf.append('\''); |
|
|
sbuf.append(s.substring(0, i+1)); |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (s.charAt(i) == '\'') |
|
|
sbuf.append("''"); |
|
|
else |
|
|
sbuf.append(s.charAt(i)); |
|
|
} |
|
|
} |
|
|
|
|
|
if (useSBUF) |
|
|
{ |
|
|
sbuf.append('\''); |
|
|
return sbuf.toString(); |
|
|
} |
|
|
else |
|
|
return s; |
|
|
} |
|
|
|
|
523 |
private void computeCollations(Hashtable flattree) |
private void computeCollations(Hashtable flattree) |
524 |
{ |
{ |
525 |
OrderedListElement listElt = (OrderedListElement)flattree.get("ldml.collations.collation.rules"); |
ListDataElement collations = (ListDataElement)flattree.get("ldml.collations"); |
526 |
|
|
527 |
|
if (collations == null) |
528 |
|
return; |
529 |
|
|
530 |
|
Hashtable table = collations.flattenLeaf("standard"); |
531 |
|
if (table == null) |
532 |
|
return; |
533 |
|
|
534 |
|
System.err.println("Found UCA table for collation rules"); |
535 |
|
|
536 |
|
OrderedListElement listElt = (OrderedListElement)table.get("collation.rules"); |
537 |
if (listElt == null) |
if (listElt == null) |
538 |
return; |
return; |
|
|
|
|
ArrayList listData = listElt.listData; |
|
|
StringBuffer rules = new StringBuffer(); |
|
|
char ruleCharacter; |
|
|
boolean multiChar, prepend; |
|
|
|
|
|
for (int i = 0; i < listData.size(); i++) |
|
|
{ |
|
|
DataElement elt = (DataElement)listData.get(i); |
|
|
|
|
|
if (elt.qualifiedName.equals("p")) |
|
|
{ |
|
|
ruleCharacter = '<'; |
|
|
multiChar = false; |
|
|
prepend = false; |
|
|
} |
|
|
else if (elt.qualifiedName.equals("s")) |
|
|
{ |
|
|
ruleCharacter = ';'; |
|
|
multiChar = false; |
|
|
prepend = false; |
|
|
} |
|
|
else if (elt.qualifiedName.equals("t")) |
|
|
{ |
|
|
ruleCharacter = ','; |
|
|
multiChar = false; |
|
|
prepend = false; |
|
|
} |
|
|
else if (elt.qualifiedName.equals("i")) |
|
|
{ |
|
|
ruleCharacter = '='; |
|
|
multiChar = false; |
|
|
prepend = false; |
|
|
} |
|
|
else if (elt.qualifiedName.equals("pc")) |
|
|
{ |
|
|
ruleCharacter = '<'; |
|
|
multiChar = true; |
|
|
prepend = false; |
|
|
} |
|
|
else if (elt.qualifiedName.equals("sc")) |
|
|
{ |
|
|
ruleCharacter = ';'; |
|
|
multiChar = true; |
|
|
prepend = false; |
|
|
} |
|
|
else if (elt.qualifiedName.equals("tc")) |
|
|
{ |
|
|
ruleCharacter = ','; |
|
|
multiChar = true; |
|
|
prepend = false; |
|
|
} |
|
|
else if (elt.qualifiedName.equals("ic")) |
|
|
{ |
|
|
ruleCharacter = '='; |
|
|
multiChar = true; |
|
|
prepend = false; |
|
|
} |
|
|
else if (elt.qualifiedName.equals("reset")) |
|
|
{ |
|
|
ruleCharacter = '&'; |
|
|
multiChar = true; |
|
|
prepend = false; |
|
|
} |
|
|
else |
|
|
continue; |
|
|
|
|
|
if (multiChar) |
|
|
{ |
|
|
int insertPoint = prepend ? 0 : rules.length(); |
|
|
|
|
|
for (int j = 0; j < elt.data.length(); j++) |
|
|
{ |
|
|
rules.insert(insertPoint, ruleCharacter); |
|
|
insertPoint++; |
|
|
|
|
|
String s = fixForRuleBasedCollator(elt.data.substring(j, j+1)); |
|
|
|
|
|
rules.insert(insertPoint, s); |
|
|
insertPoint += s.length(); |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
int insertPoint = prepend ? 0 : rules.length(); |
|
|
|
|
|
rules.insert(insertPoint, ruleCharacter); |
|
|
insertPoint++; |
|
|
|
|
|
rules.insert(insertPoint, fixForRuleBasedCollator(elt.data)); |
|
|
} |
|
|
} |
|
539 |
|
|
540 |
localeContents.add(new BigStringContent("collation_rules", rules.toString())); |
System.err.println("Found rules"); |
541 |
|
|
542 |
|
CollationInterpreter interp = new CollationInterpreter(listElt.listData); |
543 |
|
|
544 |
|
interp.compute(); |
545 |
|
|
546 |
|
localeContents.add(new BigStringContent("collation_rules", interp.toCollationRule())); |
547 |
} |
} |
548 |
|
|
549 |
private void computeHashtable(String name, Hashtable table) |
private void computeHashtable(String name, Hashtable table) |
569 |
|
|
570 |
private void computeContents() |
private void computeContents() |
571 |
{ |
{ |
572 |
Hashtable flattree = analyzer.flattenTree(); |
for (Iterator i = analyzers.iterator(); i.hasNext(); ) |
573 |
|
{ |
574 |
addStringContent(flattree, "ldml.numbers.symbols.percentSign", "percent"); |
Analyzer analyzer = (Analyzer) i.next(); |
575 |
addStringContent(flattree, "ldml.numbers.symbols.perMille", "perMill"); |
Hashtable flattree = analyzer.flattenTree(); |
576 |
addStringContent(flattree, "ldml.numbers.symbols.exponential", "exponential"); |
|
577 |
addStringContent(flattree, "ldml.numbers.symbols.infinity", "infinity"); |
addStringContent(flattree, "ldml.numbers.symbols.percentSign", "percent"); |
578 |
addStringContent(flattree, "ldml.numbers.symbols.nan", "NaN"); |
addStringContent(flattree, "ldml.numbers.symbols.perMille", "perMill"); |
579 |
addStringContent(flattree, "ldml.numbers.symbols.minusSign", "minusSign"); |
addStringContent(flattree, "ldml.numbers.symbols.exponential", "exponential"); |
580 |
addStringContent(flattree, "ldml.numbers.symbols.nativeZeroDigit", "zeroDigit"); |
addStringContent(flattree, "ldml.numbers.symbols.infinity", "infinity"); |
581 |
addStringContent(flattree, "ldml.numbers.symbols.decimal", "decimalSeparator"); |
addStringContent(flattree, "ldml.numbers.symbols.nan", "NaN"); |
582 |
addStringContent(flattree, "ldml.numbers.symbols.group", "groupingSeparator"); |
addStringContent(flattree, "ldml.numbers.symbols.minusSign", "minusSign"); |
583 |
addStringContent(flattree, "ldml.numbers.symbols.patternDigit", "digit"); |
addStringContent(flattree, "ldml.numbers.symbols.nativeZeroDigit", "zeroDigit"); |
584 |
addStringContent(flattree, "ldml.numbers.percentFormats.percentFormatLength.percentFormat.pattern", "percentFormat"); |
addStringContent(flattree, "ldml.numbers.symbols.decimal", "decimalSeparator"); |
585 |
addStringContent(flattree, "ldml.numbers.currencyFormats.currencyFormatLength.currencyFormat.pattern", "currencyFormat"); |
addStringContent(flattree, "ldml.numbers.symbols.group", "groupingSeparator"); |
586 |
addStringContent(flattree, "ldml.dates.localizedPatternChars", "localPatternChars"); |
addStringContent(flattree, "ldml.numbers.symbols.patternDigit", "digit"); |
587 |
|
addStringContent(flattree, "ldml.numbers.percentFormats.percentFormatLength.percentFormat.pattern", "percentFormat"); |
588 |
computeCalendar(flattree); |
addStringContent(flattree, "ldml.numbers.currencyFormats.currencyFormatLength.currencyFormat.pattern", "currencyFormat"); |
589 |
computeCollations(flattree); |
addStringContent(flattree, "ldml.dates.localizedPatternChars", "localPatternChars"); |
590 |
computeTimeZones(flattree); |
|
591 |
computeLocalNames(flattree); |
computeCalendar(flattree); |
592 |
|
computeCollations(flattree); |
593 |
|
computeTimeZones(flattree); |
594 |
|
computeLocalNames(flattree); |
595 |
|
} |
596 |
} |
} |
597 |
|
|
598 |
public void generateJavaHeader(PrintWriter o) |
public void generateJavaHeader(PrintWriter o) |
599 |
{ |
{ |
600 |
o.println("/* LocaleInformation_" + analyzer.getParser().getName() + ".java --"); |
o.println("/* LocaleInformation_" + locale + ".java --"); |
601 |
o.println(" Copyright (C) 2004 Free Software Foundation, Inc."); |
o.println(" Copyright (C) 2004 Free Software Foundation, Inc."); |
602 |
o.println(); |
o.println(); |
603 |
o.println("This file is part of GNU Classpath."); |
o.println("This file is part of GNU Classpath."); |
635 |
o.println("exception statement from your version. */"); |
o.println("exception statement from your version. */"); |
636 |
o.println(); |
o.println(); |
637 |
o.println(); |
o.println(); |
638 |
o.println("// This file was automatically generated by gnu.localegen from LDML " + analyzer.getParser().getName() + ".xml"); |
o.println("// This file was automatically generated by gnu.localegen from LDML"); |
639 |
o.println(); |
o.println(); |
640 |
o.println("package " + inPackage + ';'); |
o.println("package " + inPackage + ';'); |
641 |
o.println(); |
o.println(); |
667 |
|
|
668 |
public void generateJavaClass(PrintWriter o) |
public void generateJavaClass(PrintWriter o) |
669 |
{ |
{ |
670 |
o.println("public class LocaleInformation_" + analyzer.getParser().getName() + " extends ListResourceBundle"); |
o.println("public class LocaleInformation_" + locale + " extends ListResourceBundle"); |
671 |
o.println("{"); |
o.println("{"); |
672 |
|
|
673 |
for (int i=0;i<localeContents.size();i++) |
for (int i=0;i<localeContents.size();i++) |
698 |
|
|
699 |
javaDir.mkdirs(); |
javaDir.mkdirs(); |
700 |
|
|
701 |
File javaFile = new File(javaDir, "LocaleInformation_" + analyzer.getParser().getName() + ".java"); |
File javaFile = new File(javaDir, "LocaleInformation_" + locale + ".java"); |
702 |
|
|
703 |
computeContents(); |
computeContents(); |
704 |
|
|