code: function LineInfoEmitter(options, rules) {
      var stdin = process.stdin,
          incompleteLine,
          self = this;
  
      EventEmitter.call(this);
  
      // prepare stdin for character processing and listen to events
      stdin.setEncoding(options.encoding);
  
      function processData(data) {
          var lastLineIncomplete, lines;
  
          if (options.debug) {
              console.log('====> incompleteLine:', incompleteLine, 'new chunk:');
              hexdumpLine(data);
          }
  
          if (incompleteLine) {
              // append data to not yet emitted, incomplete line
              data = incompleteLine + data;
              incompleteLine = null;
          }
  
          lastLineIncomplete = data && data.charAt(data.length - 1) !== '\n';
          lines = data.split('\n');
  
          if (lastLineIncomplete) {
              // wait to emit last line until rest of line comes in
              incompleteLine = lines.pop();
          }
          else {
              // remove last '' after newline
              lines.pop();
          }
          lines.forEach(function (line, i) {
              if (options.debug) {
                  hexdumpLine(line);
              }
              var lineInfo = analyzeLine(line, rules);
              self.emit('lineInfo', lineInfo);
          });
      }
  
      stdin.on('data', processData);
  
      stdin.on('end', function () {
          if (incompleteLine) {
              processData('\n');
          }
          self.emit('end');
      });
  
      // stdin is paused by default, so let's start!
      stdin.resume();
  }
docs: Analyzes stdin and emits <code>lineInfo</code> events.
  
  @param options
  @param rules
  @constructor