From e731b814d92ac8861b8a2bc5026e279a2437e5cf Mon Sep 17 00:00:00 2001 From: Henri Sara Date: Thu, 22 Nov 2012 14:47:20 +0200 Subject: [PATCH] Combine Sass Block node handlers (parent selector), comments This eliminates potential order problems between blocks with and without parent selectors and reduces duplication of code. Change-Id: If422f7d603bf4b9938b9c0bd83989e337e1f92ce --- .../src/com/vaadin/sass/tree/BlockNode.java | 2 - .../tree/controldirective/EachDefNode.java | 9 ++- .../vaadin/sass/visitor/BlockNodeHandler.java | 44 +++++++++---- .../sass/visitor/NestedNodeHandler.java | 19 ++++++ .../sass/visitor/ParentSelectorHandler.java | 64 ------------------- 5 files changed, 57 insertions(+), 81 deletions(-) delete mode 100644 theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java diff --git a/theme-compiler/src/com/vaadin/sass/tree/BlockNode.java b/theme-compiler/src/com/vaadin/sass/tree/BlockNode.java index 07e4c69ed7..292a948320 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/BlockNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/BlockNode.java @@ -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) { diff --git a/theme-compiler/src/com/vaadin/sass/tree/controldirective/EachDefNode.java b/theme-compiler/src/com/vaadin/sass/tree/controldirective/EachDefNode.java index 4ab8486add..9c58a8c0f1 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/controldirective/EachDefNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/controldirective/EachDefNode.java @@ -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() { diff --git a/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java index a3fdd1cefa..d128da0b4b 100644 --- a/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java @@ -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 (&) are + * handled here. + * + * Sample SASS code (from www.sass-lang.com): + * + *
+ * table.hl {
+ *   margin: 2em 0;
+ *   td.ln {
+ *     text-align: right;
+ *   }
+ * }
+ * 
+ * + * 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 newList = new ArrayList(); - ArrayList parentSelectors = ((BlockNode) node.getParentNode()) - .getSelectorList(); - ArrayList 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 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); diff --git a/theme-compiler/src/com/vaadin/sass/visitor/NestedNodeHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/NestedNodeHandler.java index bb094885f0..bf75b3f728 100644 --- a/theme-compiler/src/com/vaadin/sass/visitor/NestedNodeHandler.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/NestedNodeHandler.java @@ -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): + * + *
+ * li {
+ *   font: {
+ *     family: serif;
+ *     weight: bold;
+ *     size: 1.2em;
+ *   }
+ * }
+ * 
+ * + * 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 index 6b5c5538a4..0000000000 --- a/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java +++ /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 newList = new ArrayList(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 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); - } - } - } -} -- 2.39.5