You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BlockVisitor.java 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package com.vaadin.sass.visitor;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. import org.w3c.css.sac.Selector;
  5. import org.w3c.css.sac.SelectorList;
  6. import com.vaadin.sass.parser.SelectorListImpl;
  7. import com.vaadin.sass.selector.CompositeSelector;
  8. import com.vaadin.sass.tree.BlockNode;
  9. import com.vaadin.sass.tree.Node;
  10. public class BlockVisitor implements Visitor {
  11. @Override
  12. public void traverse(Node node) {
  13. traverse(null, node);
  14. }
  15. private void traverse(Node parent, Node node) {
  16. Node after = node;
  17. Set<Node> toBeDeleted = new HashSet<Node>();
  18. for (int pos = 0; pos < node.getChildren().size(); pos++) {
  19. Node child = node.getChildren().get(pos);
  20. traverse(node, child);
  21. if (child instanceof BlockNode && node instanceof BlockNode
  22. && parent != null) {
  23. combineParentSelectorListToChild(node, child);
  24. toBeDeleted.add(child);
  25. parent.appendChild(child, after);
  26. after = child;
  27. }
  28. }
  29. for (Node child : toBeDeleted) {
  30. node.removeChild(child);
  31. }
  32. }
  33. private void combineParentSelectorListToChild(Node parent, Node child) {
  34. if (parent instanceof BlockNode && child instanceof BlockNode) {
  35. SelectorListImpl newList = new SelectorListImpl();
  36. SelectorList parentSelectors = ((BlockNode) parent)
  37. .getSelectorList();
  38. SelectorList childSelectors = ((BlockNode) child).getSelectorList();
  39. for (int i = 0; i < parentSelectors.getLength(); i++) {
  40. Selector parentSelector = parentSelectors.item(i);
  41. for (int j = 0; j < childSelectors.getLength(); j++) {
  42. Selector childSelector = childSelectors.item(j);
  43. newList.addSelector(new CompositeSelector(parentSelector,
  44. childSelector));
  45. }
  46. }
  47. ((BlockNode) child).setSelectorList(newList);
  48. }
  49. }
  50. }