UNPKG

2.31 kBJavaScriptView Raw
1let FractionJs = require('fraction.js')
2
3let Prefixer = require('./prefixer')
4let utils = require('./utils')
5
6const REGEXP = /(min|max)-resolution\s*:\s*\d*\.?\d+(dppx|dpcm|dpi|x)/gi
7const SPLIT = /(min|max)-resolution(\s*:\s*)(\d*\.?\d+)(dppx|dpcm|dpi|x)/i
8
9class Resolution extends Prefixer {
10 /**
11 * Return prefixed query name
12 */
13 prefixName(prefix, name) {
14 if (prefix === '-moz-') {
15 return name + '--moz-device-pixel-ratio'
16 } else {
17 return prefix + name + '-device-pixel-ratio'
18 }
19 }
20
21 /**
22 * Return prefixed query
23 */
24 prefixQuery(prefix, name, colon, value, units) {
25 value = new FractionJs(value)
26
27 // 1dpcm = 2.54dpi
28 // 1dppx = 96dpi
29 if (units === 'dpi') {
30 value = value.div(96)
31 } else if (units === 'dpcm') {
32 value = value.mul(2.54).div(96)
33 }
34 value = value.simplify()
35
36 if (prefix === '-o-') {
37 value = value.n + '/' + value.d
38 }
39 return this.prefixName(prefix, name) + colon + value
40 }
41
42 /**
43 * Remove prefixed queries
44 */
45 clean(rule) {
46 if (!this.bad) {
47 this.bad = []
48 for (let prefix of this.prefixes) {
49 this.bad.push(this.prefixName(prefix, 'min'))
50 this.bad.push(this.prefixName(prefix, 'max'))
51 }
52 }
53
54 rule.params = utils.editList(rule.params, queries => {
55 return queries.filter(query => this.bad.every(i => !query.includes(i)))
56 })
57 }
58
59 /**
60 * Add prefixed queries
61 */
62 process(rule) {
63 let parent = this.parentPrefix(rule)
64 let prefixes = parent ? [parent] : this.prefixes
65
66 rule.params = utils.editList(rule.params, (origin, prefixed) => {
67 for (let query of origin) {
68 if (
69 !query.includes('min-resolution') &&
70 !query.includes('max-resolution')
71 ) {
72 prefixed.push(query)
73 continue
74 }
75
76 for (let prefix of prefixes) {
77 let processed = query.replace(REGEXP, str => {
78 let parts = str.match(SPLIT)
79 return this.prefixQuery(
80 prefix,
81 parts[1],
82 parts[2],
83 parts[3],
84 parts[4]
85 )
86 })
87 prefixed.push(processed)
88 }
89 prefixed.push(query)
90 }
91
92 return utils.uniq(prefixed)
93 })
94 }
95}
96
97module.exports = Resolution