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