Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50640 views
1
'use strict';
2
module.exports = balanced;
3
function balanced(a, b, str) {
4
if (a instanceof RegExp) a = maybeMatch(a, str);
5
if (b instanceof RegExp) b = maybeMatch(b, str);
6
7
var r = range(a, b, str);
8
9
return r && {
10
start: r[0],
11
end: r[1],
12
pre: str.slice(0, r[0]),
13
body: str.slice(r[0] + a.length, r[1]),
14
post: str.slice(r[1] + b.length)
15
};
16
}
17
18
function maybeMatch(reg, str) {
19
var m = str.match(reg);
20
return m ? m[0] : null;
21
}
22
23
balanced.range = range;
24
function range(a, b, str) {
25
var begs, beg, left, right, result;
26
var ai = str.indexOf(a);
27
var bi = str.indexOf(b, ai + 1);
28
var i = ai;
29
30
if (ai >= 0 && bi > 0) {
31
begs = [];
32
left = str.length;
33
34
while (i >= 0 && !result) {
35
if (i == ai) {
36
begs.push(i);
37
ai = str.indexOf(a, i + 1);
38
} else if (begs.length == 1) {
39
result = [ begs.pop(), bi ];
40
} else {
41
beg = begs.pop();
42
if (beg < left) {
43
left = beg;
44
right = bi;
45
}
46
47
bi = str.indexOf(b, i + 1);
48
}
49
50
i = ai < bi && ai >= 0 ? ai : bi;
51
}
52
53
if (begs.length) {
54
result = [ left, right ];
55
}
56
}
57
58
return result;
59
}
60
61