{"ScriptPreparationCode":"window.simple =([result, input]) =\u003E {\r\n let regExp = new RegExp(\u0060(${input})\u0060, \u0027i\u0027);\r\n\r\n const highlightedResult = result\r\n .split(regExp)\r\n .map(segment =\u003E regExp.test(segment) ? \u0060\u003Cmark\u003E${segment}\u003C/mark\u003E\u0060 : segment)\r\n .join(\u0027\u0027)\r\n\r\n return highlightedResult;\r\n}\r\n\r\nconst separatorCommon = /[\\.,\\s!;?:\u0022\\u3000]\u002B/;\r\n\r\nfunction separateTerms(query) {\r\n let results = [],\r\n words = query\r\n .toString()\r\n .toLowerCase()\r\n .split(separatorCommon);\r\n words.forEach(function(word) {\r\n if (word \u0026\u0026 results.indexOf(word) === -1) {\r\n results.push(word);\r\n }\r\n });\r\n results.sort(function(a, b) {\r\n return b.length - a.length;\r\n });\r\n\r\n return results;\r\n}\r\n\r\nwindow.markSearchTerms = ([value, query]) =\u003E {\r\n let results = value;\r\n\r\n if (value \u0026\u0026 query) {\r\n let matchValue = value.toString().toLowerCase(),\r\n queryTerms = separateTerms(query),\r\n marks = [];\r\n\r\n queryTerms.forEach(function(term) {\r\n let index,\r\n start = 0;\r\n\r\n while ((index = matchValue.indexOf(term, start)) !== -1) {\r\n let mark = { a: index, z: index \u002B term.length },\r\n merged = false;\r\n\r\n for (let i = 0; i \u003C marks.length; i\u002B\u002B) {\r\n let current = marks[i];\r\n\r\n if (\r\n (current.a \u003C= mark.a \u0026\u0026 mark.a \u003C= current.z) ||\r\n (current.a \u003C= mark.z \u0026\u0026 mark.z \u003C= current.z)\r\n ) {\r\n current.a = Math.min(current.a, mark.a);\r\n current.z = Math.max(current.z, mark.z);\r\n merged = true;\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (!merged) {\r\n marks.push(mark);\r\n }\r\n\r\n start = index \u002B term.length;\r\n }\r\n });\r\n\r\n if (marks.length) {\r\n marks.sort(function(a, b) {\r\n return a.a - b.a;\r\n });\r\n\r\n results = [];\r\n let index = 0;\r\n marks.forEach(function(mark, i) {\r\n results.push(value.slice(index, mark.a));\r\n results.push(\u0060\u003Cmark\u003E${value.slice(mark.a, mark.z)}\u003C/mark\u003E\u0060);\r\n index = mark.z;\r\n });\r\n results.push(value.slice(index));\r\n }\r\n }\r\n\r\n return results.join(\u0027\u0027);\r\n}","TestCases":[{"Name":"Simple","Code":"[\r\n [\u0027test\u0027, \u0027est\u0027, \u0027t\u003Cmark\u003Eest\u003C/mark\u003E\u0027],\r\n [\u0027test 1\u0027, \u0027t 1\u0027, \u0027tes\u003Cmark\u003Et 1\u003C/mark\u003E\u0027], \r\n [\u0027test test\u0027, \u0027t t\u0027, \u0027tes\u003Cmark\u003Et t\u003C/mark\u003Eest\u0027],\r\n [\u0027test\u0027, \u0027test\u0027, \u0027\u003Cmark\u003Etest\u003C/mark\u003E\u0027],\r\n [\u0027TEST\u0027, \u0027te\u0027, \u0027\u003Cmark\u003ETE\u003C/mark\u003EST\u0027],\r\n [\u0027test\u0027, \u0027TE\u0027, \u0027\u003Cmark\u003Ete\u003C/mark\u003Est\u0027],\r\n [\u0027tt\u0027, \u0027t\u0027, \u0027\u003Cmark\u003Et\u003C/mark\u003E\u003Cmark\u003Et\u003C/mark\u003E\u0027],\r\n [\u0027tete\u0027, \u0027te\u0027, \u0027\u003Cmark\u003Ete\u003C/mark\u003E\u003Cmark\u003Ete\u003C/mark\u003E\u0027],\r\n [\u0027test test hi test\u0027, \u0027test test\u0027, \u0027\u003Cmark\u003Etest test\u003C/mark\u003E hi test\u0027],\r\n].forEach(simple)","IsDeferred":false},{"Name":"Complex","Code":"[\r\n [\u0027test\u0027, \u0027est\u0027, \u0027t\u003Cmark\u003Eest\u003C/mark\u003E\u0027],\r\n [\u0027test 1\u0027, \u0027t 1\u0027, \u0027tes\u003Cmark\u003Et 1\u003C/mark\u003E\u0027], \r\n [\u0027test test\u0027, \u0027t t\u0027, \u0027tes\u003Cmark\u003Et t\u003C/mark\u003Eest\u0027],\r\n [\u0027test\u0027, \u0027test\u0027, \u0027\u003Cmark\u003Etest\u003C/mark\u003E\u0027],\r\n [\u0027TEST\u0027, \u0027te\u0027, \u0027\u003Cmark\u003ETE\u003C/mark\u003EST\u0027],\r\n [\u0027test\u0027, \u0027TE\u0027, \u0027\u003Cmark\u003Ete\u003C/mark\u003Est\u0027],\r\n [\u0027tt\u0027, \u0027t\u0027, \u0027\u003Cmark\u003Et\u003C/mark\u003E\u003Cmark\u003Et\u003C/mark\u003E\u0027],\r\n [\u0027tete\u0027, \u0027te\u0027, \u0027\u003Cmark\u003Ete\u003C/mark\u003E\u003Cmark\u003Ete\u003C/mark\u003E\u0027],\r\n [\u0027test test hi test\u0027, \u0027test test\u0027, \u0027\u003Cmark\u003Etest test\u003C/mark\u003E hi test\u0027],\r\n].forEach(markSearchTerms)","IsDeferred":false}]}