Spaces:
Running
Running
/* FileSaver.js | |
* A saveAs() FileSaver implementation. | |
* 1.3.8 | |
* 2018-03-22 14:03:47 | |
* | |
* By Eli Grey, https://eligrey.com | |
* License: MIT | |
* See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md | |
*/ | |
/*global self */ | |
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ | |
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/src/FileSaver.js */ | |
(function(view) { | |
"use strict"; | |
// IE <10 is explicitly unsupported | |
if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { | |
return; | |
} | |
var | |
doc = view.document | |
// only get URL when necessary in case Blob.js hasn't overridden it yet | |
, get_URL = function() { | |
return view.URL || view.webkitURL || view; | |
} | |
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") | |
, can_use_save_link = "download" in save_link | |
, click = function(node) { | |
var event = new MouseEvent("click"); | |
node.dispatchEvent(event); | |
} | |
, is_safari = /constructor/i.test(view.HTMLElement) || view.safari | |
, is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent) | |
, setImmediate = view.setImmediate || view.setTimeout | |
, throw_outside = function(ex) { | |
setImmediate(function() { | |
throw ex; | |
}, 0); | |
} | |
, force_saveable_type = "application/octet-stream" | |
// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to | |
, arbitrary_revoke_timeout = 1000 * 40 // in ms | |
, revoke = function(file) { | |
var revoker = function() { | |
if (typeof file === "string") { // file is an object URL | |
get_URL().revokeObjectURL(file); | |
} else { // file is a File | |
file.remove(); | |
} | |
}; | |
setTimeout(revoker, arbitrary_revoke_timeout); | |
} | |
, dispatch = function(filesaver, event_types, event) { | |
event_types = [].concat(event_types); | |
var i = event_types.length; | |
while (i--) { | |
var listener = filesaver["on" + event_types[i]]; | |
if (typeof listener === "function") { | |
try { | |
listener.call(filesaver, event || filesaver); | |
} catch (ex) { | |
throw_outside(ex); | |
} | |
} | |
} | |
} | |
, auto_bom = function(blob) { | |
// prepend BOM for UTF-8 XML and text/* types (including HTML) | |
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF | |
if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { | |
return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type}); | |
} | |
return blob; | |
} | |
, FileSaver = function(blob, name, no_auto_bom) { | |
if (!no_auto_bom) { | |
blob = auto_bom(blob); | |
} | |
// First try a.download, then web filesystem, then object URLs | |
var | |
filesaver = this | |
, type = blob.type | |
, force = type === force_saveable_type | |
, object_url | |
, dispatch_all = function() { | |
dispatch(filesaver, "writestart progress write writeend".split(" ")); | |
} | |
// on any filesys errors revert to saving with object URLs | |
, fs_error = function() { | |
if ((is_chrome_ios || (force && is_safari)) && view.FileReader) { | |
// Safari doesn't allow downloading of blob urls | |
var reader = new FileReader(); | |
reader.onloadend = function() { | |
var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;'); | |
var popup = view.open(url, '_blank'); | |
if(!popup) view.location.href = url; | |
url=undefined; // release reference before dispatching | |
filesaver.readyState = filesaver.DONE; | |
dispatch_all(); | |
}; | |
reader.readAsDataURL(blob); | |
filesaver.readyState = filesaver.INIT; | |
return; | |
} | |
// don't create more object URLs than needed | |
if (!object_url) { | |
object_url = get_URL().createObjectURL(blob); | |
} | |
if (force) { | |
view.location.href = object_url; | |
} else { | |
var opened = view.open(object_url, "_blank"); | |
if (!opened) { | |
// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html | |
view.location.href = object_url; | |
} | |
} | |
filesaver.readyState = filesaver.DONE; | |
dispatch_all(); | |
revoke(object_url); | |
} | |
; | |
filesaver.readyState = filesaver.INIT; | |
if (can_use_save_link) { | |
object_url = get_URL().createObjectURL(blob); | |
setImmediate(function() { | |
save_link.href = object_url; | |
save_link.download = name; | |
click(save_link); | |
dispatch_all(); | |
revoke(object_url); | |
filesaver.readyState = filesaver.DONE; | |
}, 0); | |
return; | |
} | |
fs_error(); | |
} | |
, FS_proto = FileSaver.prototype | |
, saveAs = function(blob, name, no_auto_bom) { | |
return new FileSaver(blob, name || blob.name || "download", no_auto_bom); | |
} | |
; | |
// IE 10+ (native saveAs) | |
if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) { | |
return function(blob, name, no_auto_bom) { | |
name = name || blob.name || "download"; | |
if (!no_auto_bom) { | |
blob = auto_bom(blob); | |
} | |
return navigator.msSaveOrOpenBlob(blob, name); | |
}; | |
} | |
// todo: detect chrome extensions & packaged apps | |
//save_link.target = "_blank"; | |
FS_proto.abort = function(){}; | |
FS_proto.readyState = FS_proto.INIT = 0; | |
FS_proto.WRITING = 1; | |
FS_proto.DONE = 2; | |
FS_proto.error = | |
FS_proto.onwritestart = | |
FS_proto.onprogress = | |
FS_proto.onwrite = | |
FS_proto.onabort = | |
FS_proto.onerror = | |
FS_proto.onwriteend = | |
null; | |
view.FileSaver_saveAs = saveAs; | |
}( | |
typeof self !== "undefined" && self | |
|| typeof window !== "undefined" && window | |
|| this | |
)); | |