95 lines
2.3 KiB
JavaScript
95 lines
2.3 KiB
JavaScript
'use strict'
|
|
const util = require('util')
|
|
const defaults = require('./defaults')
|
|
const CSIHelper = require('./CSIHelper')
|
|
|
|
// Expose
|
|
module.exports = LogDraft
|
|
|
|
/*
|
|
* This is a single Line object, that saves it's relative position
|
|
* in terminal. It is responsible by updating itself.
|
|
*/
|
|
function LogDraft(console, methodName) {
|
|
this._stream = console._stdout
|
|
this._styleFn = console[methodName]
|
|
|
|
// Valid flag. If set to false, should NOT write anymore
|
|
this.valid = true
|
|
|
|
// Save line where content will be saved
|
|
this.saveLine()
|
|
}
|
|
|
|
/*
|
|
* After creating a draft, you can call as many times as you want to update it
|
|
*/
|
|
LogDraft.prototype.update = function update(/* log arguments */) {
|
|
// Get line difference
|
|
var linesUp = this.linesUp()
|
|
|
|
// Check if is offscreen
|
|
if (this.isOffScreen()) {
|
|
if (defaults.canReWrite) {
|
|
// It can be rewritten, move line to current cursor line, and keep updating
|
|
this.saveLine(-1)
|
|
} else {
|
|
// Invalidate and prevent writting
|
|
this.valid = false
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Start editing stream
|
|
this._stream.stopLineCount()
|
|
|
|
// Save state (if content is not null)
|
|
this._stream.write(CSIHelper.save())
|
|
|
|
// Move up cursor up
|
|
this._stream.write(CSIHelper.up(linesUp))
|
|
|
|
// Clear line
|
|
this._stream.write(CSIHelper.clearLine())
|
|
|
|
// Call write function
|
|
this.write.apply(this, arguments)
|
|
|
|
// Restore state
|
|
this._stream.write(CSIHelper.restore())
|
|
|
|
// Resume counting lines
|
|
this._stream.resumeLineCount()
|
|
}
|
|
|
|
/*
|
|
* Returns true if line is out of screen
|
|
*/
|
|
LogDraft.prototype.isOffScreen = function isOffScren() {
|
|
var rows = this._stream.rows() || defaults.maximumLinesUp
|
|
return this._stream.rows() <= this.linesUp()
|
|
}
|
|
|
|
/*
|
|
* Return how many lines past our current log
|
|
*/
|
|
LogDraft.prototype.linesUp = function linesUp() {
|
|
return this._stream.line() - this._line
|
|
}
|
|
|
|
/*
|
|
* Writes to the stream by calling the writeFn.
|
|
* Will not print if it's invalid
|
|
* Defaults to `_stream.write` (set on constructor)
|
|
*/
|
|
LogDraft.prototype.write = function write() {
|
|
this.valid && this._styleFn.apply(this._styleFn, arguments)
|
|
}
|
|
|
|
/*
|
|
* Saves current line number as the insertion point
|
|
*/
|
|
LogDraft.prototype.saveLine = function saveLine(relative) {
|
|
relative = relative || 0
|
|
this._line = this._stream.line() + relative
|
|
} |