Skip to content

Commit dff7ae3

Browse files
committed
Implement @font-palette-values rule and font-palette property
Closes parcel-bundler#118
1 parent 8165b9e commit dff7ae3

File tree

10 files changed

+451
-24
lines changed

10 files changed

+451
-24
lines changed

src/lib.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6591,6 +6591,61 @@ mod tests {
65916591
minify_test("@font-face {unicode-range: u+????, U+1????, U+10????;}", "@font-face{unicode-range:U+????,U+1????,U+10????}");
65926592
}
65936593

6594+
#[test]
6595+
fn test_font_palette_values() {
6596+
minify_test(r#"@font-palette-values --Cooler {
6597+
font-family: Bixa;
6598+
base-palette: 1;
6599+
override-colors: 1 #7EB7E4;
6600+
}"#, "@font-palette-values --Cooler{font-family:Bixa;base-palette:1;override-colors:1 #7eb7e4}");
6601+
minify_test(r#"@font-palette-values --Cooler {
6602+
font-family: Handover Sans;
6603+
base-palette: 3;
6604+
override-colors: 1 rgb(43, 12, 9), 3 lime;
6605+
}"#, "@font-palette-values --Cooler{font-family:Handover Sans;base-palette:3;override-colors:1 #2b0c09,3 #0f0}");
6606+
minify_test(r#"@font-palette-values --Cooler {
6607+
font-family: Handover Sans;
6608+
base-palette: 3;
6609+
override-colors: 1 rgb(43, 12, 9), 3 var(--highlight);
6610+
}"#, "@font-palette-values --Cooler{font-family:Handover Sans;base-palette:3;override-colors:1 #2b0c09,3 var(--highlight)}");
6611+
prefix_test(r#"@font-palette-values --Cooler {
6612+
font-family: Handover Sans;
6613+
base-palette: 3;
6614+
override-colors: 1 rgb(43, 12, 9), 3 lch(50.998% 135.363 338);
6615+
}"#, indoc! {r#"@font-palette-values --Cooler {
6616+
font-family: Handover Sans;
6617+
base-palette: 3;
6618+
override-colors: 1 #2b0c09, 3 #ee00be;
6619+
override-colors: 1 #2b0c09, 3 lch(50.998% 135.363 338);
6620+
}
6621+
"#}, Browsers {
6622+
chrome: Some(90 << 16),
6623+
..Browsers::default()
6624+
});
6625+
prefix_test(r#"@font-palette-values --Cooler {
6626+
font-family: Handover Sans;
6627+
base-palette: 3;
6628+
override-colors: 1 var(--foo), 3 lch(50.998% 135.363 338);
6629+
}"#, indoc! {r#"@font-palette-values --Cooler {
6630+
font-family: Handover Sans;
6631+
base-palette: 3;
6632+
override-colors: 1 var(--foo), 3 #ee00be;
6633+
}
6634+
6635+
@supports (color: lab(0% 0 0)) {
6636+
@font-palette-values --Cooler {
6637+
font-family: Handover Sans;
6638+
base-palette: 3;
6639+
override-colors: 1 var(--foo), 3 lab(50.998% 125.506 -50.7078);
6640+
}
6641+
}
6642+
"#}, Browsers {
6643+
chrome: Some(90 << 16),
6644+
..Browsers::default()
6645+
});
6646+
minify_test(".foo { font-palette: --Custom; }", ".foo{font-palette:--Custom}");
6647+
}
6648+
65946649
#[test]
65956650
fn test_page_rule() {
65966651
minify_test("@page {margin: 0.5cm}", "@page{margin:.5cm}");

src/parser.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::rules::font_palette_values::FontPaletteValuesRule;
12
use crate::rules::layer::{LayerBlockRule, LayerStatementRule};
23
use crate::rules::property::PropertyRule;
34
use crate::values::string::CowArcStr;
@@ -25,7 +26,7 @@ use crate::rules::{
2526
custom_media::CustomMediaRule,
2627
layer::{LayerName}
2728
};
28-
use crate::values::ident::CustomIdent;
29+
use crate::values::ident::{CustomIdent, DashedIdent};
2930
use crate::declaration::{DeclarationBlock, DeclarationList, parse_declaration};
3031
use crate::vendor_prefix::VendorPrefix;
3132
use std::collections::HashMap;
@@ -83,12 +84,14 @@ pub enum AtRulePrelude<'i> {
8384
FontFace,
8485
/// A @font-feature-values rule prelude, with its FamilyName list.
8586
FontFeatureValues,//(Vec<FamilyName>),
87+
/// A @font-palette-values rule prelude, with its name.
88+
FontPaletteValues(DashedIdent<'i>),
8689
/// A @counter-style rule prelude, with its counter style name.
8790
CounterStyle(CustomIdent<'i>),
8891
/// A @media rule prelude, with its media queries.
8992
Media(MediaList<'i>),
9093
/// A @custom-media rule prelude.
91-
CustomMedia(CowRcStr<'i>, MediaList<'i>),
94+
CustomMedia(DashedIdent<'i>, MediaList<'i>),
9295
/// An @supports rule, with its conditional
9396
Supports(SupportsCondition<'i>),
9497
/// A @viewport rule prelude.
@@ -110,7 +113,7 @@ pub enum AtRulePrelude<'i> {
110113
/// An @layer prelude.
111114
Layer(Vec<LayerName<'i>>),
112115
/// An @property prelude.
113-
Property(CowRcStr<'i>)
116+
Property(DashedIdent<'i>)
114117
}
115118

116119
impl<'a, 'i> AtRuleParser<'i> for TopLevelRuleParser<'a, 'i> {
@@ -168,18 +171,12 @@ impl<'a, 'i> AtRuleParser<'i> for TopLevelRuleParser<'a, 'i> {
168171
return Ok(AtRulePrelude::Charset)
169172
},
170173
"custom-media" if self.options.custom_media => {
171-
let name = input.expect_ident_cloned()?;
172-
if !name.starts_with("--") {
173-
return Err(input.new_unexpected_token_error(Token::Ident(name.into())));
174-
}
174+
let name = DashedIdent::parse(input)?;
175175
let media = MediaList::parse(input)?;
176176
return Ok(AtRulePrelude::CustomMedia(name, media))
177177
},
178178
"property" => {
179-
let name = input.expect_ident_cloned()?;
180-
if !name.starts_with("--") {
181-
return Err(input.new_unexpected_token_error(Token::Ident(name.into())));
182-
}
179+
let name = DashedIdent::parse(input)?;
183180
return Ok(AtRulePrelude::Property(name))
184181
},
185182
_ => {}
@@ -242,7 +239,7 @@ impl<'a, 'i> AtRuleParser<'i> for TopLevelRuleParser<'a, 'i> {
242239
AtRulePrelude::CustomMedia(name, query) => {
243240
self.state = State::Body;
244241
CssRule::CustomMedia(CustomMediaRule {
245-
name: name.into(),
242+
name,
246243
query,
247244
loc
248245
})
@@ -360,6 +357,10 @@ impl<'a, 'b, 'i> AtRuleParser<'i> for NestedRuleParser<'a, 'i> {
360357
// let family_names = parse_family_name_list(self.context, input)?;
361358
// Ok(AtRuleType::WithBlock(AtRuleBlockPrelude::FontFeatureValues(family_names)))
362359
// },
360+
"font-palette-values" => {
361+
let name = DashedIdent::parse(input)?;
362+
return Ok(AtRulePrelude::FontPaletteValues(name))
363+
},
363364
"counter-style" => {
364365
let name = CustomIdent::parse(input)?;
365366
Ok(AtRulePrelude::CounterStyle(name))
@@ -455,6 +456,10 @@ impl<'a, 'b, 'i> AtRuleParser<'i> for NestedRuleParser<'a, 'i> {
455456
// ),
456457
// ))))
457458
// },
459+
AtRulePrelude::FontPaletteValues(name) => {
460+
let rule = FontPaletteValuesRule::parse(name, input, loc)?;
461+
Ok(CssRule::FontPaletteValues(rule))
462+
},
458463
AtRulePrelude::CounterStyle(name) => {
459464
Ok(CssRule::CounterStyle(CounterStyleRule {
460465
name,
@@ -523,7 +528,7 @@ impl<'a, 'b, 'i> AtRuleParser<'i> for NestedRuleParser<'a, 'i> {
523528
}))
524529
},
525530
AtRulePrelude::Property(name) => {
526-
Ok(CssRule::Property(PropertyRule::parse(name.into(), input, loc)?))
531+
Ok(CssRule::Property(PropertyRule::parse(name, input, loc)?))
527532
},
528533
AtRulePrelude::Import(..) |
529534
AtRulePrelude::Namespace(..) |

src/properties/custom.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ impl<'i> TokenList<'i> {
257257
}
258258
Token::CloseParenthesis | Token::CloseSquareBracket | Token::CloseCurlyBracket => {
259259
token.to_css(dest)?;
260-
if !dest.minify && i != self.0.len() - 1 {
260+
if !dest.minify && i != self.0.len() - 1 && !matches!(self.0[i + 1], TokenOrValue::Token(Token::Comma)) {
261261
// Whitespace is removed during parsing, so add it back if we aren't minifying.
262262
dest.write_char(' ')?;
263263
}

src/properties/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ use size::*;
5454
use svg::*;
5555
use masking::*;
5656
use effects::*;
57-
use crate::values::{image::*, length::*, position::*, alpha::*, size::Size2D, rect::*, color::*, time::Time, easing::EasingFunction, shape::FillRule};
57+
use crate::values::{image::*, length::*, position::*, alpha::*, size::Size2D, rect::*, color::*, time::Time, easing::EasingFunction, shape::FillRule, ident::DashedIdent};
5858
use crate::traits::{Parse, ToCss};
5959
use crate::printer::Printer;
6060
use smallvec::{SmallVec, smallvec};
@@ -727,6 +727,7 @@ define_properties! {
727727
"line-height": LineHeight(LineHeight),
728728
"font": Font(Font<'i>),
729729
"vertical-align": VerticalAlign(VerticalAlign),
730+
"font-palette": FontPalette(DashedIdent<'i>),
730731

731732
"transition-property": TransitionProperty(SmallVec<[PropertyId<'i>; 1]>, VendorPrefix) / WebKit / Moz / Ms,
732733
"transition-duration": TransitionDuration(SmallVec<[Time; 1]>, VendorPrefix) / WebKit / Moz / Ms,

src/rules/custom_media.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
1-
use crate::values::string::CowArcStr;
1+
use crate::values::ident::DashedIdent;
22
use super::Location;
3-
use cssparser::serialize_identifier;
43
use crate::media_query::MediaList;
54
use crate::traits::ToCss;
65
use crate::printer::Printer;
76
use crate::error::PrinterError;
87

98
#[derive(Debug, PartialEq, Clone)]
109
pub struct CustomMediaRule<'i> {
11-
pub name: CowArcStr<'i>,
10+
pub name: DashedIdent<'i>,
1211
pub query: MediaList<'i>,
1312
pub loc: Location
1413
}
@@ -17,7 +16,7 @@ impl<'i> ToCss for CustomMediaRule<'i> {
1716
fn to_css<W>(&self, dest: &mut Printer<W>) -> Result<(), PrinterError> where W: std::fmt::Write {
1817
dest.add_mapping(self.loc);
1918
dest.write_str("@custom-media ")?;
20-
serialize_identifier(&self.name, dest)?;
19+
self.name.to_css(dest)?;
2120
dest.write_char(' ')?;
2221
self.query.to_css(dest)
2322
}

0 commit comments

Comments
 (0)