github.com/yrj2011/jx-test-infra@v0.0.0-20190529031832-7a2065ee98eb/triage/node_modules/balanced-match/index.js (about)

     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  }