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)/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
|