| OLD | NEW |
| 1 /// Query selector implementation for our DOM. | 1 /// Query selector implementation for our DOM. |
| 2 library html.src.query; | 2 library html.src.query; |
| 3 | 3 |
| 4 import 'package:csslib/parser.dart' as css; | 4 import 'package:csslib/parser.dart' as css; |
| 5 import 'package:csslib/parser.dart' show TokenKind; | 5 import 'package:csslib/parser.dart' show TokenKind; |
| 6 import 'package:csslib/src/messages.dart' show Message; |
| 6 import 'package:csslib/visitor.dart'; // the CSSOM | 7 import 'package:csslib/visitor.dart'; // the CSSOM |
| 7 import 'package:html/dom.dart'; | 8 import 'package:html/dom.dart'; |
| 8 import 'package:html/src/constants.dart' show isWhitespaceCC; | 9 import 'package:html/src/constants.dart' show isWhitespaceCC; |
| 9 | 10 |
| 10 bool matches(Node node, String selector) => | 11 bool matches(Node node, String selector) => |
| 11 new SelectorEvaluator().matches(node, _parseSelectorList(selector)); | 12 new SelectorEvaluator().matches(node, _parseSelectorList(selector)); |
| 12 | 13 |
| 13 Element querySelector(Node node, String selector) => | 14 Element querySelector(Node node, String selector) => |
| 14 new SelectorEvaluator().querySelector(node, _parseSelectorList(selector)); | 15 new SelectorEvaluator().querySelector(node, _parseSelectorList(selector)); |
| 15 | 16 |
| 16 List<Element> querySelectorAll(Node node, String selector) { | 17 List<Element> querySelectorAll(Node node, String selector) { |
| 17 var results = []; | 18 var results = <Element>[]; |
| 18 new SelectorEvaluator().querySelectorAll( | 19 new SelectorEvaluator().querySelectorAll( |
| 19 node, _parseSelectorList(selector), results); | 20 node, _parseSelectorList(selector), results); |
| 20 return results; | 21 return results; |
| 21 } | 22 } |
| 22 | 23 |
| 23 // http://dev.w3.org/csswg/selectors-4/#grouping | 24 // http://dev.w3.org/csswg/selectors-4/#grouping |
| 24 SelectorGroup _parseSelectorList(String selector) { | 25 SelectorGroup _parseSelectorList(String selector) { |
| 25 var errors = []; | 26 var errors = <Message>[]; |
| 26 var group = css.parseSelectorGroup(selector, errors: errors); | 27 var group = css.parseSelectorGroup(selector, errors: errors); |
| 27 if (group == null || errors.isNotEmpty) { | 28 if (group == null || errors.isNotEmpty) { |
| 28 throw new FormatException("'$selector' is not a valid selector: $errors"); | 29 throw new FormatException("'$selector' is not a valid selector: $errors"); |
| 29 } | 30 } |
| 30 return group; | 31 return group; |
| 31 } | 32 } |
| 32 | 33 |
| 33 class SelectorEvaluator extends Visitor { | 34 class SelectorEvaluator extends Visitor { |
| 34 /// The current HTML element to match against. | 35 /// The current HTML element to match against. |
| 35 Element _element; | 36 Element _element; |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 return value.startsWith(select); | 285 return value.startsWith(select); |
| 285 case TokenKind.SUFFIX_MATCH: | 286 case TokenKind.SUFFIX_MATCH: |
| 286 return value.endsWith(select); | 287 return value.endsWith(select); |
| 287 case TokenKind.SUBSTRING_MATCH: | 288 case TokenKind.SUBSTRING_MATCH: |
| 288 return value.contains(select); | 289 return value.contains(select); |
| 289 default: | 290 default: |
| 290 throw _unsupported(selector); | 291 throw _unsupported(selector); |
| 291 } | 292 } |
| 292 } | 293 } |
| 293 } | 294 } |
| OLD | NEW |