| |
| /** |
| * Accepts any node Stream instance and hijacks its "write()" function, |
| * so that it can count any newlines that get written to the output. |
| * |
| * When a '\n' byte is encountered, then a "newline" event will be emitted |
| * on the stream, with no arguments. It is up to the listeners to determine |
| * any necessary deltas required for their use-case. |
| * |
| * Ex: |
| * |
| * var cursor = ansi(process.stdout) |
| * , ln = 0 |
| * process.stdout.on('newline', function () { |
| * ln++ |
| * }) |
| */ |
| |
| /** |
| * Module dependencies. |
| */ |
| |
| var assert = require('assert') |
| var NEWLINE = '\n'.charCodeAt(0) |
| |
| function emitNewlineEvents (stream) { |
| if (stream._emittingNewlines) { |
| // already emitting newline events |
| return |
| } |
| |
| var write = stream.write |
| |
| stream.write = function (data) { |
| // first write the data |
| var rtn = write.apply(stream, arguments) |
| |
| if (stream.listeners('newline').length > 0) { |
| var len = data.length |
| , i = 0 |
| // now try to calculate any deltas |
| if (typeof data == 'string') { |
| for (; i<len; i++) { |
| processByte(stream, data.charCodeAt(i)) |
| } |
| } else { |
| // buffer |
| for (; i<len; i++) { |
| processByte(stream, data[i]) |
| } |
| } |
| } |
| |
| return rtn |
| } |
| |
| stream._emittingNewlines = true |
| } |
| module.exports = emitNewlineEvents |
| |
| |
| /** |
| * Processes an individual byte being written to a stream |
| */ |
| |
| function processByte (stream, b) { |
| assert.equal(typeof b, 'number') |
| if (b === NEWLINE) { |
| stream.emit('newline') |
| } |
| } |