From 41faa391b1bccd6654303e9fd2f8ef1e398c7b9e Mon Sep 17 00:00:00 2001 From: Hannes Erven Date: Sun, 22 Dec 2019 10:31:46 +0100 Subject: [PATCH 1/3] Nested CSS rulesets, store as tree first attempt at https://github.com/w3c/css-validator/issues/182 --- org/w3c/css/css/CssRuleList.java | 48 ++++++++++++++++--- org/w3c/css/css/CssStyleRule.java | 2 +- .../css/css/ICssStyleRuleOrCssRuleList.java | 5 ++ org/w3c/css/css/StyleSheet.java | 38 +++++++++++---- 4 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 org/w3c/css/css/ICssStyleRuleOrCssRuleList.java diff --git a/org/w3c/css/css/CssRuleList.java b/org/w3c/css/css/CssRuleList.java index e74bdc399..c1c2eebdf 100644 --- a/org/w3c/css/css/CssRuleList.java +++ b/org/w3c/css/css/CssRuleList.java @@ -5,21 +5,22 @@ package org.w3c.css.css; +import java.util.ArrayList; +import java.util.List; + import org.w3c.css.parser.AtRule; import org.w3c.css.util.Messages; -import java.util.ArrayList; - -public class CssRuleList { +public class CssRuleList implements ICssStyleRuleOrCssRuleList { AtRule atRule; - ArrayList rulelist; + ArrayList rulelist; public String pseudopage; String indent; public CssRuleList() { atRule = null; - rulelist = new ArrayList(); + rulelist = new ArrayList<>(); indent = new String(); } @@ -28,9 +29,40 @@ public void addStyleRule(CssStyleRule stylerule) { } public ArrayList getStyleRules() { + ArrayList r = new ArrayList<>(this.rulelist.size()); + for(ICssStyleRuleOrCssRuleList u: this.rulelist) { + if (u instanceof CssStyleRule) { + r.add((CssStyleRule) u); + } + } + return r; + } + + public List getStyleRulesTree() { return rulelist; } + public List getStyleRulesAllInTree() { + ArrayList r = new ArrayList<>(); + this.appendStyleRulesTree(r); + return r; + } + + protected void appendStyleRulesTree(List r) { + for(ICssStyleRuleOrCssRuleList u: this.rulelist) { + if (u instanceof CssStyleRule) { + r.add((CssStyleRule) u); + }else if (u instanceof CssRuleList) { + CssRuleList l = (CssRuleList) u; + l.appendStyleRulesTree(r); + } + } + } + + /** + * This should be rather named setAtRule + * @param atRule + */ public void addAtRule(AtRule atRule) { this.atRule = atRule; } @@ -64,7 +96,7 @@ public String toString() { ret.append(atRuleString); ret.append(" {\n\n"); } - for (CssStyleRule styleRule : rulelist) { + for (ICssStyleRuleOrCssRuleList styleRule : rulelist) { ret.append(styleRule); } if (atRuleString.length() != 0) { @@ -74,4 +106,8 @@ public String toString() { return ret.toString(); } + public void addSubRulelist(CssRuleList rulelist) { + this.rulelist.add(rulelist); + } + } diff --git a/org/w3c/css/css/CssStyleRule.java b/org/w3c/css/css/CssStyleRule.java index bb7981383..0adbe01d1 100644 --- a/org/w3c/css/css/CssStyleRule.java +++ b/org/w3c/css/css/CssStyleRule.java @@ -10,7 +10,7 @@ import java.util.ArrayList; -public class CssStyleRule { +public class CssStyleRule implements ICssStyleRuleOrCssRuleList { public CssStyleRule(String indent, String selectors, ArrayList properties, boolean important) { diff --git a/org/w3c/css/css/ICssStyleRuleOrCssRuleList.java b/org/w3c/css/css/ICssStyleRuleOrCssRuleList.java new file mode 100644 index 000000000..fd9900ed0 --- /dev/null +++ b/org/w3c/css/css/ICssStyleRuleOrCssRuleList.java @@ -0,0 +1,5 @@ +package org.w3c.css.css; + +public interface ICssStyleRuleOrCssRuleList { + +} diff --git a/org/w3c/css/css/StyleSheet.java b/org/w3c/css/css/StyleSheet.java index 65d3848eb..9eb18f677 100644 --- a/org/w3c/css/css/StyleSheet.java +++ b/org/w3c/css/css/StyleSheet.java @@ -21,6 +21,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; +import java.util.Stack; +import java.util.Vector; /** * This class contains a style sheet with all rules, errors and warnings. @@ -34,7 +37,9 @@ public class StyleSheet { private Errors errors; private Warnings warnings; private String type; - private ArrayList atRuleList; + private ArrayList atRuleListFlat = new ArrayList<>(); + private ArrayList atRuleListTree = new ArrayList<>(); + private Stack ruleInsertStack = new Stack(); private boolean doNotAddRule; private boolean doNotAddAtRule; private static final boolean debug = false; @@ -48,8 +53,6 @@ public StyleSheet() { errors = new Errors(); warnings = new Warnings(); cascading = new CssCascadingOrder(); - atRuleList = new ArrayList<>(); - customProperties = new HashMap<>(); } public void setWarningLevel(int warningLevel) { @@ -239,14 +242,23 @@ public void addCharSet(String charset) { public void newAtRule(AtRule atRule) { CssRuleList rulelist = new CssRuleList(); rulelist.addAtRule(atRule); - atRuleList.add(rulelist); + + atRuleListFlat.add(rulelist); + if (! ruleInsertStack.isEmpty()) { + ruleInsertStack.peek().addSubRulelist(rulelist); + } else { + atRuleListTree.add(rulelist); + } + ruleInsertStack.add(rulelist); + indent += " "; } public void endOfAtRule() { if (!doNotAddAtRule) { - CssRuleList rulelist = new CssRuleList(); - atRuleList.add(rulelist); //for the new set of rules +// CssRuleList rulelist = new CssRuleList(); +// atRuleList.add(rulelist); //for the new set of rules + if (! ruleInsertStack.isEmpty()) ruleInsertStack.pop(); } important = false; selectortext = ""; @@ -282,13 +294,15 @@ public void endOfRule() { if (!doNotAddRule) { CssStyleRule stylerule = new CssStyleRule(indent, selectortext, properties, important); - if (!atRuleList.isEmpty()) { - rulelist = atRuleList.remove(atRuleList.size() - 1); + if (!ruleInsertStack.isEmpty()) { + rulelist = ruleInsertStack.peek(); } else { rulelist = new CssRuleList(); + ruleInsertStack.add(rulelist); + atRuleListTree.add(rulelist); } rulelist.addStyleRule(stylerule); - atRuleList.add(rulelist); + atRuleListFlat.add(rulelist); } selectortext = ""; doNotAddRule = false; @@ -303,7 +317,10 @@ public void removeThisAtRule() { } public ArrayList newGetRules() { - return atRuleList; + return atRuleListFlat; + } + public List newGetRulesTree() { + return this.atRuleListTree; } String selectortext; @@ -311,4 +328,5 @@ public ArrayList newGetRules() { ArrayList properties; String indent = new String(); public String charset; + } From b07c451db5eeb83b6555942193c062bb5f5be667 Mon Sep 17 00:00:00 2001 From: Hannes Erven Date: Thu, 2 Jan 2020 22:57:40 +0100 Subject: [PATCH 2/3] DEBUG: corrected internal data structure --- org/w3c/css/css/StyleSheet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org/w3c/css/css/StyleSheet.java b/org/w3c/css/css/StyleSheet.java index 9eb18f677..a54286e48 100644 --- a/org/w3c/css/css/StyleSheet.java +++ b/org/w3c/css/css/StyleSheet.java @@ -300,9 +300,9 @@ public void endOfRule() { rulelist = new CssRuleList(); ruleInsertStack.add(rulelist); atRuleListTree.add(rulelist); + atRuleListFlat.add(rulelist); } rulelist.addStyleRule(stylerule); - atRuleListFlat.add(rulelist); } selectortext = ""; doNotAddRule = false; From 7860f6a52aa7f710e8c5f243b52bb3a92466271d Mon Sep 17 00:00:00 2001 From: Richard Cox Date: Fri, 24 Jun 2022 19:13:23 +0200 Subject: [PATCH 3/3] BUGFIX: Initialize HashMap --- org/w3c/css/css/StyleSheet.java | 1 + 1 file changed, 1 insertion(+) diff --git a/org/w3c/css/css/StyleSheet.java b/org/w3c/css/css/StyleSheet.java index a54286e48..e2e49670d 100644 --- a/org/w3c/css/css/StyleSheet.java +++ b/org/w3c/css/css/StyleSheet.java @@ -53,6 +53,7 @@ public StyleSheet() { errors = new Errors(); warnings = new Warnings(); cascading = new CssCascadingOrder(); + customProperties = new HashMap<>(); } public void setWarningLevel(int warningLevel) {