peer-at-code-backend/src/be/jeffcheasey88/peeratcode/parser/java/CleanerPool.java

90 lines
No EOL
2.1 KiB
Java

package be.jeffcheasey88.peeratcode.parser.java;
import java.util.ArrayList;
import java.util.List;
public class CleanerPool{
private List<Cleaner> cleaners;
public CleanerPool(List<Cleaner> 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<String> 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<String> 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;
}
}
}