package de.sebastianbenz.task.ui.highlighting;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightedPositionAcceptor;
public class Brush {
public static class MappingBuilder {
private final Pattern pattern;
public MappingBuilder(Pattern pattern) {
this.pattern = pattern;
}
public Mapping style(String id) {
return new Mapping(id, pattern);
}
}
public static class Mapping{
private final String style;
private final Pattern pattern;
public Mapping(String style, Pattern pattern) {
this.style = style;
this.pattern = pattern;
}
public static MappingBuilder keywords(String keywords) {
keywords = "(\\b(" + keywords.replaceAll(" ", ")\\\\b|\\\\b(") + ")\\b)";
return new MappingBuilder(Pattern.compile(keywords));
}
public static MappingBuilder pattern(String pattern) {
return new MappingBuilder(Pattern.compile(pattern));
}
public static MappingBuilder pattern(Pattern pattern) {
return new MappingBuilder(pattern);
}
public void apply(String string, IHighlightedPositionAcceptor acceptor) {
if(string == null || string.length() == 0){
return;
}
Matcher matcher = pattern.matcher(string);
while(matcher.find()){
int offset = matcher.start();
int length = matcher.end() - offset;
acceptor.addPosition(offset, length, style);
}
}
}
private final String name;
private final List<Mapping> mappings;
public Brush(String name, List<Mapping> mappings) {
this.name = name;
this.mappings = mappings;
}
public String getName() {
return name;
}
public void apply(String string, IHighlightedPositionAcceptor acceptor) {
for (Mapping mapping : mappings) {
mapping.apply(string, acceptor);
}
}
}