package com.aperture_software.glados_wiki.markdown;
import com.google.common.base.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author jhyun
* @since 2014. Mar. 12.
*/
public class EscapableRegexReplaceFunction implements Function<String, String> {
private Pattern pattern;
private Function<Matcher, String> replacement;
private boolean removeEscapeBackslash = false;
public EscapableRegexReplaceFunction(Pattern pattern, Function<Matcher, String> replacement, boolean removeEscapeBackslash) {
this.pattern = pattern;
this.replacement = replacement;
this.removeEscapeBackslash = removeEscapeBackslash;
}
public Pattern getPattern() {
return pattern;
}
public void setPattern(Pattern pattern) {
this.pattern = pattern;
}
public Function<Matcher, String> getReplacement() {
return replacement;
}
public void setReplacement(Function<Matcher, String> replacement) {
this.replacement = replacement;
}
@Override
public String apply(String input) {
final StringBuffer sbuf = new StringBuffer();
Matcher m = pattern.matcher(input);
int pos = 0;
while (true) {
if (m.find()) {
final int start = m.start();
final int end = m.end();
if (pos <= start) {
final String s = m.group();
if (start > 0 && input.charAt(start - 1) == '\\') {
if (this.removeEscapeBackslash) {
sbuf.append(input.substring(pos, start - 1));
} else {
sbuf.append(input.substring(pos, start));
}
pos = end;
//
sbuf.append(s);
} else {
sbuf.append(input.substring(pos, start));
pos = end;
//
sbuf.append(replacement.apply(m));
}
}
} else {
if (pos < input.length() - 1) {
sbuf.append(input.substring(pos));
}
break;
}
}
return sbuf.toString();
}
}