| #!/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) |
| })() |