Add base for theming

This commit is contained in:
Samy Pessé
2014-04-04 14:10:56 -07:00
parent 07101deaef
commit 446d486a0f
112 changed files with 14 additions and 5 deletions
+18
View File
@@ -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
};
});
+82
View File
@@ -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;
});
+5
View File
@@ -0,0 +1,5 @@
define([], function() {
return {
isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
};
});
+33
View File
@@ -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
};
});
+30
View File
@@ -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);
}
};
});