opusdev/vector-similarity-api
1
1'use strict';2module.exports = balanced;3function 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 18function maybeMatch(reg, str) {19 var m = str.match(reg);20 return m ? m[0] : null;21}22 23balanced.range = range;24function 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 if(a===b) {32 return [ai, bi];33 }34 begs = [];35 left = str.length;36 37 while (i >= 0 && !result) {38 if (i == ai) {39 begs.push(i);40 ai = str.indexOf(a, i + 1);41 } else if (begs.length == 1) {42 result = [ begs.pop(), bi ];43 } else {44 beg = begs.pop();45 if (beg < left) {46 left = beg;47 right = bi;48 }49 50 bi = str.indexOf(b, i + 1);51 }52 53 i = ai < bi && ai >= 0 ? ai : bi;54 }55 56 if (begs.length) {57 result = [ left, right ];58 }59 }60 61 return result;62}63 