/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.build.i18n;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.util.Enumeration;
import java.util.Properties;
import org.h2.build.code.CheckTextFiles;
import org.h2.build.indexer.HtmlConverter;
import org.h2.util.IOUtils;
import org.h2.util.SortedProperties;
import org.h2.util.StringUtils;
/**
* This class converts a file stored in the UTF-8 encoding format to
* a properties file and vice versa.
*/
public class PropertiesToUTF8 {
private PropertiesToUTF8() {
// utility class
}
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String... args) throws Exception {
convert("bin/org/h2/res");
convert("bin/org/h2/server/web/res");
}
/**
* Convert a properties file to a UTF-8 text file.
*
* @param source the name of the properties file
* @param target the target file name
*/
static void propertiesToTextUTF8(String source, String target) throws Exception {
if (!new File(source).exists()) {
return;
}
Properties prop = SortedProperties.loadProperties(source);
FileOutputStream out = new FileOutputStream(target);
PrintWriter writer = new PrintWriter(new OutputStreamWriter(out, "UTF-8"));
// keys is sorted
for (Enumeration<Object> en = prop.keys(); en.hasMoreElements();) {
String key = (String) en.nextElement();
String value = prop.getProperty(key, null);
writer.print("@" + key + "\n");
writer.print(value + "\n\n");
}
writer.close();
}
/**
* Convert a translation file (in UTF-8) to a properties file (without
* special characters).
*
* @param source the source file name
* @param target the target file name
*/
static void textUTF8ToProperties(String source, String target) throws Exception {
if (!new File(source).exists()) {
return;
}
LineNumberReader reader = new LineNumberReader(new InputStreamReader(new FileInputStream(source), "UTF-8"));
try {
SortedProperties prop = new SortedProperties();
StringBuilder buff = new StringBuilder();
String key = null;
boolean found = false;
while (true) {
String line = reader.readLine();
if (line == null) {
break;
}
line = line.trim();
if (line.length() == 0) {
continue;
}
if (line.startsWith("@")) {
if (key != null) {
prop.setProperty(key, buff.toString());
buff.setLength(0);
}
found = true;
key = line.substring(1);
} else {
if (buff.length() > 0) {
buff.append(System.getProperty("line.separator"));
}
buff.append(line);
}
}
if (found) {
prop.setProperty(key, buff.toString());
}
prop.store(target);
} finally {
reader.close();
}
}
private static void convert(String source) throws Exception {
for (File f : new File(source).listFiles()) {
if (!f.getName().endsWith(".properties")) {
continue;
}
FileInputStream in = new FileInputStream(f);
InputStreamReader r = new InputStreamReader(in, "UTF-8");
String s = IOUtils.readStringAndClose(r, -1);
in.close();
String name = f.getName();
String utf8, html;
if (name.startsWith("utf8")) {
utf8 = HtmlConverter.convertHtmlToString(s);
html = HtmlConverter.convertStringToHtml(utf8);
RandomAccessFile out = new RandomAccessFile("_" + name.substring(4), "rw");
out.write(html.getBytes());
out.setLength(out.getFilePointer());
out.close();
} else {
new CheckTextFiles().checkOrFixFile(f, false, false);
html = s;
utf8 = HtmlConverter.convertHtmlToString(html);
// s = unescapeHtml(s);
utf8 = StringUtils.javaDecode(utf8);
FileOutputStream out = new FileOutputStream("_utf8" + f.getName());
OutputStreamWriter w = new OutputStreamWriter(out, "UTF-8");
w.write(utf8);
w.close();
out.close();
}
String java = StringUtils.javaEncode(utf8);
java = StringUtils.replaceAll(java, "\\r", "\r");
java = StringUtils.replaceAll(java, "\\n", "\n");
RandomAccessFile out = new RandomAccessFile("_java." + name, "rw");
out.write(java.getBytes());
out.setLength(out.getFilePointer());
out.close();
}
}
}