From a0da163fd5c23f1d961fc5c686efd6ffc50ecd61 Mon Sep 17 00:00:00 2001 From: Sebastian Nyholm Date: Mon, 22 Oct 2012 11:11:04 +0300 Subject: [PATCH] Fixes #9546, #9974, #10100, #10105 Change-Id: I1baccb5604899707960b1cf06887ada0fe217d08 --- .../src/com/vaadin/sass/ScssStylesheet.java | 126 ++++++-- .../com/vaadin/sass/parser/MediaListImpl.java | 8 +- .../src/com/vaadin/sass/parser/Parser.java | 292 +++++++++--------- .../src/com/vaadin/sass/parser/Parser.jj | 8 +- .../src/com/vaadin/sass/tree/BlockNode.java | 33 +- .../src/com/vaadin/sass/tree/CommentNode.java | 5 + .../src/com/vaadin/sass/tree/ExtendNode.java | 12 + .../com/vaadin/sass/tree/FontFaceNode.java | 5 + .../src/com/vaadin/sass/tree/ForNode.java | 5 + .../com/vaadin/sass/tree/FunctionNode.java | 7 + .../src/com/vaadin/sass/tree/ImportNode.java | 9 + .../vaadin/sass/tree/InterpolationNode.java | 7 - .../com/vaadin/sass/tree/ListModifyNode.java | 8 + .../com/vaadin/sass/tree/ListRemoveNode.java | 21 +- .../src/com/vaadin/sass/tree/MediaNode.java | 5 + .../vaadin/sass/tree/MicrosoftRuleNode.java | 7 + .../com/vaadin/sass/tree/MixinDefNode.java | 12 + .../src/com/vaadin/sass/tree/MixinNode.java | 23 ++ .../vaadin/sass/tree/NestPropertiesNode.java | 11 +- .../src/com/vaadin/sass/tree/Node.java | 50 +-- .../src/com/vaadin/sass/tree/RuleNode.java | 95 +++--- .../src/com/vaadin/sass/tree/SimpleNode.java | 7 + .../com/vaadin/sass/tree/VariableNode.java | 8 + .../src/com/vaadin/sass/tree/WhileNode.java | 5 + .../tree/controldirective/EachDefNode.java | 8 + .../sass/tree/controldirective/ElseNode.java | 5 + .../tree/controldirective/IfElseDefNode.java | 14 + .../sass/tree/controldirective/IfNode.java | 13 +- .../vaadin/sass/visitor/BlockNodeHandler.java | 63 ++++ .../com/vaadin/sass/visitor/BlockVisitor.java | 75 ----- .../vaadin/sass/visitor/EachNodeHandler.java | 57 ++++ .../com/vaadin/sass/visitor/EachVisitor.java | 72 ----- ...endVisitor.java => ExtendNodeHandler.java} | 49 +-- .../sass/visitor/IfElseNodeHandler.java | 102 ++++++ .../vaadin/sass/visitor/IfElseVisitor.java | 122 -------- ...ortVisitor.java => ImportNodeHandler.java} | 26 +- .../sass/visitor/ListModifyVisitor.java | 27 -- ...ixinVisitor.java => MixinNodeHandler.java} | 65 ++-- ...iesVisitor.java => NestedNodeHandler.java} | 24 +- .../sass/visitor/ParentSelectorHandler.java | 69 +++++ .../sass/visitor/ParentSelectorVisitor.java | 60 ---- .../sass/visitor/VariableNodeHandler.java} | 17 +- .../vaadin/sass/visitor/VariableVisitor.java | 94 ------ .../tests/resources/css/parent-selector.css | 4 + .../resources/scss/_partial-for-import.scss | 18 +- .../tests/resources/scss/mixins.scss | 4 +- .../tests/resources/scss/parent-selector.scss | 6 + .../sass/testcases/scss/ParentSelector.java | 3 +- .../testcases/visitor/MixinVisitorTest.java | 267 ---------------- .../visitor/NestedPropertiesVisitorTest.java | 57 ---- 50 files changed, 910 insertions(+), 1180 deletions(-) delete mode 100644 theme-compiler/src/com/vaadin/sass/tree/InterpolationNode.java create mode 100644 theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java delete mode 100644 theme-compiler/src/com/vaadin/sass/visitor/BlockVisitor.java create mode 100644 theme-compiler/src/com/vaadin/sass/visitor/EachNodeHandler.java delete mode 100644 theme-compiler/src/com/vaadin/sass/visitor/EachVisitor.java rename theme-compiler/src/com/vaadin/sass/visitor/{ExtendVisitor.java => ExtendNodeHandler.java} (66%) create mode 100644 theme-compiler/src/com/vaadin/sass/visitor/IfElseNodeHandler.java delete mode 100644 theme-compiler/src/com/vaadin/sass/visitor/IfElseVisitor.java rename theme-compiler/src/com/vaadin/sass/visitor/{ImportVisitor.java => ImportNodeHandler.java} (84%) delete mode 100644 theme-compiler/src/com/vaadin/sass/visitor/ListModifyVisitor.java rename theme-compiler/src/com/vaadin/sass/visitor/{MixinVisitor.java => MixinNodeHandler.java} (64%) rename theme-compiler/src/com/vaadin/sass/visitor/{NestPropertiesVisitor.java => NestedNodeHandler.java} (54%) create mode 100644 theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java delete mode 100644 theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorVisitor.java rename theme-compiler/{tests/src/com/vaadin/sass/testcases/visitor/ImportVisitorTest.java => src/com/vaadin/sass/visitor/VariableNodeHandler.java} (59%) delete mode 100644 theme-compiler/src/com/vaadin/sass/visitor/VariableVisitor.java delete mode 100644 theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/MixinVisitorTest.java delete mode 100644 theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/NestedPropertiesVisitorTest.java diff --git a/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java b/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java index d0b4b732ea..45578deb19 100644 --- a/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java +++ b/theme-compiler/src/com/vaadin/sass/ScssStylesheet.java @@ -20,7 +20,9 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.List; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; import org.w3c.css.sac.CSSException; import org.w3c.css.sac.InputSource; @@ -31,24 +33,27 @@ import com.vaadin.sass.handler.SCSSErrorHandler; import com.vaadin.sass.parser.Parser; import com.vaadin.sass.resolver.ScssStylesheetResolver; import com.vaadin.sass.resolver.VaadinResolver; +import com.vaadin.sass.tree.MixinDefNode; import com.vaadin.sass.tree.Node; import com.vaadin.sass.tree.VariableNode; -import com.vaadin.sass.visitor.BlockVisitor; -import com.vaadin.sass.visitor.EachVisitor; -import com.vaadin.sass.visitor.ExtendVisitor; -import com.vaadin.sass.visitor.IfElseVisitor; -import com.vaadin.sass.visitor.ImportVisitor; -import com.vaadin.sass.visitor.ListModifyVisitor; -import com.vaadin.sass.visitor.MixinVisitor; -import com.vaadin.sass.visitor.NestPropertiesVisitor; -import com.vaadin.sass.visitor.ParentSelectorVisitor; -import com.vaadin.sass.visitor.VariableVisitor; -import com.vaadin.sass.visitor.Visitor; +import com.vaadin.sass.tree.controldirective.IfElseDefNode; +import com.vaadin.sass.visitor.ImportNodeHandler; +import com.vaadin.sass.visitor.ParentSelectorHandler; public class ScssStylesheet extends Node { private static final long serialVersionUID = 3849790204404961608L; + private static ScssStylesheet mainStyleSheet = null; + + private static final HashMap variables = new HashMap(); + + private static final Map mixinDefs = new HashMap(); + + private static final HashSet ifElseDefNodes = new HashSet(); + + private String fileName; + /** * Read in a file SCSS and parse it into a ScssStylesheet * @@ -121,20 +126,32 @@ public class ScssStylesheet extends Node { * @throws Exception */ public void compile() throws Exception { - List visitors = new ArrayList(); - visitors.add(new ImportVisitor()); - visitors.add(new VariableVisitor()); - visitors.add(new MixinVisitor()); - visitors.add(new IfElseVisitor()); - visitors.add(new ParentSelectorVisitor()); - visitors.add(new BlockVisitor()); - visitors.add(new NestPropertiesVisitor()); - visitors.add(new ExtendVisitor()); - visitors.add(new EachVisitor()); - visitors.add(new ListModifyVisitor()); - for (Visitor visitor : visitors) { - visitor.traverse(this); + mainStyleSheet = this; + mixinDefs.clear(); + variables.clear(); + ifElseDefNodes.clear(); + ParentSelectorHandler.clear(); + importOtherFiles(this); + populateDefinitions(this); + traverse(this); + } + + private void importOtherFiles(ScssStylesheet node) { + ImportNodeHandler.traverse(node); + } + + private void populateDefinitions(Node node) { + if (node instanceof MixinDefNode) { + mixinDefs.put(((MixinDefNode) node).getName(), (MixinDefNode) node); + node.getParentNode().removeChild(node); + } else if (node instanceof IfElseDefNode) { + ifElseDefNodes.add((IfElseDefNode) node); + } + + for (final Node child : new ArrayList(node.getChildren())) { + populateDefinitions(child); } + } /** @@ -169,4 +186,63 @@ public class ScssStylesheet extends Node { } } + public static ScssStylesheet get() { + return mainStyleSheet; + } + + @Override + public void traverse() { + // Not used for ScssStylesheet + } + + public void traverse(Node node) { + node.traverse(); + + @SuppressWarnings("unchecked") + HashMap variableScope = (HashMap) variables + .clone(); + + int maxSize = node.getChildren().size(); + ArrayList oldChildren = new ArrayList(node.getChildren()); + for (int i = 0; i < maxSize; i++) { + + Node current = node.getChildren().get(i); + traverse(current); + + if (!node.getChildren().equals(oldChildren)) { + oldChildren = new ArrayList(node.getChildren()); + maxSize = node.getChildren().size(); + i = i - 1; + } + + } + + variables.clear(); + variables.putAll(variableScope); + } + + public static void addVariable(VariableNode node) { + variables.put(node.getName(), node); + } + + public static VariableNode getVariable(String string) { + return variables.get(string); + } + + public static ArrayList getVariables() { + return new ArrayList(variables.values()); + } + + public static MixinDefNode getMixinDefinition(String name) { + return mixinDefs.get(name); + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileName() { + return fileName; + } + } diff --git a/theme-compiler/src/com/vaadin/sass/parser/MediaListImpl.java b/theme-compiler/src/com/vaadin/sass/parser/MediaListImpl.java index 042e385cb3..bb321ea3cd 100644 --- a/theme-compiler/src/com/vaadin/sass/parser/MediaListImpl.java +++ b/theme-compiler/src/com/vaadin/sass/parser/MediaListImpl.java @@ -8,14 +8,20 @@ */ package com.vaadin.sass.parser; +import java.io.Serializable; + import org.w3c.css.sac.SACMediaList; /** * @version $Revision: 1.4 $ * @author Philippe Le Hegaret */ -public class MediaListImpl implements SACMediaList { +public class MediaListImpl implements SACMediaList, Serializable { + /** + * + */ + private static final long serialVersionUID = 1L; String[] array = new String[10]; int current; diff --git a/theme-compiler/src/com/vaadin/sass/parser/Parser.java b/theme-compiler/src/com/vaadin/sass/parser/Parser.java index 33411bd57d..996a15d9c8 100644 --- a/theme-compiler/src/com/vaadin/sass/parser/Parser.java +++ b/theme-compiler/src/com/vaadin/sass/parser/Parser.java @@ -3427,6 +3427,13 @@ boolean isPseudoElement = false; case IDENT: name = property(); break; + case VARIABLE: + name = variableName(); + name = "$"+name; + break; + case INTERPOLATION: + name = interpolation(); + break; case FUNCTION: name = functionName(); args = argValuelist(); @@ -3464,6 +3471,13 @@ boolean isPseudoElement = false; documentHandler.includeDirective(name, args); } + final public String interpolation() throws ParseException { + Token n; + n = jj_consume_token(INTERPOLATION); + {if (true) return n.image;} + throw new Error("Missing return statement in function"); + } + final public void listModifyDirective() throws ParseException { if (jj_2_12(5)) { removeDirective(); @@ -5648,26 +5662,6 @@ LexicalUnitImpl result = null; finally { jj_save(14, xla); } } - private boolean jj_3R_205() { - if (jj_scan_token(DEG)) return true; - return false; - } - - private boolean jj_3R_204() { - if (jj_scan_token(EXS)) return true; - return false; - } - - private boolean jj_3R_203() { - if (jj_scan_token(EMS)) return true; - return false; - } - - private boolean jj_3_1() { - if (jj_3R_156()) return true; - return false; - } - private boolean jj_3R_202() { if (jj_scan_token(PX)) return true; return false; @@ -5683,6 +5677,11 @@ LexicalUnitImpl result = null; return false; } + private boolean jj_3_1() { + if (jj_3R_156()) return true; + return false; + } + private boolean jj_3R_199() { if (jj_scan_token(MM)) return true; return false; @@ -5708,22 +5707,11 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3_4() { - if (jj_3R_159()) return true; - if (jj_3R_160()) return true; - return false; - } - private boolean jj_3R_185() { if (jj_3R_221()) return true; return false; } - private boolean jj_3_7() { - if (jj_3R_156()) return true; - return false; - } - private boolean jj_3R_195() { if (jj_scan_token(NUMBER)) return true; return false; @@ -5734,16 +5722,6 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_191() { - if (jj_scan_token(COLON)) return true; - return false; - } - - private boolean jj_3_6() { - if (jj_3R_161()) return true; - return false; - } - private boolean jj_3R_181() { Token xsp; xsp = jj_scanpos; @@ -5807,6 +5785,12 @@ LexicalUnitImpl result = null; return false; } + private boolean jj_3_4() { + if (jj_3R_159()) return true; + if (jj_3R_160()) return true; + return false; + } + private boolean jj_3R_179() { if (jj_3R_193()) return true; return false; @@ -5826,6 +5810,21 @@ LexicalUnitImpl result = null; return false; } + private boolean jj_3_7() { + if (jj_3R_156()) return true; + return false; + } + + private boolean jj_3R_191() { + if (jj_scan_token(COLON)) return true; + return false; + } + + private boolean jj_3_6() { + if (jj_3R_161()) return true; + return false; + } + private boolean jj_3R_161() { if (jj_3R_178()) return true; if (jj_scan_token(COLON)) return true; @@ -5873,21 +5872,11 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3_5() { - if (jj_3R_161()) return true; - return false; - } - private boolean jj_3_14() { if (jj_3R_166()) return true; return false; } - private boolean jj_3_2() { - if (jj_3R_156()) return true; - return false; - } - private boolean jj_3R_240() { if (jj_scan_token(URL)) return true; return false; @@ -5908,11 +5897,21 @@ LexicalUnitImpl result = null; return false; } + private boolean jj_3_5() { + if (jj_3R_161()) return true; + return false; + } + private boolean jj_3R_167() { if (jj_3R_183()) return true; return false; } + private boolean jj_3_2() { + if (jj_3R_156()) return true; + return false; + } + private boolean jj_3R_164() { if (jj_scan_token(VARIABLE)) return true; Token xsp; @@ -5977,11 +5976,6 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_248() { - if (jj_scan_token(INTERPOLATION)) return true; - return false; - } - private boolean jj_3R_241() { if (jj_scan_token(UNICODERANGE)) return true; return false; @@ -5992,11 +5986,6 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3_10() { - if (jj_3R_161()) return true; - return false; - } - private boolean jj_3R_165() { if (jj_scan_token(VARIABLE)) return true; Token xsp; @@ -6018,13 +6007,8 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_192() { - if (jj_scan_token(LBRACKET)) return true; - return false; - } - - private boolean jj_3R_158() { - if (jj_3R_161()) return true; + private boolean jj_3R_248() { + if (jj_scan_token(INTERPOLATION)) return true; return false; } @@ -6038,16 +6022,6 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_178() { - if (jj_scan_token(IDENT)) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_scan_token(1)) { jj_scanpos = xsp; break; } - } - return false; - } - private boolean jj_3R_237() { if (jj_scan_token(FUNCTION)) return true; Token xsp; @@ -6061,13 +6035,8 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_242() { - if (jj_scan_token(VARIABLE)) return true; - Token xsp; - while (true) { - xsp = jj_scanpos; - if (jj_scan_token(1)) { jj_scanpos = xsp; break; } - } + private boolean jj_3_10() { + if (jj_3R_161()) return true; return false; } @@ -6091,13 +6060,23 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_235() { - if (jj_scan_token(PARENT)) return true; + private boolean jj_3R_192() { + if (jj_scan_token(LBRACKET)) return true; return false; } - private boolean jj_3R_234() { - if (jj_scan_token(ANY)) return true; + private boolean jj_3R_158() { + if (jj_3R_161()) return true; + return false; + } + + private boolean jj_3R_178() { + if (jj_scan_token(IDENT)) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_scan_token(1)) { jj_scanpos = xsp; break; } + } return false; } @@ -6106,6 +6085,16 @@ LexicalUnitImpl result = null; return false; } + private boolean jj_3R_242() { + if (jj_scan_token(VARIABLE)) return true; + Token xsp; + while (true) { + xsp = jj_scanpos; + if (jj_scan_token(1)) { jj_scanpos = xsp; break; } + } + return false; + } + private boolean jj_3R_217() { if (jj_3R_240()) return true; return false; @@ -6129,6 +6118,21 @@ LexicalUnitImpl result = null; return false; } + private boolean jj_3R_216() { + if (jj_3R_239()) return true; + return false; + } + + private boolean jj_3R_235() { + if (jj_scan_token(PARENT)) return true; + return false; + } + + private boolean jj_3R_234() { + if (jj_scan_token(ANY)) return true; + return false; + } + private boolean jj_3R_247() { if (jj_scan_token(IDENT)) return true; return false; @@ -6144,11 +6148,6 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_216() { - if (jj_3R_239()) return true; - return false; - } - private boolean jj_3R_233() { Token xsp; if (jj_3R_243()) return true; @@ -6294,11 +6293,24 @@ LexicalUnitImpl result = null; return false; } + private boolean jj_3R_238() { + if (jj_scan_token(DOT)) return true; + return false; + } + private boolean jj_3R_232() { if (jj_scan_token(PRECEDES)) return true; return false; } + private boolean jj_3R_215() { + Token xsp; + xsp = jj_scanpos; + if (jj_3R_238()) jj_scanpos = xsp; + if (jj_scan_token(IDENT)) return true; + return false; + } + private boolean jj_3R_231() { if (jj_scan_token(PLUS)) return true; return false; @@ -6319,6 +6331,11 @@ LexicalUnitImpl result = null; return false; } + private boolean jj_3R_214() { + if (jj_scan_token(STRING)) return true; + return false; + } + private boolean jj_3R_171() { if (jj_scan_token(PRECEDES)) return true; Token xsp; @@ -6329,16 +6346,27 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_238() { - if (jj_scan_token(DOT)) return true; + private boolean jj_3R_213() { + if (jj_3R_237()) return true; return false; } - private boolean jj_3R_215() { + private boolean jj_3R_182() { Token xsp; xsp = jj_scanpos; - if (jj_3R_238()) jj_scanpos = xsp; - if (jj_scan_token(IDENT)) return true; + if (jj_3R_214()) { + jj_scanpos = xsp; + if (jj_3R_215()) { + jj_scanpos = xsp; + if (jj_3R_216()) { + jj_scanpos = xsp; + if (jj_3R_217()) { + jj_scanpos = xsp; + if (jj_3R_218()) return true; + } + } + } + } return false; } @@ -6381,37 +6409,23 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_214() { - if (jj_scan_token(STRING)) return true; + private boolean jj_3R_212() { + if (jj_scan_token(DIMEN)) return true; return false; } - private boolean jj_3R_213() { - if (jj_3R_237()) return true; + private boolean jj_3R_211() { + if (jj_scan_token(KHZ)) return true; return false; } - private boolean jj_3R_182() { - Token xsp; - xsp = jj_scanpos; - if (jj_3R_214()) { - jj_scanpos = xsp; - if (jj_3R_215()) { - jj_scanpos = xsp; - if (jj_3R_216()) { - jj_scanpos = xsp; - if (jj_3R_217()) { - jj_scanpos = xsp; - if (jj_3R_218()) return true; - } - } - } - } + private boolean jj_3R_210() { + if (jj_scan_token(HZ)) return true; return false; } - private boolean jj_3R_212() { - if (jj_scan_token(DIMEN)) return true; + private boolean jj_3R_209() { + if (jj_scan_token(MS)) return true; return false; } @@ -6420,13 +6434,13 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_176() { - if (jj_3R_191()) return true; + private boolean jj_3R_208() { + if (jj_scan_token(SECOND)) return true; return false; } - private boolean jj_3R_211() { - if (jj_scan_token(KHZ)) return true; + private boolean jj_3R_176() { + if (jj_3R_191()) return true; return false; } @@ -6435,8 +6449,8 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_210() { - if (jj_scan_token(HZ)) return true; + private boolean jj_3R_207() { + if (jj_scan_token(GRAD)) return true; return false; } @@ -6450,18 +6464,18 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_209() { - if (jj_scan_token(MS)) return true; + private boolean jj_3R_206() { + if (jj_scan_token(RAD)) return true; return false; } - private boolean jj_3R_173() { - if (jj_3R_188()) return true; + private boolean jj_3R_205() { + if (jj_scan_token(DEG)) return true; return false; } - private boolean jj_3R_208() { - if (jj_scan_token(SECOND)) return true; + private boolean jj_3R_173() { + if (jj_3R_188()) return true; return false; } @@ -6489,13 +6503,13 @@ LexicalUnitImpl result = null; return false; } - private boolean jj_3R_207() { - if (jj_scan_token(GRAD)) return true; + private boolean jj_3R_204() { + if (jj_scan_token(EXS)) return true; return false; } - private boolean jj_3R_206() { - if (jj_scan_token(RAD)) return true; + private boolean jj_3R_203() { + if (jj_scan_token(EMS)) return true; return false; } @@ -6524,10 +6538,10 @@ LexicalUnitImpl result = null; jj_la1_0 = new int[] {0x0,0xc02,0xc02,0x0,0xc00,0x2,0x2,0x2,0x0,0xe8000000,0xc00,0x2,0xc00,0x2,0x0,0x2,0x0,0x2,0x2,0x2,0xe9f45400,0xe9f45400,0x2,0x400000,0x2,0x2,0x2,0x2,0x0,0x0,0x2,0x0,0x800000,0x2,0x0,0x2,0x2,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,0x1f45400,0x2,0x2,0x1100000,0x2,0x1100000,0x1100002,0x2,0x80080002,0x80080002,0x2,0x2,0x2,0x2,0x2,0xe8000000,0x0,0x0,0x0,0xe8000000,0x2,0x400000,0x2,0x2,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0x88000000,0xe8000000,0x0,0x0,0x0,0x0,0x60000000,0x2,0x2,0xfc000,0x2,0x0,0x2,0xfc000,0x0,0x2,0x2,0x0,0x2,0x0,0x2,0x800000,0x27380002,0x2,0xe8000000,0x0,0xe8000000,0x2,0x0,0x2,0x27380002,0x0,0x2,0xe8000000,0x0,0xe8000000,0x2,0x27380002,0x2,0x2,0x2,0x0,0x2,0xe8000000,0x0,0x0,0xe8000000,0x2,0x2,0x400000,0x2,0x2,0x2,0x2,0x0,0x2,0xe8000000,0x0,0x0,0xe8000000,0x2,0x400000,0x2,0x2,0x2,0x400000,0x0,0x0,0x80300000,0x2,0x0,0x400000,0x2,0x80300000,0x2,0x0,0x2,0x0,0x2,0x800000,0x2,0x2,0x2,0x0,0x2,0x2,0x2,0x400000,0x2,0x2,0x2,0x2,0x2,0x0,0x2,0x2,0x2,0x400000,0x2,0x2,0x2,0x2,0x2,0x0,0x2,0x2,0x2,0x400000,0x2,0x2,0x0,0x2,0x2,0x2,0x800000,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,0x2,0x0,0x2,0x0,0x800000,0x2,0x0,0x2,0x80301000,0x2,0x0,0x2,0x2,0x2,0x2,0x4400000,0x4400000,0x300000,0x80300000,0x300000,0x0,0x80000000,0x80000000,0x80300000,0x2,0x2,0x80300000,0x2,0xe8000000,0x2,0x2,0x2,0x0,0x800000,0x2,0x0,0x2,}; } private static void jj_la1_init_1() { - jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x283000c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc2,0xc2,0x0,0x0,0x0,0x0,0x0,0xa82000c0,0x0,0x20000000,0x88200000,0xc0,0x0,0x0,0x0,0x0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xc0,0x80,0x80,0x80,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3f,0x0,0x802000c0,0x80200000,0xc0,0x0,0x40000000,0x0,0x3f,0x0,0x0,0x802000c0,0x80200000,0xc0,0x0,0x3f,0x0,0x0,0x0,0x0,0x0,0x802000c0,0x200000,0x80000000,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x882000c0,0x200000,0x88000000,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x40,0x40,0x0,0x40,0x0,0x0,0x40,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x60000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x283000c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc2,0xc2,0x0,0x0,0x0,0x0,0x0,0xa82000c0,0x0,0x20000000,0x88200000,0xc0,0x0,0x0,0x0,0x0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xc0,0x80,0x80,0x80,0x80,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3f,0x0,0x802000c0,0x80200000,0xc0,0x0,0x40000000,0x0,0x3f,0x0,0x0,0x802000c0,0x80200000,0xc0,0x0,0x3f,0x0,0x0,0x0,0x0,0x0,0x802000c0,0x200000,0x80000000,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x882000c0,0x200000,0x88000000,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x40,0x40,0x0,0x40,0x0,0x0,0x40,0x0,0x40,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,0x0,0x0,0x60000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_init_2() { - jj_la1_2 = new int[] {0x80000000,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x400,0x50000440,0x0,0x0,0x0,0x0,0x220,0x0,0x40,0x0,0x0,0x0,0xf0000ae0,0xf0000ae0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0xe0000aa0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0xc0,0x0,0x0,0x0,0x0,0x0,0x50000444,0x44,0x0,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x10000000,0x10000000,0x0,0x0,0x10000000,0x10000000,0x10000000,0x10000000,0x10000000,0x10000000,0x10000040,0x40,0x40,0x40,0x40,0x40,0x0,0x0,0x0,0x0,0x60,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x10,0x0,0x0,0x4c0,0x0,0x50000440,0x40000400,0x10000040,0x0,0x0,0x0,0x4c0,0x8,0x0,0x50000440,0x40000400,0x10000040,0x0,0x4c0,0x0,0x0,0x0,0x440,0x0,0x50000440,0x0,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x50000440,0x40000000,0x400,0x10000040,0x0,0x0,0x0,0x0,0x0,0x0,0x400,0x400,0x1ffffee0,0x0,0x0,0x0,0x0,0x1ffffee0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x1ffffee0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1ffffee0,0x0,0xffff880,0x0,0x10000260,0x1ffffae0,0x0,0x0,0x1ffffee0,0x0,0x70000040,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,}; + jj_la1_2 = new int[] {0x80000000,0x0,0x0,0x20000000,0x0,0x0,0x0,0x0,0x400,0x50000440,0x0,0x0,0x0,0x0,0x220,0x0,0x40,0x0,0x0,0x0,0xf0000ae0,0xf0000ae0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0xe0000aa0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0xc0,0x0,0x0,0x0,0x0,0x0,0x50000444,0x44,0x0,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x10000000,0x10000000,0x0,0x0,0x10000000,0x10000000,0x10000000,0x10000000,0x10000000,0x10000000,0x10000040,0x40,0x40,0x40,0x40,0x40,0x0,0x0,0x0,0x0,0x60,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x10,0x0,0x0,0x4c0,0x0,0x50000440,0x40000400,0x10000040,0x0,0x0,0x0,0x4c0,0x8,0x0,0x50000440,0x40000400,0x10000040,0x0,0x4c0,0x0,0x0,0x0,0x440,0x0,0x50000440,0x0,0x40000400,0x10000040,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x50000440,0x40000000,0x400,0x10000040,0x0,0x0,0x0,0x0,0x0,0x0,0x400,0x400,0x1ffffee0,0x0,0x0,0x0,0x0,0x1ffffee0,0x0,0x0,0x0,0x440,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x1ffffee0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1ffffee0,0x0,0xffff880,0x0,0x10000260,0x1ffffae0,0x0,0x0,0x1ffffee0,0x0,0x70000040,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,}; } private static void jj_la1_init_3() { jj_la1_3 = new int[] {0x0,0x4,0x4,0x0,0x4,0x0,0x0,0x0,0x0,0x3,0x4,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6200f,0x6200f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6200f,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x20000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x22000,0x0,0x0,0x0,0x0,0x22000,0x0,0x0,0x0,0x20000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x22000,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x22000,0x0,0x20000,0x0,0x2000,0x22000,0x0,0x0,0x22000,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; diff --git a/theme-compiler/src/com/vaadin/sass/parser/Parser.jj b/theme-compiler/src/com/vaadin/sass/parser/Parser.jj index 92cb3e46c1..af53edb482 100644 --- a/theme-compiler/src/com/vaadin/sass/parser/Parser.jj +++ b/theme-compiler/src/com/vaadin/sass/parser/Parser.jj @@ -1576,12 +1576,18 @@ void includeDirective() : { ()* - (name = property() + (name = property()|name = variableName(){ name = "$"+name;}|name = interpolation() |(name = functionName() args = argValuelist()) )(";"()*)+ {documentHandler.includeDirective(name, args);} } +String interpolation() : +{ + Token n; } { + n = < INTERPOLATION > + { + return n.image; } } void listModifyDirective() : { } diff --git a/theme-compiler/src/com/vaadin/sass/tree/BlockNode.java b/theme-compiler/src/com/vaadin/sass/tree/BlockNode.java index 5a64a928db..07e4c69ed7 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/BlockNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/BlockNode.java @@ -18,7 +18,11 @@ package com.vaadin.sass.tree; import java.util.ArrayList; -public class BlockNode extends Node implements IVariableNode, InterpolationNode { +import com.vaadin.sass.ScssStylesheet; +import com.vaadin.sass.visitor.BlockNodeHandler; +import com.vaadin.sass.visitor.ParentSelectorHandler; + +public class BlockNode extends Node implements IVariableNode { private static final long serialVersionUID = 5742962631468325048L; @@ -94,25 +98,20 @@ public class BlockNode extends Node implements IVariableNode, InterpolationNode return b.toString(); } - @Override - public void replaceInterpolation(String variableName, String variable) { - if (selectorList == null || selectorList.isEmpty()) { - return; - } - - for (final String selector : new ArrayList(selectorList)) { - String interpolation = "#{" + variableName + "}"; - if (selector.contains(interpolation)) { - String replace = selector.replace(interpolation, variable); - selectorList.add(selectorList.indexOf(selector), replace); - selectorList.remove(selector); - } - } + public void setParentNode(Node node) { + parentNode.removeChild(this); + node.appendChild(this); } @Override - public boolean containsInterpolationVariable(String variable) { - return getSelectors().contains(variable); + public void traverse() { + try { + ParentSelectorHandler.traverse(this); + BlockNodeHandler.traverse(this); + replaceVariables(ScssStylesheet.getVariables()); + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/CommentNode.java b/theme-compiler/src/com/vaadin/sass/tree/CommentNode.java index 5fb438bb08..b867c5384b 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/CommentNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/CommentNode.java @@ -35,4 +35,9 @@ public class CommentNode extends Node { public String toString() { return comment; } + + @Override + public void traverse() { + // Not used in CommentNode + } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/ExtendNode.java b/theme-compiler/src/com/vaadin/sass/tree/ExtendNode.java index 909e69e12f..b9bf5869d1 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/ExtendNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/ExtendNode.java @@ -18,6 +18,8 @@ package com.vaadin.sass.tree; import java.util.ArrayList; +import com.vaadin.sass.visitor.ExtendNodeHandler; + public class ExtendNode extends Node implements IVariableNode { private static final long serialVersionUID = 3301805078983796878L; @@ -45,4 +47,14 @@ public class ExtendNode extends Node implements IVariableNode { return b.toString(); } + + @Override + public void traverse() { + try { + ExtendNodeHandler.traverse(this); + getParentNode().removeChild(this); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/FontFaceNode.java b/theme-compiler/src/com/vaadin/sass/tree/FontFaceNode.java index 3dab4df773..9e3b24f8de 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/FontFaceNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/FontFaceNode.java @@ -15,4 +15,9 @@ public class FontFaceNode extends Node { return builder.toString(); } + @Override + public void traverse() { + // Not in use for FontFaceNode + } + } diff --git a/theme-compiler/src/com/vaadin/sass/tree/ForNode.java b/theme-compiler/src/com/vaadin/sass/tree/ForNode.java index 7c0239aa60..da0d784229 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/ForNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/ForNode.java @@ -41,4 +41,9 @@ public class ForNode extends Node { + to + ", exclusive: " + exclusive + ", body" + body; } + @Override + public void traverse() { + + } + } diff --git a/theme-compiler/src/com/vaadin/sass/tree/FunctionNode.java b/theme-compiler/src/com/vaadin/sass/tree/FunctionNode.java index 6263d557b8..d81e4976e5 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/FunctionNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/FunctionNode.java @@ -18,6 +18,8 @@ package com.vaadin.sass.tree; import java.util.ArrayList; +import com.vaadin.sass.ScssStylesheet; + public class FunctionNode extends Node implements IVariableNode { private static final long serialVersionUID = -5383104165955523923L; @@ -50,4 +52,9 @@ public class FunctionNode extends Node implements IVariableNode { } } } + + @Override + public void traverse() { + replaceVariables(ScssStylesheet.getVariables()); + } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/ImportNode.java b/theme-compiler/src/com/vaadin/sass/tree/ImportNode.java index ac070d6ffc..9dd9c1b0d8 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/ImportNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/ImportNode.java @@ -18,6 +18,9 @@ package com.vaadin.sass.tree; import org.w3c.css.sac.SACMediaList; +import com.vaadin.sass.ScssStylesheet; +import com.vaadin.sass.visitor.ImportNodeHandler; + public class ImportNode extends Node { private static final long serialVersionUID = 5671255892282668438L; @@ -68,4 +71,10 @@ public class ImportNode extends Node { public SACMediaList getMl() { return ml; } + + @Override + public void traverse() { + // TODO shouldn't be reached with current setup, try anyway? + ImportNodeHandler.traverse((ScssStylesheet) getParentNode()); + } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/InterpolationNode.java b/theme-compiler/src/com/vaadin/sass/tree/InterpolationNode.java deleted file mode 100644 index c998b60b52..0000000000 --- a/theme-compiler/src/com/vaadin/sass/tree/InterpolationNode.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.vaadin.sass.tree; - -public interface InterpolationNode { - public void replaceInterpolation(String variableName, String variable); - - public boolean containsInterpolationVariable(String variable); -} diff --git a/theme-compiler/src/com/vaadin/sass/tree/ListModifyNode.java b/theme-compiler/src/com/vaadin/sass/tree/ListModifyNode.java index d54f56f8a7..c571fde08e 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/ListModifyNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/ListModifyNode.java @@ -3,6 +3,7 @@ package com.vaadin.sass.tree; import java.util.ArrayList; import java.util.Arrays; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.parser.LexicalUnitImpl; public abstract class ListModifyNode extends Node implements IVariableNode { @@ -99,4 +100,11 @@ public abstract class ListModifyNode extends Node implements IVariableNode { } } + @Override + public void traverse() { + replaceVariables(ScssStylesheet.getVariables()); + ScssStylesheet.addVariable(getModifiedList()); + getParentNode().removeChild(this); + } + } diff --git a/theme-compiler/src/com/vaadin/sass/tree/ListRemoveNode.java b/theme-compiler/src/com/vaadin/sass/tree/ListRemoveNode.java index 22fb216c9e..a72be7bc02 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/ListRemoveNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/ListRemoveNode.java @@ -2,8 +2,6 @@ package com.vaadin.sass.tree; import java.util.ArrayList; -import com.vaadin.sass.parser.LexicalUnitImpl; - public class ListRemoveNode extends ListModifyNode { public ListRemoveNode(String variable, String list, String remove, @@ -14,26 +12,9 @@ public class ListRemoveNode extends ListModifyNode { } - private boolean shouldInclude(LexicalUnitImpl current, - LexicalUnitImpl lastAccepted) { - - if (lastAccepted != null - && lastAccepted.getLexicalUnitType() == LexicalUnitImpl.SAC_OPERATOR_COMMA - && current.getLexicalUnitType() == LexicalUnitImpl.SAC_OPERATOR_COMMA) { - return false; - } - - String string = current.getValue().toString(); - for (final String s : modify) { - if (s.equals(string)) { - return false; - } - } - return true; - } - @Override protected void modifyList(ArrayList newList) { newList.removeAll(modify); } + } diff --git a/theme-compiler/src/com/vaadin/sass/tree/MediaNode.java b/theme-compiler/src/com/vaadin/sass/tree/MediaNode.java index b312d53a00..e410e93e53 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/MediaNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/MediaNode.java @@ -57,4 +57,9 @@ public class MediaNode extends Node { return builder.toString(); } + @Override + public void traverse() { + + } + } diff --git a/theme-compiler/src/com/vaadin/sass/tree/MicrosoftRuleNode.java b/theme-compiler/src/com/vaadin/sass/tree/MicrosoftRuleNode.java index cbd3b14289..ce2bdc8395 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/MicrosoftRuleNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/MicrosoftRuleNode.java @@ -2,6 +2,8 @@ package com.vaadin.sass.tree; import java.util.ArrayList; +import com.vaadin.sass.ScssStylesheet; + public class MicrosoftRuleNode extends Node implements IVariableNode { private final String name; @@ -26,4 +28,9 @@ public class MicrosoftRuleNode extends Node implements IVariableNode { public String toString() { return name + ": " + value + ";"; } + + @Override + public void traverse() { + replaceVariables(ScssStylesheet.getVariables()); + } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/MixinDefNode.java b/theme-compiler/src/com/vaadin/sass/tree/MixinDefNode.java index 0cffbc3203..9f51a959b8 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/MixinDefNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/MixinDefNode.java @@ -19,6 +19,7 @@ package com.vaadin.sass.tree; import java.util.ArrayList; import java.util.Collection; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.util.DeepCopy; public class MixinDefNode extends Node implements IVariableNode { @@ -73,4 +74,15 @@ public class MixinDefNode extends Node implements IVariableNode { } } + @Override + public void traverse() { + if (!arglist.isEmpty()) { + for (final VariableNode arg : arglist) { + if (arg.getExpr() != null) { + ScssStylesheet.addVariable(arg); + } + } + } + } + } diff --git a/theme-compiler/src/com/vaadin/sass/tree/MixinNode.java b/theme-compiler/src/com/vaadin/sass/tree/MixinNode.java index 205f20b500..e43be0488a 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/MixinNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/MixinNode.java @@ -19,7 +19,9 @@ package com.vaadin.sass.tree; import java.util.ArrayList; import java.util.Collection; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.parser.LexicalUnitImpl; +import com.vaadin.sass.visitor.MixinNodeHandler; public class MixinNode extends Node implements IVariableNode { private static final long serialVersionUID = 4725008226813110658L; @@ -67,6 +69,27 @@ public class MixinNode extends Node implements IVariableNode { arg.replaceValue(var.getExpr()); } } + + if (name.startsWith("$")) { + if (name.equals("$" + var.getName())) { + name = var.getExpr().toString(); + } + } else if (name.startsWith("#{") && name.endsWith("}")) { + if (name.equals("#{$" + var.getName() + "}")) { + name = var.getExpr().toString(); + } + } + + } + } + + @Override + public void traverse() { + try { + replaceVariables(ScssStylesheet.getVariables()); + MixinNodeHandler.traverse(this); + } catch (Exception e) { + e.printStackTrace(); } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/NestPropertiesNode.java b/theme-compiler/src/com/vaadin/sass/tree/NestPropertiesNode.java index 27d3f5b23f..0b0dd90334 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/NestPropertiesNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/NestPropertiesNode.java @@ -20,6 +20,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import com.vaadin.sass.visitor.NestedNodeHandler; + public class NestPropertiesNode extends Node implements IVariableNode { private static final long serialVersionUID = 3671253315690598308L; @@ -41,7 +43,8 @@ public class NestPropertiesNode extends Node implements IVariableNode { public Collection unNesting() { List result = new ArrayList(); for (Node child : children) { - result.add(createNewRuleNodeFromChild((RuleNode) child)); + RuleNode createNewRuleNodeFromChild = createNewRuleNodeFromChild((RuleNode) child); + result.add(createNewRuleNodeFromChild); } return result; } @@ -63,4 +66,10 @@ public class NestPropertiesNode extends Node implements IVariableNode { } } } + + @Override + public void traverse() { + NestedNodeHandler.traverse(this); + } + } diff --git a/theme-compiler/src/com/vaadin/sass/tree/Node.java b/theme-compiler/src/com/vaadin/sass/tree/Node.java index 6e871df286..ccbd6d64da 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/Node.java +++ b/theme-compiler/src/com/vaadin/sass/tree/Node.java @@ -24,28 +24,34 @@ public abstract class Node implements Serializable { private static final long serialVersionUID = 5914711715839294816L; protected ArrayList children; - private String fileName; - protected String rawString; + protected Node parentNode; public Node() { children = new ArrayList(); } - public Node(String raw) { - this(); - rawString = raw; - } - public void appendAll(Collection nodes) { if (nodes != null && !nodes.isEmpty()) { children.addAll(nodes); + + for (final Node n : nodes) { + if (n.getParentNode() != null) { + n.getParentNode().removeChild(n); + } + n.setParentNode(this); + } + } } public void appendChild(Node node) { if (node != null) { children.add(node); + if (node.getParentNode() != null) { + node.getParentNode().removeChild(node); + } + node.setParentNode(this); } } @@ -54,6 +60,10 @@ public abstract class Node implements Serializable { int index = children.indexOf(after); if (index != -1) { children.add(index + 1, node); + if (node.getParentNode() != null) { + node.getParentNode().removeChild(node); + } + node.setParentNode(this); } else { throw new NullPointerException("after-node was not found"); } @@ -62,7 +72,10 @@ public abstract class Node implements Serializable { public void removeChild(Node node) { if (node != null) { - children.remove(node); + boolean removed = children.remove(node); + if (removed) { + node.setParentNode(null); + } } } @@ -78,21 +91,22 @@ public abstract class Node implements Serializable { return !children.isEmpty(); } - public void setFileName(String fileName) { - this.fileName = fileName; - } - - public String getFileName() { - return fileName; - } - @Override public String toString() { return ""; } - public String getRawString() { - return rawString; + /** + * Method for manipulating the data contained within the {@link Node}. + */ + public abstract void traverse(); + + public Node getParentNode() { + return parentNode; + } + + private void setParentNode(Node parentNode) { + this.parentNode = parentNode; } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/RuleNode.java b/theme-compiler/src/com/vaadin/sass/tree/RuleNode.java index aad4509616..38c5b1cb4e 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/RuleNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/RuleNode.java @@ -19,9 +19,10 @@ package com.vaadin.sass.tree; import java.util.ArrayList; import java.util.regex.Pattern; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.parser.LexicalUnitImpl; -public class RuleNode extends Node implements IVariableNode, InterpolationNode { +public class RuleNode extends Node implements IVariableNode { private static final long serialVersionUID = 6653493127869037022L; String variable; @@ -83,36 +84,51 @@ public class RuleNode extends Node implements IVariableNode, InterpolationNode { @Override public void replaceVariables(ArrayList variables) { for (final VariableNode node : variables) { + + String interpolation = "#{$" + node.getName() + "}"; + if (value.getLexicalUnitType() == LexicalUnitImpl.SAC_FUNCTION) { - if (value.getParameters().toString() - .contains("$" + node.getName())) { - if (value.getParameters() != null) { - if (value.getParameters().toString() - .contains(node.getName())) { - - LexicalUnitImpl param = value.getParameters(); - while (param != null) { - if (param.getValue().toString() - .contains(node.getName())) { - - LexicalUnitImpl expr = node.getExpr(); - - LexicalUnitImpl prev = param - .getPreviousLexicalUnit(); - LexicalUnitImpl next = param - .getNextLexicalUnit(); - - if (param.getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE) { - param.replaceValue(expr); - param.setPrevLexicalUnit(prev); - param.setNextLexicalUnit(next); - } + + if (value.getParameters() != null) { + if (value.getParameters().toString() + .contains(node.getName())) { + + LexicalUnitImpl param = value.getParameters(); + while (param != null) { + if (param.getValue().toString() + .contains(node.getName())) { + + LexicalUnitImpl expr = node.getExpr(); + + LexicalUnitImpl prev = param + .getPreviousLexicalUnit(); + LexicalUnitImpl next = param + .getNextLexicalUnit(); + + if (param.getLexicalUnitType() == LexicalUnitImpl.SCSS_VARIABLE) { + param.replaceValue(expr); + param.setPrevLexicalUnit(prev); + param.setNextLexicalUnit(next); } - param = param.getNextLexicalUnit(); } + param = param.getNextLexicalUnit(); } } } + } else if (value.getStringValue() != null + && value.getStringValue().contains(interpolation)) { + LexicalUnitImpl current = value; + while (current != null) { + if (current.getValue().toString().contains(interpolation)) { + + current.setStringValue(current + .getValue() + .toString() + .replaceAll(Pattern.quote(interpolation), + node.getExpr().toString())); + } + current = current.getNextLexicalUnit(); + } } else { LexicalUnitImpl current = value; while (current != null) { @@ -129,32 +145,7 @@ public class RuleNode extends Node implements IVariableNode, InterpolationNode { } @Override - public void replaceInterpolation(String variableName, String variable) { - if (this.variable.contains(variableName)) { - this.variable = this.variable.replaceAll(variableName, variable); - } - - if (value.toString().contains(variableName)) { - - LexicalUnitImpl current = value; - while (current != null) { - if (current.getValue().toString().contains(variableName)) { - current.setStringValue(current - .getValue() - .toString() - .replaceAll( - Pattern.quote("#{" + variableName + "}"), - variable)); - } - - current = value.getNextLexicalUnit(); - } - } - } - - @Override - public boolean containsInterpolationVariable(String variable) { - return value.toString().contains(variable) - || this.variable.contains(variable); + public void traverse() { + replaceVariables(ScssStylesheet.getVariables()); } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/SimpleNode.java b/theme-compiler/src/com/vaadin/sass/tree/SimpleNode.java index 52329c1b14..adf1a3d15d 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/SimpleNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/SimpleNode.java @@ -2,6 +2,8 @@ package com.vaadin.sass.tree; import java.util.ArrayList; +import com.vaadin.sass.ScssStylesheet; + /** * A simple BlockNode where input text equals output. Note : ignores any * possible children so only use it when you are sure no child nodes will be @@ -33,4 +35,9 @@ public class SimpleNode extends Node implements IVariableNode { } } } + + @Override + public void traverse() { + replaceVariables(ScssStylesheet.getVariables()); + } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/VariableNode.java b/theme-compiler/src/com/vaadin/sass/tree/VariableNode.java index 6ba27ebac5..3ea8379829 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/VariableNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/VariableNode.java @@ -18,7 +18,9 @@ package com.vaadin.sass.tree; import java.util.ArrayList; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.parser.LexicalUnitImpl; +import com.vaadin.sass.visitor.VariableNodeHandler; public class VariableNode extends Node implements IVariableNode { private static final long serialVersionUID = 7003372557547748734L; @@ -92,4 +94,10 @@ public class VariableNode extends Node implements IVariableNode { unit = unit.getNextLexicalUnit(); } } + + @Override + public void traverse() { + replaceVariables(ScssStylesheet.getVariables()); + VariableNodeHandler.traverse(this); + } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/WhileNode.java b/theme-compiler/src/com/vaadin/sass/tree/WhileNode.java index 465fec061d..4cd85a97a4 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/WhileNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/WhileNode.java @@ -32,4 +32,9 @@ public class WhileNode extends Node { return "While Node: { condition: " + condition + ", body:" + body + "}"; } + @Override + public void traverse() { + + } + } 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 cb209273cb..4ab8486add 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/controldirective/EachDefNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/controldirective/EachDefNode.java @@ -19,10 +19,12 @@ package com.vaadin.sass.tree.controldirective; import java.util.ArrayList; import java.util.List; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.parser.LexicalUnitImpl; import com.vaadin.sass.tree.IVariableNode; import com.vaadin.sass.tree.Node; import com.vaadin.sass.tree.VariableNode; +import com.vaadin.sass.visitor.EachNodeHandler; public class EachDefNode extends Node implements IVariableNode { private static final long serialVersionUID = 7943948981204906221L; @@ -88,4 +90,10 @@ public class EachDefNode extends Node implements IVariableNode { public String getListVariable() { return listVariable; } + + @Override + public void traverse() { + replaceVariables(ScssStylesheet.getVariables()); + EachNodeHandler.traverse(this); + } } diff --git a/theme-compiler/src/com/vaadin/sass/tree/controldirective/ElseNode.java b/theme-compiler/src/com/vaadin/sass/tree/controldirective/ElseNode.java index 529ce4d76e..ecda69d601 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/controldirective/ElseNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/controldirective/ElseNode.java @@ -9,4 +9,9 @@ public class ElseNode extends Node implements IfElseNode { return null; } + @Override + public void traverse() { + + } + } diff --git a/theme-compiler/src/com/vaadin/sass/tree/controldirective/IfElseDefNode.java b/theme-compiler/src/com/vaadin/sass/tree/controldirective/IfElseDefNode.java index 5bd3ba526c..9a818f0a20 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/controldirective/IfElseDefNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/controldirective/IfElseDefNode.java @@ -1,6 +1,7 @@ package com.vaadin.sass.tree.controldirective; import com.vaadin.sass.tree.Node; +import com.vaadin.sass.visitor.IfElseNodeHandler; public class IfElseDefNode extends Node { @@ -14,4 +15,17 @@ public class IfElseDefNode extends Node { return b.toString(); } + public void traverse() { + try { + + for (final Node child : children) { + child.traverse(); + } + + IfElseNodeHandler.traverse(this); + } catch (Exception e) { + e.printStackTrace(); + } + } + } diff --git a/theme-compiler/src/com/vaadin/sass/tree/controldirective/IfNode.java b/theme-compiler/src/com/vaadin/sass/tree/controldirective/IfNode.java index 8de7ccf78a..cdaf1b0552 100644 --- a/theme-compiler/src/com/vaadin/sass/tree/controldirective/IfNode.java +++ b/theme-compiler/src/com/vaadin/sass/tree/controldirective/IfNode.java @@ -18,6 +18,7 @@ package com.vaadin.sass.tree.controldirective; import java.util.ArrayList; import java.util.regex.Pattern; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.tree.IVariableNode; import com.vaadin.sass.tree.Node; import com.vaadin.sass.tree.VariableNode; @@ -46,11 +47,17 @@ public class IfNode extends Node implements IfElseNode, IVariableNode { @Override public void replaceVariables(ArrayList variables) { for (final VariableNode node : variables) { - if (expression.contains("$" + node.getName())) { - expression = expression.replaceAll(Pattern.quote("$" - + node.getName()), node.getExpr().toString()); + String variable = "$" + node.getName(); + if (expression.contains(variable)) { + expression = expression.replaceAll(Pattern.quote(variable), + node.getExpr().toString()); } } } + @Override + public void traverse() { + replaceVariables(ScssStylesheet.getVariables()); + } + } \ No newline at end of file diff --git a/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java new file mode 100644 index 0000000000..efbfc4b8ff --- /dev/null +++ b/theme-compiler/src/com/vaadin/sass/visitor/BlockNodeHandler.java @@ -0,0 +1,63 @@ +/* + * 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 com.vaadin.sass.tree.BlockNode; +import com.vaadin.sass.tree.Node; + +public class BlockNodeHandler { + + public static void traverse(BlockNode node) { + + Node parent = node.getParentNode(); + if (node.getChildren().size() == 0) { + parent.removeChild(node); + while (parent != null && parent instanceof BlockNode + && parent.getChildren().size() == 0) { + Node temp = parent; + parent = parent.getParentNode(); + parent.removeChild(temp); + } + + return; + } + + if (parent instanceof BlockNode) { + combineParentSelectorListToChild(node); + } + } + + private static void combineParentSelectorListToChild(BlockNode node) { + ArrayList newList = new ArrayList(); + ArrayList parentSelectors = ((BlockNode) node.getParentNode()) + .getSelectorList(); + ArrayList childSelectors = ((BlockNode) 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); + } + + } + node.setSelectorList(newList); + node.getParentNode().getParentNode() + .appendChild(node, node.getParentNode()); + } +} diff --git a/theme-compiler/src/com/vaadin/sass/visitor/BlockVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/BlockVisitor.java deleted file mode 100644 index 3cbf7e1f98..0000000000 --- a/theme-compiler/src/com/vaadin/sass/visitor/BlockVisitor.java +++ /dev/null @@ -1,75 +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.HashSet; -import java.util.Set; - -import com.vaadin.sass.tree.BlockNode; -import com.vaadin.sass.tree.Node; - -public class BlockVisitor implements Visitor { - - @Override - public void traverse(Node node) { - traverse(null, node); - } - - private void traverse(Node parent, Node node) { - Node after = node; - Set toBeDeleted = new HashSet(); - for (int pos = 0; pos < node.getChildren().size(); pos++) { - Node child = node.getChildren().get(pos); - - traverse(node, child); - - if (child instanceof BlockNode && node instanceof BlockNode - && parent != null) { - combineParentSelectorListToChild(node, child); - toBeDeleted.add(child); - parent.appendChild(child, after); - after = child; - } else if (child instanceof BlockNode - && child.getChildren().size() == 0) { - toBeDeleted.add(child); - } - } - for (Node child : toBeDeleted) { - node.removeChild(child); - } - } - - private void combineParentSelectorListToChild(Node parent, Node child) { - if (parent instanceof BlockNode && child instanceof BlockNode) { - ArrayList newList = new ArrayList(); - ArrayList parentSelectors = ((BlockNode) parent) - .getSelectorList(); - ArrayList childSelectors = ((BlockNode) child) - .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) child).setSelectorList(newList); - } - } -} diff --git a/theme-compiler/src/com/vaadin/sass/visitor/EachNodeHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/EachNodeHandler.java new file mode 100644 index 0000000000..0eb86f3a80 --- /dev/null +++ b/theme-compiler/src/com/vaadin/sass/visitor/EachNodeHandler.java @@ -0,0 +1,57 @@ +package com.vaadin.sass.visitor; + +import java.util.ArrayList; + +import com.vaadin.sass.ScssStylesheet; +import com.vaadin.sass.parser.LexicalUnitImpl; +import com.vaadin.sass.tree.IVariableNode; +import com.vaadin.sass.tree.Node; +import com.vaadin.sass.tree.VariableNode; +import com.vaadin.sass.tree.controldirective.EachDefNode; +import com.vaadin.sass.util.DeepCopy; + +public class EachNodeHandler { + + public static void traverse(EachDefNode node) { + replaceEachDefNode(node); + } + + private static void replaceEachDefNode(EachDefNode defNode) { + Node last = defNode; + + for (final String var : defNode.getVariables()) { + VariableNode varNode = new VariableNode(defNode.getVariableName() + .substring(1), LexicalUnitImpl.createIdent(var), false); + ArrayList variables = new ArrayList( + ScssStylesheet.getVariables()); + variables.add(varNode); + + for (final Node child : defNode.getChildren()) { + + Node copy = (Node) DeepCopy.copy(child); + + replaceInterpolation(copy, variables); + + defNode.getParentNode().appendChild(copy, last); + last = copy; + } + + } + defNode.setChildren(new ArrayList()); + defNode.getParentNode().removeChild(defNode); + } + + private static void replaceInterpolation(Node copy, + ArrayList variables) { + if (copy instanceof IVariableNode) { + IVariableNode n = (IVariableNode) copy; + n.replaceVariables(variables); + } + + for (Node c : copy.getChildren()) { + replaceInterpolation(c, variables); + } + + } + +} diff --git a/theme-compiler/src/com/vaadin/sass/visitor/EachVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/EachVisitor.java deleted file mode 100644 index de58947982..0000000000 --- a/theme-compiler/src/com/vaadin/sass/visitor/EachVisitor.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.vaadin.sass.visitor; - -import java.util.HashMap; -import java.util.Map.Entry; - -import com.vaadin.sass.tree.BlockNode; -import com.vaadin.sass.tree.Node; -import com.vaadin.sass.tree.RuleNode; -import com.vaadin.sass.tree.controldirective.EachDefNode; -import com.vaadin.sass.util.DeepCopy; - -public class EachVisitor implements Visitor { - - HashMap controlDefs = new HashMap(); - private Node rootNode; - - @Override - public void traverse(Node node) throws Exception { - this.rootNode = node; - - findDefNodes(null, node); - - replaceControlNodes(); - - } - - private void findDefNodes(Node parent, Node node) { - for (Node child : node.getChildren()) { - findDefNodes(node, child); - } - if (node instanceof EachDefNode) { - controlDefs.put((EachDefNode) node, parent); - } - } - - private void replaceControlNodes() { - for (final Entry entry : controlDefs.entrySet()) { - replaceEachDefNode(entry.getKey(), entry.getValue()); - } - } - - private void replaceEachDefNode(EachDefNode defNode, Node parent) { - Node last = defNode; - for (final Node child : defNode.getChildren()) { - if (child instanceof BlockNode) { - BlockNode iNode = (BlockNode) child; - String interpolation = "#{" + defNode.getVariableName() + "}"; - if (iNode.containsInterpolationVariable(interpolation)) { - for (final String variable : defNode.getVariables()) { - BlockNode copy = (BlockNode) DeepCopy.copy(child); - copy.replaceInterpolation(defNode.getVariableName(), - variable); - - for (final Node blockChild : copy.getChildren()) { - if (blockChild instanceof RuleNode) { - ((RuleNode) blockChild).replaceInterpolation( - defNode.getVariableName(), variable); - } - } - - parent.appendChild(copy, last); - last = copy; - } - } - } - - last = child; - } - parent.removeChild(defNode); - } - -} diff --git a/theme-compiler/src/com/vaadin/sass/visitor/ExtendVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/ExtendNodeHandler.java similarity index 66% rename from theme-compiler/src/com/vaadin/sass/visitor/ExtendVisitor.java rename to theme-compiler/src/com/vaadin/sass/visitor/ExtendNodeHandler.java index 23519b6e69..0e05781072 100644 --- a/theme-compiler/src/com/vaadin/sass/visitor/ExtendVisitor.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/ExtendNodeHandler.java @@ -22,21 +22,20 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.tree.BlockNode; import com.vaadin.sass.tree.ExtendNode; import com.vaadin.sass.tree.Node; -public class ExtendVisitor implements Visitor { - private Map>> extendsMap = new HashMap>>(); +public class ExtendNodeHandler { + private static Map>> extendsMap = new HashMap>>(); - @Override - public void traverse(Node node) throws Exception { + public static void traverse(ExtendNode node) throws Exception { buildExtendsMap(node); - modifyTree(node); + modifyTree(ScssStylesheet.get()); } - @SuppressWarnings("unchecked") - private void modifyTree(Node node) throws Exception { + private static void modifyTree(Node node) throws Exception { for (Node child : node.getChildren()) { if (child instanceof BlockNode) { BlockNode blockNode = (BlockNode) child; @@ -62,42 +61,22 @@ public class ExtendVisitor implements Visitor { } } } - } else { - buildExtendsMap(child); } } } - private void buildExtendsMap(Node node) { - if (node instanceof BlockNode) { - BlockNode blockNode = (BlockNode) node; - for (Node child : new ArrayList(node.getChildren())) { - if (child instanceof ExtendNode) { - ExtendNode extendNode = (ExtendNode) child; - - String extendedString = extendNode.getListAsString(); - if (extendsMap.get(extendedString) == null) { - extendsMap.put(extendedString, - new ArrayList>()); - } - extendsMap.get(extendedString).add( - blockNode.getSelectorList()); - node.removeChild(child); - } else { - buildExtendsMap(child); - } - } - } else { - for (Node child : node.getChildren()) { - buildExtendsMap(child); - } + private static void buildExtendsMap(ExtendNode node) { + String extendedString = node.getListAsString(); + if (extendsMap.get(extendedString) == null) { + extendsMap.put(extendedString, new ArrayList>()); } - + extendsMap.get(extendedString).add( + ((BlockNode) node.getParentNode()).getSelectorList()); } - private void addAdditionalSelectorListToBlockNode(BlockNode blockNode, - ArrayList list, String selectorString) { + private static void addAdditionalSelectorListToBlockNode( + BlockNode blockNode, ArrayList list, String selectorString) { if (list != null) { for (int i = 0; i < list.size(); i++) { if (selectorString == null) { diff --git a/theme-compiler/src/com/vaadin/sass/visitor/IfElseNodeHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/IfElseNodeHandler.java new file mode 100644 index 0000000000..593f22a631 --- /dev/null +++ b/theme-compiler/src/com/vaadin/sass/visitor/IfElseNodeHandler.java @@ -0,0 +1,102 @@ +package com.vaadin.sass.visitor; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.commons.jexl2.Expression; +import org.apache.commons.jexl2.JexlEngine; +import org.apache.commons.jexl2.JexlException; +import org.w3c.flute.parser.ParseException; + +import com.vaadin.sass.tree.Node; +import com.vaadin.sass.tree.controldirective.ElseNode; +import com.vaadin.sass.tree.controldirective.IfElseDefNode; +import com.vaadin.sass.tree.controldirective.IfElseNode; +import com.vaadin.sass.tree.controldirective.IfNode; + +public class IfElseNodeHandler { + + private static final JexlEngine evaluator = new JexlEngine(); + private static final Pattern pattern = Pattern + .compile("[a-zA-Z0-9]*[a-zA-Z]+[a-zA-Z0-9]*"); + + public static void traverse(IfElseDefNode node) throws Exception { + + for (final Node child : node.getChildren()) { + if (child instanceof IfNode) { + try { + String expression = ((IfElseNode) child).getExpression(); + // We need to add ' ' for strings in the expression for + // jexl to understand that is should do a string + // comparison + expression = replaceStrings(expression); + Expression e = evaluator.createExpression(expression); + try { + Object eval = e.evaluate(null); + + Boolean result = false; + if (eval instanceof Boolean) { + result = (Boolean) eval; + } else if (eval instanceof String) { + result = Boolean.valueOf((String) eval); + } + + if (result) { + replaceDefNodeWithCorrectChild(node, + node.getParentNode(), child); + break; + } + } catch (ClassCastException ex) { + throw new ParseException( + "Invalid @if/@else in scss file, not a boolean expression : " + + child.toString()); + } catch (NullPointerException ex) { + throw new ParseException( + "Invalid @if/@else in scss file, not a boolean expression : " + + child.toString()); + } + } catch (JexlException e) { + throw new ParseException( + "Invalid @if/@else in scss file for " + + child.toString()); + } + } else { + if (!(child instanceof ElseNode) + && node.getChildren().indexOf(child) == node + .getChildren().size() - 1) { + throw new ParseException( + "Invalid @if/@else in scss file for " + node); + } else { + replaceDefNodeWithCorrectChild(node, node.getParentNode(), + child); + break; + } + } + } + + node.getParentNode().removeChild(node); + } + + private static String replaceStrings(String expression) { + expression = expression.replaceAll("\"", ""); + Matcher m = pattern.matcher(expression); + StringBuffer b = new StringBuffer(); + while (m.find()) { + String group = m.group(); + m.appendReplacement(b, "'" + group + "'"); + } + m.appendTail(b); + if (b.length() != 0) { + return b.toString(); + } + return expression; + } + + private static void replaceDefNodeWithCorrectChild(IfElseDefNode defNode, + Node parent, final Node child) { + for (final Node n : new ArrayList(child.getChildren())) { + parent.appendChild(n, defNode); + } + } +} diff --git a/theme-compiler/src/com/vaadin/sass/visitor/IfElseVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/IfElseVisitor.java deleted file mode 100644 index 2cffb890ee..0000000000 --- a/theme-compiler/src/com/vaadin/sass/visitor/IfElseVisitor.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.vaadin.sass.visitor; - -import java.util.HashMap; -import java.util.Map.Entry; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.jexl2.Expression; -import org.apache.commons.jexl2.JexlEngine; -import org.apache.commons.jexl2.JexlException; -import org.w3c.flute.parser.ParseException; - -import com.vaadin.sass.tree.Node; -import com.vaadin.sass.tree.controldirective.ElseNode; -import com.vaadin.sass.tree.controldirective.IfElseDefNode; -import com.vaadin.sass.tree.controldirective.IfElseNode; -import com.vaadin.sass.tree.controldirective.IfNode; - -public class IfElseVisitor implements Visitor { - - private HashMap controlDefs = new HashMap(); - - private static final JexlEngine evaluator = new JexlEngine(); - private static final Pattern pattern = Pattern - .compile("[a-zA-Z0-9]*[a-zA-Z]+[a-zA-Z0-9]*"); - - @Override - public void traverse(Node node) throws Exception { - addControlDefs(node, node); - - for (final Entry entry : controlDefs.entrySet()) { - IfElseDefNode defNode = entry.getValue(); - Node parent = entry.getKey(); - for (final Node child : defNode.getChildren()) { - if (child instanceof IfNode) { - try { - String expression = ((IfElseNode) child) - .getExpression(); - // We need to add ' ' for strings in the expression for - // jexl to understand that is should do a string - // comparison - expression = replaceStrings(expression); - Expression e = evaluator.createExpression(expression); - try { - Object eval = e.evaluate(null); - - Boolean result = false; - if (eval instanceof Boolean) { - result = (Boolean) eval; - } else if (eval instanceof String) { - result = Boolean.valueOf((String) eval); - } - - if (result) { - replaceDefNodeWithCorrectChild(defNode, parent, - child); - break; - } - System.out.println(); - } catch (ClassCastException ex) { - throw new ParseException( - "Invalid @if/@else in scss file, not a boolean expression : " - + child.toString()); - } catch (NullPointerException ex) { - throw new ParseException( - "Invalid @if/@else in scss file, not a boolean expression : " - + child.toString()); - } - } catch (JexlException e) { - throw new ParseException( - "Invalid @if/@else in scss file for " - + child.toString()); - } - } else { - if (!(child instanceof ElseNode) - && defNode.getChildren().indexOf(child) == defNode - .getChildren().size() - 1) { - throw new ParseException( - "Invalid @if/@else in scss file for " + defNode); - } else { - replaceDefNodeWithCorrectChild(defNode, parent, child); - break; - } - } - } - - parent.removeChild(defNode); - } - - } - - private String replaceStrings(String expression) { - expression = expression.replaceAll("\"", ""); - Matcher m = pattern.matcher(expression); - StringBuffer b = new StringBuffer(); - while (m.find()) { - String group = m.group(); - m.appendReplacement(b, "'" + group + "'"); - } - m.appendTail(b); - if (b.length() != 0) { - return b.toString(); - } - return expression; - } - - private void replaceDefNodeWithCorrectChild(IfElseDefNode defNode, - Node parent, final Node child) { - for (final Node n : child.getChildren()) { - parent.appendChild(n, defNode); - } - } - - private void addControlDefs(Node current, Node node) { - for (Node child : current.getChildren()) { - addControlDefs(node, child); - if (child instanceof IfElseDefNode) { - controlDefs.put(current, (IfElseDefNode) child); - } - } - } -} diff --git a/theme-compiler/src/com/vaadin/sass/visitor/ImportVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/ImportNodeHandler.java similarity index 84% rename from theme-compiler/src/com/vaadin/sass/visitor/ImportVisitor.java rename to theme-compiler/src/com/vaadin/sass/visitor/ImportNodeHandler.java index bda040be39..f2fb128128 100644 --- a/theme-compiler/src/com/vaadin/sass/visitor/ImportVisitor.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/ImportNodeHandler.java @@ -31,17 +31,15 @@ import com.vaadin.sass.tree.Node; import com.vaadin.sass.tree.RuleNode; import com.vaadin.sass.util.StringUtil; -public class ImportVisitor implements Visitor { +public class ImportNodeHandler { - @Override - public void traverse(Node node) { - for (Node child : new ArrayList(node.getChildren())) { - if (child instanceof ImportNode) { - ImportNode importNode = (ImportNode) child; + public static void traverse(ScssStylesheet node) { + ArrayList c = new ArrayList(node.getChildren()); + for (Node n : c) { + if (n instanceof ImportNode) { + ImportNode importNode = (ImportNode) n; if (!importNode.isPureCssImport()) { - try { - StringBuilder filePathBuilder = new StringBuilder( node.getFileName()); filePathBuilder.append(File.separatorChar).append( @@ -57,16 +55,20 @@ public class ImportVisitor implements Visitor { } if (imported == null) { throw new FileNotFoundException(importNode.getUri() - + " (parent: " + node.getFileName() + ")"); + + " (parent: " + + ScssStylesheet.get().getFileName() + ")"); } traverse(imported); + String prefix = getUrlPrefix(importNode.getUri()); if (prefix != null) { updateUrlInImportedSheet(imported, prefix); } + Node pre = importNode; - for (Node importedChild : imported.getChildren()) { + for (Node importedChild : new ArrayList( + imported.getChildren())) { node.appendChild(importedChild, pre); pre = importedChild; } @@ -81,7 +83,7 @@ public class ImportVisitor implements Visitor { } } - private String getUrlPrefix(String url) { + private static String getUrlPrefix(String url) { if (url == null) { return null; } @@ -92,7 +94,7 @@ public class ImportVisitor implements Visitor { return url.substring(0, pos + 1); } - private void updateUrlInImportedSheet(Node node, String prefix) { + private static void updateUrlInImportedSheet(Node node, String prefix) { for (Node child : node.getChildren()) { if (child instanceof RuleNode) { LexicalUnit value = ((RuleNode) child).getValue(); diff --git a/theme-compiler/src/com/vaadin/sass/visitor/ListModifyVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/ListModifyVisitor.java deleted file mode 100644 index 3edb599a07..0000000000 --- a/theme-compiler/src/com/vaadin/sass/visitor/ListModifyVisitor.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.vaadin.sass.visitor; - -import java.util.ArrayList; - -import com.vaadin.sass.tree.ListModifyNode; -import com.vaadin.sass.tree.Node; - -public class ListModifyVisitor implements Visitor { - - @Override - public void traverse(Node node) throws Exception { - for (final Node child : new ArrayList(node.getChildren())) { - removeNodes(child, node); - } - } - - private void removeNodes(Node child, Node parent) { - for (final Node c : new ArrayList(child.getChildren())) { - removeNodes(c, child); - } - - if (child instanceof ListModifyNode) { - parent.removeChild(child); - } - - } -} diff --git a/theme-compiler/src/com/vaadin/sass/visitor/MixinVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/MixinNodeHandler.java similarity index 64% rename from theme-compiler/src/com/vaadin/sass/visitor/MixinVisitor.java rename to theme-compiler/src/com/vaadin/sass/visitor/MixinNodeHandler.java index fecc717437..3c31ee1073 100644 --- a/theme-compiler/src/com/vaadin/sass/visitor/MixinVisitor.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/MixinNodeHandler.java @@ -17,9 +17,8 @@ package com.vaadin.sass.visitor; import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; +import com.vaadin.sass.ScssStylesheet; import com.vaadin.sass.parser.LexicalUnitImpl; import com.vaadin.sass.tree.IVariableNode; import com.vaadin.sass.tree.MixinDefNode; @@ -28,57 +27,35 @@ import com.vaadin.sass.tree.Node; import com.vaadin.sass.tree.VariableNode; import com.vaadin.sass.util.DeepCopy; -public class MixinVisitor implements Visitor { - Map mixinDefs = new HashMap(); - - @Override - public void traverse(Node node) throws Exception { - // create mixin map. - for (Node child : node.getChildren()) { - if (child instanceof MixinDefNode) { - mixinDefs.put(((MixinDefNode) child).getName(), - (MixinDefNode) child); - } - } +public class MixinNodeHandler { + public static void traverse(MixinNode node) throws Exception { replaceMixins(node); - - // delete MixinDefNode - for (Node child : new ArrayList(node.getChildren())) { - if (child instanceof MixinDefNode) { - node.removeChild(child); - } - } - } - private void replaceMixins(Node node) throws Exception { - for (Node child : new ArrayList(node.getChildren())) { - replaceMixins(child); - if (child instanceof MixinNode) { - MixinNode mixinNode = (MixinNode) child; - MixinDefNode mixinDef = mixinDefs.get(mixinNode.getName()); - if (mixinDef == null) { - throw new Exception("Mixin Definition: " - + mixinNode.getName() + " not found"); - } - replaceMixinNode(node, mixinNode, mixinDef); - } + private static void replaceMixins(MixinNode node) throws Exception { + MixinDefNode mixinDef = ScssStylesheet.getMixinDefinition(node + .getName()); + if (mixinDef == null) { + throw new Exception("Mixin Definition: " + node.getName() + + " not found"); } + replaceMixinNode(node, mixinDef); } - private void replaceMixinNode(Node current, MixinNode mixinNode, + private static void replaceMixinNode(MixinNode mixinNode, MixinDefNode mixinDef) { Node pre = mixinNode; + + MixinDefNode defClone = (MixinDefNode) DeepCopy.copy(mixinDef); + if (mixinDef.getArglist().isEmpty()) { - for (Node child : mixinDef.getChildren()) { - current.appendChild(child, pre); + for (Node child : new ArrayList(defClone.getChildren())) { + mixinNode.getParentNode().appendChild(child, pre); pre = child; } } else { - MixinDefNode defClone = (MixinDefNode) DeepCopy.copy(mixinDef); - replacePossibleArguments(mixinNode, defClone); Node previous = mixinNode; @@ -88,14 +65,15 @@ public class MixinVisitor implements Visitor { replaceChildVariables(defClone, clone); - current.appendChild(clone, previous); + mixinNode.getParentNode().appendChild(clone, previous); previous = clone; } } - current.removeChild(mixinNode); + + mixinNode.getParentNode().removeChild(mixinNode); } /** @@ -106,7 +84,8 @@ public class MixinVisitor implements Visitor { * @param mixinNode * @param def */ - private void replacePossibleArguments(MixinNode mixinNode, MixinDefNode def) { + private static void replacePossibleArguments(MixinNode mixinNode, + MixinDefNode def) { if (mixinNode.getArglist().size() > 0) { ArrayList remainingNodes = new ArrayList( @@ -140,7 +119,7 @@ public class MixinVisitor implements Visitor { } - private void replaceChildVariables(MixinDefNode mixinDef, Node node) { + private static void replaceChildVariables(MixinDefNode mixinDef, Node node) { for (final Node child : node.getChildren()) { replaceChildVariables(mixinDef, child); } diff --git a/theme-compiler/src/com/vaadin/sass/visitor/NestPropertiesVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/NestedNodeHandler.java similarity index 54% rename from theme-compiler/src/com/vaadin/sass/visitor/NestPropertiesVisitor.java rename to theme-compiler/src/com/vaadin/sass/visitor/NestedNodeHandler.java index 82fbef42ef..bb094885f0 100644 --- a/theme-compiler/src/com/vaadin/sass/visitor/NestPropertiesVisitor.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/NestedNodeHandler.java @@ -16,28 +16,18 @@ package com.vaadin.sass.visitor; -import java.util.ArrayList; - import com.vaadin.sass.tree.NestPropertiesNode; import com.vaadin.sass.tree.Node; import com.vaadin.sass.tree.RuleNode; -public class NestPropertiesVisitor implements Visitor { +public class NestedNodeHandler { - @Override - public void traverse(Node node) { - for (Node child : new ArrayList(node.getChildren())) { - if (child instanceof NestPropertiesNode) { - Node previous = child; - for (RuleNode unNested : ((NestPropertiesNode) child) - .unNesting()) { - node.appendChild(unNested, previous); - previous = unNested; - node.removeChild(child); - } - } else { - traverse(child); - } + public static void traverse(NestPropertiesNode node) { + Node previous = node; + for (RuleNode unNested : node.unNesting()) { + node.getParentNode().appendChild(unNested, previous); + previous = unNested; } + node.getParentNode().removeChild(node); } } diff --git a/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java b/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java new file mode 100644 index 0000000000..77e0bba10b --- /dev/null +++ b/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorHandler.java @@ -0,0 +1,69 @@ +/* + * 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 com.google.gwt.dev.util.collect.HashMap; +import com.vaadin.sass.tree.BlockNode; +import com.vaadin.sass.tree.Node; + +public class ParentSelectorHandler { + + private static HashMap parentSelectors = new HashMap(); + + 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 s : block.getSelectorList()) { + + if (s.startsWith("&") || s.endsWith("&")) { + for (final String parentSelector : parentBlock + .getSelectorList()) { + newList.add(s.replace("&", parentSelector)); + isParentSelector = true; + } + + } + } + + if (isParentSelector) { + block.setSelectorList(newList); + Node oldparent = block.getParentNode(); + if (parentSelectors.containsKey(block.getParentNode())) { + block.getParentNode() + .getParentNode() + .appendChild(block, + parentSelectors.get(block.getParentNode())); + } else { + block.getParentNode().getParentNode() + .appendChild(block, block.getParentNode()); + } + + parentSelectors.put(oldparent, block); + } + } + } + + public static void clear() { + parentSelectors.clear(); + } +} diff --git a/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorVisitor.java deleted file mode 100644 index f515d63e96..0000000000 --- a/theme-compiler/src/com/vaadin/sass/visitor/ParentSelectorVisitor.java +++ /dev/null @@ -1,60 +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 com.vaadin.sass.tree.BlockNode; -import com.vaadin.sass.tree.Node; - -public class ParentSelectorVisitor implements Visitor { - - @Override - public void traverse(Node node) throws Exception { - for (Node child : new ArrayList(node.getChildren())) { - if (child instanceof BlockNode) { - traverse(node, (BlockNode) child); - } - } - } - - private void traverse(Node parent, BlockNode block) throws Exception { - Node pre = block; - for (Node child : new ArrayList(block.getChildren())) { - if (child instanceof BlockNode) { - BlockNode blockChild = (BlockNode) child; - traverse(block, blockChild); - for (final String s : blockChild.getSelectorList()) { - - if (s.contains("&")) { - parent.appendChild(child, pre); - pre = child; - block.removeChild(child); - - ArrayList newList = new ArrayList(block - .getSelectorList().size()); - for (final String parentSelector : block - .getSelectorList()) { - newList.add(s.replace("&", parentSelector)); - } - blockChild.setSelectorList(newList); - } - } - } - } - } -} diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/ImportVisitorTest.java b/theme-compiler/src/com/vaadin/sass/visitor/VariableNodeHandler.java similarity index 59% rename from theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/ImportVisitorTest.java rename to theme-compiler/src/com/vaadin/sass/visitor/VariableNodeHandler.java index 8459139b4b..3ea26433e2 100644 --- a/theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/ImportVisitorTest.java +++ b/theme-compiler/src/com/vaadin/sass/visitor/VariableNodeHandler.java @@ -14,12 +14,19 @@ * the License. */ -package com.vaadin.sass.testcases.visitor; +package com.vaadin.sass.visitor; -import org.junit.Test; +import com.vaadin.sass.ScssStylesheet; +import com.vaadin.sass.tree.VariableNode; -public class ImportVisitorTest { - @Test - public void canHandleNestedImports() { +public class VariableNodeHandler { + + public static void traverse(VariableNode node) { + if (ScssStylesheet.getVariable(node.getName()) == null + || !node.isGuarded()) { + ScssStylesheet.addVariable(node); + } + node.getParentNode().removeChild(node); } + } diff --git a/theme-compiler/src/com/vaadin/sass/visitor/VariableVisitor.java b/theme-compiler/src/com/vaadin/sass/visitor/VariableVisitor.java deleted file mode 100644 index c8e28cd9e3..0000000000 --- a/theme-compiler/src/com/vaadin/sass/visitor/VariableVisitor.java +++ /dev/null @@ -1,94 +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.tree.IVariableNode; -import com.vaadin.sass.tree.ListModifyNode; -import com.vaadin.sass.tree.Node; -import com.vaadin.sass.tree.VariableNode; - -public class VariableVisitor implements Visitor { - - private final HashMap variables = new HashMap(); - - @Override - public void traverse(Node node) { - - replaceVariables(node, node.getChildren()); - - removeVariableNodes(node, node); - } - - private void removeVariableNodes(Node parent, Node node) { - for (final Node child : new ArrayList(node.getChildren())) { - removeVariableNodes(node, child); - } - if (node instanceof VariableNode) { - for (final Node child : node.getChildren()) { - parent.appendChild(child, node); - } - parent.removeChild(node); - } - } - - private void replaceVariables(Node n, ArrayList children) { - - ArrayList variables = new ArrayList( - this.variables.values()); - - for (Node node : children) { - - if (node instanceof IVariableNode) { - ((IVariableNode) node) - .replaceVariables(new ArrayList( - this.variables.values())); - } - - if (node instanceof VariableNode) { - VariableNode variableNode = (VariableNode) node; - if (this.variables.containsKey(variableNode.getName()) - && variableNode.isGuarded()) { - continue; - } - this.variables.put(variableNode.getName(), variableNode); - } else if (node instanceof ListModifyNode) { - - ListModifyNode modify = (ListModifyNode) node; - - String variable = modify.getNewVariable().substring(1); - - try { - VariableNode modifiedList = modify.getModifiedList(); - - this.variables.put(variable, modifiedList); - } catch (Exception e) { - e.printStackTrace(); - } - } - - replaceVariables(node, node.getChildren()); - } - - for (final VariableNode v : variables) { - this.variables.put(v.getName(), v); - } - } - -} diff --git a/theme-compiler/tests/resources/css/parent-selector.css b/theme-compiler/tests/resources/css/parent-selector.css index 32f8484457..0330782fbf 100644 --- a/theme-compiler/tests/resources/css/parent-selector.css +++ b/theme-compiler/tests/resources/css/parent-selector.css @@ -25,4 +25,8 @@ body.firefox a { .mixin-parent:hover { color: blue; +} + +.part.one, .part.two { + color: blue; } \ No newline at end of file diff --git a/theme-compiler/tests/resources/scss/_partial-for-import.scss b/theme-compiler/tests/resources/scss/_partial-for-import.scss index 32c3149a5b..96af1c78ff 100644 --- a/theme-compiler/tests/resources/scss/_partial-for-import.scss +++ b/theme-compiler/tests/resources/scss/_partial-for-import.scss @@ -1,9 +1,13 @@ $foo : red; -.caption { - $side: right; - border: 1px solid black; - background: #ff0000; - padding: 10px; - margin: 10px; -} \ No newline at end of file +@mixin caption { + .caption { + $side: right; + border: 1px solid black; + background: #ff0000; + padding: 10px; + margin: 10px; + } +} + +@include caption; \ No newline at end of file diff --git a/theme-compiler/tests/resources/scss/mixins.scss b/theme-compiler/tests/resources/scss/mixins.scss index e1fa80f357..6107897131 100644 --- a/theme-compiler/tests/resources/scss/mixins.scss +++ b/theme-compiler/tests/resources/scss/mixins.scss @@ -71,7 +71,9 @@ $mixinVar : 1px; } } -@include layout; +$layoutVariable : layout; + +@include $layoutVariable; @mixin parent($color : green, $name : default) { .#{$name}-inner { diff --git a/theme-compiler/tests/resources/scss/parent-selector.scss b/theme-compiler/tests/resources/scss/parent-selector.scss index 60e7608c07..ee02f8bf76 100644 --- a/theme-compiler/tests/resources/scss/parent-selector.scss +++ b/theme-compiler/tests/resources/scss/parent-selector.scss @@ -21,4 +21,10 @@ a { .mixin-parent { @include parent; +} + +.part { + &.one, &.two { + color: blue; + } } \ No newline at end of file diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentSelector.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentSelector.java index 7f3b3d6551..e1e1fee3b4 100644 --- a/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentSelector.java +++ b/theme-compiler/tests/src/com/vaadin/sass/testcases/scss/ParentSelector.java @@ -18,8 +18,7 @@ package com.vaadin.sass.testcases.scss; import java.io.IOException; -import junit.framework.Assert; - +import org.junit.Assert; import org.junit.Test; import org.w3c.css.sac.CSSException; diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/MixinVisitorTest.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/MixinVisitorTest.java deleted file mode 100644 index 56a35807d1..0000000000 --- a/theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/MixinVisitorTest.java +++ /dev/null @@ -1,267 +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.testcases.visitor; - -import java.util.ArrayList; - -import org.junit.Assert; -import org.junit.Test; - -import com.vaadin.sass.ScssStylesheet; -import com.vaadin.sass.parser.LexicalUnitImpl; -import com.vaadin.sass.parser.SCSSLexicalUnit; -import com.vaadin.sass.tree.BlockNode; -import com.vaadin.sass.tree.MixinDefNode; -import com.vaadin.sass.tree.MixinNode; -import com.vaadin.sass.tree.RuleNode; -import com.vaadin.sass.tree.VariableNode; -import com.vaadin.sass.visitor.MixinVisitor; - -public class MixinVisitorTest { - private MixinVisitor mixinVisitor = new MixinVisitor(); - - @Test - public void testTraversMixinWithoutArgs() { - ScssStylesheet root = new ScssStylesheet(); - MixinDefNode mixinDefNoArgs = new MixinDefNode("no-args", null); - BlockNode blockNode = new BlockNode(null); - mixinDefNoArgs.appendChild(blockNode); - root.appendChild(mixinDefNoArgs); - - BlockNode blockWithMixin = new BlockNode(null); - MixinNode mixin = new MixinNode("no-args", null); - blockWithMixin.appendChild(mixin); - root.appendChild(blockWithMixin); - - try { - mixinVisitor.traverse(root); - } catch (Exception e) { - Assert.fail(e.getMessage()); - } - - Assert.assertEquals(1, root.getChildren().size()); - BlockNode child = (BlockNode) root.getChildren().get(0); - BlockNode fromMixin = (BlockNode) child.getChildren().get(0); - Assert.assertFalse(fromMixin.hasChildren()); - } - - @Test - public void testTraverseMixinWithNonDefaultArgs() { - ScssStylesheet root = new ScssStylesheet(); - ArrayList args = new ArrayList(); - args.add(new VariableNode("arg", null, false)); - MixinDefNode mixinDefWithNonDefaultArg = new MixinDefNode( - "non-default-arg", args); - BlockNode blockNode = new BlockNode(null); - mixinDefWithNonDefaultArg.appendChild(blockNode); - root.appendChild(mixinDefWithNonDefaultArg); - - BlockNode blockWithMixin = new BlockNode(null); - ArrayList includeArgs = new ArrayList(); - LexicalUnitImpl includeArg = LexicalUnitImpl.createPixel(1f); - includeArg.setLexicalUnitType(LexicalUnitImpl.SAC_PIXEL); - includeArg.setFloatValue(1); - includeArgs.add(includeArg); - MixinNode mixin = new MixinNode("non-default-arg", includeArgs); - blockWithMixin.appendChild(mixin); - root.appendChild(blockWithMixin); - - try { - mixinVisitor.traverse(root); - } catch (Exception e) { - Assert.fail(e.getMessage()); - } - - Assert.assertEquals(1, root.getChildren().size()); - BlockNode child = (BlockNode) root.getChildren().get(0); - BlockNode fromMixin = (BlockNode) child.getChildren().get(0); - Assert.assertFalse(fromMixin.hasChildren()); - - } - - @Test - public void testTraverseMixinWithDefaultArgs() { - ScssStylesheet root = new ScssStylesheet(); - ArrayList args = new ArrayList(); - LexicalUnitImpl includeArg = LexicalUnitImpl.createPixel(1f); - args.add(new VariableNode("arg", includeArg, false)); - MixinDefNode mixinDefWithNonDefaultArg = new MixinDefNode( - "default-arg", args); - BlockNode blockNode = new BlockNode(null); - mixinDefWithNonDefaultArg.appendChild(blockNode); - root.appendChild(mixinDefWithNonDefaultArg); - - BlockNode blockWithMixin = new BlockNode(null); - MixinNode mixin = new MixinNode("default-arg", null); - blockWithMixin.appendChild(mixin); - root.appendChild(blockWithMixin); - - try { - mixinVisitor.traverse(root); - } catch (Exception e) { - Assert.fail(e.getMessage()); - } - - Assert.assertEquals(1, root.getChildren().size()); - BlockNode child = (BlockNode) root.getChildren().get(0); - BlockNode fromMixin = (BlockNode) child.getChildren().get(0); - Assert.assertFalse(fromMixin.hasChildren()); - - } - - @Test - public void testMixinWithoutArgument() { - /* - * ArrayList args = new ArrayList(); args.add("arg"); - * MixinDefNode mixinDefWithArgs = new MixinDefNode("with-args", args); - * RuleNode ruleNode = new RuleNode("var", - * com.vaadin.sass.parser.LexicalUnitImpl.createVariable(0, 0, null, - * "arg"), false); mixinDefWithArgs.appendChild(ruleNode); - */ - ScssStylesheet root = new ScssStylesheet(); - MixinDefNode mixinDefNoArgs = new MixinDefNode("table-base", null); - BlockNode thBlockNode = new BlockNode(null); - RuleNode textAlignRuleNode = new RuleNode("text-align", - LexicalUnitImpl.createString("center"), false, null); - thBlockNode.appendChild(textAlignRuleNode); - RuleNode fontWeightRuleNode = new RuleNode("font-weight", - LexicalUnitImpl.createString("bold"), false, null); - thBlockNode.appendChild(fontWeightRuleNode); - mixinDefNoArgs.appendChild(thBlockNode); - - BlockNode tdthBlockNode = new BlockNode(null); - RuleNode paddingRuleNode = new RuleNode("padding", - LexicalUnitImpl.createPixel(2f), false, null); - tdthBlockNode.appendChild(paddingRuleNode); - mixinDefNoArgs.appendChild(tdthBlockNode); - root.appendChild(mixinDefNoArgs); - - BlockNode dataBlock = new BlockNode(null); - MixinNode mixinNode = new MixinNode("table-base", null); - dataBlock.appendChild(mixinNode); - root.appendChild(dataBlock); - - try { - mixinVisitor.traverse(root); - } catch (Exception e) { - Assert.fail(e.getMessage()); - } - - Assert.assertEquals(1, root.getChildren().size()); - dataBlock = (BlockNode) root.getChildren().get(0); - BlockNode thBlock = (BlockNode) dataBlock.getChildren().get(0); - Assert.assertEquals(2, thBlock.getChildren().size()); - BlockNode thtdBlock = (BlockNode) dataBlock.getChildren().get(1); - Assert.assertEquals(1, thtdBlock.getChildren().size()); - - /* - * Assert.assertEquals(2, root.getChildren().size()); BlockNode - * datathBlockNode = (BlockNode) root.getChildren().get(0); - * Assert.assertEquals(LexicalUnit.SAC_IDENT, datathBlockNode - * .getSelectorList().item(0).getSelectorType()); - * Assert.assertEquals("text-align", ((RuleNode) datathBlockNode - * .getChildren().get(0)).getVariable()); Assert.assertEquals("center", - * ((RuleNode) datathBlockNode.getChildren() - * .get(0)).getValue().getStringValue()); - * Assert.assertEquals("font-weight", ((RuleNode) datathBlockNode - * .getChildren().get(1)).getVariable()); Assert.assertEquals("bold", - * ((RuleNode) datathBlockNode.getChildren() - * .get(1)).getValue().getStringValue()); - * - * BlockNode datathdatatdBlockNode = (BlockNode) - * root.getChildren().get(1); Assert.assertEquals(LexicalUnit.SAC_IDENT, - * datathdatatdBlockNode .getSelectorList().item(0).getSelectorType()); - * Assert.assertEquals(LexicalUnit.SAC_IDENT, datathdatatdBlockNode - * .getSelectorList().item(1).getSelectorType()); - * Assert.assertEquals("padding", ((RuleNode) datathdatatdBlockNode - * .getChildren().get(0)).getVariable()); Assert.assertEquals(2.0f, - * ((RuleNode) datathdatatdBlockNode - * .getChildren().get(0)).getValue().getFloatValue(), 0); - * Assert.assertEquals(LexicalUnit.SAC_PIXEL, ((RuleNode) - * datathdatatdBlockNode.getChildren().get(0)) - * .getValue().getLexicalUnitType()); - */ - - } - - @Test - public void testMixinWithArgument() { - ScssStylesheet root = new ScssStylesheet(); - ArrayList argNameList = new ArrayList(); - argNameList.add(new VariableNode("dist", null, false)); - MixinDefNode mixinDef = new MixinDefNode("left", argNameList); - - RuleNode floatRuleNode = new RuleNode("float", - LexicalUnitImpl.createString("left"), false, null); - mixinDef.appendChild(floatRuleNode); - RuleNode marginLeftRuleNode = new RuleNode("margin-left", - com.vaadin.sass.parser.LexicalUnitImpl.createVariable(0, 0, - null, "dist"), false, null); - mixinDef.appendChild(marginLeftRuleNode); - root.appendChild(mixinDef); - - BlockNode dataBlock = new BlockNode(null); - ArrayList argValueList = new ArrayList(); - LexicalUnitImpl arg = LexicalUnitImpl.createPixel(10f); - argValueList.add(arg); - MixinNode mixinNode = new MixinNode("left", argValueList); - dataBlock.appendChild(mixinNode); - root.appendChild(dataBlock); - - try { - mixinVisitor.traverse(root); - } catch (Exception e) { - Assert.fail(e.getMessage()); - } - - Assert.assertEquals(1, root.getChildren().size()); - BlockNode dataBlockNode = (BlockNode) root.getChildren().get(0); - Assert.assertEquals("float", ((RuleNode) dataBlockNode.getChildren() - .get(0)).getVariable()); - Assert.assertEquals("left", ((RuleNode) dataBlockNode.getChildren() - .get(0)).getValue().getStringValue()); - Assert.assertEquals("margin-left", ((RuleNode) dataBlockNode - .getChildren().get(1)).getVariable()); - Assert.assertEquals(SCSSLexicalUnit.SAC_PIXEL, - ((RuleNode) dataBlockNode.getChildren().get(1)).getValue() - .getLexicalUnitType()); - } - - @Test - public void testTopLevelInclude() { - ScssStylesheet root = new ScssStylesheet(); - - MixinDefNode defNode = new MixinDefNode("mixin", null); - defNode.appendChild(new RuleNode("var", null, false, null)); - root.appendChild(defNode); - - MixinNode mixinNode = new MixinNode("mixin", null); - root.appendChild(mixinNode); - - try { - mixinVisitor.traverse(root); - } catch (Exception e) { - Assert.fail(e.getMessage()); - } - - Assert.assertEquals(1, root.getChildren().size()); - RuleNode varRule = (RuleNode) root.getChildren().get(0); - Assert.assertEquals("var", varRule.getVariable()); - - } - -} diff --git a/theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/NestedPropertiesVisitorTest.java b/theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/NestedPropertiesVisitorTest.java deleted file mode 100644 index eafdb4908f..0000000000 --- a/theme-compiler/tests/src/com/vaadin/sass/testcases/visitor/NestedPropertiesVisitorTest.java +++ /dev/null @@ -1,57 +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.testcases.visitor; - -import org.junit.Assert; -import org.junit.Test; - -import com.vaadin.sass.ScssStylesheet; -import com.vaadin.sass.tree.NestPropertiesNode; -import com.vaadin.sass.tree.RuleNode; -import com.vaadin.sass.visitor.NestPropertiesVisitor; - -public class NestedPropertiesVisitorTest { - private NestPropertiesVisitor visitor = new NestPropertiesVisitor(); - - @Test - public void testEmptyTreeNoChange() { - ScssStylesheet root = new ScssStylesheet(); - Assert.assertFalse(root.hasChildren()); - visitor.traverse(root); - Assert.assertFalse(root.hasChildren()); - } - - @Test - public void testNestedPropertiesCanBeUnnested() { - ScssStylesheet root = new ScssStylesheet(); - NestPropertiesNode nested = new NestPropertiesNode("nested"); - RuleNode child0 = new RuleNode("child0", null, false, null); - RuleNode child1 = new RuleNode("child1", null, true, null); - nested.appendChild(child0); - nested.appendChild(child1); - root.appendChild(nested); - - Assert.assertEquals(1, root.getChildren().size()); - visitor.traverse(root); - Assert.assertEquals(2, root.getChildren().size()); - - for (int i = 0; i < root.getChildren().size(); i++) { - RuleNode node = (RuleNode) root.getChildren().get(i); - Assert.assertEquals("nested-child" + i, node.getVariable()); - } - } -} -- 2.39.5