Skip to content

Commit a2a136f

Browse files
committed
Re–use existing font-feature-settings declarations
1 parent 8edf41f commit a2a136f

File tree

3 files changed

+70
-20
lines changed

3 files changed

+70
-20
lines changed

index.js

+45-18
Original file line numberDiff line numberDiff line change
@@ -54,31 +54,58 @@ for (var prop in fontVariantProperties) {
5454
}
5555
}
5656

57+
// Find font-feature-settings declaration before given declaration,
58+
// create if does not exist
59+
function getFontFeatureSettingsPrevTo(decl) {
60+
var fontFeatureSettings = null;
61+
decl.parent.eachDecl(function(decl) {
62+
if (decl.prop === "font-feature-settings") {
63+
fontFeatureSettings = decl;
64+
}
65+
})
66+
67+
if (fontFeatureSettings === null) {
68+
fontFeatureSettings = decl.clone()
69+
fontFeatureSettings.prop = "font-feature-settings"
70+
fontFeatureSettings.value = ""
71+
decl.parent.insertBefore(decl, fontFeatureSettings)
72+
}
73+
return fontFeatureSettings
74+
}
75+
5776
/**
5877
* Expose the font-variant plugin.
5978
*/
6079
module.exports = function postcssFontVariant() {
6180
return function(styles) {
62-
// read custom media queries
63-
styles.eachDecl(function(decl) {
64-
if (!fontVariantProperties[decl.prop]) {
65-
return null
66-
}
81+
styles.eachRule(function(rule) {
82+
var fontFeatureSettings = null
83+
// read custom media queries
84+
rule.eachDecl(function(decl) {
85+
if (!fontVariantProperties[decl.prop]) {
86+
return null
87+
}
6788

68-
var newValue = decl.value
69-
if (decl.prop === "font-variant") {
70-
newValue = decl.value.split(/\s+/g).map(function(val) {
71-
return fontVariantProperties["font-variant"][val]
72-
}).join(", ")
73-
}
74-
else if (fontVariantProperties[decl.prop][decl.value]) {
75-
newValue = fontVariantProperties[decl.prop][decl.value]
76-
}
89+
var newValue = decl.value
90+
if (decl.prop === "font-variant") {
91+
newValue = decl.value.split(/\s+/g).map(function(val) {
92+
return fontVariantProperties["font-variant"][val]
93+
}).join(", ")
94+
}
95+
else if (fontVariantProperties[decl.prop][decl.value]) {
96+
newValue = fontVariantProperties[decl.prop][decl.value]
97+
}
7798

78-
var newDecl = decl.clone()
79-
newDecl.prop = "font-feature-settings"
80-
newDecl.value = newValue
81-
decl.parent.insertBefore(decl, newDecl)
99+
if (fontFeatureSettings === null) {
100+
fontFeatureSettings = getFontFeatureSettingsPrevTo(decl);
101+
}
102+
if (fontFeatureSettings.value) {
103+
fontFeatureSettings.value += ", " + newValue;
104+
}
105+
else {
106+
fontFeatureSettings.value = newValue;
107+
}
108+
})
82109
})
83110
}
84111
}

test/fixtures/font-variant.css

+12
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
selector {
22
font-variant-numeric: tabular-nums;
33
font-variant-caps: all-small-caps;
4+
}
5+
selector {
46
font-variant: normal;
7+
}
8+
selector {
59
font-variant: inherit;
10+
}
11+
selector {
612
font-variant: all-small-caps oldstyle-nums;
13+
}
14+
selector {
15+
font-feature-settings: "onum";
16+
font-variant: all-small-caps;
17+
}
18+
selector {
719
font-variant-position: normal;
820
}
+13-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
11
selector {
2-
font-feature-settings: "tnum";
2+
font-feature-settings: "tnum", "smcp", "c2sc";
33
font-variant-numeric: tabular-nums;
4-
font-feature-settings: "smcp", "c2sc";
54
font-variant-caps: all-small-caps;
5+
}
6+
selector {
67
font-feature-settings: normal;
78
font-variant: normal;
9+
}
10+
selector {
811
font-feature-settings: inherit;
912
font-variant: inherit;
13+
}
14+
selector {
1015
font-feature-settings: "smcp", "c2sc", "onum";
1116
font-variant: all-small-caps oldstyle-nums;
17+
}
18+
selector {
19+
font-feature-settings: "onum", "smcp", "c2sc";
20+
font-variant: all-small-caps;
21+
}
22+
selector {
1223
font-feature-settings: normal;
1324
font-variant-position: normal;
1425
}

0 commit comments

Comments
 (0)