Подсветка поиска в Java - PullRequest
       19

Подсветка поиска в Java

0 голосов
/ 21 января 2011

Метод 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> в качестве телефонного приветствия было приписано Томасу Эдисону;согласно одному источнику, он выразил свое «1013» с неслышным приветом.Александр Грэхем Белл первоначально использовал 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 Ответ

1 голос
/ 22 января 2011

Ух ты, ну, ты мог бы сделать это несколькими разными способами.

  1. Ты мог бы вызвать статический метод .

    т.е.

    ${statics["java.lang.System"].currentTimeMillis()} 
    
  2. MVC должен был бы выполнить эту обработку до обработки шаблона, но я знаю, что вы просто поддерживаете код.

Похоже, он просто заменяет все, поэтому изменение метода Java должно сработать.Я должен предложить вам взглянуть на экранирующие инструменты , которые есть у Freemarker.

Freemarker действительно имеет отличную документацию , а встроенные модули охватывают многие ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...