blob: 870d3eb1b363a633335f5f93ee355a474d81737a [file] [log] [blame]
package org.eclipse.jdt.core.internal.tools.unicode;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class TableBuilder {
private static final String CHAR_ELEMENT = "char"; //$NON-NLS-1$
private static final String SINCE_UNICODE_VERSION = "age"; //$NON-NLS-1$
private static final String CODE_POINT = "cp"; //$NON-NLS-1$
private static final String GROUP_CODE = "gc"; //$NON-NLS-1$
public static String[] buildTables(
final double unicodeValue,
boolean usePredefinedRange,
Environment env,
String unicodeDataFileName) throws IOException {
List<String> result = new ArrayList<>();
SAXParser saxParser = null;
try {
saxParser = SAXParserFactory.newInstance().newSAXParser();
} catch (ParserConfigurationException e) {
e.printStackTrace();
return null;
} catch (SAXException e) {
e.printStackTrace();
return null;
}
DefaultHandler defaultHandler = new DefaultHandler() {
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
if (CHAR_ELEMENT.equals(qName)) {
final String group = attributes.getValue(GROUP_CODE);
if (env.hasCategory(group)) {
final String codePoint = attributes.getValue(CODE_POINT);
final String age = attributes.getValue(SINCE_UNICODE_VERSION);
double ageValue = 0.0;
try {
ageValue = Double.parseDouble(age);
} catch (NumberFormatException e) {
e.printStackTrace();
}
if (ageValue <= unicodeValue) {
result.add(codePoint);
}
}
}
}
};
try {
saxParser.parse(new File(unicodeDataFileName), defaultHandler);
} catch (SAXException e) {
e.printStackTrace();
return null;
}
if (usePredefinedRange) {
// predefined ranges - ISO control character (see
// isIdentifierIgnorable(int))
result.add("0000..0008"); //$NON-NLS-1$
result.add("000E..001B"); //$NON-NLS-1$
result.add("007F..009F"); //$NON-NLS-1$
}
return result.toArray(new String[result.size()]);
}
}