]> source.dussan.org Git - vaadin-framework.git/commitdiff
Combine Sass Block node handlers (parent selector), comments 34/334/2
authorHenri Sara <hesara@vaadin.com>
Thu, 22 Nov 2012 12:47:20 +0000 (14:47 +0200)
committerHenri Sara <hesara@vaadin.com>
Thu, 22 Nov 2012 12:47:20 +0000 (14:47 +0200)
This eliminates potential order problems between blocks with and without
parent selectors and reduces duplication of code.

Change-Id: If422f7d603bf4b9938b9c0bd83989e337e1f92ce

theme-compiler/src/com/vaadin/sass/tree/BlockNode.java
theme-compiler/src/com/vaadin/sass/tree/controldirective/EachDefNode.java
theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java
theme-compiler/src/com/vaadin/sass/visitor/NestedNodeHandler.java
theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java [deleted file]

index 07e4c69ed7220ccbf97ba1fbe3c9e1b28ed10e11..292a9483207136280c490da3c2524d501e9d8180 100644 (file)
@@ -20,7 +20,6 @@ import java.util.ArrayList;
 
 import com.vaadin.sass.ScssStylesheet;
 import com.vaadin.sass.visitor.BlockNodeHandler;
-import com.vaadin.sass.visitor.ParentSelectorHandler;
 
 public class BlockNode extends Node implements IVariableNode {
 
@@ -106,7 +105,6 @@ public class BlockNode extends Node implements IVariableNode {
     @Override
     public void traverse() {
         try {
-            ParentSelectorHandler.traverse(this);
             BlockNodeHandler.traverse(this);
             replaceVariables(ScssStylesheet.getVariables());
         } catch (Exception e) {
index 4ab8486add85b39f5f81344bb9505a109f43b38b..9c58a8c0f1707757d58dd07f08020cfd866fde75 100644 (file)
@@ -55,8 +55,13 @@ public class EachDefNode extends Node implements IVariableNode {
 
     @Override
     public String toString() {
-        return "Each Definition Node: {variable : " + var + ", "
-                + "children : " + list.size() + "}";
+        if (hasListVariable()) {
+            return "Each Definition Node: {variable : " + var + ", "
+                    + "listVariable : " + listVariable + "}";
+        } else {
+            return "Each Definition Node: {variable : " + var + ", "
+                    + "children : " + list.size() + "}";
+        }
     }
 
     public boolean hasListVariable() {
index a3fdd1cefa70ec3e7c70f1fc5f29bf257af0dda6..d128da0b4b95eb0b47349ff00b7fdddd8b745472 100644 (file)
@@ -23,6 +23,25 @@ import com.vaadin.sass.ScssStylesheet;
 import com.vaadin.sass.tree.BlockNode;
 import com.vaadin.sass.tree.Node;
 
+/**
+ * Handle nesting of blocks by moving child blocks to their parent, updating
+ * their selector lists while doing so. Also parent selectors (&amp;) are
+ * handled here.
+ * 
+ * Sample SASS code (from www.sass-lang.com):
+ * 
+ * <pre>
+ * table.hl {
+ *   margin: 2em 0;
+ *   td.ln {
+ *     text-align: right;
+ *   }
+ * }
+ * </pre>
+ * 
+ * Note that nested properties are handled by {@link NestedNodeHandler}, not
+ * here.
+ */
 public class BlockNodeHandler {
 
     public static void traverse(BlockNode node) {
@@ -47,26 +66,25 @@ public class BlockNodeHandler {
 
     private static void combineParentSelectorListToChild(BlockNode node) {
         ArrayList<String> newList = new ArrayList<String>();
-        ArrayList<String> parentSelectors = ((BlockNode) node.getParentNode())
-                .getSelectorList();
-        ArrayList<String> childSelectors = node.getSelectorList();
-        for (int i = 0; i < parentSelectors.size(); i++) {
-            String parentSelector = parentSelectors.get(i);
-            for (int j = 0; j < childSelectors.size(); j++) {
-                String childSelector = childSelectors.get(j);
-                newList.add(parentSelector + " " + childSelector);
+        BlockNode parentBlock = (BlockNode) node.getParentNode();
+        for (String parentSelector : parentBlock.getSelectorList()) {
+            for (String childSelector : node.getSelectorList()) {
+                // handle parent selector
+                if (childSelector.contains("&")) {
+                    newList.add(childSelector.replace("&", parentSelector));
+                } else {
+                    newList.add(parentSelector + " " + childSelector);
+                }
             }
-
         }
         node.setSelectorList(newList);
         Node oldParent = node.getParentNode();
         HashMap<Node, Node> lastNodeAdded = ScssStylesheet.getLastNodeAdded();
         if (lastNodeAdded.get(oldParent) != null) {
-            node.getParentNode().getParentNode()
-                    .appendChild(node, lastNodeAdded.get(oldParent));
+            oldParent.getParentNode().appendChild(node,
+                    lastNodeAdded.get(oldParent));
         } else {
-            node.getParentNode().getParentNode()
-                    .appendChild(node, node.getParentNode());
+            oldParent.getParentNode().appendChild(node, oldParent);
         }
 
         lastNodeAdded.put(oldParent, node);
index bb094885f0c3258ca3a499686ab8cae442c56f0b..bf75b3f7280af51a4526a4bb4f89673b645c6e8a 100644 (file)
@@ -20,6 +20,25 @@ import com.vaadin.sass.tree.NestPropertiesNode;
 import com.vaadin.sass.tree.Node;
 import com.vaadin.sass.tree.RuleNode;
 
+/**
+ * Handle nested properties nodes (e.g. "font: { family: serif; }" to
+ * "font-family: serif;").
+ * 
+ * Sample SASS code (from www.sass-lang.com):
+ * 
+ * <pre>
+ * li {
+ *   font: {
+ *     family: serif;
+ *     weight: bold;
+ *     size: 1.2em;
+ *   }
+ * }
+ * </pre>
+ * 
+ * Note that this does not apply to nested blocks, which are handled by
+ * {@link BlockNodeHandler}.
+ */
 public class NestedNodeHandler {
 
     public static void traverse(NestPropertiesNode node) {
diff --git a/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java
deleted file mode 100644 (file)
index 6b5c553..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2011 Vaadin Ltd.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.vaadin.sass.visitor;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import com.vaadin.sass.ScssStylesheet;
-import com.vaadin.sass.tree.BlockNode;
-import com.vaadin.sass.tree.Node;
-
-public class ParentSelectorHandler {
-
-    public static void traverse(BlockNode block) throws Exception {
-        Node parentNode = block.getParentNode();
-        if (parentNode instanceof BlockNode) {
-            boolean isParentSelector = false;
-            ArrayList<String> newList = new ArrayList<String>(block
-                    .getSelectorList().size());
-            BlockNode parentBlock = (BlockNode) parentNode;
-            for (final String parentSelector : parentBlock.getSelectorList()) {
-                for (final String s : block.getSelectorList()) {
-                    if (s.contains("&")) {
-                        newList.add(s.replace("&", parentSelector));
-                        isParentSelector = true;
-                    } else {
-                        newList.add(parentSelector + " " + s);
-                    }
-                }
-            }
-            if (isParentSelector) {
-                block.setSelectorList(newList);
-                Node oldparent = block.getParentNode();
-                HashMap<Node, Node> lastNodeAdded = ScssStylesheet
-                        .getLastNodeAdded();
-                if (lastNodeAdded.containsKey(block.getParentNode())) {
-                    block.getParentNode()
-                            .getParentNode()
-                            .appendChild(block,
-                                    lastNodeAdded.get(block.getParentNode()));
-                } else {
-                    block.getParentNode().getParentNode()
-                            .appendChild(block, block.getParentNode());
-                }
-
-                lastNodeAdded.put(oldparent, block);
-            }
-        }
-    }
-}