Подсветка поиска в Java
Метод boldHighlight принимает текстовую строку и выделяет в ней q ключевых слов через <b></b>
теги
Метод colorHighlight принимает текстовую строку и выделяет ключевые слова int q через <b style='background-color: #color'></b>
с 12 чередующимися цветами
String text = "The use of hello as a telephone greeting has been credited to Thomas
Edison; according to one source, he expressed his surprise with a
misheard Hullo. Alexander Graham Bell initially used Ahoy (as used on
ships) as a telephone greeting"
String keywords = "HELLO Surprise"
boldHighlight(text, keywords); // will produce:
Использование
<b>hello</b>
как телефонное приветствие было зачислено Томасу Эдисону; согласно одному источнику, он выразил свое<b>surprise</b>
с подслушанным приветом. Александр Грэм Белл первоначально использовал Ahoy (как на кораблях) в качестве телефонного приветствия`
colorHighlight(text, keywords); // will produce:
Использование
<b style='background-color:#ffff66'>hello</b>
поскольку телефонное приветствие было приписано Томасу Эдисону;> согласно одному источнику, он выразил свое<b style='background-color:#a0ffff'>surprise</b>
с подслушанным приветом. Александр Грэм Белл первоначально использовал Ahoy (как на кораблях) в качестве телефонного приветствия
Вопрос:
Есть ли что-то, что я мог бы использовать, например, стороннюю библиотеку, которая выполняла бы ту же работу, что и методы ниже? Или, если вы посмотрите на код, есть ли что-то, что можно улучшить, чтобы улучшить производительность и / или сделать ее более элегантной?
private static final String[] colors = new String[]{"ffff66", "a0ffff", "99ff99", "ff9999", "ff66ff", "880000", "00aa00", "886800", "004699", "990099", "ffff66", "a0ffff"};
public static String safeCharWithSpace(String input) {
input = input.trim();
return Normalizer.normalize(input.toLowerCase(), Normalizer.Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
.replaceAll("[^\\p{Alnum}]+", " ");
}
private static String prepQuery(String q) {
try {
log.debug("qr encoded: " + q);
q = URLDecoder.decode(q, "UTF-8");
} catch (UnsupportedEncodingException ignore) {
}
log.debug("qr decoded: " + q);
return removeIgnoreCase(q, stopWords);
}
public static String boldHighlight(String text, String q) {
return highlight(text, q, false);
}
public static String colorHighlight(String text, String q) {
return highlight(text, q, true);
}
private static String replaceWord(String text, String keyword, int colorNumber, boolean useColor) {
String color = "";
keyword = safeCharWithSpace(keyword);
if (StringUtils.isNotEmpty(keyword) && !StringUtils.isWhitespace(keyword)) {
if (useColor) color = " style='background-color: " + colors[colorNumber] + "'";
return text.replaceAll("(?i)(" + keyword + ")(?!([^<]+)?>>)", "<b" + color + ">$1</b>");
} else
return text;
}
public static String highlight(String text, String q, boolean useColor) {
String qr = prepQuery(q);
String rtn = null;
int i = 0;
if (qr.startsWith("\"")) {
String keywords = StringUtils.remove(qr, "\"");
rtn = replaceWord(text, keywords, 0, useColor);
} else {
String[] keywords = qr.split("\\s");
for (String keyword : keywords) {
rtn = replaceWord(text, keyword, i, useColor);
if (useColor) {
if (i < 11) i++;
else i = 0;
}
}
}
return rtn;
}
для удаления стоп-слов removeIgnoreCase()
в prepQuery()
метод обратитесь к моему другому сообщению: удаление строк из другой строки в Java
1 ответ
Ух ты, ну ты мог бы сделать это несколькими разными способами.
Вы можете вызвать статический метод.
т.е.
${statics["java.lang.System"].currentTimeMillis()}
MVC должен был бы выполнить эту обработку до обработки шаблона, но я знаю, что вы просто поддерживаете код.
Похоже, он просто заменяет все, поэтому изменение метода Java должно сработать. Я должен предложить вам взглянуть на экранирующие инструменты, которые есть у Freemarker.
Freemarker действительно имеет отличную документацию, а встроенные модули покрывают многие ситуации.