Spaces:
Sleeping
Sleeping
| 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; | |
| } | |