12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- export default preprocess
-
- import codes from './character/codes.mjs'
- import constants from './constant/constants.mjs'
-
- 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) === codes.byteOrderMarker) {
- 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 === codes.lf &&
- startPosition === endPosition &&
- atCarriageReturn
- ) {
- chunks.push(codes.carriageReturnLineFeed)
- atCarriageReturn = undefined
- } else {
- if (atCarriageReturn) {
- chunks.push(codes.carriageReturn)
- atCarriageReturn = undefined
- }
-
- if (startPosition < endPosition) {
- chunks.push(value.slice(startPosition, endPosition))
- column += endPosition - startPosition
- }
-
- if (code === codes.nul) {
- chunks.push(codes.replacementCharacter)
- column++
- } else if (code === codes.ht) {
- next = Math.ceil(column / constants.tabSize) * constants.tabSize
- chunks.push(codes.horizontalTab)
- while (column++ < next) chunks.push(codes.virtualSpace)
- } else if (code === codes.lf) {
- chunks.push(codes.lineFeed)
- column = 1
- }
- // Must be carriage return.
- else {
- atCarriageReturn = true
- column = 1
- }
- }
-
- startPosition = endPosition + 1
- }
-
- if (end) {
- if (atCarriageReturn) chunks.push(codes.carriageReturn)
- if (buffer) chunks.push(buffer)
- chunks.push(codes.eof)
- }
-
- return chunks
- }
- }
|