upfront-editable
Version:
Friendly contenteditable API
85 lines (68 loc) • 1.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var MatchCollection = function () {
function MatchCollection() {
(0, _classCallCheck3.default)(this, MatchCollection);
this.matches = [];
}
(0, _createClass3.default)(MatchCollection, [{
key: "addMatches",
value: function addMatches(name, matches) {
if (!matches || !matches.length) return;
this.matches = mergeMatches(this.matches, matches);
}
}]);
return MatchCollection;
}();
// Private Helpers
// ---------------
exports.default = MatchCollection;
function mergeMatches(matches1, matches2) {
var next = void 0;
var length1 = matches1.length;
var length2 = matches2.length;
var lastEndIndex = -1;
var output = [];
var state = {
a1: matches1,
i1: 0,
a2: matches2,
i2: 0
};
while (state.i1 < length1 || state.i2 < length2) {
next = pickNext(state);
if (next.startIndex >= lastEndIndex) {
output.push(next);
}
lastEndIndex = next.endIndex;
}
return output;
}
function pickNext(state) {
var i1 = state.i1;
var i2 = state.i2;
var item1 = state.a1[i1];
var item2 = state.a2[i2];
if (item1 && item2 && item1.startIndex < item2.startIndex) {
state.i1 = i1 + 1;
return item1;
} else if (item1 && item2) {
state.i2 = i2 + 1;
return item2;
} else if (item1) {
state.i1 = i1 + 1;
return item1;
} else if (item2) {
state.i2 = i2 + 1;
return item2;
} else {
return undefined;
}
}