1 | let Prefixer = require('./prefixer')
|
2 | let OldValue = require('./old-value')
|
3 | let vendor = require('./vendor')
|
4 | let utils = require('./utils')
|
5 |
|
6 | class Value extends Prefixer {
|
7 | |
8 |
|
9 |
|
10 | static save(prefixes, decl) {
|
11 | let prop = decl.prop
|
12 | let result = []
|
13 |
|
14 | for (let prefix in decl._autoprefixerValues) {
|
15 | let value = decl._autoprefixerValues[prefix]
|
16 |
|
17 | if (value === decl.value) {
|
18 | continue
|
19 | }
|
20 |
|
21 | let item
|
22 | let propPrefix = vendor.prefix(prop)
|
23 |
|
24 | if (propPrefix === '-pie-') {
|
25 | continue
|
26 | }
|
27 |
|
28 | if (propPrefix === prefix) {
|
29 | item = decl.value = value
|
30 | result.push(item)
|
31 | continue
|
32 | }
|
33 |
|
34 | let prefixed = prefixes.prefixed(prop, prefix)
|
35 | let rule = decl.parent
|
36 |
|
37 | if (!rule.every(i => i.prop !== prefixed)) {
|
38 | result.push(item)
|
39 | continue
|
40 | }
|
41 |
|
42 | let trimmed = value.replace(/\s+/, ' ')
|
43 | let already = rule.some(
|
44 | i => i.prop === decl.prop && i.value.replace(/\s+/, ' ') === trimmed
|
45 | )
|
46 |
|
47 | if (already) {
|
48 | result.push(item)
|
49 | continue
|
50 | }
|
51 |
|
52 | let cloned = this.clone(decl, { value })
|
53 | item = decl.parent.insertBefore(decl, cloned)
|
54 |
|
55 | result.push(item)
|
56 | }
|
57 |
|
58 | return result
|
59 | }
|
60 |
|
61 | |
62 |
|
63 |
|
64 | check(decl) {
|
65 | let value = decl.value
|
66 | if (!value.includes(this.name)) {
|
67 | return false
|
68 | }
|
69 |
|
70 | return !!value.match(this.regexp())
|
71 | }
|
72 |
|
73 | |
74 |
|
75 |
|
76 | regexp() {
|
77 | return this.regexpCache || (this.regexpCache = utils.regexp(this.name))
|
78 | }
|
79 |
|
80 | |
81 |
|
82 |
|
83 | replace(string, prefix) {
|
84 | return string.replace(this.regexp(), `$1${prefix}$2`)
|
85 | }
|
86 |
|
87 | |
88 |
|
89 |
|
90 | value(decl) {
|
91 | if (decl.raws.value && decl.raws.value.value === decl.value) {
|
92 | return decl.raws.value.raw
|
93 | } else {
|
94 | return decl.value
|
95 | }
|
96 | }
|
97 |
|
98 | |
99 |
|
100 |
|
101 | add(decl, prefix) {
|
102 | if (!decl._autoprefixerValues) {
|
103 | decl._autoprefixerValues = {}
|
104 | }
|
105 | let value = decl._autoprefixerValues[prefix] || this.value(decl)
|
106 |
|
107 | let before
|
108 | do {
|
109 | before = value
|
110 | value = this.replace(value, prefix)
|
111 | if (value === false) return
|
112 | } while (value !== before)
|
113 |
|
114 | decl._autoprefixerValues[prefix] = value
|
115 | }
|
116 |
|
117 | |
118 |
|
119 |
|
120 | old(prefix) {
|
121 | return new OldValue(this.name, prefix + this.name)
|
122 | }
|
123 | }
|
124 |
|
125 | module.exports = Value
|