From 6722961db100d58f8290d51768943fc6b416f7a9 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 14 Mar 2012 16:31:28 -0400 Subject: [PATCH] A bunch more Lucene work --- src/com/gitblit/utils/LuceneUtils.java | 61 +++++++++++++++++++++++------- 1 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/com/gitblit/utils/LuceneUtils.java b/src/com/gitblit/utils/LuceneUtils.java index 1c24f28..ca1bbf1 100644 --- a/src/com/gitblit/utils/LuceneUtils.java +++ b/src/com/gitblit/utils/LuceneUtils.java @@ -21,6 +21,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.text.MessageFormat; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; @@ -903,7 +904,8 @@ Document doc = searcher.doc(docId); SearchResult result = createSearchResult(doc, hits[i].score); String content = doc.get(FIELD_CONTENT); - result.fragment = getHighlightedFragment(analyzer, query, content); + + result.fragment = getHighlightedFragment(analyzer, query, content, result); results.add(result); } } catch (Exception e) { @@ -913,28 +915,44 @@ } private static String getHighlightedFragment(Analyzer analyzer, Query query, - String content) throws IOException, InvalidTokenOffsetsException { - content = content == null ? "":StringUtils.escapeForHtml(content, false); + String content, SearchResult result) throws IOException, InvalidTokenOffsetsException { + content = content == null ? "":StringUtils.escapeForHtml(content, false); + TokenStream stream = TokenSources.getTokenStream("content", content, analyzer); QueryScorer scorer = new QueryScorer(query, "content"); - Fragmenter fragmenter = new SimpleSpanFragmenter(scorer, 150); - - SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span class=\"highlight\">", "</span>"); - Highlighter highlighter = new Highlighter(formatter, scorer); + Fragmenter fragmenter; + if (ObjectType.commit == result.type) { + fragmenter = new SimpleSpanFragmenter(scorer, 1024); + } else { + fragmenter = new SimpleSpanFragmenter(scorer, 150); + } + + // use an artificial delimiter for the token + String termTag = "<!--["; + String termTagEnd = "]-->"; + SimpleHTMLFormatter formatter = new SimpleHTMLFormatter(termTag, termTagEnd); + Highlighter highlighter = new Highlighter(formatter, scorer); highlighter.setTextFragmenter(fragmenter); + String [] fragments = highlighter.getBestFragments(stream, content, 5); if (ArrayUtils.isEmpty(fragments)) { - return content; - } - if (fragments.length == 1) { - return "<pre>" + fragments[0] + "</pre>"; + if (ObjectType.blob == result.type) { + return ""; + } + return "<pre class=\"text\">" + content + "</pre>"; } StringBuilder sb = new StringBuilder(); for (int i = 0, len = fragments.length; i < len; i++) { - String fragment = fragments[i].trim(); - sb.append("<pre>"); - sb.append(fragment); + String fragment = fragments[i]; + + // resurrect the raw fragment from removing the artificial delimiters + String raw = fragment.replace(termTag, "").replace(termTagEnd, ""); + sb.append(getPreTag(result, raw, content)); + + // replace the artificial delimiter with html tags + String html = fragment.replace(termTag, "<span class=\"highlight\">").replace(termTagEnd, "</span>"); + sb.append(html); sb.append("</pre>"); if (i < len - 1) { sb.append("<span class=\"ellipses\">...</span><br/>"); @@ -942,6 +960,21 @@ } return sb.toString(); } + + private static String getPreTag(SearchResult result, String fragment, String content) { + String pre = "<pre class=\"text\">"; + if (ObjectType.blob == result.type) { + int line = StringUtils.countLines(content.substring(0, content.indexOf(fragment))); + int lastDot = result.path.lastIndexOf('.'); + if (lastDot > -1) { + String ext = result.path.substring(lastDot + 1).toLowerCase(); + pre = MessageFormat.format("<pre class=\"prettyprint linenums:{0,number,0} lang-{1}\">", line, ext); + } else { + pre = MessageFormat.format("<pre class=\"prettyprint linenums:{0,number,0}\">", line); + } + } + return pre; + } /** * Close all the index writers and searchers -- Gitblit v1.9.1