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