Skip to content

Instantly share code, notes, and snippets.

@ryasmi
Last active August 29, 2015 14:21
Show Gist options
  • Save ryasmi/4394fb4f93155807006e to your computer and use it in GitHub Desktop.
Save ryasmi/4394fb4f93155807006e to your computer and use it in GitHub Desktop.
// This code will export statements to a CSV just as Learning Locker's exports do.
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
var saveAs=saveAs||function(e){"use strict";if("undefined"==typeof navigator||!/MSIE [1-9]\./.test(navigator.userAgent)){var t=e.document,n=function(){return e.URL||e.webkitURL||e},o=t.createElementNS("http://www.w3.org/1999/xhtml","a"),r="download"in o,i=function(n){var o=t.createEvent("MouseEvents");o.initMouseEvent("click",!0,!1,e,0,0,0,0,0,!1,!1,!1,!1,0,null),n.dispatchEvent(o)},a=e.webkitRequestFileSystem,c=e.requestFileSystem||a||e.mozRequestFileSystem,u=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},f="application/octet-stream",s=0,d=500,l=function(t){var o=function(){"string"==typeof t?n().revokeObjectURL(t):t.remove()};e.chrome?o():setTimeout(o,d)},v=function(e,t,n){t=[].concat(t);for(var o=t.length;o--;){var r=e["on"+t[o]];if("function"==typeof r)try{r.call(e,n||e)}catch(i){u(i)}}},p=function(e){return/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob(["\ufeff",e],{type:e.type}):e},w=function(t,u){t=p(t);var d,w,y,m=this,S=t.type,h=!1,O=function(){v(m,"writestart progress write writeend".split(" "))},E=function(){if((h||!d)&&(d=n().createObjectURL(t)),w)w.location.href=d;else{var o=e.open(d,"_blank");void 0==o&&"undefined"!=typeof safari&&(e.location.href=d)}m.readyState=m.DONE,O(),l(d)},R=function(e){return function(){return m.readyState!==m.DONE?e.apply(this,arguments):void 0}},b={create:!0,exclusive:!1};return m.readyState=m.INIT,u||(u="download"),r?(d=n().createObjectURL(t),o.href=d,o.download=u,i(o),m.readyState=m.DONE,O(),void l(d)):(e.chrome&&S&&S!==f&&(y=t.slice||t.webkitSlice,t=y.call(t,0,t.size,f),h=!0),a&&"download"!==u&&(u+=".download"),(S===f||a)&&(w=e),c?(s+=t.size,void c(e.TEMPORARY,s,R(function(e){e.root.getDirectory("saved",b,R(function(e){var n=function(){e.getFile(u,b,R(function(e){e.createWriter(R(function(n){n.onwriteend=function(t){w.location.href=e.toURL(),m.readyState=m.DONE,v(m,"writeend",t),l(e)},n.onerror=function(){var e=n.error;e.code!==e.ABORT_ERR&&E()},"writestart progress write abort".split(" ").forEach(function(e){n["on"+e]=m["on"+e]}),n.write(t),m.abort=function(){n.abort(),m.readyState=m.DONE},m.readyState=m.WRITING}),E)}),E)};e.getFile(u,{create:!1},R(function(e){e.remove(),n()}),R(function(e){e.code===e.NOT_FOUND_ERR?n():E()}))}),E)}),E)):void E())},y=w.prototype,m=function(e,t){return new w(e,t)};return"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob?function(e,t){return navigator.msSaveOrOpenBlob(p(e),t)}:(y.abort=function(){var e=this;e.readyState=e.DONE,v(e,"abort")},y.readyState=y.INIT=0,y.WRITING=1,y.DONE=2,y.error=y.onwritestart=y.onprogress=y.onwrite=y.onabort=y.onerror=y.onwriteend=null,m)}}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this.content);"undefined"!=typeof module&&module.exports?module.exports.saveAs=saveAs:"undefined"!=typeof define&&null!==define&&null!=define.amd&&define([],function(){return saveAs});
// Exports the response as a CSV.
var exporter = function (response) {
// Gets the necessary fields from the statement.
var results = response.statements.map(function (statement) {
return {
id: statement.actor.mbox || statement.actor.account.name,
actor: statement.actor.name,
timestamp: statement.stored
};
});
// Adds the headers for the CSV.
results.unshift({
id: 'actor-id',
actor: 'actor-name',
timestamp: 'timestamp'
});
// Converts the data to CSV.
var file = results.map(function (result) {
return '"'+result.id+'","'+result.actor+'","'+result.timestamp+'"';
}).join('\n');
// Saves the CSV.
saveAs(new Blob([file]), 'download.csv');
}
// Makes the request to the LRS.
var request = new XMLHttpRequest();
request.open('GET', 'http://demo.learninglocker.net/data/xAPI/statements?activity=http%3a%2f%2fbeta.curatr3.com%2fcourses%2fxapi&related_activities=true&since=2015-05-19T00:00&limit=2000');
request.setRequestHeader('X-Experience-API-Version', '1.0.1');
request.setRequestHeader('Authorization', 'Basic ZDQxNmU2MjIwODEyNzQwZDM5MjJlYjA5ODEzZWJiNDE2M2U4ZWIzZTpiYzdlMGEyZWRkNWQxOTY5YjZkNzc0ZTY3OWQ0ZWI0ZTdhMzViZTEz');
request.onreadystatechange = function () {
if (request.readyState === 4) {
exporter(JSON.parse(request.responseText));
}
};
request.send(true);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment