| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- '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
- }
|