| 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;
 |