aboutsummaryrefslogtreecommitdiffstats
path: root/theme-compiler/src/com/vaadin/sass/internal/visitor/ExtendNodeHandler.java
diff options
context:
space:
mode:
authorMarc Englund <marc@vaadin.com>2012-11-23 13:21:49 +0200
committerVaadin Code Review <review@vaadin.com>2012-11-23 11:47:42 +0000
commitfa7da722662de5ead99226189ca963afebdf5446 (patch)
tree7a6d87dd6ddf2ec6922cc10833a260d9340115eb /theme-compiler/src/com/vaadin/sass/internal/visitor/ExtendNodeHandler.java
parent1c400f042b32046a4becacfb856db4829bd0515d (diff)
downloadvaadin-framework-fa7da722662de5ead99226189ca963afebdf5446.tar.gz
vaadin-framework-fa7da722662de5ead99226189ca963afebdf5446.zip
Make most of the sass compiler API internal, fixes #10339
Change-Id: Ia783142aa96665a26491b659a387490883875d37
Diffstat (limited to 'theme-compiler/src/com/vaadin/sass/internal/visitor/ExtendNodeHandler.java')
-rw-r--r--theme-compiler/src/com/vaadin/sass/internal/visitor/ExtendNodeHandler.java97
1 files changed, 97 insertions, 0 deletions
diff --git a/theme-compiler/src/com/vaadin/sass/internal/visitor/ExtendNodeHandler.java b/theme-compiler/src/com/vaadin/sass/internal/visitor/ExtendNodeHandler.java
new file mode 100644
index 0000000000..c05f8f6d38
--- /dev/null
+++ b/theme-compiler/src/com/vaadin/sass/internal/visitor/ExtendNodeHandler.java
@@ -0,0 +1,97 @@
+/*
+ * 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.internal.visitor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.vaadin.sass.internal.ScssStylesheet;
+import com.vaadin.sass.internal.tree.BlockNode;
+import com.vaadin.sass.internal.tree.ExtendNode;
+import com.vaadin.sass.internal.tree.Node;
+
+public class ExtendNodeHandler {
+ private static Map<String, List<ArrayList<String>>> extendsMap = new HashMap<String, List<ArrayList<String>>>();
+
+ public static void traverse(ExtendNode node) throws Exception {
+ buildExtendsMap(node);
+ modifyTree(ScssStylesheet.get());
+ }
+
+ private static void modifyTree(Node node) throws Exception {
+ for (Node child : node.getChildren()) {
+ if (child instanceof BlockNode) {
+ BlockNode blockNode = (BlockNode) child;
+ String selectorString = blockNode.getSelectors();
+ if (extendsMap.get(selectorString) != null) {
+ for (ArrayList<String> sList : extendsMap
+ .get(selectorString)) {
+ ArrayList<String> clone = (ArrayList<String>) sList
+ .clone();
+ addAdditionalSelectorListToBlockNode(blockNode, clone,
+ null);
+ }
+ } else {
+ for (Entry<String, List<ArrayList<String>>> entry : extendsMap
+ .entrySet()) {
+ if (selectorString.contains(entry.getKey())) {
+ for (ArrayList<String> sList : entry.getValue()) {
+ ArrayList<String> clone = (ArrayList<String>) sList
+ .clone();
+ addAdditionalSelectorListToBlockNode(blockNode,
+ clone, entry.getKey());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ private static void buildExtendsMap(ExtendNode node) {
+ String extendedString = node.getListAsString();
+ if (extendsMap.get(extendedString) == null) {
+ extendsMap.put(extendedString, new ArrayList<ArrayList<String>>());
+ }
+ extendsMap.get(extendedString).add(
+ ((BlockNode) node.getParentNode()).getSelectorList());
+ }
+
+ private static void addAdditionalSelectorListToBlockNode(
+ BlockNode blockNode, ArrayList<String> list, String selectorString) {
+ if (list != null) {
+ for (int i = 0; i < list.size(); i++) {
+ if (selectorString == null) {
+ blockNode.getSelectorList().add(list.get(i));
+ } else {
+ ArrayList<String> newTags = new ArrayList<String>();
+ for (final String existing : blockNode.getSelectorList()) {
+ if (existing.contains(selectorString)) {
+ newTags.add(existing.replace(selectorString,
+ list.get(i)));
+ }
+ }
+ blockNode.getSelectorList().addAll(newTags);
+ }
+ }
+ }
+ }
+}