| @@ 1582-1682 (lines=101) @@ | ||
| 1579 | var whiteSpace = /^\s*|\s*$/g; |
|
| 1580 | var Collection; |
|
| 1581 | var Selector = global$a.extend({ |
|
| 1582 | init: function (selector) { |
|
| 1583 | var match = this.match; |
|
| 1584 | function compileNameFilter(name) { |
|
| 1585 | if (name) { |
|
| 1586 | name = name.toLowerCase(); |
|
| 1587 | return function (item) { |
|
| 1588 | return name === '*' || item.type === name; |
|
| 1589 | }; |
|
| 1590 | } |
|
| 1591 | } |
|
| 1592 | function compileIdFilter(id) { |
|
| 1593 | if (id) { |
|
| 1594 | return function (item) { |
|
| 1595 | return item._name === id; |
|
| 1596 | }; |
|
| 1597 | } |
|
| 1598 | } |
|
| 1599 | function compileClassesFilter(classes) { |
|
| 1600 | if (classes) { |
|
| 1601 | classes = classes.split('.'); |
|
| 1602 | return function (item) { |
|
| 1603 | var i = classes.length; |
|
| 1604 | while (i--) { |
|
| 1605 | if (!item.classes.contains(classes[i])) { |
|
| 1606 | return false; |
|
| 1607 | } |
|
| 1608 | } |
|
| 1609 | return true; |
|
| 1610 | }; |
|
| 1611 | } |
|
| 1612 | } |
|
| 1613 | function compileAttrFilter(name, cmp, check) { |
|
| 1614 | if (name) { |
|
| 1615 | return function (item) { |
|
| 1616 | var value = item[name] ? item[name]() : ''; |
|
| 1617 | return !cmp ? !!check : cmp === '=' ? value === check : cmp === '*=' ? value.indexOf(check) >= 0 : cmp === '~=' ? (' ' + value + ' ').indexOf(' ' + check + ' ') >= 0 : cmp === '!=' ? value !== check : cmp === '^=' ? value.indexOf(check) === 0 : cmp === '$=' ? value.substr(value.length - check.length) === check : false; |
|
| 1618 | }; |
|
| 1619 | } |
|
| 1620 | } |
|
| 1621 | function compilePsuedoFilter(name) { |
|
| 1622 | var notSelectors; |
|
| 1623 | if (name) { |
|
| 1624 | name = /(?:not\((.+)\))|(.+)/i.exec(name); |
|
| 1625 | if (!name[1]) { |
|
| 1626 | name = name[2]; |
|
| 1627 | return function (item, index, length) { |
|
| 1628 | return name === 'first' ? index === 0 : name === 'last' ? index === length - 1 : name === 'even' ? index % 2 === 0 : name === 'odd' ? index % 2 === 1 : item[name] ? item[name]() : false; |
|
| 1629 | }; |
|
| 1630 | } |
|
| 1631 | notSelectors = parseChunks(name[1], []); |
|
| 1632 | return function (item) { |
|
| 1633 | return !match(item, notSelectors); |
|
| 1634 | }; |
|
| 1635 | } |
|
| 1636 | } |
|
| 1637 | function compile(selector, filters, direct) { |
|
| 1638 | var parts; |
|
| 1639 | function add(filter) { |
|
| 1640 | if (filter) { |
|
| 1641 | filters.push(filter); |
|
| 1642 | } |
|
| 1643 | } |
|
| 1644 | parts = expression.exec(selector.replace(whiteSpace, '')); |
|
| 1645 | add(compileNameFilter(parts[1])); |
|
| 1646 | add(compileIdFilter(parts[2])); |
|
| 1647 | add(compileClassesFilter(parts[3])); |
|
| 1648 | add(compileAttrFilter(parts[4], parts[5], parts[6])); |
|
| 1649 | add(compilePsuedoFilter(parts[7])); |
|
| 1650 | filters.pseudo = !!parts[7]; |
|
| 1651 | filters.direct = direct; |
|
| 1652 | return filters; |
|
| 1653 | } |
|
| 1654 | function parseChunks(selector, selectors) { |
|
| 1655 | var parts = []; |
|
| 1656 | var extra, matches, i; |
|
| 1657 | do { |
|
| 1658 | chunker.exec(''); |
|
| 1659 | matches = chunker.exec(selector); |
|
| 1660 | if (matches) { |
|
| 1661 | selector = matches[3]; |
|
| 1662 | parts.push(matches[1]); |
|
| 1663 | if (matches[2]) { |
|
| 1664 | extra = matches[3]; |
|
| 1665 | break; |
|
| 1666 | } |
|
| 1667 | } |
|
| 1668 | } while (matches); |
|
| 1669 | if (extra) { |
|
| 1670 | parseChunks(extra, selectors); |
|
| 1671 | } |
|
| 1672 | selector = []; |
|
| 1673 | for (i = 0; i < parts.length; i++) { |
|
| 1674 | if (parts[i] !== '>') { |
|
| 1675 | selector.push(compile(parts[i], [], parts[i - 1] === '>')); |
|
| 1676 | } |
|
| 1677 | } |
|
| 1678 | selectors.push(selector); |
|
| 1679 | return selectors; |
|
| 1680 | } |
|
| 1681 | this._selectors = parseChunks(selector, []); |
|
| 1682 | }, |
|
| 1683 | match: function (control, selectors) { |
|
| 1684 | var i, l, si, sl, selector, fi, fl, filters, index, length, siblings, count, item; |
|
| 1685 | selectors = selectors || this._selectors; |
|
| @@ 1042-1142 (lines=101) @@ | ||
| 1039 | var whiteSpace = /^\s*|\s*$/g; |
|
| 1040 | var Collection; |
|
| 1041 | var Selector = global$8.extend({ |
|
| 1042 | init: function (selector) { |
|
| 1043 | var match = this.match; |
|
| 1044 | function compileNameFilter(name) { |
|
| 1045 | if (name) { |
|
| 1046 | name = name.toLowerCase(); |
|
| 1047 | return function (item) { |
|
| 1048 | return name === '*' || item.type === name; |
|
| 1049 | }; |
|
| 1050 | } |
|
| 1051 | } |
|
| 1052 | function compileIdFilter(id) { |
|
| 1053 | if (id) { |
|
| 1054 | return function (item) { |
|
| 1055 | return item._name === id; |
|
| 1056 | }; |
|
| 1057 | } |
|
| 1058 | } |
|
| 1059 | function compileClassesFilter(classes) { |
|
| 1060 | if (classes) { |
|
| 1061 | classes = classes.split('.'); |
|
| 1062 | return function (item) { |
|
| 1063 | var i = classes.length; |
|
| 1064 | while (i--) { |
|
| 1065 | if (!item.classes.contains(classes[i])) { |
|
| 1066 | return false; |
|
| 1067 | } |
|
| 1068 | } |
|
| 1069 | return true; |
|
| 1070 | }; |
|
| 1071 | } |
|
| 1072 | } |
|
| 1073 | function compileAttrFilter(name, cmp, check) { |
|
| 1074 | if (name) { |
|
| 1075 | return function (item) { |
|
| 1076 | var value = item[name] ? item[name]() : ''; |
|
| 1077 | return !cmp ? !!check : cmp === '=' ? value === check : cmp === '*=' ? value.indexOf(check) >= 0 : cmp === '~=' ? (' ' + value + ' ').indexOf(' ' + check + ' ') >= 0 : cmp === '!=' ? value !== check : cmp === '^=' ? value.indexOf(check) === 0 : cmp === '$=' ? value.substr(value.length - check.length) === check : false; |
|
| 1078 | }; |
|
| 1079 | } |
|
| 1080 | } |
|
| 1081 | function compilePsuedoFilter(name) { |
|
| 1082 | var notSelectors; |
|
| 1083 | if (name) { |
|
| 1084 | name = /(?:not\((.+)\))|(.+)/i.exec(name); |
|
| 1085 | if (!name[1]) { |
|
| 1086 | name = name[2]; |
|
| 1087 | return function (item, index, length) { |
|
| 1088 | return name === 'first' ? index === 0 : name === 'last' ? index === length - 1 : name === 'even' ? index % 2 === 0 : name === 'odd' ? index % 2 === 1 : item[name] ? item[name]() : false; |
|
| 1089 | }; |
|
| 1090 | } |
|
| 1091 | notSelectors = parseChunks(name[1], []); |
|
| 1092 | return function (item) { |
|
| 1093 | return !match(item, notSelectors); |
|
| 1094 | }; |
|
| 1095 | } |
|
| 1096 | } |
|
| 1097 | function compile(selector, filters, direct) { |
|
| 1098 | var parts; |
|
| 1099 | function add(filter) { |
|
| 1100 | if (filter) { |
|
| 1101 | filters.push(filter); |
|
| 1102 | } |
|
| 1103 | } |
|
| 1104 | parts = expression.exec(selector.replace(whiteSpace, '')); |
|
| 1105 | add(compileNameFilter(parts[1])); |
|
| 1106 | add(compileIdFilter(parts[2])); |
|
| 1107 | add(compileClassesFilter(parts[3])); |
|
| 1108 | add(compileAttrFilter(parts[4], parts[5], parts[6])); |
|
| 1109 | add(compilePsuedoFilter(parts[7])); |
|
| 1110 | filters.pseudo = !!parts[7]; |
|
| 1111 | filters.direct = direct; |
|
| 1112 | return filters; |
|
| 1113 | } |
|
| 1114 | function parseChunks(selector, selectors) { |
|
| 1115 | var parts = []; |
|
| 1116 | var extra, matches, i; |
|
| 1117 | do { |
|
| 1118 | chunker.exec(''); |
|
| 1119 | matches = chunker.exec(selector); |
|
| 1120 | if (matches) { |
|
| 1121 | selector = matches[3]; |
|
| 1122 | parts.push(matches[1]); |
|
| 1123 | if (matches[2]) { |
|
| 1124 | extra = matches[3]; |
|
| 1125 | break; |
|
| 1126 | } |
|
| 1127 | } |
|
| 1128 | } while (matches); |
|
| 1129 | if (extra) { |
|
| 1130 | parseChunks(extra, selectors); |
|
| 1131 | } |
|
| 1132 | selector = []; |
|
| 1133 | for (i = 0; i < parts.length; i++) { |
|
| 1134 | if (parts[i] !== '>') { |
|
| 1135 | selector.push(compile(parts[i], [], parts[i - 1] === '>')); |
|
| 1136 | } |
|
| 1137 | } |
|
| 1138 | selectors.push(selector); |
|
| 1139 | return selectors; |
|
| 1140 | } |
|
| 1141 | this._selectors = parseChunks(selector, []); |
|
| 1142 | }, |
|
| 1143 | match: function (control, selectors) { |
|
| 1144 | var i, l, si, sl, selector, fi, fl, filters, index, length, siblings, count, item; |
|
| 1145 | selectors = selectors || this._selectors; |
|