| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 | let FractionJs = require('fraction.js')let Prefixer = require('./prefixer')let utils = require('./utils')const REGEXP = /(min|max)-resolution\s*:\s*\d*\.?\d+(dppx|dpcm|dpi|x)/giconst SPLIT = /(min|max)-resolution(\s*:\s*)(\d*\.?\d+)(dppx|dpcm|dpi|x)/iclass Resolution extends Prefixer {  /**   * Return prefixed query name   */  prefixName(prefix, name) {    if (prefix === '-moz-') {      return name + '--moz-device-pixel-ratio'    } else {      return prefix + name + '-device-pixel-ratio'    }  }  /**   * Return prefixed query   */  prefixQuery(prefix, name, colon, value, units) {    value = new FractionJs(value)    // 1dpcm = 2.54dpi    // 1dppx = 96dpi    if (units === 'dpi') {      value = value.div(96)    } else if (units === 'dpcm') {      value = value.mul(2.54).div(96)    }    value = value.simplify()    if (prefix === '-o-') {      value = value.n + '/' + value.d    }    return this.prefixName(prefix, name) + colon + value  }  /**   * Remove prefixed queries   */  clean(rule) {    if (!this.bad) {      this.bad = []      for (let prefix of this.prefixes) {        this.bad.push(this.prefixName(prefix, 'min'))        this.bad.push(this.prefixName(prefix, 'max'))      }    }    rule.params = utils.editList(rule.params, queries => {      return queries.filter(query => this.bad.every(i => !query.includes(i)))    })  }  /**   * Add prefixed queries   */  process(rule) {    let parent = this.parentPrefix(rule)    let prefixes = parent ? [parent] : this.prefixes    rule.params = utils.editList(rule.params, (origin, prefixed) => {      for (let query of origin) {        if (          !query.includes('min-resolution') &&          !query.includes('max-resolution')        ) {          prefixed.push(query)          continue        }        for (let prefix of prefixes) {          let processed = query.replace(REGEXP, str => {            let parts = str.match(SPLIT)            return this.prefixQuery(              prefix,              parts[1],              parts[2],              parts[3],              parts[4]            )          })          prefixed.push(processed)        }        prefixed.push(query)      }      return utils.uniq(prefixed)    })  }}module.exports = Resolution
 |