import {List, ListWrapper, StringMapWrapper} from 'facade/collection'; import {RegExpWrapper, RegExpMatcherWrapper, CONST, isPresent, isBlank} from 'facade/lang'; const _EMPTY_ATTR_VALUE = ''; export class SelectorMatcher { /* TODO: Add these fields when the transpiler supports fields _elementMap:Map; _elementPartialMap:Map; _classMap:Map; _classPartialMap:Map; _attrValueMap:Map>; _attrValuePartialMap:Map>; */ constructor() { this._selectables = ListWrapper.create(); this._elementMap = StringMapWrapper.create(); this._elementPartialMap = StringMapWrapper.create(); this._classMap = StringMapWrapper.create(); this._classPartialMap = StringMapWrapper.create(); this._attrValueMap = StringMapWrapper.create(); this._attrValuePartialMap = StringMapWrapper.create(); } /** * Add an object that can be found later on by calling `match`. * @param cssSelector A css selector * @param selectable An opaque object that will be given to the callback of the `match` function */ addSelectable(cssSelector:CssSelector, selectable) { var matcher = this; var element = cssSelector.element; var classNames = cssSelector.classNames; var attrs = cssSelector.attrs; if (isPresent(element)) { var isTerminal = attrs.length === 0 && classNames.length === 0; if (isTerminal) { this._addTerminal(matcher._elementMap, element, selectable); } else { matcher = this._addPartial(matcher._elementPartialMap, element); } } if (isPresent(classNames)) { for (var index = 0; index, attrs:List) { this.element = element; this.classNames = classNames; this.attrs = attrs; } toString():string { var res = ''; if (isPresent(this.element)) { res += this.element; } if (isPresent(this.classNames)) { for (var i=0; i