forked from lix-project/lix-website
88 lines
1.9 KiB
JavaScript
88 lines
1.9 KiB
JavaScript
|
'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
|