package be.jeffcheasey88.peeratcode.parser.java; import java.util.ArrayList; import java.util.List; public class CleanerPool{ private List cleaners; public CleanerPool(List cleaners){ this.cleaners = new ArrayList<>(cleaners); } public String clean(String value){ for(Cleaner cleaner : this.cleaners) value = cleaner.clean(value); return value; } public boolean isConstant(String value){ for(Cleaner cleaner : this.cleaners) if(value.startsWith(cleaner.getPattern())) return true; return false; } public String getConstant(String value){ for(Cleaner cleaner : this.cleaners){ if(value.startsWith(cleaner.getPattern())){ return cleaner.getConstant(value); } } return null; } public static class Cleaner{ private String pattern; private char open; private char close; public List constants; public Cleaner(String pattern, char open, char close){ this.pattern = pattern; this.open = open; this.close = close; this.constants = new ArrayList<>(); } public String getPattern(){ return this.pattern; } public String getConstant(String value){ return this.constants.get(Integer.parseInt(value.replace(this.pattern, ""))); } public String clean(String value){ StringBuilder builder = new StringBuilder(); for(int i = 0; i < value.length(); i++){ char c = value.charAt(i); if(c == '<'){ i+=cutOpenable(value.substring(i+1), constants, pattern, open, close); builder.append(pattern+(constants.size()-1)); }else{ builder.append(c); } } return builder.toString(); } private int cutOpenable(String value, List constants, String pattern, char open, char close){ StringBuilder builder = new StringBuilder(); for(int i = 0; i < value.length(); i++){ char c = value.charAt(i); if(c == open){ i+=cutOpenable(value.substring(i+1), constants, pattern, open, close); builder.append(pattern+(constants.size()-1)); }else if(c == close){ break; }else{ builder.append(c); } } constants.add(builder.toString()); return builder.length()+1; } } }