1 | (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.blobUtil = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
|
2 | (function (global){
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | var BlobBuilder = global.BlobBuilder
|
8 | || global.WebKitBlobBuilder
|
9 | || global.MSBlobBuilder
|
10 | || global.MozBlobBuilder;
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | var blobSupported = (function() {
|
17 | try {
|
18 | var a = new Blob(['hi']);
|
19 | return a.size === 2;
|
20 | } catch(e) {
|
21 | return false;
|
22 | }
|
23 | })();
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 | var blobSupportsArrayBufferView = blobSupported && (function() {
|
31 | try {
|
32 | var b = new Blob([new Uint8Array([1,2])]);
|
33 | return b.size === 2;
|
34 | } catch(e) {
|
35 | return false;
|
36 | }
|
37 | })();
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 | var blobBuilderSupported = BlobBuilder
|
44 | && BlobBuilder.prototype.append
|
45 | && BlobBuilder.prototype.getBlob;
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 |
|
52 |
|
53 | function mapArrayBufferViews(ary) {
|
54 | for (var i = 0; i < ary.length; i++) {
|
55 | var chunk = ary[i];
|
56 | if (chunk.buffer instanceof ArrayBuffer) {
|
57 | var buf = chunk.buffer;
|
58 |
|
59 |
|
60 |
|
61 | if (chunk.byteLength !== buf.byteLength) {
|
62 | var copy = new Uint8Array(chunk.byteLength);
|
63 | copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));
|
64 | buf = copy.buffer;
|
65 | }
|
66 |
|
67 | ary[i] = buf;
|
68 | }
|
69 | }
|
70 | }
|
71 |
|
72 | function BlobBuilderConstructor(ary, options) {
|
73 | options = options || {};
|
74 |
|
75 | var bb = new BlobBuilder();
|
76 | mapArrayBufferViews(ary);
|
77 |
|
78 | for (var i = 0; i < ary.length; i++) {
|
79 | bb.append(ary[i]);
|
80 | }
|
81 |
|
82 | return (options.type) ? bb.getBlob(options.type) : bb.getBlob();
|
83 | };
|
84 |
|
85 | function BlobConstructor(ary, options) {
|
86 | mapArrayBufferViews(ary);
|
87 | return new Blob(ary, options || {});
|
88 | };
|
89 |
|
90 | module.exports = (function() {
|
91 | if (blobSupported) {
|
92 | return blobSupportsArrayBufferView ? global.Blob : BlobConstructor;
|
93 | } else if (blobBuilderSupported) {
|
94 | return BlobBuilderConstructor;
|
95 | } else {
|
96 | return undefined;
|
97 | }
|
98 | })();
|
99 |
|
100 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
101 | },{}],2:[function(_dereq_,module,exports){
|
102 | 'use strict';
|
103 | var types = [
|
104 | _dereq_(5),
|
105 | _dereq_(4),
|
106 | _dereq_(3),
|
107 | _dereq_(6),
|
108 | _dereq_(7)
|
109 | ];
|
110 | var draining;
|
111 | var currentQueue;
|
112 | var queueIndex = -1;
|
113 | var queue = [];
|
114 | var scheduled = false;
|
115 | function cleanUpNextTick() {
|
116 | draining = false;
|
117 | if (currentQueue && currentQueue.length) {
|
118 | queue = currentQueue.concat(queue);
|
119 | } else {
|
120 | queueIndex = -1;
|
121 | }
|
122 | if (queue.length) {
|
123 | nextTick();
|
124 | }
|
125 | }
|
126 |
|
127 |
|
128 | function nextTick() {
|
129 | scheduled = false;
|
130 | draining = true;
|
131 | var len = queue.length;
|
132 | var timeout = setTimeout(cleanUpNextTick);
|
133 | while (len) {
|
134 | currentQueue = queue;
|
135 | queue = [];
|
136 | while (++queueIndex < len) {
|
137 | currentQueue[queueIndex].run();
|
138 | }
|
139 | queueIndex = -1;
|
140 | len = queue.length;
|
141 | }
|
142 | queueIndex = -1;
|
143 | draining = false;
|
144 | clearTimeout(timeout);
|
145 | }
|
146 | var scheduleDrain;
|
147 | var i = -1;
|
148 | var len = types.length;
|
149 | while (++i < len) {
|
150 | if (types[i] && types[i].test && types[i].test()) {
|
151 | scheduleDrain = types[i].install(nextTick);
|
152 | break;
|
153 | }
|
154 | }
|
155 |
|
156 | function Item(fun, array) {
|
157 | this.fun = fun;
|
158 | this.array = array;
|
159 | }
|
160 | Item.prototype.run = function () {
|
161 | this.fun.apply(null, this.array);
|
162 | };
|
163 | module.exports = immediate;
|
164 | function immediate(task) {
|
165 | var args = new Array(arguments.length - 1);
|
166 | if (arguments.length > 1) {
|
167 | for (var i = 1; i < arguments.length; i++) {
|
168 | args[i - 1] = arguments[i];
|
169 | }
|
170 | }
|
171 | queue.push(new Item(task, args));
|
172 | if (!scheduled && !draining) {
|
173 | scheduled = true;
|
174 | scheduleDrain();
|
175 | }
|
176 | }
|
177 |
|
178 | },{"3":3,"4":4,"5":5,"6":6,"7":7}],3:[function(_dereq_,module,exports){
|
179 | (function (global){
|
180 | 'use strict';
|
181 |
|
182 | exports.test = function () {
|
183 | if (global.setImmediate) {
|
184 |
|
185 |
|
186 | return false;
|
187 | }
|
188 | return typeof global.MessageChannel !== 'undefined';
|
189 | };
|
190 |
|
191 | exports.install = function (func) {
|
192 | var channel = new global.MessageChannel();
|
193 | channel.port1.onmessage = func;
|
194 | return function () {
|
195 | channel.port2.postMessage(0);
|
196 | };
|
197 | };
|
198 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
199 | },{}],4:[function(_dereq_,module,exports){
|
200 | (function (global){
|
201 | 'use strict';
|
202 |
|
203 |
|
204 |
|
205 |
|
206 | var Mutation = global.MutationObserver || global.WebKitMutationObserver;
|
207 |
|
208 | exports.test = function () {
|
209 | return Mutation;
|
210 | };
|
211 |
|
212 | exports.install = function (handle) {
|
213 | var called = 0;
|
214 | var observer = new Mutation(handle);
|
215 | var element = global.document.createTextNode('');
|
216 | observer.observe(element, {
|
217 | characterData: true
|
218 | });
|
219 | return function () {
|
220 | element.data = (called = ++called % 2);
|
221 | };
|
222 | };
|
223 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
224 | },{}],5:[function(_dereq_,module,exports){
|
225 | (function (process){
|
226 | 'use strict';
|
227 | exports.test = function () {
|
228 |
|
229 | return (typeof process !== 'undefined') && !process.browser;
|
230 | };
|
231 |
|
232 | exports.install = function (func) {
|
233 | return function () {
|
234 | process.nextTick(func);
|
235 | };
|
236 | };
|
237 |
|
238 | }).call(this,_dereq_(21))
|
239 | },{"21":21}],6:[function(_dereq_,module,exports){
|
240 | (function (global){
|
241 | 'use strict';
|
242 |
|
243 | exports.test = function () {
|
244 | return 'document' in global && 'onreadystatechange' in global.document.createElement('script');
|
245 | };
|
246 |
|
247 | exports.install = function (handle) {
|
248 | return function () {
|
249 |
|
250 |
|
251 |
|
252 | var scriptEl = global.document.createElement('script');
|
253 | scriptEl.onreadystatechange = function () {
|
254 | handle();
|
255 |
|
256 | scriptEl.onreadystatechange = null;
|
257 | scriptEl.parentNode.removeChild(scriptEl);
|
258 | scriptEl = null;
|
259 | };
|
260 | global.document.documentElement.appendChild(scriptEl);
|
261 |
|
262 | return handle;
|
263 | };
|
264 | };
|
265 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
266 | },{}],7:[function(_dereq_,module,exports){
|
267 | 'use strict';
|
268 | exports.test = function () {
|
269 | return true;
|
270 | };
|
271 |
|
272 | exports.install = function (t) {
|
273 | return function () {
|
274 | setTimeout(t, 0);
|
275 | };
|
276 | };
|
277 | },{}],8:[function(_dereq_,module,exports){
|
278 | 'use strict';
|
279 |
|
280 | module.exports = INTERNAL;
|
281 |
|
282 | function INTERNAL() {}
|
283 | },{}],9:[function(_dereq_,module,exports){
|
284 | 'use strict';
|
285 | var Promise = _dereq_(12);
|
286 | var reject = _dereq_(14);
|
287 | var resolve = _dereq_(15);
|
288 | var INTERNAL = _dereq_(8);
|
289 | var handlers = _dereq_(10);
|
290 | var noArray = reject(new TypeError('must be an array'));
|
291 | module.exports = function all(iterable) {
|
292 | if (Object.prototype.toString.call(iterable) !== '[object Array]') {
|
293 | return noArray;
|
294 | }
|
295 |
|
296 | var len = iterable.length;
|
297 | var called = false;
|
298 | if (!len) {
|
299 | return resolve([]);
|
300 | }
|
301 |
|
302 | var values = new Array(len);
|
303 | var resolved = 0;
|
304 | var i = -1;
|
305 | var promise = new Promise(INTERNAL);
|
306 |
|
307 | while (++i < len) {
|
308 | allResolver(iterable[i], i);
|
309 | }
|
310 | return promise;
|
311 | function allResolver(value, i) {
|
312 | resolve(value).then(resolveFromAll, function (error) {
|
313 | if (!called) {
|
314 | called = true;
|
315 | handlers.reject(promise, error);
|
316 | }
|
317 | });
|
318 | function resolveFromAll(outValue) {
|
319 | values[i] = outValue;
|
320 | if (++resolved === len & !called) {
|
321 | called = true;
|
322 | handlers.resolve(promise, values);
|
323 | }
|
324 | }
|
325 | }
|
326 | };
|
327 | },{"10":10,"12":12,"14":14,"15":15,"8":8}],10:[function(_dereq_,module,exports){
|
328 | 'use strict';
|
329 | var tryCatch = _dereq_(18);
|
330 | var resolveThenable = _dereq_(16);
|
331 | var states = _dereq_(17);
|
332 |
|
333 | exports.resolve = function (self, value) {
|
334 | var result = tryCatch(getThen, value);
|
335 | if (result.status === 'error') {
|
336 | return exports.reject(self, result.value);
|
337 | }
|
338 | var thenable = result.value;
|
339 |
|
340 | if (thenable) {
|
341 | resolveThenable.safely(self, thenable);
|
342 | } else {
|
343 | self.state = states.FULFILLED;
|
344 | self.outcome = value;
|
345 | var i = -1;
|
346 | var len = self.queue.length;
|
347 | while (++i < len) {
|
348 | self.queue[i].callFulfilled(value);
|
349 | }
|
350 | }
|
351 | return self;
|
352 | };
|
353 | exports.reject = function (self, error) {
|
354 | self.state = states.REJECTED;
|
355 | self.outcome = error;
|
356 | var i = -1;
|
357 | var len = self.queue.length;
|
358 | while (++i < len) {
|
359 | self.queue[i].callRejected(error);
|
360 | }
|
361 | return self;
|
362 | };
|
363 |
|
364 | function getThen(obj) {
|
365 |
|
366 | var then = obj && obj.then;
|
367 | if (obj && typeof obj === 'object' && typeof then === 'function') {
|
368 | return function appyThen() {
|
369 | then.apply(obj, arguments);
|
370 | };
|
371 | }
|
372 | }
|
373 | },{"16":16,"17":17,"18":18}],11:[function(_dereq_,module,exports){
|
374 | module.exports = exports = _dereq_(12);
|
375 |
|
376 | exports.resolve = _dereq_(15);
|
377 | exports.reject = _dereq_(14);
|
378 | exports.all = _dereq_(9);
|
379 | },{"12":12,"14":14,"15":15,"9":9}],12:[function(_dereq_,module,exports){
|
380 | 'use strict';
|
381 |
|
382 | var unwrap = _dereq_(19);
|
383 | var INTERNAL = _dereq_(8);
|
384 | var resolveThenable = _dereq_(16);
|
385 | var states = _dereq_(17);
|
386 | var QueueItem = _dereq_(13);
|
387 |
|
388 | module.exports = Promise;
|
389 | function Promise(resolver) {
|
390 | if (!(this instanceof Promise)) {
|
391 | return new Promise(resolver);
|
392 | }
|
393 | if (typeof resolver !== 'function') {
|
394 | throw new TypeError('reslover must be a function');
|
395 | }
|
396 | this.state = states.PENDING;
|
397 | this.queue = [];
|
398 | this.outcome = void 0;
|
399 | if (resolver !== INTERNAL) {
|
400 | resolveThenable.safely(this, resolver);
|
401 | }
|
402 | }
|
403 |
|
404 | Promise.prototype['catch'] = function (onRejected) {
|
405 | return this.then(null, onRejected);
|
406 | };
|
407 | Promise.prototype.then = function (onFulfilled, onRejected) {
|
408 | if (typeof onFulfilled !== 'function' && this.state === states.FULFILLED ||
|
409 | typeof onRejected !== 'function' && this.state === states.REJECTED) {
|
410 | return this;
|
411 | }
|
412 | var promise = new Promise(INTERNAL);
|
413 |
|
414 |
|
415 | if (this.state !== states.PENDING) {
|
416 | var resolver = this.state === states.FULFILLED ? onFulfilled: onRejected;
|
417 | unwrap(promise, resolver, this.outcome);
|
418 | } else {
|
419 | this.queue.push(new QueueItem(promise, onFulfilled, onRejected));
|
420 | }
|
421 |
|
422 | return promise;
|
423 | };
|
424 |
|
425 | },{"13":13,"16":16,"17":17,"19":19,"8":8}],13:[function(_dereq_,module,exports){
|
426 | 'use strict';
|
427 | var handlers = _dereq_(10);
|
428 | var unwrap = _dereq_(19);
|
429 |
|
430 | module.exports = QueueItem;
|
431 | function QueueItem(promise, onFulfilled, onRejected) {
|
432 | this.promise = promise;
|
433 | if (typeof onFulfilled === 'function') {
|
434 | this.onFulfilled = onFulfilled;
|
435 | this.callFulfilled = this.otherCallFulfilled;
|
436 | }
|
437 | if (typeof onRejected === 'function') {
|
438 | this.onRejected = onRejected;
|
439 | this.callRejected = this.otherCallRejected;
|
440 | }
|
441 | }
|
442 | QueueItem.prototype.callFulfilled = function (value) {
|
443 | handlers.resolve(this.promise, value);
|
444 | };
|
445 | QueueItem.prototype.otherCallFulfilled = function (value) {
|
446 | unwrap(this.promise, this.onFulfilled, value);
|
447 | };
|
448 | QueueItem.prototype.callRejected = function (value) {
|
449 | handlers.reject(this.promise, value);
|
450 | };
|
451 | QueueItem.prototype.otherCallRejected = function (value) {
|
452 | unwrap(this.promise, this.onRejected, value);
|
453 | };
|
454 | },{"10":10,"19":19}],14:[function(_dereq_,module,exports){
|
455 | 'use strict';
|
456 |
|
457 | var Promise = _dereq_(12);
|
458 | var INTERNAL = _dereq_(8);
|
459 | var handlers = _dereq_(10);
|
460 | module.exports = reject;
|
461 |
|
462 | function reject(reason) {
|
463 | var promise = new Promise(INTERNAL);
|
464 | return handlers.reject(promise, reason);
|
465 | }
|
466 | },{"10":10,"12":12,"8":8}],15:[function(_dereq_,module,exports){
|
467 | 'use strict';
|
468 |
|
469 | var Promise = _dereq_(12);
|
470 | var INTERNAL = _dereq_(8);
|
471 | var handlers = _dereq_(10);
|
472 | module.exports = resolve;
|
473 |
|
474 | var FALSE = handlers.resolve(new Promise(INTERNAL), false);
|
475 | var NULL = handlers.resolve(new Promise(INTERNAL), null);
|
476 | var UNDEFINED = handlers.resolve(new Promise(INTERNAL), void 0);
|
477 | var ZERO = handlers.resolve(new Promise(INTERNAL), 0);
|
478 | var EMPTYSTRING = handlers.resolve(new Promise(INTERNAL), '');
|
479 |
|
480 | function resolve(value) {
|
481 | if (value) {
|
482 | if (value instanceof Promise) {
|
483 | return value;
|
484 | }
|
485 | return handlers.resolve(new Promise(INTERNAL), value);
|
486 | }
|
487 | var valueType = typeof value;
|
488 | switch (valueType) {
|
489 | case 'boolean':
|
490 | return FALSE;
|
491 | case 'undefined':
|
492 | return UNDEFINED;
|
493 | case 'object':
|
494 | return NULL;
|
495 | case 'number':
|
496 | return ZERO;
|
497 | case 'string':
|
498 | return EMPTYSTRING;
|
499 | }
|
500 | }
|
501 | },{"10":10,"12":12,"8":8}],16:[function(_dereq_,module,exports){
|
502 | 'use strict';
|
503 | var handlers = _dereq_(10);
|
504 | var tryCatch = _dereq_(18);
|
505 | function safelyResolveThenable(self, thenable) {
|
506 |
|
507 | var called = false;
|
508 | function onError(value) {
|
509 | if (called) {
|
510 | return;
|
511 | }
|
512 | called = true;
|
513 | handlers.reject(self, value);
|
514 | }
|
515 |
|
516 | function onSuccess(value) {
|
517 | if (called) {
|
518 | return;
|
519 | }
|
520 | called = true;
|
521 | handlers.resolve(self, value);
|
522 | }
|
523 |
|
524 | function tryToUnwrap() {
|
525 | thenable(onSuccess, onError);
|
526 | }
|
527 |
|
528 | var result = tryCatch(tryToUnwrap);
|
529 | if (result.status === 'error') {
|
530 | onError(result.value);
|
531 | }
|
532 | }
|
533 | exports.safely = safelyResolveThenable;
|
534 | },{"10":10,"18":18}],17:[function(_dereq_,module,exports){
|
535 |
|
536 |
|
537 | exports.REJECTED = ['REJECTED'];
|
538 | exports.FULFILLED = ['FULFILLED'];
|
539 | exports.PENDING = ['PENDING'];
|
540 | },{}],18:[function(_dereq_,module,exports){
|
541 | 'use strict';
|
542 |
|
543 | module.exports = tryCatch;
|
544 |
|
545 | function tryCatch(func, value) {
|
546 | var out = {};
|
547 | try {
|
548 | out.value = func(value);
|
549 | out.status = 'success';
|
550 | } catch (e) {
|
551 | out.status = 'error';
|
552 | out.value = e;
|
553 | }
|
554 | return out;
|
555 | }
|
556 | },{}],19:[function(_dereq_,module,exports){
|
557 | 'use strict';
|
558 |
|
559 | var immediate = _dereq_(2);
|
560 | var handlers = _dereq_(10);
|
561 | module.exports = unwrap;
|
562 |
|
563 | function unwrap(promise, func, value) {
|
564 | immediate(function () {
|
565 | var returnValue;
|
566 | try {
|
567 | returnValue = func(value);
|
568 | } catch (e) {
|
569 | return handlers.reject(promise, e);
|
570 | }
|
571 | if (returnValue === promise) {
|
572 | handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));
|
573 | } else {
|
574 | handlers.resolve(promise, returnValue);
|
575 | }
|
576 | });
|
577 | }
|
578 | },{"10":10,"2":2}],20:[function(_dereq_,module,exports){
|
579 | (function (global){
|
580 | if (typeof global.Promise === 'function') {
|
581 | module.exports = global.Promise;
|
582 | } else {
|
583 | module.exports = _dereq_(11);
|
584 | }
|
585 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
586 | },{"11":11}],21:[function(_dereq_,module,exports){
|
587 |
|
588 |
|
589 | var process = module.exports = {};
|
590 | var queue = [];
|
591 | var draining = false;
|
592 |
|
593 | function drainQueue() {
|
594 | if (draining) {
|
595 | return;
|
596 | }
|
597 | draining = true;
|
598 | var currentQueue;
|
599 | var len = queue.length;
|
600 | while(len) {
|
601 | currentQueue = queue;
|
602 | queue = [];
|
603 | var i = -1;
|
604 | while (++i < len) {
|
605 | currentQueue[i]();
|
606 | }
|
607 | len = queue.length;
|
608 | }
|
609 | draining = false;
|
610 | }
|
611 | process.nextTick = function (fun) {
|
612 | queue.push(fun);
|
613 | if (!draining) {
|
614 | setTimeout(drainQueue, 0);
|
615 | }
|
616 | };
|
617 |
|
618 | process.title = 'browser';
|
619 | process.browser = true;
|
620 | process.env = {};
|
621 | process.argv = [];
|
622 | process.version = '';
|
623 | process.versions = {};
|
624 |
|
625 | function noop() {}
|
626 |
|
627 | process.on = noop;
|
628 | process.addListener = noop;
|
629 | process.once = noop;
|
630 | process.off = noop;
|
631 | process.removeListener = noop;
|
632 | process.removeAllListeners = noop;
|
633 | process.emit = noop;
|
634 |
|
635 | process.binding = function (name) {
|
636 | throw new Error('process.binding is not supported');
|
637 | };
|
638 |
|
639 |
|
640 | process.cwd = function () { return '/' };
|
641 | process.chdir = function (dir) {
|
642 | throw new Error('process.chdir is not supported');
|
643 | };
|
644 | process.umask = function() { return 0; };
|
645 |
|
646 | },{}],22:[function(_dereq_,module,exports){
|
647 | 'use strict';
|
648 |
|
649 |
|
650 | var Blob = _dereq_(1);
|
651 | var Promise = _dereq_(20);
|
652 |
|
653 |
|
654 |
|
655 |
|
656 |
|
657 |
|
658 |
|
659 | function binaryStringToArrayBuffer(binary) {
|
660 | var length = binary.length;
|
661 | var buf = new ArrayBuffer(length);
|
662 | var arr = new Uint8Array(buf);
|
663 | var i = -1;
|
664 | while (++i < length) {
|
665 | arr[i] = binary.charCodeAt(i);
|
666 | }
|
667 | return buf;
|
668 | }
|
669 |
|
670 |
|
671 |
|
672 |
|
673 | function arrayBufferToBinaryString(buffer) {
|
674 | var binary = '';
|
675 | var bytes = new Uint8Array(buffer);
|
676 | var length = bytes.byteLength;
|
677 | var i = -1;
|
678 | while (++i < length) {
|
679 | binary += String.fromCharCode(bytes[i]);
|
680 | }
|
681 | return binary;
|
682 | }
|
683 |
|
684 |
|
685 |
|
686 | function loadImage(src, crossOrigin) {
|
687 | return new Promise(function (resolve, reject) {
|
688 | var img = new Image();
|
689 | if (crossOrigin) {
|
690 | img.crossOrigin = crossOrigin;
|
691 | }
|
692 | img.onload = function () {
|
693 | resolve(img);
|
694 | };
|
695 | img.onerror = reject;
|
696 | img.src = src;
|
697 | });
|
698 | }
|
699 |
|
700 | function imgToCanvas(img) {
|
701 | var canvas = document.createElement('canvas');
|
702 |
|
703 | canvas.width = img.width;
|
704 | canvas.height = img.height;
|
705 |
|
706 |
|
707 | var context = canvas.getContext('2d');
|
708 | context.drawImage(
|
709 | img,
|
710 | 0, 0,
|
711 | img.width, img.height,
|
712 | 0, 0,
|
713 | img.width, img.height);
|
714 |
|
715 | return canvas;
|
716 | }
|
717 |
|
718 |
|
719 |
|
720 |
|
721 |
|
722 |
|
723 |
|
724 |
|
725 |
|
726 |
|
727 |
|
728 |
|
729 |
|
730 |
|
731 |
|
732 | function createBlob(parts, options) {
|
733 | options = options || {};
|
734 | if (typeof options === 'string') {
|
735 | options = {type: options};
|
736 | }
|
737 | return new Blob(parts, options);
|
738 | }
|
739 |
|
740 |
|
741 |
|
742 |
|
743 |
|
744 |
|
745 |
|
746 |
|
747 |
|
748 | function createObjectURL(blob) {
|
749 | return (window.URL || window.webkitURL).createObjectURL(blob);
|
750 | }
|
751 |
|
752 |
|
753 |
|
754 |
|
755 |
|
756 |
|
757 |
|
758 |
|
759 | function revokeObjectURL(url) {
|
760 | return (window.URL || window.webkitURL).revokeObjectURL(url);
|
761 | }
|
762 |
|
763 |
|
764 |
|
765 |
|
766 |
|
767 |
|
768 |
|
769 | function blobToBinaryString(blob) {
|
770 | return new Promise(function (resolve, reject) {
|
771 | var reader = new FileReader();
|
772 | var hasBinaryString = typeof reader.readAsBinaryString === 'function';
|
773 | reader.onloadend = function (e) {
|
774 | var result = e.target.result || '';
|
775 | if (hasBinaryString) {
|
776 | return resolve(result);
|
777 | }
|
778 | resolve(arrayBufferToBinaryString(result));
|
779 | };
|
780 | reader.onerror = reject;
|
781 | if (hasBinaryString) {
|
782 | reader.readAsBinaryString(blob);
|
783 | } else {
|
784 | reader.readAsArrayBuffer(blob);
|
785 | }
|
786 | });
|
787 | }
|
788 |
|
789 |
|
790 |
|
791 |
|
792 |
|
793 |
|
794 |
|
795 | function base64StringToBlob(base64, type) {
|
796 | return Promise.resolve().then(function () {
|
797 | var parts = [binaryStringToArrayBuffer(atob(base64))];
|
798 | return type ? createBlob(parts, {type: type}) : createBlob(parts);
|
799 | });
|
800 | }
|
801 |
|
802 |
|
803 |
|
804 |
|
805 |
|
806 |
|
807 |
|
808 | function binaryStringToBlob(binary, type) {
|
809 | return Promise.resolve().then(function () {
|
810 | return base64StringToBlob(btoa(binary), type);
|
811 | });
|
812 | }
|
813 |
|
814 |
|
815 |
|
816 |
|
817 |
|
818 |
|
819 | function blobToBase64String(blob) {
|
820 | return blobToBinaryString(blob).then(function (binary) {
|
821 | return btoa(binary);
|
822 | });
|
823 | }
|
824 |
|
825 |
|
826 |
|
827 |
|
828 |
|
829 |
|
830 |
|
831 |
|
832 | function dataURLToBlob(dataURL) {
|
833 | return Promise.resolve().then(function () {
|
834 | var type = dataURL.match(/data:([^;]+)/)[1];
|
835 | var base64 = dataURL.replace(/^[^,]+,/, '');
|
836 |
|
837 | var buff = binaryStringToArrayBuffer(atob(base64));
|
838 | return createBlob([buff], {type: type});
|
839 | });
|
840 | }
|
841 |
|
842 |
|
843 |
|
844 |
|
845 |
|
846 |
|
847 |
|
848 |
|
849 |
|
850 |
|
851 |
|
852 |
|
853 |
|
854 |
|
855 |
|
856 |
|
857 | function imgSrcToDataURL(src, type, crossOrigin, quality) {
|
858 | type = type || 'image/png';
|
859 |
|
860 | return loadImage(src, crossOrigin).then(function (img) {
|
861 | return imgToCanvas(img);
|
862 | }).then(function (canvas) {
|
863 | return canvas.toDataURL(type, quality);
|
864 | });
|
865 | }
|
866 |
|
867 |
|
868 |
|
869 |
|
870 |
|
871 |
|
872 |
|
873 |
|
874 |
|
875 | function canvasToBlob(canvas, type, quality) {
|
876 | return Promise.resolve().then(function () {
|
877 | if (typeof canvas.toBlob === 'function') {
|
878 | return new Promise(function (resolve) {
|
879 | canvas.toBlob(resolve, type, quality);
|
880 | });
|
881 | }
|
882 | return dataURLToBlob(canvas.toDataURL(type, quality));
|
883 | });
|
884 | }
|
885 |
|
886 |
|
887 |
|
888 |
|
889 |
|
890 |
|
891 |
|
892 |
|
893 |
|
894 |
|
895 |
|
896 |
|
897 |
|
898 |
|
899 |
|
900 |
|
901 | function imgSrcToBlob(src, type, crossOrigin, quality) {
|
902 | type = type || 'image/png';
|
903 |
|
904 | return loadImage(src, crossOrigin).then(function (img) {
|
905 | return imgToCanvas(img);
|
906 | }).then(function (canvas) {
|
907 | return canvasToBlob(canvas, type, quality);
|
908 | });
|
909 | }
|
910 |
|
911 |
|
912 |
|
913 |
|
914 |
|
915 |
|
916 |
|
917 |
|
918 | function arrayBufferToBlob(buffer, type) {
|
919 | return Promise.resolve().then(function () {
|
920 | return createBlob([buffer], type);
|
921 | });
|
922 | }
|
923 |
|
924 |
|
925 |
|
926 |
|
927 |
|
928 |
|
929 | function blobToArrayBuffer(blob) {
|
930 | return new Promise(function (resolve, reject) {
|
931 | var reader = new FileReader();
|
932 | reader.onloadend = function (e) {
|
933 | var result = e.target.result || new ArrayBuffer(0);
|
934 | resolve(result);
|
935 | };
|
936 | reader.onerror = reject;
|
937 | reader.readAsArrayBuffer(blob);
|
938 | });
|
939 | }
|
940 |
|
941 | module.exports = {
|
942 | createBlob : createBlob,
|
943 | createObjectURL : createObjectURL,
|
944 | revokeObjectURL : revokeObjectURL,
|
945 | imgSrcToBlob : imgSrcToBlob,
|
946 | imgSrcToDataURL : imgSrcToDataURL,
|
947 | canvasToBlob : canvasToBlob,
|
948 | dataURLToBlob : dataURLToBlob,
|
949 | blobToBase64String : blobToBase64String,
|
950 | base64StringToBlob : base64StringToBlob,
|
951 | binaryStringToBlob : binaryStringToBlob,
|
952 | blobToBinaryString : blobToBinaryString,
|
953 | arrayBufferToBlob : arrayBufferToBlob,
|
954 | blobToArrayBuffer : blobToArrayBuffer
|
955 | };
|
956 |
|
957 | },{"1":1,"20":20}]},{},[22])(22)
|
958 | }); |
\ | No newline at end of file |