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