You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
4.7 KiB
197 lines
4.7 KiB
var DEFAULTS = { |
|
'*': { |
|
colors: { |
|
hexAlpha: false, // 4- and 8-character hex notation |
|
opacity: true // rgba / hsla |
|
}, |
|
customUnits: { |
|
rpx: false |
|
}, |
|
properties: { |
|
backgroundClipMerging: true, // background-clip to shorthand |
|
backgroundOriginMerging: true, // background-origin to shorthand |
|
backgroundSizeMerging: true, // background-size to shorthand |
|
colors: true, // any kind of color transformations, like `#ff00ff` to `#f0f` or `#fff` into `red` |
|
ieBangHack: false, // !ie suffix hacks on IE<8 |
|
ieFilters: false, // whether to preserve `filter` and `-ms-filter` properties |
|
iePrefixHack: false, // underscore / asterisk prefix hacks on IE |
|
ieSuffixHack: false, // \9 suffix hacks on IE6-9, \0 suffix hack on IE6-11 |
|
merging: true, // merging properties into one |
|
shorterLengthUnits: false, // optimize pixel units into `pt`, `pc` or `in` units |
|
spaceAfterClosingBrace: true, // 'url() no-repeat' to 'url()no-repeat' |
|
urlQuotes: true, // whether to wrap content of `url()` into quotes or not |
|
zeroUnits: true // 0[unit] -> 0 |
|
}, |
|
selectors: { |
|
adjacentSpace: false, // div+ nav Android stock browser hack |
|
ie7Hack: false, // *+html hack |
|
mergeablePseudoClasses: [ |
|
':active', |
|
':after', |
|
':before', |
|
':empty', |
|
':checked', |
|
':disabled', |
|
':empty', |
|
':enabled', |
|
':first-child', |
|
':first-letter', |
|
':first-line', |
|
':first-of-type', |
|
':focus', |
|
':hover', |
|
':lang', |
|
':last-child', |
|
':last-of-type', |
|
':link', |
|
':not', |
|
':nth-child', |
|
':nth-last-child', |
|
':nth-last-of-type', |
|
':nth-of-type', |
|
':only-child', |
|
':only-of-type', |
|
':root', |
|
':target', |
|
':visited' |
|
], // selectors with these pseudo-classes can be merged as these are universally supported |
|
mergeablePseudoElements: [ |
|
'::after', |
|
'::before', |
|
'::first-letter', |
|
'::first-line' |
|
], // selectors with these pseudo-elements can be merged as these are universally supported |
|
mergeLimit: 8191, // number of rules that can be safely merged together |
|
multiplePseudoMerging: true |
|
}, |
|
units: { |
|
ch: true, |
|
in: true, |
|
pc: true, |
|
pt: true, |
|
rem: true, |
|
vh: true, |
|
vm: true, // vm is vmin on IE9+ see https://developer.mozilla.org/en-US/docs/Web/CSS/length |
|
vmax: true, |
|
vmin: true, |
|
vw: true |
|
} |
|
} |
|
}; |
|
|
|
DEFAULTS.ie11 = merge(DEFAULTS['*'], { |
|
properties: { |
|
ieSuffixHack: true |
|
} |
|
}); |
|
|
|
DEFAULTS.ie10 = merge(DEFAULTS['*'], { |
|
properties: { |
|
ieSuffixHack: true |
|
} |
|
}); |
|
|
|
DEFAULTS.ie9 = merge(DEFAULTS['*'], { |
|
properties: { |
|
ieFilters: true, |
|
ieSuffixHack: true |
|
} |
|
}); |
|
|
|
DEFAULTS.ie8 = merge(DEFAULTS.ie9, { |
|
colors: { |
|
opacity: false |
|
}, |
|
properties: { |
|
backgroundClipMerging: false, |
|
backgroundOriginMerging: false, |
|
backgroundSizeMerging: false, |
|
iePrefixHack: true, |
|
merging: false |
|
}, |
|
selectors: { |
|
mergeablePseudoClasses: [ |
|
':after', |
|
':before', |
|
':first-child', |
|
':first-letter', |
|
':focus', |
|
':hover', |
|
':visited' |
|
], |
|
mergeablePseudoElements: [] |
|
}, |
|
units: { |
|
ch: false, |
|
rem: false, |
|
vh: false, |
|
vm: false, |
|
vmax: false, |
|
vmin: false, |
|
vw: false |
|
} |
|
}); |
|
|
|
DEFAULTS.ie7 = merge(DEFAULTS.ie8, { |
|
properties: { |
|
ieBangHack: true |
|
}, |
|
selectors: { |
|
ie7Hack: true, |
|
mergeablePseudoClasses: [ |
|
':first-child', |
|
':first-letter', |
|
':hover', |
|
':visited' |
|
] |
|
}, |
|
}); |
|
|
|
function compatibilityFrom(source) { |
|
return merge(DEFAULTS['*'], calculateSource(source)); |
|
} |
|
|
|
function merge(source, target) { |
|
for (var key in source) { |
|
if (Object.prototype.hasOwnProperty.call(source, key)) { |
|
var value = source[key]; |
|
|
|
if (Object.prototype.hasOwnProperty.call(target, key) && typeof value === 'object' && !Array.isArray(value)) { |
|
target[key] = merge(value, target[key] || {}); |
|
} else { |
|
target[key] = key in target ? target[key] : value; |
|
} |
|
} |
|
} |
|
|
|
return target; |
|
} |
|
|
|
function calculateSource(source) { |
|
if (typeof source == 'object') |
|
return source; |
|
|
|
if (!/[,\+\-]/.test(source)) |
|
return DEFAULTS[source] || DEFAULTS['*']; |
|
|
|
var parts = source.split(','); |
|
var template = parts[0] in DEFAULTS ? |
|
DEFAULTS[parts.shift()] : |
|
DEFAULTS['*']; |
|
|
|
source = {}; |
|
|
|
parts.forEach(function (part) { |
|
var isAdd = part[0] == '+'; |
|
var key = part.substring(1).split('.'); |
|
var group = key[0]; |
|
var option = key[1]; |
|
|
|
source[group] = source[group] || {}; |
|
source[group][option] = isAdd; |
|
}); |
|
|
|
return merge(template, source); |
|
} |
|
|
|
module.exports = compatibilityFrom;
|
|
|