65 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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;
 |