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