* Parse a directive value and extract the expression * and its filters into a descriptor. * * Example: * * "a + 1 | uppercase" will yield: * { * expression: 'a + 1', * filters: [ * { name: 'uppercase', args: null } * ] * } * * @param {String} s * @
(s)
| 685 | */ |
| 686 | |
| 687 | function parseDirective(s) { |
| 688 | var hit = cache$1.get(s); |
| 689 | if (hit) { |
| 690 | return hit; |
| 691 | } |
| 692 | |
| 693 | // reset parser state |
| 694 | str = s; |
| 695 | inSingle = inDouble = false; |
| 696 | curly = square = paren = 0; |
| 697 | lastFilterIndex = 0; |
| 698 | dir = {}; |
| 699 | |
| 700 | for (i = 0, l = str.length; i < l; i++) { |
| 701 | prev = c; |
| 702 | c = str.charCodeAt(i); |
| 703 | if (inSingle) { |
| 704 | // check single quote |
| 705 | if (c === 0x27 && prev !== 0x5C) inSingle = !inSingle; |
| 706 | } else if (inDouble) { |
| 707 | // check double quote |
| 708 | if (c === 0x22 && prev !== 0x5C) inDouble = !inDouble; |
| 709 | } else if (c === 0x7C && // pipe |
| 710 | str.charCodeAt(i + 1) !== 0x7C && str.charCodeAt(i - 1) !== 0x7C) { |
| 711 | if (dir.expression == null) { |
| 712 | // first filter, end of expression |
| 713 | lastFilterIndex = i + 1; |
| 714 | dir.expression = str.slice(0, i).trim(); |
| 715 | } else { |
| 716 | // already has filter |
| 717 | pushFilter(); |
| 718 | } |
| 719 | } else { |
| 720 | switch (c) { |
| 721 | case 0x22: |
| 722 | inDouble = true;break; // " |
| 723 | case 0x27: |
| 724 | inSingle = true;break; // ' |
| 725 | case 0x28: |
| 726 | paren++;break; // ( |
| 727 | case 0x29: |
| 728 | paren--;break; // ) |
| 729 | case 0x5B: |
| 730 | square++;break; // [ |
| 731 | case 0x5D: |
| 732 | square--;break; // ] |
| 733 | case 0x7B: |
| 734 | curly++;break; // { |
| 735 | case 0x7D: |
| 736 | curly--;break; // } |
| 737 | } |
| 738 | } |
| 739 | } |
| 740 | |
| 741 | if (dir.expression == null) { |
| 742 | dir.expression = str.slice(0, i).trim(); |
| 743 | } else if (lastFilterIndex !== 0) { |
| 744 | pushFilter(); |
no test coverage detected