'use strict' var search = /[\0\t\n\r]/g function preprocess() { var start = true var column = 1 var buffer = '' var atCarriageReturn return preprocessor function preprocessor(value, encoding, end) { var chunks = [] var match var next var startPosition var endPosition var code value = buffer + value.toString(encoding) startPosition = 0 buffer = '' if (start) { if (value.charCodeAt(0) === 65279) { startPosition++ } start = undefined } while (startPosition < value.length) { search.lastIndex = startPosition match = search.exec(value) endPosition = match ? match.index : value.length code = value.charCodeAt(endPosition) if (!match) { buffer = value.slice(startPosition) break } if (code === 10 && startPosition === endPosition && atCarriageReturn) { chunks.push(-3) atCarriageReturn = undefined } else { if (atCarriageReturn) { chunks.push(-5) atCarriageReturn = undefined } if (startPosition < endPosition) { chunks.push(value.slice(startPosition, endPosition)) column += endPosition - startPosition } if (code === 0) { chunks.push(65533) column++ } else if (code === 9) { next = Math.ceil(column / 4) * 4 chunks.push(-2) while (column++ < next) chunks.push(-1) } else if (code === 10) { chunks.push(-4) column = 1 } // Must be carriage return. else { atCarriageReturn = true column = 1 } } startPosition = endPosition + 1 } if (end) { if (atCarriageReturn) chunks.push(-5) if (buffer) chunks.push(buffer) chunks.push(null) } return chunks } } module.exports = preprocess