bitbox-compiler
Version:
bitbox /unbox
46 lines (41 loc) • 4.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = pair;
/** Pair matched brakets
( left: string, right: string, input: string )
*/
function pair(a, b, str) {
var bal = 0;
var m = {};
var ended = false;
for (var i = 0; i < str.length; i++) {
if (a == str.substr(i, a.length)) {
if (!('start' in m)) m.start = i;
bal++;
} else if (b == str.substr(i, b.length) && 'start' in m) {
ended = true;
bal--;
if (!bal) {
m.end = i;
m.pre = str.substr(0, m.start);
m.body = m.end - m.start > 1 ? str.substring(m.start + a.length, m.end) : '';
m.post = str.slice(m.end + b.length);
return m;
}
}
}
// if we opened more than we closed, find the one we closed
if (bal && ended) {
var start = m.start + a.length;
m = pair(a, b, str.substr(start));
if (m) {
m.start += start;
m.end += start;
m.pre = str.slice(0, start) + m.pre;
}
return m;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYWlyL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUl3QixJQUFJOzs7OztBQUFiLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFOztBQUV2QyxLQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDWixLQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDWCxLQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7O0FBRWxCLE1BQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BDLE1BQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNqQyxPQUFJLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQSxBQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDakMsTUFBRyxFQUFFLENBQUM7R0FDTixNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFO0FBQ3hELFFBQUssR0FBRyxJQUFJLENBQUM7QUFDYixNQUFHLEVBQUUsQ0FBQztBQUNOLE9BQUksQ0FBQyxHQUFHLEVBQUU7QUFDVCxLQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUNWLEtBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9CLEtBQUMsQ0FBQyxJQUFJLEdBQUcsQUFBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxHQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDL0UsS0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3JDLFdBQU8sQ0FBQyxDQUFDO0lBQ1Q7R0FDRDtFQUNEOzs7QUFBQSxBQUdELEtBQUksR0FBRyxJQUFJLEtBQUssRUFBRTtBQUNqQixNQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDL0IsR0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNsQyxNQUFJLENBQUMsRUFBRTtBQUNOLElBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO0FBQ2pCLElBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO0FBQ2YsSUFBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0dBQ3BDO0FBQ0QsU0FBTyxDQUFDLENBQUM7RUFDVDtDQUNEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFBhaXIgbWF0Y2hlZCBicmFrZXRzXG5cdCggbGVmdDogc3RyaW5nLCByaWdodDogc3RyaW5nLCBpbnB1dDogc3RyaW5nIClcblx0Ki9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFpcihhLCBiLCBzdHIpIHtcblxuXHR2YXIgYmFsID0gMDtcblx0dmFyIG0gPSB7fTtcblx0dmFyIGVuZGVkID0gZmFsc2U7XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcblx0XHRpZiAoYSA9PSBzdHIuc3Vic3RyKGksIGEubGVuZ3RoKSkge1xuXHRcdFx0aWYgKCEoJ3N0YXJ0JyBpbiBtKSkgbS5zdGFydCA9IGk7XG5cdFx0XHRiYWwrKztcblx0XHR9IGVsc2UgaWYgKGIgPT0gc3RyLnN1YnN0cihpLCBiLmxlbmd0aCkgJiYgJ3N0YXJ0JyBpbiBtKSB7XG5cdFx0XHRlbmRlZCA9IHRydWU7XG5cdFx0XHRiYWwtLTtcblx0XHRcdGlmICghYmFsKSB7XG5cdFx0XHRcdG0uZW5kID0gaTtcblx0XHRcdFx0bS5wcmUgPSBzdHIuc3Vic3RyKDAsIG0uc3RhcnQpO1xuXHRcdFx0XHRtLmJvZHkgPSAobS5lbmQgLSBtLnN0YXJ0ID4gMSkgPyBzdHIuc3Vic3RyaW5nKG0uc3RhcnQgKyBhLmxlbmd0aCwgbS5lbmQpIDogJyc7XG5cdFx0XHRcdG0ucG9zdCA9IHN0ci5zbGljZShtLmVuZCArIGIubGVuZ3RoKTtcblx0XHRcdFx0cmV0dXJuIG07XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gaWYgd2Ugb3BlbmVkIG1vcmUgdGhhbiB3ZSBjbG9zZWQsIGZpbmQgdGhlIG9uZSB3ZSBjbG9zZWRcblx0aWYgKGJhbCAmJiBlbmRlZCkge1xuXHRcdHZhciBzdGFydCA9IG0uc3RhcnQgKyBhLmxlbmd0aDtcblx0XHRtID0gcGFpcihhLCBiLCBzdHIuc3Vic3RyKHN0YXJ0KSk7XG5cdFx0aWYgKG0pIHtcblx0XHRcdG0uc3RhcnQgKz0gc3RhcnQ7XG5cdFx0XHRtLmVuZCArPSBzdGFydDtcblx0XHRcdG0ucHJlID0gc3RyLnNsaWNlKDAsIHN0YXJ0KSArIG0ucHJlO1xuXHRcdH1cblx0XHRyZXR1cm4gbTtcblx0fVxufVxuIl19