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<CssStyleRule> rulelist; + ArrayList<ICssStyleRuleOrCssRuleList> rulelist; public String pseudopage; String indent; public CssRuleList() { atRule = null; - rulelist = new ArrayList<CssStyleRule>(); + rulelist = new ArrayList<>(); indent = new String(); } @@ -28,9 +29,40 @@ public void addStyleRule(CssStyleRule stylerule) { } public ArrayList<CssStyleRule> getStyleRules() { + ArrayList<CssStyleRule> r = new ArrayList<>(this.rulelist.size()); + for(ICssStyleRuleOrCssRuleList u: this.rulelist) { + if (u instanceof CssStyleRule) { + r.add((CssStyleRule) u); + } + } + return r; + } + + public List<ICssStyleRuleOrCssRuleList> getStyleRulesTree() { return rulelist; } + public List<CssStyleRule> getStyleRulesAllInTree() { + ArrayList<CssStyleRule> r = new ArrayList<>(); + this.appendStyleRulesTree(r); + return r; + } + + protected void appendStyleRulesTree(List<CssStyleRule> 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<CssProperty> 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..e2e49670d 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<CssRuleList> atRuleList; + private ArrayList<CssRuleList> atRuleListFlat = new ArrayList<>(); + private ArrayList<CssRuleList> atRuleListTree = new ArrayList<>(); + private Stack<CssRuleList> ruleInsertStack = new Stack<CssRuleList>(); private boolean doNotAddRule; private boolean doNotAddAtRule; private static final boolean debug = false; @@ -48,7 +53,6 @@ public StyleSheet() { errors = new Errors(); warnings = new Warnings(); cascading = new CssCascadingOrder(); - atRuleList = new ArrayList<>(); customProperties = new HashMap<>(); } @@ -239,14 +243,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 +295,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); + atRuleListFlat.add(rulelist); } rulelist.addStyleRule(stylerule); - atRuleList.add(rulelist); } selectortext = ""; doNotAddRule = false; @@ -303,7 +318,10 @@ public void removeThisAtRule() { } public ArrayList<CssRuleList> newGetRules() { - return atRuleList; + return atRuleListFlat; + } + public List<CssRuleList> newGetRulesTree() { + return this.atRuleListTree; } String selectortext; @@ -311,4 +329,5 @@ public ArrayList<CssRuleList> newGetRules() { ArrayList<CssProperty> properties; String indent = new String(); public String charset; + }