mirror of
https://github.com/urbit/shrub.git
synced 2024-12-20 01:01:37 +03:00
72 lines
1.5 KiB
JavaScript
72 lines
1.5 KiB
JavaScript
|
|
/**
|
|
* 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')
|
|
}
|
|
}
|