stylecow-plugin-nested-rules
Advanced tools
Comparing version 4.0.1 to 4.1.0
104
index.js
@@ -18,3 +18,3 @@ module.exports = function (stylecow) { | ||
if (child.type === 'AtRule' && child.name === 'media') { | ||
nestedMedia(parentRule, child, index + offset); | ||
nestedRuleMedia(parentRule, child, index + offset); | ||
++offset; | ||
@@ -36,3 +36,29 @@ } | ||
function nestedMedia(parentRule, media, parentRuleIndex) { | ||
//Merge nested @media | ||
stylecow.addTask({ | ||
filter: { | ||
type: 'AtRule', | ||
name: 'media' | ||
}, | ||
fn: function (parentMedia) { | ||
var index = parentMedia.index(); | ||
var offset = 1; | ||
parentMedia | ||
.getChild('Block') | ||
.getChildren({ | ||
type: 'AtRule', | ||
name: 'media' | ||
}) | ||
.forEach(function (child) { | ||
nestedMedia(parentMedia, child, index + offset); | ||
}); | ||
if (!parentMedia.getChild('Block').length) { | ||
parentRule.remove(); | ||
} | ||
} | ||
}); | ||
function nestedRuleMedia(parentRule, media, parentRuleIndex) { | ||
var rule = new stylecow.Rule(); | ||
@@ -65,2 +91,18 @@ | ||
function nestedMedia(parentMedia, media, parentMediaIndex) { | ||
var mediaQueries = media.getChild('MediaQueries'); | ||
var mergedMediaQueries = new stylecow.MediaQueries(); | ||
parentMedia | ||
.getChild('MediaQueries') | ||
.forEach(function (parentMediaQuery) { | ||
mediaQueries.forEach(function (mediaQuery) { | ||
mergedMediaQueries.push(mergeMediaQuery(parentMediaQuery.clone(), mediaQuery.clone())); | ||
}); | ||
}); | ||
mediaQueries.replaceWith(mergedMediaQueries); | ||
parentMedia.getParent().splice(parentMediaIndex, 0, media); | ||
} | ||
function nestedRule(parentRule, rule, parentRuleIndex) { | ||
@@ -74,3 +116,3 @@ var selectors = rule.getChild('Selectors'); | ||
selectors.forEach(function (selector) { | ||
mergedSelectors.push(merge(parentSelector.clone(), selector.clone())); | ||
mergedSelectors.push(mergeSelector(parentSelector.clone(), selector.clone())); | ||
}); | ||
@@ -83,36 +125,52 @@ }); | ||
function merge (selector, appendedSelector) { | ||
var firstElement = appendedSelector.shift(); | ||
function mergeSelector (selector, appendedSelector) { | ||
var joinCombinator = appendedSelector.getChild({ | ||
type: 'Combinator', | ||
name: '&' | ||
}); | ||
// html { .foo { => html .foo | ||
if (firstElement.type !== 'Combinator') { | ||
var separator = (new stylecow.Combinator()).setName(' '); | ||
selector.push(separator); | ||
selector.push(firstElement); | ||
if (!joinCombinator) { | ||
if (appendedSelector[0].type !== 'Combinator') { | ||
appendedSelector.unshift((new stylecow.Combinator()).setName(' ')); | ||
} | ||
joinCombinator = (new stylecow.Combinator()).setName('&'); | ||
appendedSelector.unshift(joinCombinator); | ||
} | ||
// html { >.foo { => html>.foo | ||
else if (firstElement.name !== '&') { | ||
selector.push(firstElement); | ||
} | ||
// .foo { &html { => html.foo | ||
else if (appendedSelector.length && appendedSelector[0].is('TypeSelector')) { | ||
firstElement = appendedSelector.shift(); | ||
//resolve .foo&html => html.foo | ||
var next = joinCombinator.next(); | ||
if (next && next.is('TypeSelector')) { | ||
var combinators = selector.getChildren('Combinator'); | ||
if (combinators.length) { | ||
combinators.pop().after(firstElement); | ||
combinators.pop().after(next); | ||
} else { | ||
selector.unshift(firstElement); | ||
selector.unshift(next); | ||
} | ||
} | ||
while (appendedSelector[0]) { | ||
selector.push(appendedSelector[0]); | ||
while (selector[0]) { | ||
joinCombinator.before(selector.shift()); | ||
} | ||
return selector; | ||
joinCombinator.remove(); | ||
return appendedSelector; | ||
} | ||
function mergeMediaQuery (mediaQueries, appendedMediaQuery) { | ||
var expression = new stylecow.ConditionalExpression(); | ||
while (appendedMediaQuery[0]) { | ||
expression.push(appendedMediaQuery.shift()); | ||
} | ||
var joinKeyword = (new stylecow.Keyword()).setName('and'); | ||
mediaQueries.push(joinKeyword); | ||
mediaQueries.push(expression); | ||
return mediaQueries; | ||
} | ||
}; |
{ | ||
"name": "stylecow-plugin-nested-rules", | ||
"description": "Stylecow plugin to add support for nested rules.", | ||
"version": "4.0.1", | ||
"version": "4.1.0", | ||
"author": "Oscar Otero <oom@oscarotero.com>", | ||
@@ -6,0 +6,0 @@ "homepage": "https://github.com/stylecow/stylecow-plugin-nested-rules", |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
44312
19
1617