/**
* Copyright (c) 2013-2016 Angelo ZERR.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
*/
package tern.angular.protocol;
import org.w3c.dom.Attr;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import tern.angular.AngularType;
import tern.angular.modules.Directive;
import tern.angular.modules.IDirectiveProvider;
public class HTMLTernAngularHelper {
private HTMLTernAngularHelper() {
}
public static void populateScope(Node element, IDirectiveProvider provider,
Object project, TernAngularQuery query) {
TernAngularScope scope = query.getScope();
populateScope(element, scope, provider, project,
query.getFirstAngularType());
}
public static void populateScope(Node element, TernAngularScope scope,
IDirectiveProvider provider, Object project, AngularType angularType) {
switch (angularType) {
case module:
// do nothing;
break;
case controller:
// find controller
populateScope(scope, element, provider, project, false);
break;
case unknown:
case model:
case directive:
case repeat_expression:
// find model
populateScope(scope, element, provider, project, true);
break;
}
}
private static void populateScope(TernAngularScope scope, Node element,
IDirectiveProvider provider, Object project,
boolean populateController) {
if (element == null || element.getNodeType() == Node.DOCUMENT_NODE) {
return;
}
NamedNodeMap attributes = element.getAttributes();
if (attributes != null) {
Attr node = null;
for (int i = 0; i < attributes.getLength(); i++) {
node = (Attr) attributes.item(i);
Directive directive = provider.getAngularDirective(project,
node);
if (directive != null) {
switch (directive.getDirectiveType()) {
case module:
String module = ((Attr) node).getValue();
scope.setModule(module);
return;
case controller:
if (populateController) {
String controller = ((Attr) node).getValue();
scope.addController(controller);
}
break;
case model:
String model = ((Attr) node).getValue();
scope.addModel(model);
break;
case repeat_expression:
String expression = ((Attr) node).getValue();
scope.addRepeat(expression);
break;
default:
break;
}
}
}
}
Node parent = element.getPreviousSibling();
if (parent == null)
parent = element.getParentNode();
populateScope(scope, parent, provider, project, populateController);
}
}