website with slop placeholders
This commit is contained in:
@@ -0,0 +1,136 @@
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define([], factory);
|
||||
} else if (typeof module === 'object' && module.exports) {
|
||||
module.exports = factory();
|
||||
} else {
|
||||
root.UFormat = factory();
|
||||
}
|
||||
}(typeof self !== 'undefined' ? self : this, function () {
|
||||
'use strict';
|
||||
|
||||
const BYTE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
|
||||
|
||||
function scaleBytes(bytes) {
|
||||
let value = Number(bytes || 0);
|
||||
let unitIndex = 0;
|
||||
while (Math.abs(value) >= 1024 && unitIndex < BYTE_UNITS.length - 1) {
|
||||
value /= 1024;
|
||||
unitIndex += 1;
|
||||
}
|
||||
return { value, unitIndex };
|
||||
}
|
||||
|
||||
function formatBytes(bytes) {
|
||||
if (bytes == null || bytes === '') return '--';
|
||||
const scaled = scaleBytes(bytes);
|
||||
const decimals = scaled.unitIndex === 0 ? 0 : 1;
|
||||
return `${scaled.value.toFixed(decimals)} ${BYTE_UNITS[scaled.unitIndex]}`;
|
||||
}
|
||||
|
||||
function formatDiskBytes(bytes) {
|
||||
if (bytes == null || bytes === '') return '--';
|
||||
const scaled = scaleBytes(bytes);
|
||||
const decimals = scaled.unitIndex >= 4 ? 2 : scaled.unitIndex >= 1 ? 1 : 0;
|
||||
return `${scaled.value.toFixed(decimals)} ${BYTE_UNITS[scaled.unitIndex]}`;
|
||||
}
|
||||
|
||||
function formatCount(value) {
|
||||
const number = Number(value);
|
||||
if (!Number.isFinite(number)) return '--';
|
||||
return number.toLocaleString();
|
||||
}
|
||||
|
||||
function formatDurationMs(value) {
|
||||
const number = Number(value);
|
||||
if (!Number.isFinite(number)) return '--';
|
||||
if (Math.abs(number) >= 1000) {
|
||||
return `${(number / 1000).toFixed(number >= 10000 ? 0 : 1)} s`;
|
||||
}
|
||||
return `${number.toFixed(number >= 100 ? 0 : 1)} ms`;
|
||||
}
|
||||
|
||||
function parseUnitNumber(text) {
|
||||
const normalized = String(text || '').trim().toLowerCase().replace(/,/g, '');
|
||||
if (!normalized) return null;
|
||||
|
||||
const pure = normalized.match(/^([-+]?\d*\.?\d+)$/);
|
||||
if (pure) {
|
||||
return Number(pure[1]);
|
||||
}
|
||||
|
||||
const withUnit = normalized.match(/^([-+]?\d*\.?\d+)\s*([a-z%][a-z0-9\/_-]*)$/);
|
||||
if (!withUnit) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const value = Number(withUnit[1]);
|
||||
let unit = withUnit[2];
|
||||
if (!Number.isFinite(value)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (unit.endsWith('/s')) {
|
||||
unit = unit.slice(0, -2);
|
||||
}
|
||||
|
||||
const bytes = {
|
||||
b: 1,
|
||||
kb: 1024,
|
||||
kib: 1024,
|
||||
mb: 1024 ** 2,
|
||||
mib: 1024 ** 2,
|
||||
gb: 1024 ** 3,
|
||||
gib: 1024 ** 3,
|
||||
tb: 1024 ** 4,
|
||||
tib: 1024 ** 4,
|
||||
pb: 1024 ** 5,
|
||||
pib: 1024 ** 5,
|
||||
};
|
||||
|
||||
if (Object.prototype.hasOwnProperty.call(bytes, unit)) {
|
||||
return value * bytes[unit];
|
||||
}
|
||||
|
||||
const durations = {
|
||||
ms: 0.001,
|
||||
s: 1,
|
||||
sec: 1,
|
||||
secs: 1,
|
||||
second: 1,
|
||||
seconds: 1,
|
||||
m: 60,
|
||||
min: 60,
|
||||
mins: 60,
|
||||
minute: 60,
|
||||
minutes: 60,
|
||||
h: 3600,
|
||||
hr: 3600,
|
||||
hrs: 3600,
|
||||
hour: 3600,
|
||||
hours: 3600,
|
||||
d: 86400,
|
||||
day: 86400,
|
||||
days: 86400,
|
||||
};
|
||||
|
||||
if (Object.prototype.hasOwnProperty.call(durations, unit)) {
|
||||
return value * durations[unit];
|
||||
}
|
||||
|
||||
if (unit === '%') {
|
||||
return value;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
formatBytes,
|
||||
formatCount,
|
||||
formatDiskBytes,
|
||||
formatDurationMs,
|
||||
parseUnitNumber,
|
||||
scaleBytes,
|
||||
};
|
||||
}));
|
||||
Reference in New Issue
Block a user