Changeset 5015


Ignore:
Timestamp:
04/22/14 08:14:00 (10 years ago)
Author:
Twan Goosen
Message:

added search word highlighting to record page

Location:
vlo/branches/vlo-3.0/vlo-web-app/src/main
Files:
1 added
3 edited
1 copied

Legend:

Unmodified
Added
Removed
  • vlo/branches/vlo-3.0/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/RecordPage.java

    r4987 r5015  
    2323import eu.clarin.cmdi.vlo.service.FieldFilter;
    2424import eu.clarin.cmdi.vlo.service.PageParametersConverter;
     25import eu.clarin.cmdi.vlo.wicket.HighlightSearchTermBehavior;
    2526import eu.clarin.cmdi.vlo.wicket.components.SolrFieldLabel;
    2627import eu.clarin.cmdi.vlo.wicket.model.CollectionListModel;
     
    6263public class RecordPage extends VloBasePage<SolrDocument> {
    6364
    64     @SpringBean(name="documentParamsConverter")
     65    @SpringBean(name = "documentParamsConverter")
    6566    private PageParametersConverter<SolrDocument> documentParamConverter;
    66     @SpringBean(name="queryParametersConverter")
     67    @SpringBean(name = "queryParametersConverter")
    6768    private PageParametersConverter<QueryFacetsSelection> selectionParametersConverter;
    68     @SpringBean(name="searchContextParamsConverter")
     69    @SpringBean(name = "searchContextParamsConverter")
    6970    private PageParametersConverter<SearchContext> contextParamConverter;
    7071    @SpringBean(name = "basicPropertiesFilter")
     
    113114
    114115        addComponents();
     116        add(new HighlightSearchTermBehavior());
    115117    }
    116118
     
    225227        final IModel<String> locationModel = new SolrFieldStringModel(getModel(), FacetConstants.FIELD_FILENAME);
    226228        final UrlFromStringModel locationUrlModel = new UrlFromStringModel(locationModel);
    227         return new TogglePanel(id, Model.of("Show all metadata fields"), Model.of("Hide all metadata fields")) {
     229        final TogglePanel togglePanel = new TogglePanel(id, Model.of("Show all metadata fields"), Model.of("Hide all metadata fields")) {
    228230
    229231            @Override
     
    234236            }
    235237        };
     238        // highlight search terms when panel becomes visible
     239        togglePanel.add(new HighlightSearchTermBehavior());
     240        return togglePanel;
    236241    }
    237242
  • vlo/branches/vlo-3.0/vlo-web-app/src/main/resources/eu/clarin/cmdi/vlo/wicket/pages/clarin-d/colour.css

    r5000 r5015  
    115115}
    116116
     117#record .attributeValues .searchword, #recordcmdi .searchword {
     118    background: yellow;
     119}
     120
    117121li.searchresultitem:nth-child(even), #record .recorddetailstable tr:nth-child(odd) {
    118122    background: #f1f3f6;
  • vlo/branches/vlo-3.0/vlo-web-app/src/main/resources/eu/clarin/cmdi/vlo/wicket/pages/colour.css

    r5000 r5015  
    107107}
    108108
     109#record .attributeValues .searchword, #recordcmdi .searchword {
     110    background: yellow;
     111}
     112
    109113li.searchresultitem:nth-child(even), #record .recorddetailstable tr:nth-child(odd) {
    110114    background: #ccd6e8;
  • vlo/branches/vlo-3.0/vlo-web-app/src/main/resources/eu/clarin/cmdi/vlo/wicket/pages/searchhi.js

    r5007 r5015  
    44/* Modified 20081217 to do in-page searching and wrap up in an object */
    55/* Modified 20081218 to scroll to first hit like
    6    http://www.woolyss.free.fr/js/searchhi_Woolyss.js and say when not found */
     6 http://www.woolyss.free.fr/js/searchhi_Woolyss.js and say when not found */
    77/* Modified 20120112 to use the URL instead of referrer */
    88
    99searchhi = {
    10   highlightWord: function(node,word) {
    11     // Iterate into this nodes childNodes
    12     if (node.hasChildNodes) {
    13             for (var hi_cn=0;hi_cn<node.childNodes.length;hi_cn++) {
    14                     searchhi.highlightWord(node.childNodes[hi_cn],word);
    15             }
     10    highlightWord: function(node, word) {
     11        // Iterate into this nodes childNodes
     12        if (node.hasChildNodes) {
     13            for (var hi_cn = 0; hi_cn < node.childNodes.length; hi_cn++) {
     14                searchhi.highlightWord(node.childNodes[hi_cn], word);
     15            }
     16        }
     17
     18        // And do this node itself
     19        if (node.nodeType == 3) { // text node
     20            tempNodeVal = node.nodeValue.toLowerCase();
     21            tempWordVal = word.toLowerCase();
     22            if (tempNodeVal.indexOf(tempWordVal) != -1) {
     23                var pn = node.parentNode;
     24                // check if we're inside a "nosearchhi" zone
     25                var checkn = pn;
     26                while (checkn.nodeType != 9 &&
     27                        checkn.nodeName.toLowerCase() != 'body') {
     28                    // 9 = top of doc
     29                    if (checkn.className.match(/\bnosearchhi\b/)) {
     30                        return;
     31                    }
     32                    checkn = checkn.parentNode;
     33                }
     34                if (pn.className != "searchword") {
     35                    // word has not already been highlighted!
     36                    var nv = node.nodeValue;
     37                    var ni = tempNodeVal.indexOf(tempWordVal);
     38                    // Create a load of replacement nodes
     39                    var before = document.createTextNode(nv.substr(0, ni));
     40                    var docWordVal = nv.substr(ni, word.length);
     41                    var after = document.createTextNode(nv.substr(ni + word.length));
     42                    var hiwordtext = document.createTextNode(docWordVal);
     43                    var hiword = document.createElement("span");
     44                    hiword.className = "searchword";
     45                    hiword.appendChild(hiwordtext);
     46                    pn.insertBefore(before, node);
     47                    pn.insertBefore(hiword, node);
     48                    pn.insertBefore(after, node);
     49                    pn.removeChild(node);
     50                    searchhi.found += 1;
     51                    if (searchhi.found == 1)
     52                        pn.scrollIntoView();
     53                }
     54            }
     55        }
     56    },
     57    googleSearchHighlight: function() {
     58        var ref = document.URL;
     59        if (ref.indexOf('?') == -1)
     60            return;
     61        var qs = ref.substr(ref.indexOf('?') + 1);
     62        var qsa = qs.split('&');
     63        for (var i = 0; i < qsa.length; i++) {
     64            var qsip = qsa[i].split('=');
     65            if (qsip.length == 1)
     66                continue;
     67            if (qsip[0] == 'q' || qsip[0] == 'p') { // q= for Google, p= for Yahoo
     68                var wordstring = unescape(qsip[1].replace(/\+/g, ' '));
     69                searchhi.process(wordstring);
     70            }
     71        }
     72    },
     73    process: function(wordstring) {
     74        searchhi.found = 0;
     75        var words = wordstring.split(/\s+/);
     76        for (w = 0; w < words.length; w++) {
     77            searchhi.highlightWord(document.getElementsByTagName("body")[0], words[w]);
     78        }
     79        if (searchhi.found === 0) {
     80            searchhi.nohits();
     81        }
     82    },
     83    nohits: function() {
     84    },
     85    init: function() {
     86        if (!document.createElement || !document.getElementsByTagName)
     87            return;
     88        // hook up forms of type searchhi
     89        var frms = document.getElementsByTagName("form");
     90        for (var i = 0; i < frms.length; i++) {
     91            if (frms[i].className.match(/\bsearchhi\b/)) {
     92                frms[i].onsubmit = function() {
     93                    var inps = this.getElementsByTagName("input");
     94                    for (var j = 0; j < inps.length; j++) {
     95                        if (inps[j].type == "text") {
     96                            searchhi.process(inps[j].value);
     97                            return false;
     98                        }
     99                    }
     100                };
     101            }
     102        }
     103        // highlight search engine referrer results
     104        searchhi.googleSearchHighlight();
    16105    }
    17 
    18     // And do this node itself
    19     if (node.nodeType == 3) { // text node
    20             tempNodeVal = node.nodeValue.toLowerCase();
    21             tempWordVal = word.toLowerCase();
    22             if (tempNodeVal.indexOf(tempWordVal) != -1) {
    23                     var pn = node.parentNode;
    24                     // check if we're inside a "nosearchhi" zone
    25                     var checkn = pn;
    26                     while (checkn.nodeType != 9 &&
    27                     checkn.nodeName.toLowerCase() != 'body') {
    28                     // 9 = top of doc
    29                             if (checkn.className.match(/\bnosearchhi\b/)) { return; }
    30                             checkn = checkn.parentNode;
    31                     }
    32                     if (pn.className != "searchword") {
    33                             // word has not already been highlighted!
    34                             var nv = node.nodeValue;
    35                             var ni = tempNodeVal.indexOf(tempWordVal);
    36                             // Create a load of replacement nodes
    37                             var before = document.createTextNode(nv.substr(0,ni));
    38                             var docWordVal = nv.substr(ni,word.length);
    39                             var after = document.createTextNode(nv.substr(ni+word.length));
    40                             var hiwordtext = document.createTextNode(docWordVal);
    41                             var hiword = document.createElement("span");
    42                             hiword.className = "searchword";
    43                             hiword.appendChild(hiwordtext);
    44                             pn.insertBefore(before,node);
    45                             pn.insertBefore(hiword,node);
    46                             pn.insertBefore(after,node);
    47                             pn.removeChild(node);
    48                             searchhi.found += 1;
    49                             if (searchhi.found == 1) pn.scrollIntoView();
    50                     }
    51             }
    52     }
    53   },
    54 
    55   googleSearchHighlight: function() {
    56     var ref = document.URL;
    57     if (ref.indexOf('?') == -1) return;
    58     var qs = ref.substr(ref.indexOf('?')+1);
    59     var qsa = qs.split('&');
    60     for (var i=0;i<qsa.length;i++) {
    61             var qsip = qsa[i].split('=');
    62       if (qsip.length == 1) continue;
    63       if (qsip[0] == 'q' || qsip[0] == 'p') { // q= for Google, p= for Yahoo
    64                     var wordstring = unescape(qsip[1].replace(/\+/g,' '));
    65                     searchhi.process(wordstring);
    66       }
    67     }
    68   },
    69  
    70   process: function(wordstring) {
    71     searchhi.found = 0;
    72     var words = wordstring.split(/\s+/);
    73     for (w=0;w<words.length;w++) {
    74             searchhi.highlightWord(document.getElementsByTagName("body")[0],words[w]);
    75     }
    76     if (searchhi.found === 0) {
    77       searchhi.nohits();
    78     }
    79   },
    80  
    81   nohits: function() {
    82   },
    83  
    84   init: function() {
    85     if (!document.createElement || !document.getElementsByTagName) return;
    86     // hook up forms of type searchhi
    87     var frms = document.getElementsByTagName("form");
    88     for (var i=0; i<frms.length; i++) {
    89       if (frms[i].className.match(/\bsearchhi\b/)) {
    90         frms[i].onsubmit = function() {
    91           var inps = this.getElementsByTagName("input");
    92           for (var j=0; j<inps.length; j++) {
    93             if (inps[j].type == "text") {
    94               searchhi.process(inps[j].value);
    95               return false;
    96             }
    97           }
    98         };
    99       }
    100     }
    101     // highlight search engine referrer results
    102     searchhi.googleSearchHighlight();
    103   }
    104106};
    105 
    106 (function(i) {var u =navigator.userAgent;var e=/*@cc_on!@*/false; var st =
    107 setTimeout;if(/webkit/i.test(u)){st(function(){var dr=document.readyState;
    108 if(dr=="loaded"||dr=="complete"){i()}else{st(arguments.callee,10);}},10);}
    109 else if((/mozilla/i.test(u)&&!/(compati)/.test(u)) || (/opera/i.test(u))){
    110 document.addEventListener("DOMContentLoaded",i,false); } else if(e){     (
    111 function(){var t=document.createElement('doc:rdy');try{t.doScroll('left');
    112 i();t=null;}catch(e){st(arguments.callee,0);}})();}else{window.onload=i;}})(searchhi.init);
     107//
     108//(function(i) {
     109//    var u = navigator.userAgent;
     110//    var e = /*@cc_on!@*/false;
     111//    var st =
     112//            setTimeout;
     113//    if (/webkit/i.test(u)) {
     114//        st(function() {
     115//            var dr = document.readyState;
     116//            if (dr == "loaded" || dr == "complete") {
     117//                i()
     118//            } else {
     119//                st(arguments.callee, 10);
     120//            }
     121//        }, 10);
     122//    }
     123//    else if ((/mozilla/i.test(u) && !/(compati)/.test(u)) || (/opera/i.test(u))) {
     124//        document.addEventListener("DOMContentLoaded", i, false);
     125//    } else if (e) {
     126//        (
     127//                function() {
     128//                    var t = document.createElement('doc:rdy');
     129//                    try {
     130//                        t.doScroll('left');
     131//                        i();
     132//                        t = null;
     133//                    } catch (e) {
     134//                        st(arguments.callee, 0);
     135//                    }
     136//                })();
     137//    } else {
     138//        window.onload = i;
     139//    }
     140//})
     141//
     142//(searchhi.init);
Note: See TracChangeset for help on using the changeset viewer.