private void importOtherFiles(ScssStylesheet node) { ImportNodeHandler.traverse(node); }
public static void traverse(MixinNode node) throws Exception { replaceMixins(node); }
@Override public void traverse() { NestedNodeHandler.traverse(this); }
public static void traverse(ExtendNode node) throws Exception { buildExtendsMap(node); modifyTree(ScssStylesheet.get()); }
public static void traverse(BlockNode node) { if (node.getChildren().size() == 0) { // empty blocks are removed later return; } Node parent = node.getParentNode(); if (parent instanceof BlockNode) { combineParentSelectorListToChild(node); } else if (node.getSelectors().contains("&")) { ScssStylesheet.warning("Base-level rule contains" + " the parent-selector-referencing character '&';" + " the character will be removed:\n" + node); removeParentReference(node); } }
private static void replaceMixinNode(MixinNode mixinNode, MixinDefNode mixinDef) { MixinDefNode defClone = (MixinDefNode) DeepCopy.copy(mixinDef); defClone.traverse(); defClone.replaceContentDirective(mixinNode); if (mixinDef.getArglist().isEmpty()) { mixinNode.getParentNode().appendChildrenAfter( new ArrayList<Node>(defClone.getChildren()), mixinNode); } else { if (mixinNode.getArglist() != null && !mixinNode.getArglist().isEmpty()) { replacePossibleArguments(mixinNode, defClone); } Node previous = mixinNode; for (final Node child : new ArrayList<Node>(defClone.getChildren())) { replaceChildVariables(defClone, child); mixinNode.getParentNode().appendChild(child, previous); previous = child; } } mixinNode.getParentNode().removeChild(mixinNode); }
public static void traverse(EachDefNode node) { replaceEachDefNode(node); }
@Override public void traverse() { try { for (final Node child : children) { child.traverse(); } IfElseNodeHandler.traverse(this); } catch (Exception e) { e.printStackTrace(); } }
@Override public void traverse() { replaceVariables(ScssStylesheet.getVariables()); EachNodeHandler.traverse(this); } }
private static void replaceInterpolation(Node copy, ArrayList<VariableNode> variables) { if (copy instanceof IVariableNode) { IVariableNode n = (IVariableNode) copy; n.replaceVariables(variables); } for (Node c : copy.getChildren()) { replaceInterpolation(c, variables); } }
@Override public void traverse() { try { BlockNodeHandler.traverse(this); replaceVariables(ScssStylesheet.getVariables()); } catch (Exception e) { e.printStackTrace(); } }
@Override public void traverse() { try { ExtendNodeHandler.traverse(this); getParentNode().removeChild(this); } catch (Exception e) { e.printStackTrace(); } } }
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); }
/** * Applies all the visitors and compiles SCSS into Css. * * @throws Exception */ public void compile() throws Exception { mainStyleSheet = this; mixinDefs.clear(); variables.clear(); ifElseDefNodes.clear(); lastNodeAdded.clear(); ExtendNodeHandler.clear(); importOtherFiles(this); populateDefinitions(this); traverse(this); removeEmptyBlocks(this); }
private static void replaceChildVariables(MixinDefNode mixinDef, Node node) { for (final Node child : node.getChildren()) { replaceChildVariables(mixinDef, child); } if (node instanceof IVariableNode) { ((IVariableNode) node).replaceVariables(mixinDef.getArglist()); } } }
private static void addAdditionalSelectorListToBlockNode( BlockNode blockNode, ArrayList<String> extendingSelectors, String extendedSelector) { if (extendingSelectors != null) { for (String extendingSelector : extendingSelectors) { if (extendedSelector == null) { blockNode.getSelectorList().add(extendingSelector); } else { ArrayList<String> newTags = new ArrayList<String>(); for (final String selectorString : blockNode .getSelectorList()) { if (StringUtil.containsSubString(selectorString, extendedSelector)) { String newTag = generateExtendingSelectors( selectorString, extendedSelector, extendingSelector); // prevent adding duplicated selector list if (!blockNode.getSelectorList().contains(newTag) && !newTags.contains(newTag)) { newTags.add(newTag); } } } blockNode.getSelectorList().addAll(newTags); } } } }
@Override public void traverse() { try { // limit variable scope to the mixin Map<String, VariableNode> variableScope = ScssStylesheet .openVariableScope(); replaceVariables(ScssStylesheet.getVariables()); replaceVariablesForChildren(); MixinNodeHandler.traverse(this); ScssStylesheet.closeVariableScope(variableScope); } catch (Exception e) { e.printStackTrace(); } }
private static void updateUrlInImportedSheet(Node node, String prefix) { for (Node child : node.getChildren()) { if (child instanceof RuleNode) { LexicalUnit value = ((RuleNode) child).getValue(); while (value != null) { if (value.getLexicalUnitType() == LexicalUnit.SAC_URI) { String path = value.getStringValue() .replaceAll("^\"|\"$", "") .replaceAll("^'|'$", ""); if (!path.startsWith("/") && !path.contains(":")) { path = prefix + path; path = StringUtil.cleanPath(path); ((LexicalUnitImpl) value).setStringValue(path); } } value = value.getNextLexicalUnit(); } } updateUrlInImportedSheet(child, prefix); } } }
@Override public void traverse() { /* * "replaceVariables(ScssStylesheet.getVariables());" seems duplicated * and can be extracted out of if, but it is not. * containsArithmeticalOperator must be called before replaceVariables. * Because for the "/" operator, it needs to see if its predecessor or * successor is a Variable or not, to determine it is an arithmetic * operator. */ if (ArithmeticExpressionEvaluator.get().containsArithmeticalOperator( expr)) { replaceVariables(ScssStylesheet.getVariables()); expr = ArithmeticExpressionEvaluator.get().evaluate(expr); } else { replaceVariables(ScssStylesheet.getVariables()); } VariableNodeHandler.traverse(this); } }
@Override public void traverse() { // nested imports ImportNodeHandler.traverse(getParentNode()); } }