summaryrefslogtreecommitdiffstats
path: root/theme/javascript/core/glossary.js
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2014-10-13 15:23:51 +0200
committerSamy Pessé <samypesse@gmail.com>2014-10-13 15:23:51 +0200
commit32a64be407e05b6ce4275e6f3f9213e8f87f884a (patch)
tree7d3ae8bbe637474c579a91ec7b25d372d3b46712 /theme/javascript/core/glossary.js
parent138cddf3d656137abbfbfed8b51aea1e1ac3241f (diff)
downloadgitbook-32a64be407e05b6ce4275e6f3f9213e8f87f884a.zip
gitbook-32a64be407e05b6ce4275e6f3f9213e8f87f884a.tar.gz
gitbook-32a64be407e05b6ce4275e6f3f9213e8f87f884a.tar.bz2
Fix #460: search for glossary term on all nodes
Diffstat (limited to 'theme/javascript/core/glossary.js')
-rw-r--r--theme/javascript/core/glossary.js46
1 files changed, 40 insertions, 6 deletions
diff --git a/theme/javascript/core/glossary.js b/theme/javascript/core/glossary.js
index 6e300e3..4db64d1 100644
--- a/theme/javascript/core/glossary.js
+++ b/theme/javascript/core/glossary.js
@@ -31,6 +31,8 @@ define([
return d.promise();
}
+
+
var pregQuote = function( str ) {
// http://kevin.vanzonneveld.net
// + original by: booeyOH
@@ -56,15 +58,47 @@ define([
});
};
+ var matchText = function(node, regex, callback, excludeElements) {
+ excludeElements || (excludeElements = ['script', 'style', 'iframe', 'canvas']);
+ var child = node.firstChild;
+
+ if (!child) return;
+
+ do {
+ switch (child.nodeType) {
+ case 1:
+ if (excludeElements.indexOf(child.tagName.toLowerCase()) > -1) {
+ continue;
+ }
+ matchText(child, regex, callback, excludeElements);
+ break;
+ case 3:
+ child.data.replace(regex, function(all) {
+ var args = [].slice.call(arguments),
+ offset = args[args.length - 2],
+ newTextNode = child.splitText(offset);
+
+ newTextNode.data = newTextNode.data.substr(all.length);
+ callback.apply(window, [child].concat(args));
+ child = newTextNode;
+ });
+ break;
+ }
+ } while (child = child.nextSibling);
+
+ return node;
+ };
+
var replaceTerm = function($el, term) {
var r = new RegExp( "\\b(" + pregQuote(term.name.toLowerCase()) + ")\\b" , 'gi' );
- $el.find("p:contains('"+term.name+"')").each( function( i, element ) {
- element = $(element);
- var content = $(element).html();
-
- content = content.replace(r, '<span class="glossary-term" data-glossary-term="' + term.id + '" title="' + term.description + '">$1</span>');
- element.html(content);
+ matchText($el.get(0), r, function(node, match, offset) {
+ var span = document.createElement("span");
+ span.className = "glossary-term";
+ span.textContent = match;
+ span.setAttribute("data-glossary-term", term.id);
+ span.setAttribute("title", term.description);
+ node.parentNode.insertBefore(span, node.nextSibling);
});
};