Skip to content

Commit

Permalink
handle nested @media rule with parallel block rules
Browse files Browse the repository at this point in the history
  • Loading branch information
volker committed Jul 13, 2023
1 parent 2121e4d commit 6c0df39
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 14 deletions.
20 changes: 6 additions & 14 deletions src/main/java/com/inet/sass/visitor/BlockNodeHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,22 +65,21 @@ public static Collection<Node> traverse( ScssContext context, BlockNode node ) {
BlockNode oldParent = context.getParentBlock();
context.setParentBlock( node );
try {
ArrayList<Node> medias = null;
ArrayList<Node> newChildren = null;
for( Node child : children ) {
if( child.getClass() == BlockNode.class ) {
((BlockNode)child).setParentSelectors( node.getSelectorList() );
result.addAll( child.traverse( context ) );
} else if( child.getClass() == MediaNode.class ) {
medias = bubbleMedia( medias, context, node, (MediaNode)child );
bubbleMedia( result, context, node, (MediaNode)child );
} else {
Collection<Node> childTraversed = child.traverse( context );
for( Node n : childTraversed ) {
if( n.getClass() == BlockNode.class ) {
// already traversed
result.add( n );
} else if( n.getClass() == MediaNode.class ) {
medias = bubbleMedia( medias, context, node, (MediaNode)n );
bubbleMedia( result, context, node, (MediaNode)n );
} else {
if( newChildren == null ) {
newChildren = new ArrayList<Node>();
Expand All @@ -90,9 +89,6 @@ public static Collection<Node> traverse( ScssContext context, BlockNode node ) {
}
}
}
if( medias != null ) {
result = medias;
}
// add the node with the remaining non-block children at the
// beginning
if( newChildren != null ) {
Expand All @@ -111,26 +107,22 @@ public static Collection<Node> traverse( ScssContext context, BlockNode node ) {

/**
* Reorder the @media rule on top
* @param medias container for the medias, will be null on first call
* @param result container for the traversed media
* @param context current context
* @param node the parent node of the MediaNode
* @param child the media node which is child
* @return the container, never null
*/
static ArrayList<Node> bubbleMedia( ArrayList<Node> medias, ScssContext context, BlockNode node, MediaNode child ) {
static void bubbleMedia( ArrayList<Node> result, ScssContext context, BlockNode node, MediaNode child ) {
for( Selector selector : node.getSelectorList() ) {
if( selector.isPlaceholder() ) {
//TODO placeholder selectors must handle other
return medias;
return;
}
}
if( medias == null ) {
medias = new ArrayList<>();
}
MediaNode media = new MediaNode( child.getUri(), child.getLineNumber(), child.getColumnNumber(), child.getMedia() );
media.appendChild( new BlockNode( node, child.getChildren() ) );
medias.addAll( media.traverse( context ) );
return medias;
result.addAll( media.traverse( context ) );
}

private static void updateSelectors( BlockNode node) {
Expand Down
7 changes: 7 additions & 0 deletions src/test/resources/automatic/css/media-nested.css
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@
.class {
color: red;
}

@media screen {
.class {
transition: none;
}
}

@media print {
.class {
transition: width 2s;
}
}

.class .sub {
color: blue;
}

@media (hover: hover) {
.button:hover {
border: 2px solid black;
}
}

@media (hover: hover) and (color) {
.button:hover {
border-color: #036;
Expand Down
3 changes: 3 additions & 0 deletions src/test/resources/automatic/scss/media-nested.scss
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
.class {
@include my-mixin;
color: red;
.sub {
color: blue;
}
}

@media (hover: hover) {
Expand Down

0 comments on commit 6c0df39

Please sign in to comment.