195 lines
6.1 KiB
JavaScript
195 lines
6.1 KiB
JavaScript
import { _ as _createClass, a as _classCallCheck, b as _objectWithoutProperties } from '../../_rollupPluginBabelHelpers-b054ecd2.js';
|
|
import ChangeDetails from '../../core/change-details.js';
|
|
import { isString } from '../../core/utils.js';
|
|
import ContinuousTailDetails from '../../core/continuous-tail-details.js';
|
|
import IMask from '../../core/holder.js';
|
|
|
|
var _excluded = ["chunks"];
|
|
|
|
var ChunksTailDetails = /*#__PURE__*/function () {
|
|
/** */
|
|
function ChunksTailDetails() {
|
|
var chunks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
var from = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
|
|
_classCallCheck(this, ChunksTailDetails);
|
|
|
|
this.chunks = chunks;
|
|
this.from = from;
|
|
}
|
|
|
|
_createClass(ChunksTailDetails, [{
|
|
key: "toString",
|
|
value: function toString() {
|
|
return this.chunks.map(String).join('');
|
|
} // $FlowFixMe no ideas
|
|
|
|
}, {
|
|
key: "extend",
|
|
value: function extend(tailChunk) {
|
|
if (!String(tailChunk)) return;
|
|
if (isString(tailChunk)) tailChunk = new ContinuousTailDetails(String(tailChunk));
|
|
var lastChunk = this.chunks[this.chunks.length - 1];
|
|
var extendLast = lastChunk && ( // if stops are same or tail has no stop
|
|
lastChunk.stop === tailChunk.stop || tailChunk.stop == null) && // if tail chunk goes just after last chunk
|
|
tailChunk.from === lastChunk.from + lastChunk.toString().length;
|
|
|
|
if (tailChunk instanceof ContinuousTailDetails) {
|
|
// check the ability to extend previous chunk
|
|
if (extendLast) {
|
|
// extend previous chunk
|
|
lastChunk.extend(tailChunk.toString());
|
|
} else {
|
|
// append new chunk
|
|
this.chunks.push(tailChunk);
|
|
}
|
|
} else if (tailChunk instanceof ChunksTailDetails) {
|
|
if (tailChunk.stop == null) {
|
|
// unwrap floating chunks to parent, keeping `from` pos
|
|
var firstTailChunk;
|
|
|
|
while (tailChunk.chunks.length && tailChunk.chunks[0].stop == null) {
|
|
firstTailChunk = tailChunk.chunks.shift();
|
|
firstTailChunk.from += tailChunk.from;
|
|
this.extend(firstTailChunk);
|
|
}
|
|
} // if tail chunk still has value
|
|
|
|
|
|
if (tailChunk.toString()) {
|
|
// if chunks contains stops, then popup stop to container
|
|
tailChunk.stop = tailChunk.blockIndex;
|
|
this.chunks.push(tailChunk);
|
|
}
|
|
}
|
|
}
|
|
}, {
|
|
key: "appendTo",
|
|
value: function appendTo(masked) {
|
|
// $FlowFixMe
|
|
if (!(masked instanceof IMask.MaskedPattern)) {
|
|
var tail = new ContinuousTailDetails(this.toString());
|
|
return tail.appendTo(masked);
|
|
}
|
|
|
|
var details = new ChangeDetails();
|
|
|
|
for (var ci = 0; ci < this.chunks.length && !details.skip; ++ci) {
|
|
var chunk = this.chunks[ci];
|
|
|
|
var lastBlockIter = masked._mapPosToBlock(masked.value.length);
|
|
|
|
var stop = chunk.stop;
|
|
var chunkBlock = void 0;
|
|
|
|
if (stop != null && ( // if block not found or stop is behind lastBlock
|
|
!lastBlockIter || lastBlockIter.index <= stop)) {
|
|
if (chunk instanceof ChunksTailDetails || // for continuous block also check if stop is exist
|
|
masked._stops.indexOf(stop) >= 0) {
|
|
details.aggregate(masked._appendPlaceholder(stop));
|
|
}
|
|
|
|
chunkBlock = chunk instanceof ChunksTailDetails && masked._blocks[stop];
|
|
}
|
|
|
|
if (chunkBlock) {
|
|
var tailDetails = chunkBlock.appendTail(chunk);
|
|
tailDetails.skip = false; // always ignore skip, it will be set on last
|
|
|
|
details.aggregate(tailDetails);
|
|
masked._value += tailDetails.inserted; // get not inserted chars
|
|
|
|
var remainChars = chunk.toString().slice(tailDetails.rawInserted.length);
|
|
if (remainChars) details.aggregate(masked.append(remainChars, {
|
|
tail: true
|
|
}));
|
|
} else {
|
|
details.aggregate(masked.append(chunk.toString(), {
|
|
tail: true
|
|
}));
|
|
}
|
|
}
|
|
return details;
|
|
}
|
|
}, {
|
|
key: "state",
|
|
get: function get() {
|
|
return {
|
|
chunks: this.chunks.map(function (c) {
|
|
return c.state;
|
|
}),
|
|
from: this.from,
|
|
stop: this.stop,
|
|
blockIndex: this.blockIndex
|
|
};
|
|
},
|
|
set: function set(state) {
|
|
var chunks = state.chunks,
|
|
props = _objectWithoutProperties(state, _excluded);
|
|
|
|
Object.assign(this, props);
|
|
this.chunks = chunks.map(function (cstate) {
|
|
var chunk = "chunks" in cstate ? new ChunksTailDetails() : new ContinuousTailDetails(); // $FlowFixMe already checked above
|
|
|
|
chunk.state = cstate;
|
|
return chunk;
|
|
});
|
|
}
|
|
}, {
|
|
key: "unshift",
|
|
value: function unshift(beforePos) {
|
|
if (!this.chunks.length || beforePos != null && this.from >= beforePos) return '';
|
|
var chunkShiftPos = beforePos != null ? beforePos - this.from : beforePos;
|
|
var ci = 0;
|
|
|
|
while (ci < this.chunks.length) {
|
|
var chunk = this.chunks[ci];
|
|
var shiftChar = chunk.unshift(chunkShiftPos);
|
|
|
|
if (chunk.toString()) {
|
|
// chunk still contains value
|
|
// but not shifted - means no more available chars to shift
|
|
if (!shiftChar) break;
|
|
++ci;
|
|
} else {
|
|
// clean if chunk has no value
|
|
this.chunks.splice(ci, 1);
|
|
}
|
|
|
|
if (shiftChar) return shiftChar;
|
|
}
|
|
|
|
return '';
|
|
}
|
|
}, {
|
|
key: "shift",
|
|
value: function shift() {
|
|
if (!this.chunks.length) return '';
|
|
var ci = this.chunks.length - 1;
|
|
|
|
while (0 <= ci) {
|
|
var chunk = this.chunks[ci];
|
|
var shiftChar = chunk.shift();
|
|
|
|
if (chunk.toString()) {
|
|
// chunk still contains value
|
|
// but not shifted - means no more available chars to shift
|
|
if (!shiftChar) break;
|
|
--ci;
|
|
} else {
|
|
// clean if chunk has no value
|
|
this.chunks.splice(ci, 1);
|
|
}
|
|
|
|
if (shiftChar) return shiftChar;
|
|
}
|
|
|
|
return '';
|
|
}
|
|
}]);
|
|
|
|
return ChunksTailDetails;
|
|
}();
|
|
|
|
export { ChunksTailDetails as default };
|