mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
1.7 KiB
87 lines
1.7 KiB
#!/usr/bin/env node
|
|
|
|
var assert = require('assert')
|
|
, ansi = require('../../')
|
|
|
|
function Progress (stream, width) {
|
|
this.cursor = ansi(stream)
|
|
this.delta = this.cursor.newlines
|
|
this.width = width | 0 || 10
|
|
this.open = '['
|
|
this.close = ']'
|
|
this.complete = '█'
|
|
this.incomplete = '_'
|
|
|
|
// initial render
|
|
this.progress = 0
|
|
}
|
|
|
|
Object.defineProperty(Progress.prototype, 'progress', {
|
|
get: get
|
|
, set: set
|
|
, configurable: true
|
|
, enumerable: true
|
|
})
|
|
|
|
function get () {
|
|
return this._progress
|
|
}
|
|
|
|
function set (v) {
|
|
this._progress = Math.max(0, Math.min(v, 100))
|
|
|
|
var w = this.width - this.complete.length - this.incomplete.length
|
|
, n = w * (this._progress / 100) | 0
|
|
, i = w - n
|
|
, com = c(this.complete, n)
|
|
, inc = c(this.incomplete, i)
|
|
, delta = this.cursor.newlines - this.delta
|
|
|
|
assert.equal(com.length + inc.length, w)
|
|
|
|
if (delta > 0) {
|
|
this.cursor.up(delta)
|
|
this.delta = this.cursor.newlines
|
|
}
|
|
|
|
this.cursor
|
|
.horizontalAbsolute(0)
|
|
.eraseLine(2)
|
|
.fg.white()
|
|
.write(this.open)
|
|
.fg.grey()
|
|
.bold()
|
|
.write(com)
|
|
.resetBold()
|
|
.write(inc)
|
|
.fg.white()
|
|
.write(this.close)
|
|
.fg.reset()
|
|
.write('\n')
|
|
}
|
|
|
|
function c (char, length) {
|
|
return Array.apply(null, Array(length)).map(function () {
|
|
return char
|
|
}).join('')
|
|
}
|
|
|
|
|
|
|
|
|
|
// Usage
|
|
var width = parseInt(process.argv[2], 10) || process.stdout.getWindowSize()[0] / 2
|
|
, p = new Progress(process.stdout, width)
|
|
|
|
;(function tick () {
|
|
p.progress += Math.random() * 5
|
|
p.cursor
|
|
.eraseLine(2)
|
|
.write('Progress: ')
|
|
.bold().write(p.progress.toFixed(2))
|
|
.write('%')
|
|
.resetBold()
|
|
.write('\n')
|
|
if (p.progress < 100)
|
|
setTimeout(tick, 100)
|
|
})()
|
|
|