1/* 2 * jQuery File Upload Processing Plugin 3 * https://github.com/blueimp/jQuery-File-Upload 4 * 5 * Copyright 2012, Sebastian Tschan 6 * https://blueimp.net 7 * 8 * Licensed under the MIT license: 9 * https://opensource.org/licenses/MIT 10 */ 11 12/* jshint nomen:false */ 13/* global define, require, window */ 14 15;(function (factory) { 16 'use strict'; 17 if (typeof define === 'function' && define.amd) { 18 // Register as an anonymous AMD module: 19 define([ 20 'jquery', 21 './jquery.fileupload' 22 ], factory); 23 } else if (typeof exports === 'object') { 24 // Node/CommonJS: 25 factory( 26 require('jquery'), 27 require('./jquery.fileupload') 28 ); 29 } else { 30 // Browser globals: 31 factory( 32 window.jQuery 33 ); 34 } 35}(function ($) { 36 'use strict'; 37 38 var originalAdd = $.blueimp.fileupload.prototype.options.add; 39 40 // The File Upload Processing plugin extends the fileupload widget 41 // with file processing functionality: 42 $.widget('blueimp.fileupload', $.blueimp.fileupload, { 43 44 options: { 45 // The list of processing actions: 46 processQueue: [ 47 /* 48 { 49 action: 'log', 50 type: 'debug' 51 } 52 */ 53 ], 54 add: function (e, data) { 55 var $this = $(this); 56 data.process(function () { 57 return $this.fileupload('process', data); 58 }); 59 originalAdd.call(this, e, data); 60 } 61 }, 62 63 processActions: { 64 /* 65 log: function (data, options) { 66 console[options.type]( 67 'Processing "' + data.files[data.index].name + '"' 68 ); 69 } 70 */ 71 }, 72 73 _processFile: function (data, originalData) { 74 var that = this, 75 dfd = $.Deferred().resolveWith(that, [data]), 76 chain = dfd.promise(); 77 this._trigger('process', null, data); 78 $.each(data.processQueue, function (i, settings) { 79 var func = function (data) { 80 if (originalData.errorThrown) { 81 return $.Deferred() 82 .rejectWith(that, [originalData]).promise(); 83 } 84 return that.processActions[settings.action].call( 85 that, 86 data, 87 settings 88 ); 89 }; 90 chain = chain.then(func, settings.always && func); 91 }); 92 chain 93 .done(function () { 94 that._trigger('processdone', null, data); 95 that._trigger('processalways', null, data); 96 }) 97 .fail(function () { 98 that._trigger('processfail', null, data); 99 that._trigger('processalways', null, data); 100 }); 101 return chain; 102 }, 103 104 // Replaces the settings of each processQueue item that 105 // are strings starting with an "@", using the remaining 106 // substring as key for the option map, 107 // e.g. "@autoUpload" is replaced with options.autoUpload: 108 _transformProcessQueue: function (options) { 109 var processQueue = []; 110 $.each(options.processQueue, function () { 111 var settings = {}, 112 action = this.action, 113 prefix = this.prefix === true ? action : this.prefix; 114 $.each(this, function (key, value) { 115 if ($.type(value) === 'string' && 116 value.charAt(0) === '@') { 117 settings[key] = options[ 118 value.slice(1) || (prefix ? prefix + 119 key.charAt(0).toUpperCase() + key.slice(1) : key) 120 ]; 121 } else { 122 settings[key] = value; 123 } 124 125 }); 126 processQueue.push(settings); 127 }); 128 options.processQueue = processQueue; 129 }, 130 131 // Returns the number of files currently in the processsing queue: 132 processing: function () { 133 return this._processing; 134 }, 135 136 // Processes the files given as files property of the data parameter, 137 // returns a Promise object that allows to bind callbacks: 138 process: function (data) { 139 var that = this, 140 options = $.extend({}, this.options, data); 141 if (options.processQueue && options.processQueue.length) { 142 this._transformProcessQueue(options); 143 if (this._processing === 0) { 144 this._trigger('processstart'); 145 } 146 $.each(data.files, function (index) { 147 var opts = index ? $.extend({}, options) : options, 148 func = function () { 149 if (data.errorThrown) { 150 return $.Deferred() 151 .rejectWith(that, [data]).promise(); 152 } 153 return that._processFile(opts, data); 154 }; 155 opts.index = index;
156 that._processing += 1; 157 that._processingQueue = that._processingQueue.then(func, func) 158 .always(function () { 159 that._processing -= 1; 160 if (that._processing === 0) { 161 that._trigger('processstop'); 162 } 163 }); 164 }); 165 } 166 return this._processingQueue; 167 }, 168 169 _create: function () { 170 this._super(); 171 this._processing = 0; 172 this._processingQueue = $.Deferred().resolveWith(this) 173 .promise(); 174 } 175 176 }); 177 178}));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.