Changeset 6686


Ignore:
Timestamp:
10/20/15 09:13:20 (9 years ago)
Author:
Twan Goosen
Message:

Search term highlighting with the highlight JQuery plugin. Added some additional pre-processing of the query terms.

Location:
vlo/branches/vlo-3.3/vlo-web-app/src/main
Files:
1 added
1 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • vlo/branches/vlo-3.3/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/JavaScriptResources.java

    r6685 r6686  
    3838    private final static CssResourceReference JQUERY_UI_CSS = new CssResourceReference(VloBasePage.class, "jquery-ui-1.11.4.custom/jquery-ui.min.css");
    3939    private final static JavaScriptResourceReference JQUERY_WATERMARK = new JavaScriptResourceReference(VloBasePage.class, "jquery.watermark-3.1.4/jquery.watermark.min.js");
    40     private final static JavaScriptResourceReference HIGHLIGHT = new JavaScriptResourceReference(RecordPage.class, "searchhi.js");
     40    private final static JavaScriptResourceReference HIGHLIGHT = new JavaScriptResourceReference(RecordPage.class, "jquery.highlight.js");
    4141
    4242    public static JavaScriptResourceReference getVloFrontJS() {
  • vlo/branches/vlo-3.3/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/HighlightSearchTermBehavior.java

    r5161 r6686  
    1717package eu.clarin.cmdi.vlo.wicket;
    1818
     19import com.google.common.collect.ImmutableSet;
    1920import eu.clarin.cmdi.vlo.JavaScriptResources;
     21import java.util.Collection;
    2022import org.apache.wicket.Component;
    2123import org.apache.wicket.behavior.Behavior;
     
    2325import org.apache.wicket.markup.head.JavaScriptHeaderItem;
    2426import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
     27import org.apache.wicket.request.Request;
     28import org.apache.wicket.util.string.StringValue;
    2529
    2630/**
     
    3337public class HighlightSearchTermBehavior extends Behavior {
    3438
    35     private static final String HIGHLIGHT_FUNCTION = "searchhi.init()";
     39    private static final String HIGHLIGHT_FUNCTION = "$('#%s').highlight(%s, {className:'%s'})";
     40    private static final Collection<String> DEFAULT_EXCLUDE_WORDS = ImmutableSet.of("and", "or", "not", "to");
    3641
    3742    @Override
     
    3944        // include highlight script
    4045        response.render(JavaScriptHeaderItem.forReference(JavaScriptResources.getHighlightJS()));
    41         // after load, highlight
    42         response.render(OnDomReadyHeaderItem.forScript(HIGHLIGHT_FUNCTION));
     46
     47        final StringValue words = getWordList(component);
     48        if (!words.isEmpty()) {
     49            // after load, highlight
     50            response.render(OnDomReadyHeaderItem.forScript(String.format(HIGHLIGHT_FUNCTION,
     51                    component.getMarkupId(), makeWordListArray(words.toString()),
     52                    getSearchWordClass()
     53            )));
     54        }
     55    }
     56
     57    /**
     58     *
     59     * @param wordList string of whitespace separated words
     60     * @return a string representing a sanitised javascript array of words
     61     */
     62    private CharSequence makeWordListArray(String wordList) {
     63        final StringBuilder sb = new StringBuilder("[");
     64        final String[] words = wordList.split("\\s");
     65        for (int i = 0; i < words.length; i++) {
     66            final String word = sanitise(words[i]); //remove white space and quotes at beginning or end
     67            // is on exclude list?
     68            if (!getExcludeWords().contains(word.toLowerCase())) {
     69                // wrap in quotes
     70                sb.append("'").append(word).append("'");
     71                if (i + 1 < words.length) {
     72                    // prepare to append next
     73                    sb.append(",");
     74                }
     75            }
     76        }
     77        return sb.append("]");
     78    }
     79
     80    private String sanitise(String word) {
     81        return word.replaceAll("^[\\s'\"]+|[\\s'\"]+$", "");
     82    }
     83
     84    /**
     85     *
     86     * @return CSS class to mark matches with
     87     */
     88    protected String getSearchWordClass() {
     89        return "searchword";
     90    }
     91
     92    protected StringValue getWordList(Component component) {
     93        Request request = component.getPage().getRequestCycle().getRequest();
     94        return request.getQueryParameters().getParameterValue(getQueryParam());
     95    }
     96
     97    protected String getQueryParam() {
     98        return "q";
     99    }
     100
     101    /**
     102     *
     103     * @return Words not to highlight
     104     */
     105    protected Collection<String> getExcludeWords() {
     106        return DEFAULT_EXCLUDE_WORDS;
    43107    }
    44108
  • vlo/branches/vlo-3.3/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/RecordPage.html

    r6330 r6686  
    5151                <div id="recorddetails">
    5252                    <a wicket:id="landingPageLink" target="_blank" id="recordlandingpage">Show this record in its original context</a>
    53                     <wicket:container wicket:id="documentProperties">[PROPERTIES TABLE]</wicket:container>
     53                    <div id="recordProperties" wicket:id="documentProperties">[PROPERTIES TABLE]</div>
    5454                </div>
    5555
  • vlo/branches/vlo-3.3/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/RecordPage.java

    r6611 r6686  
    130130
    131131        addComponents();
    132         add(new HighlightSearchTermBehavior());
    133132    }
    134133
     
    138137
    139138        final WebMarkupContainer topNavigation = new WebMarkupContainer("topnavigation");
    140         topNavigation.setOutputMarkupId(true);
    141         add(topNavigation);
    142 
    143         topNavigation.add(new BreadCrumbPanel("breadcrumbs", selectionModel));
    144         topNavigation.add(createPermalink("permalink", topNavigation));
     139        add(topNavigation
     140                .add(new BreadCrumbPanel("breadcrumbs", selectionModel))
     141                .add(createPermalink("permalink", topNavigation))
     142                .setOutputMarkupId(true)
     143        );
    145144
    146145        // General information section
    147146        add(new SolrFieldLabel("name", getModel(), FacetConstants.FIELD_NAME, getString("recordpage.unnamedrecord")));
    148147        add(createLandingPageLink("landingPageLink"));
    149         add(new FieldsTablePanel("documentProperties", new DocumentFieldsProvider(getModel(), basicPropertiesFilter, fieldOrder)));
     148       
     149        final FieldsTablePanel fieldsTable = new FieldsTablePanel("documentProperties", new DocumentFieldsProvider(getModel(), basicPropertiesFilter, fieldOrder));
     150        fieldsTable.add(new HighlightSearchTermBehavior());
     151        add(fieldsTable);
    150152
    151153        // Resources section
Note: See TracChangeset for help on using the changeset viewer.