| "use strict"; |
| |
| /**
|
| * filesize
|
| *
|
| * @copyright 2018 Jason Mulligan <jason.mulligan@avoidwork.com>
|
| * @license BSD-3-Clause
|
| * @version 3.6.1
|
| */ |
| (function (global) { |
| var b = /^(b|B)$/, |
| symbol = { |
| iec: { |
| bits: ["b", "Kib", "Mib", "Gib", "Tib", "Pib", "Eib", "Zib", "Yib"], |
| bytes: ["B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"] |
| }, |
| jedec: { |
| bits: ["b", "Kb", "Mb", "Gb", "Tb", "Pb", "Eb", "Zb", "Yb"], |
| bytes: ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"] |
| } |
| }, |
| fullform = { |
| iec: ["", "kibi", "mebi", "gibi", "tebi", "pebi", "exbi", "zebi", "yobi"], |
| jedec: ["", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta"] |
| }; |
| |
| /**
|
| * filesize
|
| *
|
| * @method filesize
|
| * @param {Mixed} arg String, Int or Float to transform
|
| * @param {Object} descriptor [Optional] Flags
|
| * @return {String} Readable file size String
|
| */ |
| function filesize(arg) { |
| var descriptor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
| |
| var result = [], |
| val = 0, |
| e = void 0, |
| base = void 0, |
| bits = void 0, |
| ceil = void 0, |
| full = void 0, |
| fullforms = void 0, |
| neg = void 0, |
| num = void 0, |
| output = void 0, |
| round = void 0, |
| unix = void 0, |
| separator = void 0, |
| spacer = void 0, |
| standard = void 0, |
| symbols = void 0; |
| |
| if (isNaN(arg)) { |
| throw new Error("Invalid arguments"); |
| } |
| |
| bits = descriptor.bits === true; |
| unix = descriptor.unix === true; |
| base = descriptor.base || 2; |
| round = descriptor.round !== void 0 ? descriptor.round : unix ? 1 : 2; |
| separator = descriptor.separator !== void 0 ? descriptor.separator || "" : ""; |
| spacer = descriptor.spacer !== void 0 ? descriptor.spacer : unix ? "" : " "; |
| symbols = descriptor.symbols || descriptor.suffixes || {}; |
| standard = base === 2 ? descriptor.standard || "jedec" : "jedec"; |
| output = descriptor.output || "string"; |
| full = descriptor.fullform === true; |
| fullforms = descriptor.fullforms instanceof Array ? descriptor.fullforms : []; |
| e = descriptor.exponent !== void 0 ? descriptor.exponent : -1; |
| num = Number(arg); |
| neg = num < 0; |
| ceil = base > 2 ? 1000 : 1024; |
| |
| // Flipping a negative number to determine the size |
| if (neg) { |
| num = -num; |
| } |
| |
| // Determining the exponent |
| if (e === -1 || isNaN(e)) { |
| e = Math.floor(Math.log(num) / Math.log(ceil)); |
| |
| if (e < 0) { |
| e = 0; |
| } |
| } |
| |
| // Exceeding supported length, time to reduce & multiply |
| if (e > 8) { |
| e = 8; |
| } |
| |
| // Zero is now a special case because bytes divide by 1 |
| if (num === 0) { |
| result[0] = 0; |
| result[1] = unix ? "" : symbol[standard][bits ? "bits" : "bytes"][e]; |
| } else { |
| val = num / (base === 2 ? Math.pow(2, e * 10) : Math.pow(1000, e)); |
| |
| if (bits) { |
| val = val * 8; |
| |
| if (val >= ceil && e < 8) { |
| val = val / ceil; |
| e++; |
| } |
| } |
| |
| result[0] = Number(val.toFixed(e > 0 ? round : 0)); |
| result[1] = base === 10 && e === 1 ? bits ? "kb" : "kB" : symbol[standard][bits ? "bits" : "bytes"][e]; |
| |
| if (unix) { |
| result[1] = standard === "jedec" ? result[1].charAt(0) : e > 0 ? result[1].replace(/B$/, "") : result[1]; |
| |
| if (b.test(result[1])) { |
| result[0] = Math.floor(result[0]); |
| result[1] = ""; |
| } |
| } |
| } |
| |
| // Decorating a 'diff' |
| if (neg) { |
| result[0] = -result[0]; |
| } |
| |
| // Applying custom symbol |
| result[1] = symbols[result[1]] || result[1]; |
| |
| // Returning Array, Object, or String (default) |
| if (output === "array") { |
| return result; |
| } |
| |
| if (output === "exponent") { |
| return e; |
| } |
| |
| if (output === "object") { |
| return { value: result[0], suffix: result[1], symbol: result[1] }; |
| } |
| |
| if (full) { |
| result[1] = fullforms[e] ? fullforms[e] : fullform[standard][e] + (bits ? "bit" : "byte") + (result[0] === 1 ? "" : "s"); |
| } |
| |
| if (separator.length > 0) { |
| result[0] = result[0].toString().replace(".", separator); |
| } |
| |
| return result.join(spacer); |
| } |
| |
| // Partial application for functional programming |
| filesize.partial = function (opt) { |
| return function (arg) { |
| return filesize(arg, opt); |
| }; |
| }; |
| |
| // CommonJS, AMD, script tag |
| if (typeof exports !== "undefined") { |
| module.exports = filesize; |
| } else if (typeof define === "function" && define.amd) { |
| define(function () { |
| return filesize; |
| }); |
| } else { |
| global.filesize = filesize; |
| } |
| })(typeof window !== "undefined" ? window : global); |