Skip to content

Commit c69114d

Browse files
committed
Handle UI properties
1 parent 36c41a8 commit c69114d

File tree

5 files changed

+507
-0
lines changed

5 files changed

+507
-0
lines changed

src/lib.rs

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4603,4 +4603,150 @@ mod tests {
46034603
..Browsers::default()
46044604
});
46054605
}
4606+
4607+
#[test]
4608+
fn test_ui() {
4609+
minify_test(".foo { resize: both }", ".foo{resize:both}");
4610+
minify_test(".foo { resize: Horizontal }", ".foo{resize:horizontal}");
4611+
minify_test(".foo { cursor: ew-resize }", ".foo{cursor:ew-resize}");
4612+
minify_test(".foo { cursor: url(\"test.cur\"), ew-resize }", ".foo{cursor:url(test.cur),ew-resize}");
4613+
minify_test(".foo { cursor: url(\"test.cur\"), url(\"foo.cur\"), ew-resize }", ".foo{cursor:url(test.cur),url(foo.cur),ew-resize}");
4614+
minify_test(".foo { caret-color: auto }", ".foo{caret-color:auto}");
4615+
minify_test(".foo { caret-color: yellow }", ".foo{caret-color:#ff0}");
4616+
minify_test(".foo { caret-shape: block }", ".foo{caret-shape:block}");
4617+
minify_test(".foo { caret: yellow block }", ".foo{caret:#ff0 block}");
4618+
minify_test(".foo { caret: block yellow }", ".foo{caret:#ff0 block}");
4619+
minify_test(".foo { caret: block }", ".foo{caret:block}");
4620+
minify_test(".foo { caret: yellow }", ".foo{caret:#ff0}");
4621+
minify_test(".foo { caret: auto auto }", ".foo{caret:auto}");
4622+
minify_test(".foo { caret: auto }", ".foo{caret:auto}");
4623+
minify_test(".foo { caret: yellow auto }", ".foo{caret:#ff0}");
4624+
minify_test(".foo { caret: auto block }", ".foo{caret:block}");
4625+
minify_test(".foo { user-select: none }", ".foo{user-select:none}");
4626+
minify_test(".foo { -webkit-user-select: none }", ".foo{-webkit-user-select:none}");
4627+
minify_test(".foo { accent-color: auto }", ".foo{accent-color:auto}");
4628+
minify_test(".foo { accent-color: yellow }", ".foo{accent-color:#ff0}");
4629+
minify_test(".foo { appearance: None }", ".foo{appearance:none}");
4630+
minify_test(".foo { -webkit-appearance: textfield }", ".foo{-webkit-appearance:textfield}");
4631+
4632+
prefix_test(r#"
4633+
.foo {
4634+
user-select: none;
4635+
}
4636+
"#, indoc! {r#"
4637+
.foo {
4638+
-webkit-user-select: none;
4639+
-moz-user-select: none;
4640+
-ms-user-select: none;
4641+
user-select: none;
4642+
}
4643+
"#},
4644+
Browsers {
4645+
safari: Some(8 << 16),
4646+
opera: Some(5 << 16),
4647+
firefox: Some(10 << 16),
4648+
ie: Some(10 << 16),
4649+
..Browsers::default()
4650+
});
4651+
4652+
prefix_test(r#"
4653+
.foo {
4654+
-webkit-user-select: none;
4655+
-moz-user-select: none;
4656+
-ms-user-select: none;
4657+
user-select: none;
4658+
}
4659+
"#, indoc! {r#"
4660+
.foo {
4661+
-webkit-user-select: none;
4662+
user-select: none;
4663+
}
4664+
"#},
4665+
Browsers {
4666+
safari: Some(8 << 16),
4667+
opera: Some(80 << 16),
4668+
firefox: Some(80 << 16),
4669+
edge: Some(80 << 16),
4670+
..Browsers::default()
4671+
});
4672+
4673+
prefix_test(r#"
4674+
.foo {
4675+
-webkit-user-select: none;
4676+
-moz-user-select: none;
4677+
-ms-user-select: none;
4678+
user-select: none;
4679+
}
4680+
"#, indoc! {r#"
4681+
.foo {
4682+
user-select: none;
4683+
}
4684+
"#},
4685+
Browsers {
4686+
opera: Some(80 << 16),
4687+
firefox: Some(80 << 16),
4688+
edge: Some(80 << 16),
4689+
..Browsers::default()
4690+
});
4691+
4692+
prefix_test(r#"
4693+
.foo {
4694+
appearance: none;
4695+
}
4696+
"#, indoc! {r#"
4697+
.foo {
4698+
-webkit-appearance: none;
4699+
-moz-appearance: none;
4700+
-ms-appearance: none;
4701+
appearance: none;
4702+
}
4703+
"#},
4704+
Browsers {
4705+
safari: Some(8 << 16),
4706+
chrome: Some(80 << 16),
4707+
firefox: Some(10 << 16),
4708+
ie: Some(11 << 16),
4709+
..Browsers::default()
4710+
});
4711+
4712+
prefix_test(r#"
4713+
.foo {
4714+
-webkit-appearance: none;
4715+
-moz-appearance: none;
4716+
-ms-appearance: none;
4717+
appearance: none;
4718+
}
4719+
"#, indoc! {r#"
4720+
.foo {
4721+
-webkit-appearance: none;
4722+
appearance: none;
4723+
}
4724+
"#},
4725+
Browsers {
4726+
safari: Some(15 << 16),
4727+
chrome: Some(85 << 16),
4728+
firefox: Some(80 << 16),
4729+
edge: Some(85 << 16),
4730+
..Browsers::default()
4731+
});
4732+
4733+
prefix_test(r#"
4734+
.foo {
4735+
-webkit-appearance: none;
4736+
-moz-appearance: none;
4737+
-ms-appearance: none;
4738+
appearance: none;
4739+
}
4740+
"#, indoc! {r#"
4741+
.foo {
4742+
appearance: none;
4743+
}
4744+
"#},
4745+
Browsers {
4746+
chrome: Some(85 << 16),
4747+
firefox: Some(80 << 16),
4748+
edge: Some(85 << 16),
4749+
..Browsers::default()
4750+
});
4751+
}
46064752
}

src/macros.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,81 @@ macro_rules! enum_property {
8686
}
8787

8888
pub(crate) use enum_property;
89+
90+
macro_rules! shorthand_property {
91+
(
92+
$name: ident
93+
{ $first_key: ident: $first_type: ty, $( $key: ident: $type: ty, )* }
94+
) => {
95+
#[derive(Debug, Clone, PartialEq)]
96+
pub struct $name {
97+
pub $first_key: $first_type,
98+
$(
99+
pub $key: $type,
100+
)*
101+
}
102+
103+
impl Parse for $name {
104+
fn parse<'i, 't>(input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i, ()>> {
105+
let mut $first_key = None;
106+
$(
107+
let mut $key = None;
108+
)*
109+
110+
macro_rules! parse_one {
111+
($k: ident, $t: ty) => {
112+
if $k.is_none() {
113+
if let Ok(val) = input.try_parse(<$t>::parse) {
114+
$k = Some(val);
115+
continue
116+
}
117+
}
118+
};
119+
}
120+
121+
loop {
122+
parse_one!($first_key, $first_type);
123+
$(
124+
parse_one!($key, $type);
125+
)*
126+
break
127+
}
128+
129+
Ok($name {
130+
$first_key: $first_key.unwrap_or_default(),
131+
$(
132+
$key: $key.unwrap_or_default(),
133+
)*
134+
})
135+
}
136+
}
137+
138+
impl ToCss for $name {
139+
fn to_css<W>(&self, dest: &mut Printer<W>) -> std::fmt::Result where W: std::fmt::Write {
140+
let mut needs_space = false;
141+
macro_rules! print_one {
142+
($k: ident, $t: ty) => {
143+
if self.$k != <$t>::default() {
144+
if needs_space {
145+
dest.write_char(' ')?;
146+
}
147+
self.$k.to_css(dest)?;
148+
needs_space = true;
149+
}
150+
};
151+
}
152+
153+
print_one!($first_key, $first_type);
154+
$(
155+
print_one!($key, $type);
156+
)*
157+
if !needs_space {
158+
self.$first_key.to_css(dest)?;
159+
}
160+
Ok(())
161+
}
162+
}
163+
};
164+
}
165+
166+
pub (crate) use shorthand_property;

src/properties/mod.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub mod display;
1818
pub mod text;
1919
pub mod position;
2020
pub mod overflow;
21+
pub mod ui;
2122

2223
use cssparser::*;
2324
use custom::*;
@@ -36,6 +37,7 @@ use transform::*;
3637
use display::*;
3738
use text::*;
3839
use overflow::*;
40+
use ui::*;
3941
use crate::values::{image::*, length::*, position::*, alpha::*, size::*, rect::*, color::*, time::Time, ident::CustomIdent, easing::EasingFunction};
4042
use crate::traits::{Parse, ToCss};
4143
use crate::printer::Printer;
@@ -477,6 +479,16 @@ define_properties! {
477479
"text-emphasis": TextEmphasis(TextEmphasis, VendorPrefix) / "webkit",
478480
"text-emphasis-position": TextEmphasisPosition(TextEmphasisPosition, VendorPrefix) / "webkit",
479481
"text-shadow": TextShadow(SmallVec<[TextShadow; 1]>),
482+
483+
// https://www.w3.org/TR/2021/WD-css-ui-4-20210316
484+
"resize": Resize(Resize),
485+
"cursor": Cursor(Cursor),
486+
"caret-color": CaretColor(ColorOrAuto),
487+
"caret-shape": CaretShape(CaretShape),
488+
"caret": Caret(Caret),
489+
"user-select": UserSelect(UserSelect, VendorPrefix) / "webkit" / "moz" / "ms",
490+
"accent-color": AccentColor(ColorOrAuto),
491+
"appearance": Appearance(Appearance, VendorPrefix) / "webkit" / "moz" / "ms",
480492
}
481493

482494
impl<T: smallvec::Array<Item = V>, V: Parse> Parse for SmallVec<T> {

src/properties/prefix_handler.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,6 @@ define_prefixes! {
9090
TextAlignLast,
9191
TextDecorationSkipInk,
9292
TextOverflow,
93+
UserSelect,
94+
Appearance,
9395
}

0 commit comments

Comments
 (0)