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(); } }