summaryrefslogtreecommitdiffstats
path: root/theme/javascript/utils
diff options
context:
space:
mode:
authorSamy Pessé <samypesse@gmail.com>2014-04-04 14:10:56 -0700
committerSamy Pessé <samypesse@gmail.com>2014-04-04 14:10:56 -0700
commit446d486a0fb725f3df76d9b6e8d2bca02042805b (patch)
treecfd5405f607fcca196ef5bad6b0b88662c30ccb9 /theme/javascript/utils
parent07101deaefb8848d40231eea12a3bf0710e6a78e (diff)
downloadgitbook-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.js18
-rw-r--r--theme/javascript/utils/execute.js82
-rw-r--r--theme/javascript/utils/platform.js5
-rw-r--r--theme/javascript/utils/sharing.js33
-rw-r--r--theme/javascript/utils/storage.js30
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