| package org.unicode.cldr.util; |
| |
| import java.io.BufferedReader; |
| |
| import org.unicode.cldr.util.CldrUtility.VariableReplacer; |
| |
| /** |
| * Parses a file of regexes for use in RegexLookup or any other class that requires |
| * a list of regexes. |
| * |
| * @author jchye |
| */ |
| public class RegexFileParser { |
| private RegexLineParser lineParser; |
| private VariableProcessor varProcessor = DEFAULT_VARIABLE_PROCESSOR; |
| |
| /** |
| * Parses a line given to it by the RegexFileParser. |
| */ |
| public interface RegexLineParser { |
| public void parse(String line); |
| } |
| |
| /** |
| * Stores variables given to it by the RegexFileParser and performs replacements |
| * if needed. |
| */ |
| public interface VariableProcessor { |
| public void add(String variable, String variableName); |
| |
| public String replace(String str); |
| } |
| |
| private static final VariableProcessor DEFAULT_VARIABLE_PROCESSOR = new VariableProcessor() { |
| VariableReplacer variables = new VariableReplacer(); |
| |
| @Override |
| public void add(String variableName, String value) { |
| variables.add(variableName, value); |
| } |
| |
| @Override |
| public String replace(String str) { |
| return variables.replace(str); |
| } |
| }; |
| |
| public void setLineParser(RegexLineParser lineParser) { |
| this.lineParser = lineParser; |
| } |
| |
| public void setVariableProcessor(VariableProcessor varProcessor) { |
| this.varProcessor = varProcessor; |
| } |
| |
| /** |
| * Parses the specified text file. |
| * |
| * @param a |
| * class relative to filename |
| * @param filename |
| * the name of the text file to be parsed |
| */ |
| public void parse(Class<?> baseClass, String filename) { |
| BufferedReader reader = FileReaders.openFile(baseClass, filename); |
| String line = null; |
| int lineNumber = 0; |
| try { |
| while ((line = reader.readLine()) != null) { |
| lineNumber++; |
| line = line.trim(); |
| // Skip comments. |
| if (line.length() == 0 || line.startsWith("#")) continue; |
| // Read variables. |
| if (line.charAt(0) == '%') { |
| int pos = line.indexOf("="); |
| if (pos < 0) { |
| throw new IllegalArgumentException("Failed to read variable in " + filename + "\t\t(" |
| + lineNumber + ") " + line); |
| } |
| String varName = line.substring(0, pos).trim(); |
| String varValue = line.substring(pos + 1).trim(); |
| varProcessor.add(varName, varValue); |
| continue; |
| } |
| if (line.contains("%")) { |
| line = varProcessor.replace(line); |
| } |
| // Process a line in the input file for xpath conversion. |
| lineParser.parse(line); |
| } |
| } catch (Exception e) { |
| System.err.println("Error reading " + filename + " at line " + lineNumber + ": " + line); |
| e.printStackTrace(); |
| } |
| } |
| } |