angular2
Version:
Angular 2 - a web framework for modern web apps
340 lines (339 loc) • 13.8 kB
JavaScript
"use strict";
Object.defineProperties(module.exports, {
CssSelector: {get: function() {
return CssSelector;
}},
SelectorMatcher: {get: function() {
return SelectorMatcher;
}},
__esModule: {value: true}
});
var $__angular2_47_src_47_facade_47_collection__,
$__angular2_47_src_47_facade_47_lang__;
var $__0 = ($__angular2_47_src_47_facade_47_collection__ = require("angular2/src/facade/collection"), $__angular2_47_src_47_facade_47_collection__ && $__angular2_47_src_47_facade_47_collection__.__esModule && $__angular2_47_src_47_facade_47_collection__ || {default: $__angular2_47_src_47_facade_47_collection__}),
List = $__0.List,
Map = $__0.Map,
ListWrapper = $__0.ListWrapper,
MapWrapper = $__0.MapWrapper;
var $__1 = ($__angular2_47_src_47_facade_47_lang__ = require("angular2/src/facade/lang"), $__angular2_47_src_47_facade_47_lang__ && $__angular2_47_src_47_facade_47_lang__.__esModule && $__angular2_47_src_47_facade_47_lang__ || {default: $__angular2_47_src_47_facade_47_lang__}),
isPresent = $__1.isPresent,
isBlank = $__1.isBlank,
RegExpWrapper = $__1.RegExpWrapper,
RegExpMatcherWrapper = $__1.RegExpMatcherWrapper,
StringWrapper = $__1.StringWrapper,
BaseException = $__1.BaseException;
var _EMPTY_ATTR_VALUE = '';
var _SELECTOR_REGEXP = RegExpWrapper.create('(\\:not\\()|' + '([-\\w]+)|' + '(?:\\.([-\\w]+))|' + '(?:\\[([-\\w*]+)(?:=([^\\]]*))?\\])|' + '(?:\\))|' + '(\\s*,\\s*)');
var CssSelector = function CssSelector() {
this.element = null;
this.classNames = ListWrapper.create();
this.attrs = ListWrapper.create();
this.notSelector = null;
};
var $CssSelector = CssSelector;
($traceurRuntime.createClass)(CssSelector, {
setElement: function() {
var element = arguments[0] !== (void 0) ? arguments[0] : null;
if (isPresent(element)) {
element = element.toLowerCase();
}
this.element = element;
},
addAttribute: function(name) {
var value = arguments[1] !== (void 0) ? arguments[1] : _EMPTY_ATTR_VALUE;
ListWrapper.push(this.attrs, name.toLowerCase());
if (isPresent(value)) {
value = value.toLowerCase();
} else {
value = _EMPTY_ATTR_VALUE;
}
ListWrapper.push(this.attrs, value);
},
addClassName: function(name) {
ListWrapper.push(this.classNames, name.toLowerCase());
},
toString: function() {
var res = '';
if (isPresent(this.element)) {
res += this.element;
}
if (isPresent(this.classNames)) {
for (var i = 0; i < this.classNames.length; i++) {
res += '.' + this.classNames[i];
}
}
if (isPresent(this.attrs)) {
for (var i = 0; i < this.attrs.length; ) {
var attrName = this.attrs[i++];
var attrValue = this.attrs[i++];
res += '[' + attrName;
if (attrValue.length > 0) {
res += '=' + attrValue;
}
res += ']';
}
}
if (isPresent(this.notSelector)) {
res += ":not(" + this.notSelector.toString() + ")";
}
return res;
}
}, {parse: function(selector) {
var results = ListWrapper.create();
var _addResult = (function(res, cssSel) {
if (isPresent(cssSel.notSelector) && isBlank(cssSel.element) && ListWrapper.isEmpty(cssSel.classNames) && ListWrapper.isEmpty(cssSel.attrs)) {
cssSel.element = "*";
}
ListWrapper.push(res, cssSel);
});
var cssSelector = new $CssSelector();
var matcher = RegExpWrapper.matcher(_SELECTOR_REGEXP, selector);
var match;
var current = cssSelector;
while (isPresent(match = RegExpMatcherWrapper.next(matcher))) {
if (isPresent(match[1])) {
if (isPresent(cssSelector.notSelector)) {
throw new BaseException('Nesting :not is not allowed in a selector');
}
current.notSelector = new $CssSelector();
current = current.notSelector;
}
if (isPresent(match[2])) {
current.setElement(match[2]);
}
if (isPresent(match[3])) {
current.addClassName(match[3]);
}
if (isPresent(match[4])) {
current.addAttribute(match[4], match[5]);
}
if (isPresent(match[6])) {
_addResult(results, cssSelector);
cssSelector = current = new $CssSelector();
}
}
_addResult(results, cssSelector);
return results;
}});
Object.defineProperty(CssSelector.parse, "parameters", {get: function() {
return [[$traceurRuntime.type.string]];
}});
Object.defineProperty(CssSelector.prototype.setElement, "parameters", {get: function() {
return [[$traceurRuntime.type.string]];
}});
Object.defineProperty(CssSelector.prototype.addAttribute, "parameters", {get: function() {
return [[$traceurRuntime.type.string], [$traceurRuntime.type.string]];
}});
Object.defineProperty(CssSelector.prototype.addClassName, "parameters", {get: function() {
return [[$traceurRuntime.type.string]];
}});
var SelectorMatcher = function SelectorMatcher() {
this._elementMap = MapWrapper.create();
this._elementPartialMap = MapWrapper.create();
this._classMap = MapWrapper.create();
this._classPartialMap = MapWrapper.create();
this._attrValueMap = MapWrapper.create();
this._attrValuePartialMap = MapWrapper.create();
this._listContexts = ListWrapper.create();
};
var $SelectorMatcher = SelectorMatcher;
($traceurRuntime.createClass)(SelectorMatcher, {
addSelectables: function(cssSelectors, callbackCtxt) {
var listContext = null;
if (cssSelectors.length > 1) {
listContext = new SelectorListContext(cssSelectors);
ListWrapper.push(this._listContexts, listContext);
}
for (var i = 0; i < cssSelectors.length; i++) {
this.addSelectable(cssSelectors[i], callbackCtxt, listContext);
}
},
addSelectable: function(cssSelector, callbackCtxt, listContext) {
var matcher = this;
var element = cssSelector.element;
var classNames = cssSelector.classNames;
var attrs = cssSelector.attrs;
var selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);
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 < classNames.length; index++) {
var isTerminal = attrs.length === 0 && index === classNames.length - 1;
var className = classNames[index];
if (isTerminal) {
this._addTerminal(matcher._classMap, className, selectable);
} else {
matcher = this._addPartial(matcher._classPartialMap, className);
}
}
}
if (isPresent(attrs)) {
for (var index = 0; index < attrs.length; ) {
var isTerminal = index === attrs.length - 2;
var attrName = attrs[index++];
var attrValue = attrs[index++];
var map = isTerminal ? matcher._attrValueMap : matcher._attrValuePartialMap;
var valuesMap = MapWrapper.get(map, attrName);
if (isBlank(valuesMap)) {
valuesMap = MapWrapper.create();
MapWrapper.set(map, attrName, valuesMap);
}
if (isTerminal) {
this._addTerminal(valuesMap, attrValue, selectable);
} else {
matcher = this._addPartial(valuesMap, attrValue);
}
}
}
},
_addTerminal: function(map, name, selectable) {
var terminalList = MapWrapper.get(map, name);
if (isBlank(terminalList)) {
terminalList = ListWrapper.create();
MapWrapper.set(map, name, terminalList);
}
ListWrapper.push(terminalList, selectable);
},
_addPartial: function(map, name) {
var matcher = MapWrapper.get(map, name);
if (isBlank(matcher)) {
matcher = new $SelectorMatcher();
MapWrapper.set(map, name, matcher);
}
return matcher;
},
match: function(cssSelector, matchedCallback) {
var result = false;
var element = cssSelector.element;
var classNames = cssSelector.classNames;
var attrs = cssSelector.attrs;
for (var i = 0; i < this._listContexts.length; i++) {
this._listContexts[i].alreadyMatched = false;
}
result = this._matchTerminal(this._elementMap, element, cssSelector, matchedCallback) || result;
result = this._matchPartial(this._elementPartialMap, element, cssSelector, matchedCallback) || result;
if (isPresent(classNames)) {
for (var index = 0; index < classNames.length; index++) {
var className = classNames[index];
result = this._matchTerminal(this._classMap, className, cssSelector, matchedCallback) || result;
result = this._matchPartial(this._classPartialMap, className, cssSelector, matchedCallback) || result;
}
}
if (isPresent(attrs)) {
for (var index = 0; index < attrs.length; ) {
var attrName = attrs[index++];
var attrValue = attrs[index++];
var valuesMap = MapWrapper.get(this._attrValueMap, attrName);
if (!StringWrapper.equals(attrValue, _EMPTY_ATTR_VALUE)) {
result = this._matchTerminal(valuesMap, _EMPTY_ATTR_VALUE, cssSelector, matchedCallback) || result;
}
result = this._matchTerminal(valuesMap, attrValue, cssSelector, matchedCallback) || result;
valuesMap = MapWrapper.get(this._attrValuePartialMap, attrName);
result = this._matchPartial(valuesMap, attrValue, cssSelector, matchedCallback) || result;
}
}
return result;
},
_matchTerminal: function() {
var map = arguments[0] !== (void 0) ? arguments[0] : null;
var name = arguments[1];
var cssSelector = arguments[2];
var matchedCallback = arguments[3];
if (isBlank(map) || isBlank(name)) {
return false;
}
var selectables = MapWrapper.get(map, name);
var starSelectables = MapWrapper.get(map, "*");
if (isPresent(starSelectables)) {
selectables = ListWrapper.concat(selectables, starSelectables);
}
if (isBlank(selectables)) {
return false;
}
var selectable;
var result = false;
for (var index = 0; index < selectables.length; index++) {
selectable = selectables[index];
result = selectable.finalize(cssSelector, matchedCallback) || result;
}
return result;
},
_matchPartial: function() {
var map = arguments[0] !== (void 0) ? arguments[0] : null;
var name = arguments[1];
var cssSelector = arguments[2];
var matchedCallback = arguments[3];
if (isBlank(map) || isBlank(name)) {
return false;
}
var nestedSelector = MapWrapper.get(map, name);
if (isBlank(nestedSelector)) {
return false;
}
return nestedSelector.match(cssSelector, matchedCallback);
}
}, {});
Object.defineProperty(SelectorMatcher.prototype.addSelectables, "parameters", {get: function() {
return [[$traceurRuntime.genericType(List, CssSelector)], []];
}});
Object.defineProperty(SelectorMatcher.prototype.addSelectable, "parameters", {get: function() {
return [[], [], [SelectorListContext]];
}});
Object.defineProperty(SelectorMatcher.prototype._addTerminal, "parameters", {get: function() {
return [[$traceurRuntime.genericType(Map, $traceurRuntime.type.string, $traceurRuntime.type.string)], [$traceurRuntime.type.string], []];
}});
Object.defineProperty(SelectorMatcher.prototype._addPartial, "parameters", {get: function() {
return [[$traceurRuntime.genericType(Map, $traceurRuntime.type.string, $traceurRuntime.type.string)], [$traceurRuntime.type.string]];
}});
Object.defineProperty(SelectorMatcher.prototype.match, "parameters", {get: function() {
return [[CssSelector], [Function]];
}});
Object.defineProperty(SelectorMatcher.prototype._matchTerminal, "parameters", {get: function() {
return [[$traceurRuntime.genericType(Map, $traceurRuntime.type.string, $traceurRuntime.type.string)], [], [], []];
}});
Object.defineProperty(SelectorMatcher.prototype._matchPartial, "parameters", {get: function() {
return [[$traceurRuntime.genericType(Map, $traceurRuntime.type.string, $traceurRuntime.type.string)], [], [], []];
}});
var SelectorListContext = function SelectorListContext(selectors) {
this.selectors = selectors;
this.alreadyMatched = false;
};
($traceurRuntime.createClass)(SelectorListContext, {}, {});
Object.defineProperty(SelectorListContext, "parameters", {get: function() {
return [[$traceurRuntime.genericType(List, CssSelector)]];
}});
var SelectorContext = function SelectorContext(selector, cbContext, listContext) {
this.selector = selector;
this.notSelector = selector.notSelector;
this.cbContext = cbContext;
this.listContext = listContext;
};
($traceurRuntime.createClass)(SelectorContext, {finalize: function(cssSelector, callback) {
var result = true;
if (isPresent(this.notSelector) && (isBlank(this.listContext) || !this.listContext.alreadyMatched)) {
var notMatcher = new SelectorMatcher();
notMatcher.addSelectable(this.notSelector, null, null);
result = !notMatcher.match(cssSelector, null);
}
if (result && isPresent(callback) && (isBlank(this.listContext) || !this.listContext.alreadyMatched)) {
if (isPresent(this.listContext)) {
this.listContext.alreadyMatched = true;
}
callback(this.selector, this.cbContext);
}
return result;
}}, {});
Object.defineProperty(SelectorContext, "parameters", {get: function() {
return [[CssSelector], [], [SelectorListContext]];
}});
Object.defineProperty(SelectorContext.prototype.finalize, "parameters", {get: function() {
return [[CssSelector], []];
}});
//# sourceMappingURL=selector.js.map
//# sourceMappingURL=./selector.map