1
|
|
|
const CONSTANTS = { |
2
|
|
|
ICONS: { |
3
|
|
|
TIME: '🕓', |
4
|
|
|
}, |
5
|
|
|
NAME_LENGTHS: { |
6
|
|
|
OLD: 12, |
7
|
|
|
NEW: 15, |
8
|
|
|
}, |
9
|
|
|
PADDING_LENGTHS: { |
10
|
|
|
NEW_1: 8, |
11
|
|
|
NEW_2: 28, |
12
|
|
|
}, |
13
|
|
|
SYMBOLS: { |
14
|
|
|
PERCENT: '%', |
15
|
|
|
DOT: '.', |
16
|
|
|
ELLIPSIS: '...', |
17
|
|
|
BAR: '░▏▎▍▌▋▊▉█', |
18
|
|
|
}, |
19
|
|
|
BAR_CHART_SIZE: 23, |
20
|
|
|
FRACTION_UNIT: 8, |
21
|
|
|
SECONDS_IN: { |
22
|
|
|
DAY: 24 * 60 * 60, |
23
|
|
|
HOUR: 60 * 60, |
24
|
|
|
MINUTE: 60, |
25
|
|
|
}, |
26
|
|
|
}; |
27
|
|
|
|
28
|
|
|
export default function formatLine(name: string, totalSeconds: number, percent: number, useOldFormat: boolean) { |
29
|
|
|
const displayName = truncateString(name, 10); |
30
|
|
|
const formattedSeconds = formatTime(totalSeconds); |
31
|
|
|
const formattedPercent = percent.toFixed(1).toString(); |
32
|
|
|
return useOldFormat |
33
|
|
|
? formatOldLine(displayName, formattedSeconds, formattedPercent, percent) |
34
|
|
|
: formatNewLine(displayName, formattedSeconds, formattedPercent); |
35
|
|
|
} |
36
|
|
|
|
37
|
|
|
function buildTimeString(majorUnit: number, majorLabel: string, seconds: number, majorUnitSeconds: number, minorLabel: string, minorUnitSeconds?: number): string { |
38
|
|
|
return minorUnitSeconds !== undefined |
39
|
|
|
? `${majorUnit}${majorLabel} ${Math.floor((seconds % majorUnitSeconds) / minorUnitSeconds)}${minorLabel}` |
40
|
|
|
: `${majorUnit}${majorLabel}`; |
41
|
|
|
} |
42
|
|
|
|
43
|
|
|
function formatTime(seconds: number): string { |
44
|
|
|
const {DAY, HOUR, MINUTE} = CONSTANTS.SECONDS_IN; |
45
|
|
|
const days = Math.floor(seconds / DAY); |
46
|
|
|
if (days > 0) return buildTimeString(days, 'd', seconds, DAY, 'h', HOUR); |
47
|
|
|
const hours = Math.floor(seconds / HOUR); |
48
|
|
|
if (hours > 0) return buildTimeString(hours, 'h', seconds, HOUR, 'm', MINUTE); |
49
|
|
|
const minutes = Math.floor(seconds / MINUTE); |
50
|
|
|
if (minutes > 0) return buildTimeString(minutes, 'm', seconds, MINUTE, 's'); |
51
|
|
|
return `${Math.round(seconds)}s`; |
52
|
|
|
} |
53
|
|
|
|
54
|
|
|
function truncateString(str: string, len: number): string { |
55
|
|
|
const {ELLIPSIS} = CONSTANTS.SYMBOLS; |
56
|
|
|
return str.length > len ? str.substring(0, len - ELLIPSIS.length) + ELLIPSIS : str; |
57
|
|
|
} |
58
|
|
|
|
59
|
|
|
function generateBarChart(percent: number): string { |
60
|
|
|
const {BAR_CHART_SIZE, FRACTION_UNIT, SYMBOLS: {BAR}} = CONSTANTS; |
61
|
|
|
const frac = Math.floor((BAR_CHART_SIZE * FRACTION_UNIT * percent) / 100); |
62
|
|
|
const barsFull = Math.floor(frac / FRACTION_UNIT); |
63
|
|
|
const semiBarIndex = frac % FRACTION_UNIT; |
64
|
|
|
return barsFull >= BAR_CHART_SIZE |
65
|
|
|
? BAR[8].repeat(BAR_CHART_SIZE) |
66
|
|
|
: BAR[8].repeat(barsFull) + BAR[semiBarIndex].padEnd(BAR_CHART_SIZE, BAR[0]); |
67
|
|
|
} |
68
|
|
|
|
69
|
|
|
function formatPercent(percent: string): string { |
70
|
|
|
return percent.padStart(5) + CONSTANTS.SYMBOLS.PERCENT; |
71
|
|
|
} |
72
|
|
|
|
73
|
|
|
function formatTimeWithIcon(seconds: string): string { |
74
|
|
|
return `${CONSTANTS.ICONS.TIME} ${seconds.padEnd(9)}`; |
75
|
|
|
} |
76
|
|
|
|
77
|
|
|
function formatNewTimeDisplay(seconds: string): string { |
78
|
|
|
return (seconds + ' ').padEnd(CONSTANTS.PADDING_LENGTHS.NEW_1, CONSTANTS.SYMBOLS.DOT); |
79
|
|
|
} |
80
|
|
|
|
81
|
|
|
function formatOldLine(name: string, seconds: string, percent: string, percentValue: number) { |
82
|
|
|
return [ |
83
|
|
|
name.padEnd(CONSTANTS.NAME_LENGTHS.OLD), |
84
|
|
|
formatTimeWithIcon(seconds), |
85
|
|
|
generateBarChart(percentValue), |
86
|
|
|
formatPercent(percent), |
87
|
|
|
].join(' '); |
88
|
|
|
} |
89
|
|
|
|
90
|
|
|
function formatNewLine(name: string, seconds: string, percent: string) { |
91
|
|
|
return ( |
92
|
|
|
[ |
93
|
|
|
name.padEnd(CONSTANTS.NAME_LENGTHS.NEW, CONSTANTS.SYMBOLS.DOT), |
94
|
|
|
formatNewTimeDisplay(seconds), |
95
|
|
|
].join(' ') + percent.padStart(CONSTANTS.PADDING_LENGTHS.NEW_2, CONSTANTS.SYMBOLS.DOT) + CONSTANTS.SYMBOLS.PERCENT |
96
|
|
|
); |
97
|
|
|
} |
98
|
|
|
|