98 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
| 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
 |