summaryrefslogtreecommitdiffstats
path: root/theme/javascript/core/glossary.js
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2015-01-20 11:29:26 +0100
committerSamy Pessé <samypesse@gmail.com>2015-01-20 11:29:26 +0100
commit238cd9f7f09f11ecdb1717a5d07fc33642d29043 (patch)
tree72eac94839bda4f32cb41441b2b88532eed52603 /theme/javascript/core/glossary.js
parentbac25cdf297a7fa54f21977aa17d455e439cdf51 (diff)
downloadgitbook-238cd9f7f09f11ecdb1717a5d07fc33642d29043.zip
gitbook-238cd9f7f09f11ecdb1717a5d07fc33642d29043.tar.gz
gitbook-238cd9f7f09f11ecdb1717a5d07fc33642d29043.tar.bz2
Add back theme
Diffstat (limited to 'theme/javascript/core/glossary.js')
-rw-r--r--theme/javascript/core/glossary.js117
1 files changed, 117 insertions, 0 deletions
diff --git a/theme/javascript/core/glossary.js b/theme/javascript/core/glossary.js
new file mode 100644
index 0000000..44ebab1
--- /dev/null
+++ b/theme/javascript/core/glossary.js
@@ -0,0 +1,117 @@
+define([
+ "jQuery",
+ "lodash",
+ "core/state"
+], function($, _, state) {
+ var index = null;
+
+ // Use a specific idnex
+ var useIndex = function(data) {
+ index = data;
+ };
+
+ // Load complete index
+ var loadIndex = function() {
+ return $.getJSON(state.basePath+"/glossary_index.json")
+ .then(useIndex);
+ };
+
+ // Get index and return a promise
+ var getIndex = function() {
+ var d = $.Deferred();
+
+ if (index) {
+ d.resolve(index);
+ } else {
+ loadIndex().done(function(){
+ d.resolve(index);
+ }).fail(d.reject);
+ }
+
+ return d.promise();
+ }
+
+ $.fn.replaceText = function( search, replace, text_only ) {
+ return this.each(function(){
+ var node = this.firstChild,
+ val,
+ new_val,
+
+ // Elements to be removed at the end.
+ remove = [];
+
+ // Only continue if firstChild exists.
+ if ( node ) {
+
+ // Loop over all childNodes.
+ do {
+
+ // Only process text nodes.
+ if ( node.nodeType === 3 ) {
+
+ // The original node value.
+ val = node.nodeValue;
+
+ // The new value.
+ new_val = val.replace( search, replace );
+
+ // Only replace text if the new value is actually different!
+ if ( new_val !== val ) {
+
+ if ( !text_only && /</.test( new_val ) ) {
+ // The new value contains HTML, set it in a slower but far more
+ // robust way.
+ $(node).before( new_val );
+
+ // Don't remove the node yet, or the loop will lose its place.
+ remove.push( node );
+ } else {
+ // The new value contains no HTML, so it can be set in this
+ // very fast, simple way.
+ node.nodeValue = new_val;
+ }
+ }
+ }
+
+ } while ( node = node.nextSibling );
+ }
+
+ // Time to remove those elements!
+ remove.length && $(remove).remove();
+ });
+ };
+
+ var pregQuote = function( str ) {
+ return (str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1");
+ };
+
+ var init = function() {
+ // Bind click on glossary item
+ $(document).on("click", ".book-body .page-wrapper .page-inner .glossary-term", function(e) {
+ e.preventDefault();
+
+ location.href = state.basePath+"/GLOSSARY.html#"+$(e.currentTarget).data("glossary-term");
+ });
+ };
+
+ var replaceTerm = function($el, term) {
+ var r = new RegExp( "\\b(" + pregQuote(term.name.toLowerCase()) + ")\\b" , 'gi' );
+
+ $el.find("*").replaceText(r, function(match) {
+ return "<span class='glossary-term' data-glossary-term='"+term.id+"' title='"+term.description+"'>"+match+"</span>";
+ });
+
+ };
+
+ var prepare = function() {
+ getIndex()
+ .done(function() {
+ _.each(index, _.partial(replaceTerm, $(".book-body .page-wrapper .page-inner")));
+ });
+ };
+
+ return {
+ init: init,
+ prepare: prepare
+ };
+}); \ No newline at end of file