package org.jtwig.util;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static java.util.Arrays.asList;
import static java.util.regex.Pattern.compile;
import static java.util.regex.Pattern.quote;
public final class HtmlUtils {
private static final String START_COMMENT = "<!--";
private static final String END_COMMENT = "-->";
private HtmlUtils () {}
public static String stripTags (String input, String allowedTags) {
return removeUnknownTags(removeHtmlComments(input), allowedTags);
}
public static String stripTags (String input) {
return removeUnknownTags(removeHtmlComments(input), "");
}
private static String removeUnknownTags(String input, String knownTags) {
List<String> knownTagList = asList(knownTags.replaceAll("^<", "").replaceAll(">$", "").split("><"));
return removeTags(input, knownTagList);
}
private static String removeTags(String input, List<String> knownTagList) {
Pattern tag = compile("</?([^\\s>]*)\\s*[^>]*>", Pattern.CASE_INSENSITIVE);
Matcher matches = tag.matcher(input);
String result = input;
while (matches.find()) {
if (!knownTagList.contains(matches.group(1))) {
result = result.replaceAll(quote(matches.group()), "");
}
}
return result;
}
private static String removeTags (String input, String startTag, String endTag) {
String result = input;
while (result.contains(startTag)) {
int start = result.indexOf(startTag);
int end = result.substring(start + startTag.length()).indexOf(endTag);
if (end == -1) result = result.substring(0, start);
else result = result.substring(0, start) + result.substring(start + startTag.length() + end + endTag.length());
}
return result;
}
private static String removeHtmlComments (String input) {
return removeTags(input, START_COMMENT, END_COMMENT);
}
}