From c6be443ccee60904bce8d9e163ce5a82fecd27bb Mon Sep 17 00:00:00 2001 From: Victor <victor@suumit.com> Date: Tue, 22 Apr 2014 16:18:41 +0200 Subject: [PATCH] style(Selector): Move public API on top of the file Closes #939 --- lib/core_dom/selector.dart | 300 ++++++++++++++++++------------------- 1 file changed, 145 insertions(+), 155 deletions(-) diff --git a/lib/core_dom/selector.dart b/lib/core_dom/selector.dart index ad7456b44..fec6946e8 100644 --- a/lib/core_dom/selector.dart +++ b/lib/core_dom/selector.dart @@ -7,8 +7,7 @@ part of angular.core.dom_internal; * DirectiveSelector is used by the [Compiler] during the template walking * to extract the [DirectiveRef]s. * - * DirectiveSelector can be created using the [directiveSelectorFactory] - * method. + * DirectiveSelector can be created using the [DirectiveSelectorFactory]. * * The DirectiveSelector supports CSS selectors which do not cross * element boundaries only. The selectors can have any mix of element-name, @@ -16,17 +15,151 @@ part of angular.core.dom_internal; * * Examples: * - * <pre> - * element - * .class - * [attribute] - * [attribute=value] - * element[attribute1][attribute2=value] - * :contains(/abc/) - * </pre> - * - * + * * element + * * .class + * * [attribute] + * * [attribute=value] + * * element[attribute1][attribute2=value] + * * :contains(/abc/) */ +class DirectiveSelector { + ElementBinderFactory _binderFactory; + DirectiveMap _directives; + var elementSelector; + var attrSelector; + var textSelector; + + DirectiveSelector(this._directives, this._binderFactory) { + elementSelector = new _ElementSelector(''); + attrSelector = <_ContainsSelector>[]; + textSelector = <_ContainsSelector>[]; + _directives.forEach((Directive annotation, Type type) { + var match; + var selector = annotation.selector; + List<_SelectorPart> selectorParts; + if (selector == null) { + throw new ArgumentError('Missing selector annotation for $type'); + } + + if ((match = _CONTAINS_REGEXP.firstMatch(selector)) != null) { + textSelector.add(new _ContainsSelector(annotation, match.group(1))); + } else if ((match = _ATTR_CONTAINS_REGEXP.firstMatch(selector)) != null) { + attrSelector.add(new _ContainsSelector(annotation, match[1])); + } else if ((selectorParts = _splitCss(selector, type)) != null){ + elementSelector.addDirective(selectorParts, + new _Directive(type, annotation)); + } else { + throw new ArgumentError('Unsupported Selector: $selector'); + } + }); + } + + ElementBinder matchElement(dom.Node node) { + assert(node is dom.Element); + + ElementBinderBuilder builder = _binderFactory.builder(); + List<_ElementSelector> partialSelection; + var classes = <String, bool>{}; + Map<String, String> attrs = {}; + + dom.Element element = node; + String nodeName = element.tagName.toLowerCase(); + + // Set default attribute + if (nodeName == 'input' && !element.attributes.containsKey('type')) { + element.attributes['type'] = 'text'; + } + + // Select node + partialSelection = elementSelector.selectNode(builder, + partialSelection, element, nodeName); + + // Select .name + if ((element.classes) != null) { + for (var name in element.classes) { + classes[name] = true; + partialSelection = elementSelector.selectClass(builder, + partialSelection, element, name); + } + } + + // Select [attributes] + element.attributes.forEach((attrName, value) { + + if (attrName.startsWith("on-")) { + builder.onEvents[attrName] = value; + } else if (attrName.startsWith("bind-")) { + builder.bindAttrs[attrName] = value; + } + + attrs[attrName] = value; + for (var k = 0; k < attrSelector.length; k++) { + _ContainsSelector selectorRegExp = attrSelector[k]; + if (selectorRegExp.regexp.hasMatch(value)) { + // this directive is matched on any attribute name, and so + // we need to pass the name to the directive by prefixing it to + // the value. Yes it is a bit of a hack. + _directives[selectorRegExp.annotation].forEach((type) { + builder.addDirective(new DirectiveRef( + node, type, selectorRegExp.annotation, '$attrName=$value')); + }); + } + } + + partialSelection = elementSelector.selectAttr(builder, + partialSelection, node, attrName, value); + }); + + while (partialSelection != null) { + List<_ElementSelector> elementSelectors = partialSelection; + partialSelection = null; + elementSelectors.forEach((_ElementSelector elementSelector) { + classes.forEach((className, _) { + partialSelection = elementSelector.selectClass(builder, + partialSelection, node, className); + }); + attrs.forEach((attrName, value) { + partialSelection = elementSelector.selectAttr(builder, + partialSelection, node, attrName, value); + }); + }); + } + return builder.binder; + } + + ElementBinder matchText(dom.Node node) { + ElementBinderBuilder builder = _binderFactory.builder(); + + var value = node.nodeValue; + for (var k = 0; k < textSelector.length; k++) { + var selectorRegExp = textSelector[k]; + if (selectorRegExp.regexp.hasMatch(value)) { + _directives[selectorRegExp.annotation].forEach((type) { + builder.addDirective(new DirectiveRef(node, type, + selectorRegExp.annotation, value)); + }); + } + } + return builder.binder; + } + + ElementBinder matchComment(dom.Node node) => + _binderFactory.builder().binder; +} + +/** + * Factory for creating a [DirectiveSelector]. + */ +@Injectable() +class DirectiveSelectorFactory { + ElementBinderFactory _binderFactory; + + DirectiveSelectorFactory(this._binderFactory); + + DirectiveSelector selector(DirectiveMap directives) => + new DirectiveSelector(directives, _binderFactory); +} + class _Directive { final Type type; final Directive annotation; @@ -36,7 +169,6 @@ class _Directive { toString() => annotation.selector; } - class _ContainsSelector { final Directive annotation; final RegExp regexp; @@ -239,145 +371,3 @@ List<_SelectorPart> _splitCss(String selector, Type type) { } return parts; } - - -class DirectiveSelector { - ElementBinderFactory _binderFactory; - DirectiveMap _directives; - var elementSelector; - var attrSelector; - var textSelector; - - DirectiveSelector(this._directives, this._binderFactory) { - elementSelector = new _ElementSelector(''); - attrSelector = <_ContainsSelector>[]; - textSelector = <_ContainsSelector>[]; - _directives.forEach((Directive annotation, Type type) { - var match; - var selector = annotation.selector; - List<_SelectorPart> selectorParts; - if (selector == null) { - throw new ArgumentError('Missing selector annotation for $type'); - } - - if ((match = _CONTAINS_REGEXP.firstMatch(selector)) != null) { - textSelector.add(new _ContainsSelector(annotation, match.group(1))); - } else if ((match = _ATTR_CONTAINS_REGEXP.firstMatch(selector)) != null) { - attrSelector.add(new _ContainsSelector(annotation, match[1])); - } else if ((selectorParts = _splitCss(selector, type)) != null){ - elementSelector.addDirective(selectorParts, - new _Directive(type, annotation)); - } else { - throw new ArgumentError('Unsupported Selector: $selector'); - } - }); - } - - ElementBinder matchElement(dom.Node node) { - assert(node is dom.Element); - - ElementBinderBuilder builder = _binderFactory.builder(); - List<_ElementSelector> partialSelection; - var classes = <String, bool>{}; - Map<String, String> attrs = {}; - - dom.Element element = node; - String nodeName = element.tagName.toLowerCase(); - - // Set default attribute - if (nodeName == 'input' && !element.attributes.containsKey('type')) { - element.attributes['type'] = 'text'; - } - - // Select node - partialSelection = elementSelector.selectNode(builder, - partialSelection, element, nodeName); - - // Select .name - if ((element.classes) != null) { - for (var name in element.classes) { - classes[name] = true; - partialSelection = elementSelector.selectClass(builder, - partialSelection, element, name); - } - } - - // Select [attributes] - element.attributes.forEach((attrName, value) { - - if (attrName.startsWith("on-")) { - builder.onEvents[attrName] = value; - } - - if (attrName.startsWith("bind-")) { - builder.bindAttrs[attrName] = value; - } - - attrs[attrName] = value; - for (var k = 0; k < attrSelector.length; k++) { - _ContainsSelector selectorRegExp = attrSelector[k]; - if (selectorRegExp.regexp.hasMatch(value)) { - // this directive is matched on any attribute name, and so - // we need to pass the name to the directive by prefixing it to - // the value. Yes it is a bit of a hack. - _directives[selectorRegExp.annotation].forEach((type) { - builder.addDirective(new DirectiveRef( - node, type, selectorRegExp.annotation, '$attrName=$value')); - }); - } - } - - partialSelection = elementSelector.selectAttr(builder, - partialSelection, node, attrName, value); - }); - - while (partialSelection != null) { - List<_ElementSelector> elementSelectors = partialSelection; - partialSelection = null; - elementSelectors.forEach((_ElementSelector elementSelector) { - classes.forEach((className, _) { - partialSelection = elementSelector.selectClass(builder, - partialSelection, node, className); - }); - attrs.forEach((attrName, value) { - partialSelection = elementSelector.selectAttr(builder, - partialSelection, node, attrName, value); - }); - }); - } - return builder.binder; - } - - ElementBinder matchText(dom.Node node) { - ElementBinderBuilder builder = _binderFactory.builder(); - - var value = node.nodeValue; - for (var k = 0; k < textSelector.length; k++) { - var selectorRegExp = textSelector[k]; - if (selectorRegExp.regexp.hasMatch(value)) { - _directives[selectorRegExp.annotation].forEach((type) { - builder.addDirective(new DirectiveRef(node, type, - selectorRegExp.annotation, value)); - }); - } - } - return builder.binder; - } - - ElementBinder matchComment(dom.Node node) { - return _binderFactory.builder().binder; - } -} -/** - * Factory for creating a [DirectiveSelector]. - */ -@Injectable() -class DirectiveSelectorFactory { - ElementBinderFactory _binderFactory; - - DirectiveSelectorFactory(this._binderFactory); - - DirectiveSelector selector(DirectiveMap directives) { - return new DirectiveSelector(directives, _binderFactory); - } -}