1 | /*
|
2 | Terminal Kit
|
3 |
|
4 | Copyright (c) 2009 - 2020 Cédric Ronvel
|
5 |
|
6 | The MIT License (MIT)
|
7 |
|
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
|
9 | of this software and associated documentation files (the "Software"), to deal
|
10 | in the Software without restriction, including without limitation the rights
|
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12 | copies of the Software, and to permit persons to whom the Software is
|
13 | furnished to do so, subject to the following conditions:
|
14 |
|
15 | The above copyright notice and this permission notice shall be included in all
|
16 | copies or substantial portions of the Software.
|
17 |
|
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
24 | SOFTWARE.
|
25 | */
|
26 |
|
27 | ;
|
28 |
|
29 |
|
30 |
|
31 | // Load modules
|
32 | var spChars = require( './spChars.js' ) ;
|
33 |
|
34 |
|
35 |
|
36 | /*
|
37 | bar( value , options )
|
38 | * value `number` the value to display as bar
|
39 | * options `object` of options, where:
|
40 | * innerSize `number` the inner width in characters (default: 10)
|
41 | * barStyle `function` the style of the bar, default to term.blue
|
42 | * str `boolean` (default: false) if true it outputs nothing, instead it returns a string
|
43 | */
|
44 | module.exports = function bar( value , options ) {
|
45 | var str = '' , barString = '' ;
|
46 |
|
47 | options = options || {} ;
|
48 |
|
49 | if ( isNaN( value ) || value < 0 ) { value = 0 ; }
|
50 | else if ( value > 1 ) { value = 1 ; }
|
51 |
|
52 | var innerSize = options.innerSize || 10 ;
|
53 | var fullBlocks = Math.floor( value * innerSize ) ;
|
54 | var partialBlock = Math.round( ( value * innerSize - fullBlocks ) * 8 ) ;
|
55 | var barStyle = options.barStyle || this.blue ;
|
56 |
|
57 | barString += '█'.repeat( fullBlocks ) ;
|
58 |
|
59 | if ( fullBlocks < innerSize ) {
|
60 | barString += spChars.enlargingBlock[ partialBlock ] ;
|
61 | barString += ' '.repeat( innerSize - fullBlocks - 1 ) ;
|
62 | }
|
63 |
|
64 | if ( options.str ) {
|
65 | str += this.str.inverse( '▉' ) ;
|
66 | str += barStyle.str( barString ) ;
|
67 | str += this.str( '▏' ) ;
|
68 | return str ;
|
69 | }
|
70 |
|
71 | this.inverse( '▉' ) ;
|
72 | barStyle( barString ) ;
|
73 | this( '▏' ) ;
|
74 |
|
75 | return this ;
|
76 | } ;
|
77 |
|
78 |
|