Home | History | Annotate | Download | only in util
      1 package org.unicode.cldr.util;
      2 
      3 import java.io.BufferedReader;
      4 
      5 import org.unicode.cldr.util.CldrUtility.VariableReplacer;
      6 
      7 /**
      8  * Parses a file of regexes for use in RegexLookup or any other class that requires
      9  * a list of regexes.
     10  *
     11  * @author jchye
     12  */
     13 public class RegexFileParser {
     14     private RegexLineParser lineParser;
     15     private VariableProcessor varProcessor = DEFAULT_VARIABLE_PROCESSOR;
     16 
     17     /**
     18      * Parses a line given to it by the RegexFileParser.
     19      */
     20     public interface RegexLineParser {
     21         public void parse(String line);
     22     }
     23 
     24     /**
     25      * Stores variables given to it by the RegexFileParser and performs replacements
     26      * if needed.
     27      */
     28     public interface VariableProcessor {
     29         public void add(String variable, String variableName);
     30 
     31         public String replace(String str);
     32     }
     33 
     34     private static final VariableProcessor DEFAULT_VARIABLE_PROCESSOR = new VariableProcessor() {
     35         VariableReplacer variables = new VariableReplacer();
     36 
     37         @Override
     38         public void add(String variableName, String value) {
     39             variables.add(variableName, value);
     40         }
     41 
     42         @Override
     43         public String replace(String str) {
     44             return variables.replace(str);
     45         }
     46     };
     47 
     48     public void setLineParser(RegexLineParser lineParser) {
     49         this.lineParser = lineParser;
     50     }
     51 
     52     public void setVariableProcessor(VariableProcessor varProcessor) {
     53         this.varProcessor = varProcessor;
     54     }
     55 
     56     /**
     57      * Parses the specified text file.
     58      *
     59      * @param a
     60      *            class relative to filename
     61      * @param filename
     62      *            the name of the text file to be parsed
     63      */
     64     public void parse(Class<?> baseClass, String filename) {
     65         BufferedReader reader = FileReaders.openFile(baseClass, filename);
     66         String line = null;
     67         int lineNumber = 0;
     68         try {
     69             while ((line = reader.readLine()) != null) {
     70                 lineNumber++;
     71                 line = line.trim();
     72                 // Skip comments.
     73                 if (line.length() == 0 || line.startsWith("#")) continue;
     74                 // Read variables.
     75                 if (line.charAt(0) == '%') {
     76                     int pos = line.indexOf("=");
     77                     if (pos < 0) {
     78                         throw new IllegalArgumentException("Failed to read variable in " + filename + "\t\t("
     79                             + lineNumber + ") " + line);
     80                     }
     81                     String varName = line.substring(0, pos).trim();
     82                     String varValue = line.substring(pos + 1).trim();
     83                     varProcessor.add(varName, varValue);
     84                     continue;
     85                 }
     86                 if (line.contains("%")) {
     87                     line = varProcessor.replace(line);
     88                 }
     89                 // Process a line in the input file for xpath conversion.
     90                 lineParser.parse(line);
     91             }
     92         } catch (Exception e) {
     93             System.err.println("Error reading " + filename + " at line " + lineNumber + ": " + line);
     94             e.printStackTrace();
     95         }
     96     }
     97 }