1b5840353SAdam Hornáček /* 2b5840353SAdam Hornáček * Copyright 2005 The Apache Software Foundation 3b5840353SAdam Hornáček * Portions Copyright (c) 2017, Chris Fraire <cfraire@me.com>. 4b5840353SAdam Hornáček * 5b5840353SAdam Hornáček * Licensed under the Apache License, Version 2.0 (the "License"); 6b5840353SAdam Hornáček * you may not use this file except in compliance with the License. 7b5840353SAdam Hornáček * You may obtain a copy of the License at 8b5840353SAdam Hornáček * 9b5840353SAdam Hornáček * http://www.apache.org/licenses/LICENSE-2.0 10b5840353SAdam Hornáček * 11b5840353SAdam Hornáček * Unless required by applicable law or agreed to in writing, software 12b5840353SAdam Hornáček * distributed under the License is distributed on an "AS IS" BASIS, 13b5840353SAdam Hornáček * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14b5840353SAdam Hornáček * See the License for the specific language governing permissions and 15b5840353SAdam Hornáček * limitations under the License. 16b5840353SAdam Hornáček */ 179805b761SAdam Hornáček package org.opengrok.indexer.search; 18b5840353SAdam Hornáček 19b5840353SAdam Hornáček import java.util.ArrayList; 20b5840353SAdam Hornáček import java.util.List; 219805b761SAdam Hornáček import org.opengrok.indexer.web.Util; 22b5840353SAdam Hornáček 23b5840353SAdam Hornáček /** A document summary dynamically generated to match a query. */ 24b5840353SAdam Hornáček public class Summary { 25b5840353SAdam Hornáček htmlize(String q)26b5840353SAdam Hornáček protected static String htmlize(String q) { 27b5840353SAdam Hornáček return Util.prehtmlize(q); 28b5840353SAdam Hornáček } 29b5840353SAdam Hornáček 30b5840353SAdam Hornáček /** A fragment of text within a summary. */ 31b5840353SAdam Hornáček public static class Fragment { 32b5840353SAdam Hornáček private final String text; 33b5840353SAdam Hornáček 3481b586e6SVladimir Kotal /* Constructs a fragment for the given text. */ Fragment(String text)35*ff44f24aSAdam Hornáček public Fragment(String text) { 36*ff44f24aSAdam Hornáček this.text = text; 37*ff44f24aSAdam Hornáček } 38b5840353SAdam Hornáček 3981b586e6SVladimir Kotal /* Returns the text of this fragment. */ getText()40*ff44f24aSAdam Hornáček public String getText() { 41*ff44f24aSAdam Hornáček return text; 42*ff44f24aSAdam Hornáček } 43b5840353SAdam Hornáček 4481b586e6SVladimir Kotal /* Returns true iff this fragment is to be highlighted. */ isHighlight()45*ff44f24aSAdam Hornáček public boolean isHighlight() { 46*ff44f24aSAdam Hornáček return false; 47*ff44f24aSAdam Hornáček } 48b5840353SAdam Hornáček 4981b586e6SVladimir Kotal /* Returns true iff this fragment is an ellipsis. */ isEllipsis()50*ff44f24aSAdam Hornáček public boolean isEllipsis() { 51*ff44f24aSAdam Hornáček return false; 52*ff44f24aSAdam Hornáček } 53b5840353SAdam Hornáček 5481b586e6SVladimir Kotal /* Returns an HTML representation of this fragment. */ 55*ff44f24aSAdam Hornáček @Override toString()56*ff44f24aSAdam Hornáček public String toString() { 57*ff44f24aSAdam Hornáček return htmlize(text); 58*ff44f24aSAdam Hornáček } 59b5840353SAdam Hornáček } 60b5840353SAdam Hornáček 61b5840353SAdam Hornáček /** A highlighted fragment of text within a summary. */ 62b5840353SAdam Hornáček public static class Highlight extends Fragment { 6381b586e6SVladimir Kotal /* Constructs a highlighted fragment for the given text. */ Highlight(String text)64*ff44f24aSAdam Hornáček public Highlight(String text) { 65*ff44f24aSAdam Hornáček super(text); 66*ff44f24aSAdam Hornáček } 67b5840353SAdam Hornáček 6881b586e6SVladimir Kotal /* Returns true. */ 69*ff44f24aSAdam Hornáček @Override isHighlight()70*ff44f24aSAdam Hornáček public boolean isHighlight() { 71*ff44f24aSAdam Hornáček return true; 72*ff44f24aSAdam Hornáček } 73b5840353SAdam Hornáček 7481b586e6SVladimir Kotal /* Returns an HTML representation of this fragment. */ 75*ff44f24aSAdam Hornáček @Override toString()76*ff44f24aSAdam Hornáček public String toString() { 77*ff44f24aSAdam Hornáček return "<b>" + super.toString() + "</b>"; 78*ff44f24aSAdam Hornáček } 79b5840353SAdam Hornáček } 80b5840353SAdam Hornáček 81b5840353SAdam Hornáček /** An ellipsis fragment within a summary. */ 82b5840353SAdam Hornáček public static class Ellipsis extends Fragment { 8381b586e6SVladimir Kotal /* Constructs an ellipsis fragment for the given text. */ Ellipsis()84*ff44f24aSAdam Hornáček public Ellipsis() { 85*ff44f24aSAdam Hornáček super(" ... "); 86b5840353SAdam Hornáček } 87b5840353SAdam Hornáček 88*ff44f24aSAdam Hornáček /* Returns true. */ 89*ff44f24aSAdam Hornáček @Override isEllipsis()90*ff44f24aSAdam Hornáček public boolean isEllipsis() { 91*ff44f24aSAdam Hornáček return true; 92*ff44f24aSAdam Hornáček } 93*ff44f24aSAdam Hornáček 94*ff44f24aSAdam Hornáček /* Returns an HTML representation of this fragment. */ 95*ff44f24aSAdam Hornáček @Override toString()96*ff44f24aSAdam Hornáček public String toString() { 97*ff44f24aSAdam Hornáček return "<b> ... </b>"; 98*ff44f24aSAdam Hornáček } 99*ff44f24aSAdam Hornáček } 100*ff44f24aSAdam Hornáček 101*ff44f24aSAdam Hornáček private final List<Fragment> fragments = new ArrayList<>(); 102b5840353SAdam Hornáček 103b5840353SAdam Hornáček private static final Fragment[] FRAGMENT_PROTO = new Fragment[0]; 104b5840353SAdam Hornáček 1054ce4e2b9SAdam Hornáček /* Adds a fragment to a summary.*/ add(Fragment fragment)106*ff44f24aSAdam Hornáček public void add(Fragment fragment) { 107*ff44f24aSAdam Hornáček fragments.add(fragment); 108*ff44f24aSAdam Hornáček } 109b5840353SAdam Hornáček 11081b586e6SVladimir Kotal /** 11181b586e6SVladimir Kotal * Returns an array of all of this summary's fragments. 11281b586e6SVladimir Kotal * @return fragment array 11381b586e6SVladimir Kotal */ getFragments()114b5840353SAdam Hornáček public Fragment[] getFragments() { 1155670a478SVladimir Kotal return fragments.toArray(FRAGMENT_PROTO); 116b5840353SAdam Hornáček } 117b5840353SAdam Hornáček 11881b586e6SVladimir Kotal /** 11981b586e6SVladimir Kotal * Returns an HTML representation of this fragment. 12081b586e6SVladimir Kotal * @return string representation 12181b586e6SVladimir Kotal */ 122*ff44f24aSAdam Hornáček @Override toString()123b5840353SAdam Hornáček public String toString() { 124b5840353SAdam Hornáček StringBuilder buffer = new StringBuilder(); 125*ff44f24aSAdam Hornáček for (Fragment fragment : fragments) { 126*ff44f24aSAdam Hornáček buffer.append(fragment); 127b5840353SAdam Hornáček } 128b5840353SAdam Hornáček return buffer.toString(); 129b5840353SAdam Hornáček } 130b5840353SAdam Hornáček } 131