// Copyright 2001-2005, FreeHEP. package org.freehep.graphics2d.font.encoding; import java.io.*; import java.util.StringTokenizer; /** * CharTableConverter class generates java files from * given unicode formatted txt file to use with Lookup class. * Usage java CharTableConverter encoding.unicode.txt [encoding type] * * @author Sami Kama * @version $Id: CharTableConverter.java 8584 2006-08-10 23:06:37Z duns $ */ public class CharTableConverter { private BufferedReader textFile = null; private PrintWriter javaOut = null; private int encType=1; public void putHeaders(String pkg, String className) throws Exception { javaOut.println("//Generated by CharTableConverter"); javaOut.println("//!!DO NOT EDIT"); javaOut.println("package "+pkg+";"); javaOut.println(); javaOut.println("import java.util.*;"); javaOut.println(); javaOut.println("/**"); javaOut.println(" * Generated "+className+" Encoding Table."); javaOut.println(" *"); javaOut.println(" * @author org.freehep.graphics2d.font.CharTableConverter"); javaOut.println(" * @version $Id: CharTableConverter.java 8584 2006-08-10 23:06:37Z duns $"); javaOut.println(" */"); javaOut.println("public class "+className+" extends AbstractCharTable {"); javaOut.println("\tprivate Hashtable unicodeToName = new Hashtable();"); javaOut.println("\tprivate Hashtable nameToUnicode = new Hashtable();"); javaOut.println("\tprivate Hashtable nameToEnc = new Hashtable();"); javaOut.println("\tprivate String[] encToName = new String[256];"); javaOut.println("\tpublic "+className+"() {"); } public void putMethods(String encoding, String tableName) throws Exception { /* javaOut.println("\tpublic String toName(char c){"); javaOut.println("\t\treturn((String)(unicodeToName.get(new Character(c))));"); javaOut.println("\t}"); javaOut.println(); */ javaOut.println("\tpublic String toName(Character c){"); javaOut.println("\t\treturn((String)unicodeToName.get(c));"); javaOut.println("\t}"); javaOut.println(); javaOut.println("\tpublic String toName(int enc){"); javaOut.println("\t\tif(enc!=0)"); javaOut.println("\t\treturn(encToName[enc]);"); javaOut.println("\t\treturn(null);"); javaOut.println("\t}"); javaOut.println(); /* javaOut.println("\tpublic String toName(Integer enc){"); javaOut.println("\t\treturn(encToName[enc.intValue()]);"); javaOut.println("\t}"); javaOut.println(); */ javaOut.println("\tpublic int toEncoding(String name){"); javaOut.println("\t\treturn(((Integer)(nameToEnc.get(name))).intValue());"); javaOut.println("\t}"); javaOut.println(); javaOut.println("\tpublic char toUnicode(String name){"); javaOut.println("\t\treturn(((Character)(nameToUnicode.get(name))).charValue());"); javaOut.println("\t}"); javaOut.println(); javaOut.println("\tpublic String getName(){"); javaOut.println("\treturn(\""+tableName+"\");"); javaOut.println("\t}"); javaOut.println(); javaOut.println("\tpublic String getEncoding(){"); javaOut.println("\t return(\""+encoding+"\");"); javaOut.println("\t}"); javaOut.println(); javaOut.println("}"); javaOut.flush(); javaOut.close(); } public void openFiles(File in, String outName) throws Exception{ InputStream textIn = new FileInputStream(in); Reader textFileReader = new InputStreamReader(textIn,"UTF-16"); File out = new File(outName); out.getParentFile().mkdirs(); Writer javaFileWriter = new FileWriter(out); textFile = new BufferedReader(textFileReader); javaOut = new PrintWriter(javaFileWriter); } public void convertTxtToHash(String encoding) throws Exception{ String buff = new String(); String charCode = new String(); String charName = new String(); String enc = new String(); String hexformat = new String(); if (encoding.equals("ISO")) encType=5; if (encoding.equals("PDF")) encType=4; if (encoding.equals("WIN")) encType=3; if (encoding.equals("MAC")) encType=2; if (encoding.equals("STD")) encType=1; while((buff=textFile.readLine())!=null){ StringTokenizer st = new StringTokenizer(buff,"\u0009\u0020"); if (!st.hasMoreTokens()) continue; charCode=st.nextToken(); if (charCode.equals("##")) continue; if (!st.hasMoreTokens()) continue; charName=st.nextToken(); for (int i=0;i<encType;i++){ if (!st.hasMoreTokens()) continue; enc = st.nextToken(); } if (charCode.startsWith("\\u")){ int cCL = charCode.length(); javaOut.println(); hexformat = charCode.substring(cCL-4,cCL); javaOut.print("\t\t\t"); javaOut.println("unicodeToName.put(new Character((char)0x"+ hexformat+"),\""+charName+"\");"); javaOut.print("\t\t\t"); javaOut.println("nameToUnicode.put(\"" +charName+"\""+", new Character((char)0x"+hexformat+"));"); } else { hexformat = "00"+(Integer.toHexString((int)charCode.charAt(0))); javaOut.println(); javaOut.print("\t\t\t"); javaOut.println("unicodeToName.put(new Character((char)0x"+ hexformat.substring(hexformat.length()-4,hexformat.length())+ "),\""+charName+"\");"); javaOut.print("\t\t\t"); javaOut.println("nameToUnicode.put(\""+ charName+"\""+",new Character((char)0x"+ hexformat.substring(hexformat.length()-4,hexformat.length())+ "));"); } Integer encodingInt = Integer.decode(enc); if (encodingInt.intValue() >= 0) { javaOut.print("\t\t\t"); javaOut.println("nameToEnc.put(\""+charName+ "\", new Integer("+encodingInt+"));"); javaOut.print("\t\t\t"); javaOut.println("encToName["+encodingInt+"]=\""+charName+"\";"); } } javaOut.println(); javaOut.println("\t\t}"); javaOut.println(); } public static void main(String args[]) throws Exception { if ((args.length<3)||(args.length>4)){ System.err.println("Usage: CharTableConverter destdir package txtfile [Encoding type]"); System.exit(0); } CharTableConverter converter = new CharTableConverter(); File src = new File(args[2]); String encoding = (args.length==4) ? args[3] : ""; String tableName = src.getName(); int dot = tableName.indexOf("."); if (dot >= 0) tableName = tableName.substring(0,dot); String className = encoding+tableName; String pkg = args[1]; String destFile = args[0]+File.separator+pkg.replace('.', File.separatorChar)+File.separator+className+".java"; converter.openFiles(src, destFile); converter.putHeaders(pkg, className); converter.convertTxtToHash(encoding); converter.putMethods(encoding, tableName); } }