(exp)
| 5345 | var validDivisionCharRE = /[\w).+\-_$\]]/; |
| 5346 | |
| 5347 | function parseFilters (exp) { |
| 5348 | var inSingle = false; |
| 5349 | var inDouble = false; |
| 5350 | var inTemplateString = false; |
| 5351 | var inRegex = false; |
| 5352 | var curly = 0; |
| 5353 | var square = 0; |
| 5354 | var paren = 0; |
| 5355 | var lastFilterIndex = 0; |
| 5356 | var c, prev, i, expression, filters; |
| 5357 | |
| 5358 | for (i = 0; i < exp.length; i++) { |
| 5359 | prev = c; |
| 5360 | c = exp.charCodeAt(i); |
| 5361 | if (inSingle) { |
| 5362 | if (c === 0x27 && prev !== 0x5C) { inSingle = false; } |
| 5363 | } else if (inDouble) { |
| 5364 | if (c === 0x22 && prev !== 0x5C) { inDouble = false; } |
| 5365 | } else if (inTemplateString) { |
| 5366 | if (c === 0x60 && prev !== 0x5C) { inTemplateString = false; } |
| 5367 | } else if (inRegex) { |
| 5368 | if (c === 0x2f && prev !== 0x5C) { inRegex = false; } |
| 5369 | } else if ( |
| 5370 | c === 0x7C && // pipe |
| 5371 | exp.charCodeAt(i + 1) !== 0x7C && |
| 5372 | exp.charCodeAt(i - 1) !== 0x7C && |
| 5373 | !curly && !square && !paren |
| 5374 | ) { |
| 5375 | if (expression === undefined) { |
| 5376 | // first filter, end of expression |
| 5377 | lastFilterIndex = i + 1; |
| 5378 | expression = exp.slice(0, i).trim(); |
| 5379 | } else { |
| 5380 | pushFilter(); |
| 5381 | } |
| 5382 | } else { |
| 5383 | switch (c) { |
| 5384 | case 0x22: inDouble = true; break // " |
| 5385 | case 0x27: inSingle = true; break // ' |
| 5386 | case 0x60: inTemplateString = true; break // ` |
| 5387 | case 0x28: paren++; break // ( |
| 5388 | case 0x29: paren--; break // ) |
| 5389 | case 0x5B: square++; break // [ |
| 5390 | case 0x5D: square--; break // ] |
| 5391 | case 0x7B: curly++; break // { |
| 5392 | case 0x7D: curly--; break // } |
| 5393 | } |
| 5394 | if (c === 0x2f) { // / |
| 5395 | var j = i - 1; |
| 5396 | var p = (void 0); |
| 5397 | // find first non-whitespace prev char |
| 5398 | for (; j >= 0; j--) { |
| 5399 | p = exp.charAt(j); |
| 5400 | if (p !== ' ') { break } |
| 5401 | } |
| 5402 | if (!p || !validDivisionCharRE.test(p)) { |
| 5403 | inRegex = true; |
| 5404 | } |
no test coverage detected