'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;
|