-
Notifications
You must be signed in to change notification settings - Fork 10
/
index.js
77 lines (59 loc) · 1.69 KB
/
index.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
'use strict';
var postcss = require('postcss');
var parseCssFont = require('parse-css-font');
var quote = require('quote');
var quoteIfNecessary = function (family) {
if (/[^^]\s[^$]/.test(family)) {
return quote(family);
}
return family;
};
var getLastPropertyDecl = function (parent, name) {
var decl;
parent.walkDecls(name, function (currentDecl) {
decl = currentDecl;
});
return decl;
};
var declWalker = function (decl) {
var parent = decl.parent;
var objFit = decl.value;
var existingFont = getLastPropertyDecl(parent, /^font(-family)?$/);
var objPosition = getLastPropertyDecl(parent, 'object-position');
var value = [
'object-fit:' + objFit
];
if (objPosition) {
value.push('object-position:' + objPosition.value);
}
var props = {
prop: 'font-family',
value: quote(value.join(';'))
};
// keep existing font-family
var fontFamily;
if (existingFont) {
if (existingFont.prop === 'font') {
fontFamily = parseCssFont(existingFont.value).family;
fontFamily = fontFamily.map(quoteIfNecessary).join(', ');
} else {
fontFamily = existingFont.value;
}
}
if (fontFamily) {
props.value += ', ' + fontFamily;
if (existingFont.prop === 'font') {
existingFont.cloneAfter(props);
} else {
existingFont.replaceWith(props);
}
} else {
decl.cloneBefore(props);
}
};
module.exports = postcss.plugin('postcss-object-fit-images', function (opts) {
opts = opts || {};
return function (css) {
css.walkDecls('object-fit', declWalker);
};
});