81 lines
2.6 KiB
JavaScript
81 lines
2.6 KiB
JavaScript
const _stringWidth = require('string-width');
|
|
const _defaultFormatValue = require('./format-value');
|
|
const _defaultFormatBar = require('./format-bar');
|
|
const _defaultFormatTime = require('./format-time');
|
|
|
|
// generic formatter
|
|
module.exports = function defaultFormatter(options, params, payload){
|
|
|
|
// copy format string
|
|
let s = options.format;
|
|
|
|
// custom time format set ?
|
|
const formatTime = options.formatTime || _defaultFormatTime;
|
|
|
|
// custom value format set ?
|
|
const formatValue = options.formatValue || _defaultFormatValue;
|
|
|
|
// custom bar format set ?
|
|
const formatBar = options.formatBar || _defaultFormatBar;
|
|
|
|
// calculate progress in percent
|
|
const percentage = Math.floor(params.progress*100) + '';
|
|
|
|
// bar stopped and stopTime set ?
|
|
const stopTime = params.stopTime || Date.now();
|
|
|
|
// calculate elapsed time
|
|
const elapsedTime = Math.round((stopTime - params.startTime)/1000);
|
|
|
|
// merges data from payload and calculated
|
|
const context = Object.assign({}, payload, {
|
|
bar: formatBar(params.progress, options),
|
|
|
|
percentage: formatValue(percentage, options, 'percentage'),
|
|
total: formatValue(params.total, options, 'total'),
|
|
value: formatValue(params.value, options, 'value'),
|
|
|
|
eta: formatValue(params.eta, options, 'eta'),
|
|
eta_formatted: formatTime(params.eta, options, 5),
|
|
|
|
duration: formatValue(elapsedTime, options, 'duration'),
|
|
duration_formatted: formatTime(elapsedTime, options, 1)
|
|
});
|
|
|
|
// assign placeholder tokens
|
|
s = s.replace(/\{(\w+)\}/g, function(match, key){
|
|
// key exists within payload/context
|
|
if (typeof context[key] !== 'undefined') {
|
|
return context[key];
|
|
}
|
|
|
|
// no changes to unknown values
|
|
return match;
|
|
});
|
|
|
|
// calculate available whitespace (2 characters margin of error)
|
|
const fullMargin = Math.max(0, params.maxWidth - _stringWidth(s) -2);
|
|
const halfMargin = Math.floor(fullMargin / 2);
|
|
|
|
// distribute available whitespace according to position
|
|
switch (options.align) {
|
|
|
|
// fill start-of-line with whitespaces
|
|
case 'right':
|
|
s = (fullMargin > 0) ? ' '.repeat(fullMargin) + s : s;
|
|
break;
|
|
|
|
// distribute whitespaces to left+right
|
|
case 'center':
|
|
s = (halfMargin > 0) ? ' '.repeat(halfMargin) + s : s;
|
|
break;
|
|
|
|
// default: left align, no additional whitespaces
|
|
case 'left':
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return s;
|
|
}
|