123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- var util = require('util');
- var DEFAULTS = {
- '*': {
- colors: {
- opacity: true // rgba / hsla
- },
- properties: {
- backgroundClipMerging: false, // background-clip to shorthand
- backgroundOriginMerging: false, // background-origin to shorthand
- backgroundSizeMerging: false, // 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
- iePrefixHack: false, // underscore / asterisk prefix hacks on IE
- ieSuffixHack: true, // \9 suffix hacks on IE6-9
- 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: false, // 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
- special: /(\-moz\-|\-ms\-|\-o\-|\-webkit\-|:dir\([a-z-]*\)|:first(?![a-z-])|:fullscreen|:left|:read-only|:read-write|:right|:placeholder|:host|:content|\/deep\/|:shadow|:selection|^,)/ // special selectors which prevent merging
- },
- 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
- }
- },
- 'ie8': {
- colors: {
- opacity: false
- },
- properties: {
- backgroundClipMerging: false,
- backgroundOriginMerging: false,
- backgroundSizeMerging: false,
- colors: true,
- ieBangHack: false,
- iePrefixHack: true,
- ieSuffixHack: true,
- merging: false,
- shorterLengthUnits: false,
- spaceAfterClosingBrace: true,
- urlQuotes: false,
- zeroUnits: true
- },
- selectors: {
- adjacentSpace: false,
- ie7Hack: false,
- special: /(\-moz\-|\-ms\-|\-o\-|\-webkit\-|:root|:nth|:first\-of|:last|:only|:empty|:target|:checked|::selection|:enabled|:disabled|:not|:placeholder|:host|::content|\/deep\/|::shadow|^,)/
- },
- units: {
- ch: false,
- in: true,
- pc: true,
- pt: true,
- rem: false,
- vh: false,
- vm: false,
- vmax: false,
- vmin: false,
- vw: false
- }
- },
- 'ie7': {
- colors: {
- opacity: false
- },
- properties: {
- backgroundClipMerging: false,
- backgroundOriginMerging: false,
- backgroundSizeMerging: false,
- colors: true,
- ieBangHack: true,
- iePrefixHack: true,
- ieSuffixHack: true,
- merging: false,
- shorterLengthUnits: false,
- spaceAfterClosingBrace: true,
- urlQuotes: false,
- zeroUnits: true
- },
- selectors: {
- adjacentSpace: false,
- ie7Hack: true,
- special: /(\-moz\-|\-ms\-|\-o\-|\-webkit\-|:focus|:before|:after|:root|:nth|:first\-of|:last|:only|:empty|:target|:checked|::selection|:enabled|:disabled|:not|:placeholder|:host|::content|\/deep\/|::shadow|^,)/
- },
- units: {
- ch: false,
- in: true,
- pc: true,
- pt: true,
- rem: false,
- vh: false,
- vm: false,
- vmax: false,
- vmin: false,
- vw: false,
- }
- }
- };
- function Compatibility(source) {
- this.source = source || {};
- }
- function merge(source, target) {
- for (var key in source) {
- var value = source[key];
- if (typeof value === 'object' && !util.isRegExp(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);
- }
- Compatibility.prototype.toOptions = function () {
- return merge(DEFAULTS['*'], calculateSource(this.source));
- };
- module.exports = Compatibility;
|