blob: 4e37a0adbc1a95aca006587fceda9a56980867ef (
plain)
- /**
- * 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')
- }
- }
|