| 'use strict'; |
| |
| const stream = require('stream'); |
| const Transform = stream.Transform; |
| |
| /** |
| * Ensures that only <CR><LF> sequences are used for linebreaks |
| * |
| * @param {Object} options Stream options |
| */ |
| class LeWindows extends Transform { |
| |
| constructor(options) { |
| super(options); |
| // init Transform |
| this.options = options || {}; |
| this.lastByte = false; |
| } |
| |
| /** |
| * Escapes dots |
| */ |
| _transform(chunk, encoding, done) { |
| let buf; |
| let lastPos = 0; |
| |
| for (let i = 0, len = chunk.length; i < len; i++) { |
| if (chunk[i] === 0x0A) { // \n |
| if ( |
| (i && chunk[i - 1] !== 0x0D) || |
| (!i && this.lastByte !== 0x0D) |
| ) { |
| if (i > lastPos) { |
| buf = chunk.slice(lastPos, i); |
| this.push(buf); |
| } |
| this.push(new Buffer('\r\n')); |
| lastPos = i + 1; |
| } |
| } |
| } |
| |
| if (lastPos && lastPos < chunk.length) { |
| buf = chunk.slice(lastPos); |
| this.push(buf); |
| } else if (!lastPos) { |
| this.push(chunk); |
| } |
| |
| this.lastByte = chunk[chunk.length - 1]; |
| done(); |
| } |
| } |
| |
| module.exports = LeWindows; |