group-css-media-queries
Version:
CSS postprocessing: group media queries. Useful for postprocessing preprocessed CSS files :)
97 lines (92 loc) • 2.96 kB
JavaScript
// Generated by CoffeeScript 1.10.0
(function() {
var parseCss, stringifyCss,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
parseCss = require('css-parse');
stringifyCss = require('css-stringify');
module.exports = function(css) {
var emToPxRatio, i, intervalRules, len, m, media, mediaRules, medias, onlyMaxRules, onlyMinRules, otherRules, parsed, ref, rootRules, rule, rules;
parsed = parseCss(css);
medias = {};
rootRules = [];
ref = parsed.stylesheet.rules;
for (i = 0, len = ref.length; i < len; i++) {
rule = ref[i];
if (rule.type === 'media') {
if (!medias[rule.media]) {
medias[rule.media] = [];
}
medias[rule.media] = medias[rule.media].concat(rule.rules);
} else {
rootRules.push(rule);
}
}
mediaRules = [];
for (media in medias) {
rules = medias[media];
rule = {
type: "media",
media: media,
rules: rules
};
if (media.indexOf("min-width") !== -1) {
m = media.match(/min-width:\s*(\d+)(px|em)?/);
if (m && m[1]) {
rule.minWidth = parseInt(m[1]);
}
if (m[2]) {
rule.unit = m[2];
}
}
if (media.indexOf("max-width") !== -1) {
m = media.match(/max-width:\s*(\d+)(px|em)?/);
if (m && m[1]) {
rule.maxWidth = parseInt(m[1]);
}
if (m[2]) {
rule.unit = m[2];
}
}
mediaRules.push(rule);
}
onlyMinRules = mediaRules.filter(function(rule) {
return (rule.minWidth != null) && (rule.maxWidth == null);
});
onlyMaxRules = mediaRules.filter(function(rule) {
return (rule.maxWidth != null) && (rule.minWidth == null);
});
intervalRules = mediaRules.filter(function(rule) {
return (rule.minWidth != null) && (rule.maxWidth != null);
});
otherRules = mediaRules.filter(function(rule) {
return indexOf.call(onlyMinRules.concat(onlyMaxRules).concat(intervalRules), rule) < 0;
});
emToPxRatio = 16;
onlyMinRules.sort(function(a, b) {
var aPxValue, bPxValue;
aPxValue = a.minWidth;
bPxValue = b.minWidth;
if (a.unit === 'em') {
aPxValue *= emToPxRatio;
}
if (b.unit === 'em') {
bPxValue *= emToPxRatio;
}
return aPxValue - bPxValue;
});
onlyMaxRules.sort(function(a, b) {
var aPxValue, bPxValue;
aPxValue = a.maxWidth;
bPxValue = b.maxWidth;
if (a.unit === 'em') {
aPxValue *= emToPxRatio;
}
if (b.unit === 'em') {
bPxValue *= emToPxRatio;
}
return bPxValue - aPxValue;
});
parsed.stylesheet.rules = rootRules.concat(onlyMinRules).concat(onlyMaxRules).concat(intervalRules).concat(otherRules);
return stringifyCss(parsed);
};
}).call(this);