98 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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)/gi
 | 
						|
const SPLIT = /(min|max)-resolution(\s*:\s*)(\d*\.?\d+)(dppx|dpcm|dpi|x)/i
 | 
						|
 | 
						|
class Resolution extends Prefixer {
 | 
						|
  /**
 | 
						|
   * 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)))
 | 
						|
    })
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * 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
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * 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
 |