191 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*! FileSaver.js v1.3.6
 | |
|  *
 | |
|  * A saveAs() FileSaver implementation.
 | |
|  *
 | |
|  * By Travis Clarke, https://travismclarke.com
 | |
|  * By Eli Grey, http://eligrey.com
 | |
|  *
 | |
|  * License: MIT (https://github.com/clarketm/FileSaver.js/blob/master/LICENSE.md)
 | |
|  */
 | |
| 
 | |
| ;(function (root, factory) {
 | |
|     if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
 | |
|         module.exports = root.document ? factory(root, true) : function (w) {
 | |
|             if (!w.document) {
 | |
|                 throw new Error("FileSaver requires a window with a document");
 | |
|             }
 | |
|             return factory(w);
 | |
|         };
 | |
|     } else {
 | |
|         factory(root);
 | |
|     }
 | |
| }(window || this, function (window, noGlobal) {
 | |
|         "use strict";
 | |
|         // IE <10 is explicitly unsupported
 | |
|         if (typeof window === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
 | |
|             return;
 | |
|         }
 | |
|         var
 | |
|             doc = window.document
 | |
|             // only get URL when necessary in case Blob.js hasn't overridden it yet
 | |
|             , get_URL = function () {
 | |
|                 return window.URL || window.webkitURL || window;
 | |
|             }
 | |
|             , 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(window.HTMLElement) || window.safari
 | |
|             , is_chrome_ios = /CriOS\/[\d]+/.test(navigator.userAgent)
 | |
|             , throw_outside = function (ex) {
 | |
|                 (window.setImmediate || window.setTimeout)(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)) && window.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 = window.open(url, '_blank');
 | |
|                                 if (!popup) window.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) {
 | |
|                             window.location.href = object_url;
 | |
|                         } else {
 | |
|                             var opened = window.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
 | |
|                                 window.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);
 | |
|                     setTimeout(function () {
 | |
|                         save_link.href = object_url;
 | |
|                         save_link.download = name;
 | |
|                         click(save_link);
 | |
|                         dispatch_all();
 | |
|                         revoke(object_url);
 | |
|                         filesaver.readyState = filesaver.DONE;
 | |
|                     });
 | |
|                     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) {
 | |
|             saveAs = function (blob, name, no_auto_bom) {
 | |
|                 name = name || blob.name || "download";
 | |
| 
 | |
|                 if (!no_auto_bom) {
 | |
|                     blob = auto_bom(blob);
 | |
|                 }
 | |
|                 return navigator.msSaveOrOpenBlob(blob, name);
 | |
|             };
 | |
|         }
 | |
| 
 | |
|         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;
 | |
| 
 | |
|         if (typeof define === "function" && define.amd) {
 | |
|             define("file-saverjs", [], function () {
 | |
|                 return saveAs;
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         if (typeof noGlobal === 'undefined') {
 | |
|             window.saveAs = saveAs;
 | |
|         }
 | |
|         return saveAs;
 | |
|     }
 | |
| ));
 |