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