package org.droiddraw.util; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.Writer; import java.util.Hashtable; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; public class StringHandler extends DefaultHandler { Hashtable<String, String> strings; StringBuffer buff; String name; public StringHandler() { strings = new Hashtable<String,String>(); buff = new StringBuffer(); } @Override public void characters(char arg0[], int arg1, int arg2) { buff.append(arg0, arg1, arg2); } @Override public void startDocument() { strings.clear(); } @Override public void startElement(String ns, String lName, String qName, Attributes atts) { buff.setLength(0); if(qName.equals("string")) name = atts.getValue("name"); } @Override public void endElement(String uri, String localName, String qName) { if(qName.equals("string")) { String str = buff.toString(); while (str.indexOf("\\u")!=-1) { int ix = str.indexOf("\\u"); int code = Integer.parseInt(str.substring(ix+2, ix+6), 16); str = str.substring(0, ix)+(char)code+str.substring(ix+6); } while (str.indexOf("\\n")!=-1) { str = str.replace("\\n", "\n"); } strings.put(name, str); } } public Hashtable<String,String> getStrings() { return strings; } public static Hashtable<String,String> load(InputStream is) throws SAXException, ParserConfigurationException, IOException { return load(new InputSource(is)); } public static Hashtable<String,String> load(InputSource in) throws SAXException, ParserConfigurationException, IOException { StringHandler sh = new StringHandler(); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse(in, sh); return sh.getStrings(); } public static void dump(Writer w, Hashtable<String, String> strings) throws IOException { PrintWriter pw = new PrintWriter(w); pw.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); pw.println("<resources>"); for (String key : strings.keySet()) { String value = strings.get(key); pw.println("<string name=\""+key+"\">"+value+"</string>"); } pw.println("</resources>"); pw.flush(); w.flush(); } }