Koha/koha-tmpl/opac-tmpl/bootstrap/lib/jquery/plugins/jquery.highlight-3.js
Jonathan Druart 2e4b574074 Bug 5844: Avoid strings cut on unhighlighing
If a user is searching for several words and that one is contained in
another ( "mag ma" ), some characters are cut (removed from the DOM!).

To reproduce:
1/ search for "mag ma m"
2/ The result page contains "Magazine"
3/ "Mag" is highlighted
4/ Click on the "Unhighlight" link
5/ The "Magazine" words become "azine", "Mag" has been cut.
There is no way to show these characters again.

Test plan:
1/ Confirm the bad behavior without this patch
2/ Apply this patch
3/ search for "mag ma m"
4/ The result page contains "Magazine"
5/ "Mag" is highlighted
6/ Click on the "Unhighlight" link
7/ strings are unhighlighted and still in the DOM :)

Note that the Highlight link won't work very well (only "a" will be
highlighted, but considered as minor since this did not work before the
patch neither).

Followed test plan. Strings are no longer cut when unhiglighted.
Signed-off-by: Marc Veron <veron@veron.ch>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
2015-03-31 10:13:18 -03:00

49 lines
1.2 KiB
JavaScript

/*
highlight v3
Highlights arbitrary terms.
<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>
MIT license.
Johann Burkard
<http://johannburkard.de>
<mailto:jb@eaio.com>
*/
jQuery.fn.highlight = function(pat) {
function innerHighlight(node, pat) {
var skip = 0;
if (node.nodeType == 3) {
var pos = node.data.toUpperCase().indexOf(pat);
if (pos >= 0) {
var spannode = document.createElement('span');
spannode.className = 'term';
var middlebit = node.splitText(pos);
var endbit = middlebit.splitText(pat.length);
var middleclone = middlebit.cloneNode(true);
spannode.appendChild(middleclone);
middlebit.parentNode.replaceChild(spannode, middlebit);
skip = 1;
}
}
else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
for (var i = 0; i < node.childNodes.length; ++i) {
i += innerHighlight(node.childNodes[i], pat);
}
}
return skip;
}
return this.each(function() {
innerHighlight(this, pat.toUpperCase());
});
};
jQuery.fn.removeHighlight = function() {
return this.find("span.term").each(function() {
$(this).contents().unwrap();
});
};