You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.7 KiB
64 lines
1.7 KiB
'use strict'; |
|
|
|
const Mixin = require('../../utils/mixin'); |
|
|
|
class PositionTrackingPreprocessorMixin extends Mixin { |
|
constructor(preprocessor) { |
|
super(preprocessor); |
|
|
|
this.preprocessor = preprocessor; |
|
this.isEol = false; |
|
this.lineStartPos = 0; |
|
this.droppedBufferSize = 0; |
|
|
|
this.offset = 0; |
|
this.col = 0; |
|
this.line = 1; |
|
} |
|
|
|
_getOverriddenMethods(mxn, orig) { |
|
return { |
|
advance() { |
|
const pos = this.pos + 1; |
|
const ch = this.html[pos]; |
|
|
|
//NOTE: LF should be in the last column of the line |
|
if (mxn.isEol) { |
|
mxn.isEol = false; |
|
mxn.line++; |
|
mxn.lineStartPos = pos; |
|
} |
|
|
|
if (ch === '\n' || (ch === '\r' && this.html[pos + 1] !== '\n')) { |
|
mxn.isEol = true; |
|
} |
|
|
|
mxn.col = pos - mxn.lineStartPos + 1; |
|
mxn.offset = mxn.droppedBufferSize + pos; |
|
|
|
return orig.advance.call(this); |
|
}, |
|
|
|
retreat() { |
|
orig.retreat.call(this); |
|
|
|
mxn.isEol = false; |
|
mxn.col = this.pos - mxn.lineStartPos + 1; |
|
}, |
|
|
|
dropParsedChunk() { |
|
const prevPos = this.pos; |
|
|
|
orig.dropParsedChunk.call(this); |
|
|
|
const reduction = prevPos - this.pos; |
|
|
|
mxn.lineStartPos -= reduction; |
|
mxn.droppedBufferSize += reduction; |
|
mxn.offset = mxn.droppedBufferSize + this.pos; |
|
} |
|
}; |
|
} |
|
} |
|
|
|
module.exports = PositionTrackingPreprocessorMixin;
|
|
|