scuffed-code/tools/unicodetools/com/ibm/rbm/RBICUExporter.java
2002-05-20 18:53:10 +00:00

198 lines
8.2 KiB
Java

/*
*****************************************************************************
* Copyright (C) 2000-2002, International Business Machines Corporation and *
* others. All Rights Reserved. *
*****************************************************************************
*
* $Source: /xsrl/Nsvn/icu/unicodetools/com/ibm/rbm/RBICUExporter.java,v $
* $Date: 2002/05/20 18:53:10 $
* $Revision: 1.1 $
*
*****************************************************************************
*/
package com.ibm.rbm;
import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.*;
import java.util.*;
/**
* This class provides a plug-in exporter utility for RBManager that outputs ICU
* resource bundle files in the according to the file structure of Resource
* Bundles. Most of the meta-data is lost in this export.
*
* @author George Rhoten
* @see com.ibm.rbm.RBManager
*/
public class RBICUExporter extends RBExporter {
/** Do characters beyond \\u007f need \\u escape notation? */
private boolean escapeNonAscii = false;
/** Write the meta data for each resource? */
private boolean writeMetaData = true;
/** Write the groups as keys? */
private boolean writeGroupsAsKeys = false;
public RBICUExporter() {
super();
// Initialize the file chooser if necessary
if (chooser == null) {
chooser = new JFileChooser();
chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
public String getDescription() {
return "root ICU File";
}
public boolean accept(File f) {
if (f.isDirectory()) return true;
return (f.getName().startsWith("root."));
}
});
} // end if
}
protected void export(RBManager rbm) throws IOException {
if (rbm == null) return;
// Open the Save Dialog
int ret_val = chooser.showSaveDialog(null);
if (ret_val != JFileChooser.APPROVE_OPTION) {
return;
}
// Retrieve basic file information
File file = chooser.getSelectedFile(); // The file(s) we will be working with
File directory = new File(file.getParent()); // The directory we will be writing to
String base_name = file.getName(); // The base name of the files we will write
if (base_name == null || base_name.equals("")) {
base_name = rbm.getBaseClass();
}
if (base_name.toLowerCase().endsWith(".properties")) {
base_name = base_name.substring(0,base_name.length()-11);
}
Vector bundle_v = rbm.getBundles();
for (int i=0; i < bundle_v.size(); i++) {
Bundle bundle = (Bundle)bundle_v.elementAt(i);
String base_enc = base_name;
if (bundle.encoding != null && !bundle.encoding.equals("")) {
base_enc = base_enc + "_" + bundle.encoding;
}
String file_name = base_enc + ".txt";
String header = "\ufeff// Resource Bundle: " + file_name + " - File automatically generated by RBManager at " + (new Date());
OutputStream fos = new FileOutputStream(new File(directory, file_name));
PrintWriter resOut = new PrintWriter(new OutputStreamWriter(fos, "UTF-8"));
Vector group_v = bundle.getGroupsAsVector();
resOut.println(header);
resOut.println(base_enc + " { ");
for (int j=0; j < group_v.size(); j++) {
BundleGroup group = (BundleGroup)group_v.elementAt(j);
Vector itemVect = group.getItemsAsVector();
int itemVectSize = itemVect.size();
if (itemVectSize > 0) {
if (writeMetaData) {
String groupComment = group.getComment();
if (groupComment != null && !groupComment.equals("")) {
resOut.println(" // @groupComment " + groupComment);
}
}
boolean writeGroupName = !bundle.getUngroupedGroup().getName().equals(group.getName());
if (writeGroupName) {
if (writeGroupsAsKeys) {
resOut.println(" " + escapeString(group.getName(), true) + " { ");
}
else if (writeMetaData) {
resOut.println(" // @group " + escapeString(group.getName(), true));
}
}
for (int k=0; k < itemVectSize; k++) {
BundleItem item = (BundleItem)itemVect.elementAt(k);
if (writeMetaData) {
resOut.print(" //");
resOut.print(" @translated " + item.isTranslated());
resOut.print(" @created " + item.getCreatedDate());
resOut.print(" @modified " + item.getModifiedDate());
resOut.print(" @creator " + item.getCreator());
resOut.println(" @modifier " + item.getModifier());
String itemComment = item.getComment();
if (itemComment != null && !itemComment.equals("")) {
resOut.println(" // @comment " + itemComment);
}
}
resOut.println(" " + escapeString(item.getKey(), true)
+ " { " + escapeString(item.getTranslation(), false) + " }");
} // end for - k
if (writeGroupName && writeGroupsAsKeys) {
resOut.println(" }");
}
}
} // end for - j
resOut.println("}");
// Write out the file
resOut.close();
fos.close();
} // end for - i
}
/**
* Escape a string according to how the ICU tool "genrb" handles strings.
* @param str The string to escape
* @param isKey If this is a key, then quotes are optional.
* @return A string that can be used in an ICU resource bundle.
*/
protected String escapeString(String str, boolean isKey) throws IOException {
StringBuffer strBuf = new StringBuffer();
int len = str.length();
boolean quoteRequired = !isKey;
for (int idx = 0; idx < len; idx++) {
char ch = str.charAt(idx);
if (ch <= ' ' || '~' < ch) {
if (isKey && ch != ' ') {
IOException e = new IOException(str + " needs to use invariant characters for the key.");
e.fillInStackTrace();
throw e;
} else if (escapeNonAscii && ch != ' ') {
String zeros;
String hexNum;
if ((ch & 0xf800) == 0xd800) {
// We assume that we found a valid UTF-16 string with a surrogate
int ch2 = str.charAt(idx++);
int chSurrogate = ((((int)ch)<<10)+(ch2)-((0xd800<<10)+0xdc00-0x10000));
zeros = "00000000";
hexNum = Integer.toHexString(chSurrogate);
strBuf.append("\\U");
} else {
zeros = "0000";
hexNum = Integer.toHexString(ch);
strBuf.append("\\u");
}
strBuf.append(zeros.substring(hexNum.length()) + hexNum.toUpperCase());
} else {
quoteRequired = true;
strBuf.append(ch);
}
} else if (ch == '\"') {
quoteRequired = true;
strBuf.append("\\\"");
} else {
if (ch == '{' || ch == '}') {
quoteRequired = true;
}
strBuf.append(ch);
}
}
if (quoteRequired) {
strBuf.insert(0, '\"');
strBuf.append('\"');
}
return strBuf.toString();
}
}