/** * @param node * @param rootNode */ private void addNode(IParseNode node) { CSSNode cssNode = (CSSNode) node; short type = cssNode.getNodeType(); switch (type) { case ICSSNodeTypes.RULE: pushFormatterRuleNode((CSSRuleNode) cssNode); break; case ICSSNodeTypes.PAGE: pushFormatterPageNode((CSSPageNode) cssNode); break; case ICSSNodeTypes.FONTFACE: pushFormatterFontFaceNode((CSSFontFaceNode) cssNode); break; case ICSSNodeTypes.MEDIA: pushFormatterMediaNode((CSSMediaNode) cssNode); break; case ICSSNodeTypes.AT_RULE: case ICSSNodeTypes.CHAR_SET: case ICSSNodeTypes.NAMESPACE: case ICSSNodeTypes.IMPORT: // Custom at-rule and import nodes currently fall under the same formatting case. This may // need to // change once the parser returns the url part as a textnode pushAtRuleNode(cssNode); break; default: break; } }
// This is a temporary fix for custom at-rules. When the parser adds support to return the ruleID, // this will need to // be changed private void pushAtRuleNode(CSSNode atRuleNode) { int length = document.getLength(); int selectorStartingOffset = atRuleNode.getStartingOffset(); int selectEndingOffset = atRuleNode.getEndingOffset(); // Locate first white space after the @rule while (selectorStartingOffset < length) { if (Character.isWhitespace(document.charAt(selectorStartingOffset))) { break; } selectorStartingOffset++; } // Find the starting offset for the selector selectorStartingOffset = getBeginWithoutWhiteSpaces(selectorStartingOffset, document); // Find the end offset for the selector while (selectEndingOffset >= selectorStartingOffset) { if (!Character.isWhitespace(document.charAt(selectEndingOffset - 1))) { break; } selectEndingOffset--; } // Push an At-Node to control the lines separators. FormatterCSSAtRuleNode atNode = new FormatterCSSAtRuleNode(document); atNode.setBegin( createTextNode(document, atRuleNode.getStartingOffset(), selectorStartingOffset)); push(atNode); checkedPop(atNode, -1); // We use a selector node for now, we may want to create a new formatter node type for rule id FormatterBlockWithBeginNode formatterSelectorNode = new FormatterCSSSelectorNode(document, false, false); formatterSelectorNode.setBegin( createTextNode( document, getBeginWithoutWhiteSpaces(selectorStartingOffset, document), getEndWithoutWhiteSpaces(selectEndingOffset, document) + 1)); push(formatterSelectorNode); findAndPushPunctuationNode(TypePunctuation.SEMICOLON, selectEndingOffset, false); checkedPop(formatterSelectorNode, -1); }