-
Notifications
You must be signed in to change notification settings - Fork 0
/
value.js
125 lines (102 loc) · 2.56 KB
/
value.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import Prefixer from "./prefixer.js";
import OldValue from "./old-value.js";
import vendor from "./vendor.js";
import * as utils from "./utils.js";
class Value extends Prefixer {
/**
* Clone decl for each prefixed values
*/
static save(prefixes, decl) {
let prop = decl.prop;
let result = [];
for (let prefix in decl._autoprefixerValues) {
let value = decl._autoprefixerValues[prefix];
if (value === decl.value) {
continue;
}
let item;
let propPrefix = vendor.prefix(prop);
if (propPrefix === "-pie-") {
continue;
}
if (propPrefix === prefix) {
item = decl.value = value;
result.push(item);
continue;
}
let prefixed = prefixes.prefixed(prop, prefix);
let rule = decl.parent;
if (!rule.every((i) => i.prop !== prefixed)) {
result.push(item);
continue;
}
let trimmed = value.replace(/\s+/, " ");
let already = rule.some(
(i) => i.prop === decl.prop && i.value.replace(/\s+/, " ") === trimmed,
);
if (already) {
result.push(item);
continue;
}
let cloned = this.clone(decl, { value });
item = decl.parent.insertBefore(decl, cloned);
result.push(item);
}
return result;
}
/**
* Is declaration need to be prefixed
*/
check(decl) {
let value = decl.value;
if (!value.includes(this.name)) {
return false;
}
return !!value.match(this.regexp());
}
/**
* Lazy regexp loading
*/
regexp() {
return this.regexpCache || (this.regexpCache = utils.regexp(this.name));
}
/**
* Add prefix to values in string
*/
replace(string, prefix) {
return string.replace(this.regexp(), `$1${prefix}$2`);
}
/**
* Get value with comments if it was not changed
*/
value(decl) {
if (decl.raws.value && decl.raws.value.value === decl.value) {
return decl.raws.value.raw;
} else {
return decl.value;
}
}
/**
* Save values with next prefixed token
*/
add(decl, prefix) {
if (!decl._autoprefixerValues) {
decl._autoprefixerValues = {};
}
let value = decl._autoprefixerValues[prefix] || this.value(decl);
let before;
do {
before = value;
value = this.replace(value, prefix);
if (value === false) return;
} while (value !== before);
decl._autoprefixerValues[prefix] = value;
}
/**
* Return function to fast find prefixed value
*/
old(prefix) {
return new OldValue(this.name, prefix + this.name);
}
}
export default Value;