diff options
author | Samy Pessé <samypesse@gmail.com> | 2014-04-04 14:10:56 -0700 |
---|---|---|
committer | Samy Pessé <samypesse@gmail.com> | 2014-04-04 14:10:56 -0700 |
commit | 446d486a0fb725f3df76d9b6e8d2bca02042805b (patch) | |
tree | cfd5405f607fcca196ef5bad6b0b88662c30ccb9 /theme/javascript/utils | |
parent | 07101deaefb8848d40231eea12a3bf0710e6a78e (diff) | |
download | gitbook-446d486a0fb725f3df76d9b6e8d2bca02042805b.zip gitbook-446d486a0fb725f3df76d9b6e8d2bca02042805b.tar.gz gitbook-446d486a0fb725f3df76d9b6e8d2bca02042805b.tar.bz2 |
Add base for theming
Diffstat (limited to 'theme/javascript/utils')
-rw-r--r-- | theme/javascript/utils/analytic.js | 18 | ||||
-rw-r--r-- | theme/javascript/utils/execute.js | 82 | ||||
-rw-r--r-- | theme/javascript/utils/platform.js | 5 | ||||
-rw-r--r-- | theme/javascript/utils/sharing.js | 33 | ||||
-rw-r--r-- | theme/javascript/utils/storage.js | 30 |
5 files changed, 168 insertions, 0 deletions
diff --git a/theme/javascript/utils/analytic.js b/theme/javascript/utils/analytic.js new file mode 100644 index 0000000..12c672a --- /dev/null +++ b/theme/javascript/utils/analytic.js @@ -0,0 +1,18 @@ +define([], function() { + var isAvailable = function() { + return (typeof mixpanel !== "undefined"); + }; + + var track = function(event, data) { + if (!isAvailable()) { + console.log("tracking not available!"); + return; + } + mixpanel.track(event, data); + }; + + return { + isAvailable: isAvailable, + track: track + }; +});
\ No newline at end of file diff --git a/theme/javascript/utils/execute.js b/theme/javascript/utils/execute.js new file mode 100644 index 0000000..61354b8 --- /dev/null +++ b/theme/javascript/utils/execute.js @@ -0,0 +1,82 @@ +define(function(){ + var evalJS = function(code, callback) { + var ready = false; + var finished = false; + + var finish = function() { + if(finished) { + return console.error('Already finished'); + } + finished = true; + return callback.apply(null, arguments); + }; + + var jsrepl; + + // Handles all our events + var eventHandler = function(data, eventType) { + console.log([eventType, data]); + switch(eventType) { + case 'progress': + // Update UI loading bar + break; + case 'timeout': + finish(new Error(data)); + break; + case 'result': + finish(null, { + value: data, + type: 'result' + }); + break; + case 'error': + if(ready) { + return finish(null, { + value: data, + type: 'error' + }); + } + return finish(new Error(data)); + break + case 'ready': + // We're good to get results and stuff back now + ready = true; + // Eval our code now that the runtime is ready + jsrepl.eval(code); + break; + default: + console.log('Unhandled event =', eventType, 'data =', data); + } + }; + + jsrepl = new JSREPL({ + input: eventHandler, + output: eventHandler, + result: eventHandler, + error: eventHandler, + progress: eventHandler, + timeout: { + time: 30000, + callback: eventHandler + } + }); + + jsrepl.loadLanguage('javascript', eventHandler); + }; + + + var ass = "function assert(condition, message) { \nif (!condition) { \n throw message || \"Assertion failed\"; \n } \n }\n"; + + var execute = function(solution, validation, callback) { + // Validate with validation code + var code = [solution, ass, validation].join(";\n"); + evalJS(code, function(err, res) { + if(err) return callback(err); + + if (res.type == "error") callback(new Error(res.value)); + else callback(null, res.value); + }); + }; + + return execute; +});
\ No newline at end of file diff --git a/theme/javascript/utils/platform.js b/theme/javascript/utils/platform.js new file mode 100644 index 0000000..ad5f3b4 --- /dev/null +++ b/theme/javascript/utils/platform.js @@ -0,0 +1,5 @@ +define([], function() { + return { + isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) + }; +});
\ No newline at end of file diff --git a/theme/javascript/utils/sharing.js b/theme/javascript/utils/sharing.js new file mode 100644 index 0000000..f4354f1 --- /dev/null +++ b/theme/javascript/utils/sharing.js @@ -0,0 +1,33 @@ +define([ + "jQuery" +], function($) { + var url = location.href; + var title = $("title").text(); + + var types = { + "twitter": function($el) { + window.open("http://twitter.com/home?status="+encodeURIComponent(title+" "+url)) + }, + "facebook": function($el) { + window.open("http://www.facebook.com/sharer/sharer.php?s=100&p[url]="+encodeURIComponent(url)) + }, + "google-plus": function($el) { + window.open("https://plus.google.com/share?url="+encodeURIComponent(url)) + } + }; + + + // Bind all sharing button + var init = function() { + $("a[data-sharing]").click(function(e) { + if (e) e.preventDefault(); + var type = $(this).data("sharing"); + + types[type]($(this)); + }) + }; + + return { + init: init + }; +});
\ No newline at end of file diff --git a/theme/javascript/utils/storage.js b/theme/javascript/utils/storage.js new file mode 100644 index 0000000..14275c6 --- /dev/null +++ b/theme/javascript/utils/storage.js @@ -0,0 +1,30 @@ +define(function(){ + var baseKey = ""; + + /* + * Simple module for storing data in the browser's local storage + */ + return { + setBaseKey: function(key) { + baseKey = key; + }, + set: function(key, value) { + key = baseKey+":"+key; + localStorage[key] = JSON.stringify(value); + }, + get: function(key, def) { + key = baseKey+":"+key; + try { + var v = JSON.parse(localStorage[key]); + return v == null ? def : v;; + } catch(err) { + console.error(err); + return localStorage[key] || def; + } + }, + remove: function(key) { + key = baseKey+":"+key; + localStorage.removeItem(key); + } + }; +});
\ No newline at end of file |