{"version":3,"file":"balanced.js","sources":["webpack:///webpack/bootstrap 95e04d20eceb5aa7fdd0","webpack:///./index.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,wC;;;;;;CCtCA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAa,cAAc;AAC3B,cAAa;AACb;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,MAAM;AACnB,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,yBAAyB;AAC5C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA,KAAI;AACJ;AACA,KAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA,QAAO,8C;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;AACH;AACA;AACA,GAAE;;AAEF;AACA;AACA;AACA,cAAa,OAAO;AACpB,cAAa,SAAS;AACtB,cAAa,MAAM;AACnB,cAAa;AACb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,iBAAgB,QAAQ;AACxB;AACA;AACA;AACA;;AAEA;AACA,aAAY,gBAAgB;AAC5B;AACA;AACA;;AAEA;AACA,aAAY,QAAQ;AACpB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAiB,6DAA6D;;AAE9E;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAY,MAAM;AAClB,aAAY,OAAO;AACnB,aAAY,SAAS;AACrB,aAAY;AACZ;AACA;AACA;;AAEA,iBAAgB,oBAAoB;AACpC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAY,OAAO;AACnB,aAAY;AACZ;AACA;AACA,qCAAoC,EAAE;AACtC;;AAEA;AACA;AACA;AACA,aAAY,MAAM;AAClB,aAAY,OAAO;AACnB,aAAY,QAAQ;AACpB,aAAY;AACZ;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;AACA,GAAE;AACF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAY,MAAM;AAClB,aAAY,MAAM;AAClB,aAAY;AACZ;AACA;AACA;AACA;;AAEA,kBAAiB,oBAAoB;AACrC;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAE;AACF;;AAEA;AACA,yD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAE;;AAEF;;AAEA;AACA,G","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 95e04d20eceb5aa7fdd0\n **/","// Note: this currently doesn't support nested replacements because its meant to be \n// greedy and grab the first head all the way to the last\n// \n// Node: for nested matches you can just do recursion because of the greedyness\n\nfunction Balanced (config) {\n\tconfig = config || {};\n\t\n\tif (!config.open) throw new Error('Balanced: please provide a \"open\" property');\n\tif (!config.close) throw new Error('Balanced: please provide a \"close\" property');\n\n\tthis.balance = config.balance || false;\n\tthis.exceptions = config.exceptions || false;\n\tthis.caseInsensitive = config.caseInsensitive;\n\n\tthis.head = config.head || config.open;\n\tthis.head = Array.isArray(this.head) ? this.head : [this.head];\n\tthis.open = Array.isArray(config.open) ? config.open : [config.open];\n\tthis.close = Array.isArray(config.close) ? config.close : [config.close];\n\n\tif (\n\t\t!Array.isArray(this.head) || \n\t\t!Array.isArray(this.open) || \n\t\t!Array.isArray(this.close) ||\n\t\t!(this.head.length === this.open.length && this.open.length === this.close.length)\n\t) {\n\t\tthrow new Error('Balanced: if you use arrays for a \"head,open,close\" you must use matching arrays for all options');\n\t}\n\n\tvar headRegExp = regExpFromArray(this.head.map(this.regExpFromArrayGroupedMap, this)),\n\t\topenRegExp = regExpFromArray(this.open.map(this.regExpFromArrayGroupedMap, this)),\n\t\tcloseRegExp = regExpFromArray(this.close.map(this.regExpFromArrayGroupedMap, this));\n\t\n\tthis.regExp = regExpFromArray([headRegExp, openRegExp, closeRegExp], 'g' + (this.caseInsensitive ? 'i' : ''));\n\tthis.regExpGroupLength = this.head.length;\n}\n\nBalanced.prototype = {\n\t/**\n\t * helper creating method for running regExpFromArray with one arg and grouped set to true\n\t * \n\t * @param {RegExp/String} value\n\t * @return {RegExp}\n\t */\n\tregExpFromArrayGroupedMap: function (value) {\n\t\treturn regExpFromArray([value], null, true);\n\t},\n\n\t/**\n\t * Matches contents\n\t * \n\t * @param {String} string\n\t * @param {Array} ignoreRanges\n\t * @return {Array}\n\t */\n\tmatchContentsInBetweenBrackets: function (string, ignoreRanges) {\n\t\tvar regex = new RegExp(this.regExp),\n\t\t\tstack = [],\n\t\t\tmatches = [],\n\t\t\tmatchedOpening = null,\n\t\t\tmatch,\n\t\t\tbalanced = true;\n\n\t\twhile ((match = regex.exec(string))) {\n\t\t\tif (ignoreRanges) {\n\t\t\t\tvar ignore = false;\n\t\t\t\t\n\t\t\t\tfor (var i = 0; i < ignoreRanges.length; i++) {\n\t\t\t\t\tif (isIndexInRage(match.index, ignoreRanges[i])) {\n\t\t\t\t\t\tignore = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (ignore) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar matchResultPosition = match.indexOf(match[0], 1) - 1,\n\t\t\t\tsectionIndex = Math.floor(matchResultPosition / this.regExpGroupLength),\n\t\t\t\tvalueIndex = matchResultPosition - (Math.floor(matchResultPosition / this.regExpGroupLength) * this.regExpGroupLength);\n\n\t\t\tif (!matchedOpening && sectionIndex === 0 && (!this.balance || this.balance && !stack.length)) {\n\t\t\t\tmatchedOpening = match;\n\n\t\t\t\tif (this.balance) {\n\t\t\t\t\tstack.push(valueIndex);\n\t\t\t\t} else {\n\t\t\t\t\tstack = [valueIndex];\n\t\t\t\t}\n\t\t\t} else if (sectionIndex === 1 || sectionIndex === 0) {\n\t\t\t\tstack.push(valueIndex);\n\t\t\t} else if (sectionIndex === 2) {\n\t\t\t\tvar expectedValueIndex = stack.pop();\n\n\t\t\t\tif (expectedValueIndex === valueIndex) {\n\t\t\t\t\tif (matchedOpening !== null && stack.length === 0) {\n\t\t\t\t\t\tmatches.push({\n\t\t\t\t\t\t\tindex: matchedOpening.index, \n\t\t\t\t\t\t\tlength: match.index + match[0].length - matchedOpening.index,\n\t\t\t\t\t\t\thead: matchedOpening[0],\n\t\t\t\t\t\t\ttail: match[0]\n\t\t\t\t\t\t});\n\t\t\t\t\t\tmatchedOpening = null;\n\t\t\t\t\t}\n\t\t\t\t} else if (this.balance) {\n\t\t\t\t\tbalanced = false;\n\n\t\t\t\t\tif (this.exceptions) {\n\t\t\t\t\t\tif (expectedValueIndex === undefined) {\n\t\t\t\t\t\t\tthrow errorForStringIndex('Balanced: unexpected close bracket', string, match.index);\n\t\t\t\t\t\t} else if (expectedValueIndex !== valueIndex) {\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tthrow errorForStringIndex('Balanced: mismatching close bracket, expected \"' + this.close[expectedValueIndex] + '\" but found \"' + this.close[valueIndex] + '\"', string, match.index);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.balance) {\n\t\t\tif (this.exceptions && !(balanced && stack.length === 0)) {\n\t\t\t\tthrow errorForStringIndex('Balanced: expected close bracket', string, string.length -1);\n\t\t\t}\n\t\t\treturn balanced && stack.length === 0 ? matches : null;\n\t\t} else {\n\t\t\treturn matches;\n\t\t}\n\t},\n\n\t/**\n\t * Runs replace function against matches, and source.\n\t * \n\t * @param {String} string\n\t * @param {Function} replace\n\t * @param {Array} ignoreRanges\n\t * @return {String}\n\t */\n\treplaceMatchesInBetweenBrackets: function (string, replace, ignoreRanges) {\n\t\tvar matches = this.matchContentsInBetweenBrackets(string, ignoreRanges);\n\t\treturn replaceMatchesInString(matches, string, replace);\n\t}\n};\n\n/**\n * creates an error object for the specified index\n * \n * @param {String} error\n * @param {String} string\n * @param {Number} index\n * @return {Error}\n */\nfunction errorForStringIndex (error, string, index) {\n\tvar lines = getRangesForMatch(string.substr(0, index + 1), /^.*\\n?$/gim),\n\t\tallLines = getRangesForMatch(string, /^.*\\n?$/gim),\n\t\tline = lines.length - 1,\n\t\tlastLineIndex = lines.length ? lines[lines.length - 1].index : 0,\n\t\tcolumn = index + 1 - lastLineIndex,\n\t\tmessage = '';\n\n\t// show current and previous lines\n\tfor (var i = 2; i >= 0; i--) {\n\t\tif (line - i >= 0 && allLines[line-i]) {\n\t\t\tmessage += string.substr(allLines[line-i].index, allLines[line-i].length) + '\\n';\n\t\t}\n\t}\n\n\t// add carrot\n\tfor (i = 0; i < column - 1; i++) {\n\t\tmessage += '-';\n\t}\n\tmessage += '^\\n';\n\n\t// show next lines\n\tfor (i = 1; i <= 2; i++) {\n\t\tif (line + i >= 0 && allLines[line+i]) {\n\t\t\tmessage += string.substr(allLines[line+i].index, allLines[line+i].length) + '\\n';\n\t\t}\n\t}\n\n\t// replace tabs with spaces\n\tmessage = message.replace(/\\t/g, ' ').replace(/\\n$/, '');\n\n\tvar errorObject = new Error(error + ' at ' + (line + 1) + ':' + column + '\\n\\n' + message);\n\terrorObject.line = line + 1;\n\terrorObject.column = column;\n\terrorObject.index = index;\n\t\n\treturn errorObject;\n}\n\n/**\n * checks if index is inside of range\n * \n * @param {Number} index\n * @param {Object} range\n * @return {Boolean}\n */\nfunction isIndexInRage (index, range) {\n\treturn index >= range.index && index <= range.index + range.length - 1;\n}\n\n/**\n * generates an array of match range objects\n * \n * @param {String} string\n * @param {RegExp} regexp\n * @return {Array}\n */\nfunction getRangesForMatch (string, regexp) {\n\tvar pattern = new RegExp(regexp),\n\t\tmatch,\n\t\tmatches = [];\n\n\tif (string) {\n\t\twhile ((match = pattern.exec(string))) {\n\t\t\tmatches.push({index: match.index, length: match[0].length, match: match[0]});\n\t\t\t\n\t\t\tif (!match[0].length) {\n\t\t\t\tpattern.lastIndex++;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn matches;\n}\n\n/**\n * Non-destructive match replacements.\n * \n * @param {Array} matches\n * @param {String} string\n * @param {Function} replace\n * @return {String}\n */\nfunction replaceMatchesInString (matches, string, replace) {\n\tvar offset = 0;\n\t\n\tfor (var i = 0; i < matches.length; i++) {\n\t\tvar match = matches[i],\n\t\t\treplacement = replace(string.substr(match.index + offset + match.head.length, match.length - match.head.length - match.tail.length), match.head, match.tail);\n\t\tstring = string.substr(0, match.index + offset) + replacement + string.substr(match.index + offset + match.length, (string.length) - (match.index + offset + match.length));\n\t\t\n\t\toffset += replacement.length - match.length;\n\t}\n\t\n\treturn string;\n}\n\n/**\n * Escapes a string to be used within a RegExp\n * \n * @param {String} string\n * @return {String}\n */\nfunction escapeRegExp (string) {\n return string.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n}\n\n/**\n * creates an RegExp from an array of string or RegExp\n * \n * @param {Array} array\n * @param {String} flags\n * @param {Boolean} grouped\n * @return {RegExp}\n */\nfunction regExpFromArray (array, flags, grouped) {\n\tvar string = array.map(function (value) {\n\t\treturn value instanceof RegExp ? value.source : escapeRegExp(value);\n\t}, this).join('|');\n\n\tif (grouped) {\n\t\tstring = '(' + string + ')';\n\t} else {\n\t\tstring = '(?:' + string + ')';\n\t}\n\n\treturn new RegExp(string, flags || undefined);\n}\n\n/**\n * returns an array of ranges that are not in the without ranges\n * \n * @param {Array} ranges\n * @param {Array} without\n * @return {Array}\n */\nfunction rangesWithout (ranges, without) {\n\treturn ranges.filter(function (range) {\n\t\tvar ignored = false;\n\n\t\tfor (var i = 0; i < without.length; i++) {\n\t\t\tif (isIndexInRage(range.index, without[i])) {\n\t\t\t\tignored = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn !ignored;\n\t});\n}\n\n// export generic methods\nexports.replaceMatchesInString = replaceMatchesInString; \nexports.getRangesForMatch = getRangesForMatch;\nexports.isIndexInRage = isIndexInRage;\nexports.rangesWithout = rangesWithout;\n// exports.escapeRegExp = escapeRegExp;\n// exports.regExpFromArray = regExpFromArray;\n\n// allows you to create a reusable Balance object and use its `replaceMatchesInBetweenBrackets` and `matchContentsInBetweenBrackets` directly\nexports.Balanced = Balanced;\n\nexports.replacements = function (config) {\n\tconfig = config || {};\n\n\tvar balanced = new Balanced({\n\t\thead: config.head,\n\t\topen: config.open,\n\t\tclose: config.close,\n\t\tbalance: config.balance,\n\t\texceptions: config.exceptions,\n\t\tcaseInsensitive: config.caseInsensitive\n\t});\n\n\tif (!config.source) throw new Error('Balanced: please provide a \"source\" property');\n\tif (typeof config.replace !== 'function') throw new Error('Balanced: please provide a \"replace\" function');\n\n\treturn balanced.replaceMatchesInBetweenBrackets(config.source, config.replace);\n};\nexports.matches = function (config) {\n\tvar balanced = new Balanced({\n\t\thead: config.head,\n\t\topen: config.open,\n\t\tclose: config.close,\n\t\tbalance: config.balance,\n\t\texceptions: config.exceptions,\n\t\tcaseInsensitive: config.caseInsensitive\n\t});\n\n\tif (!config.source) throw new Error('Balanced: please provide a \"source\" property');\n\n\treturn balanced.matchContentsInBetweenBrackets(config.source, config.ignore);\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./index.js\n ** module id = 0\n ** module chunks = 0\n **/"],"sourceRoot":""}