Skip to content

Commit 990534f

Browse files
committed
Parse transitions
1 parent 25389cf commit 990534f

File tree

4 files changed

+97
-2
lines changed

4 files changed

+97
-2
lines changed

src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,5 +1314,10 @@ mod tests {
13141314
minify_test(".foo { transition-timing-function: ease-in-out, cubic-bezier(0.42, 0, 1, 1) }", ".foo{transition-timing-function:ease-in-out,ease-in}");
13151315
minify_test(".foo { transition-timing-function: cubic-bezier(0.42, 0, 1, 1), cubic-bezier(0.58, 0.2, 0.11, 1.2) }", ".foo{transition-timing-function:ease-in,cubic-bezier(.58,.2,.11,1.2)}");
13161316
minify_test(".foo { transition-timing-function: step-start, steps(5, jump-start) }", ".foo{transition-timing-function:step-start,steps(5,start)}");
1317+
minify_test(".foo { transition: width 2s ease }", ".foo{transition:width 2s}");
1318+
minify_test(".foo { transition: width 2s ease, height 1000ms cubic-bezier(0.25, 0.1, 0.25, 1) }", ".foo{transition:width 2s,height 1s}");
1319+
minify_test(".foo { transition: width 2s 1s }", ".foo{transition:width 2s 1s}");
1320+
minify_test(".foo { transition: width 2s ease 1s }", ".foo{transition:width 2s 1s}");
1321+
minify_test(".foo { transition: ease-in 1s width 4s }", ".foo{transition:width 1s ease-in 4s}");
13171322
}
13181323
}

src/properties/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub mod box_shadow;
99
pub mod border;
1010
pub mod border_image;
1111
pub mod border_radius;
12+
pub mod transition;
1213

1314
use cssparser::*;
1415
use custom::*;
@@ -21,6 +22,7 @@ use box_shadow::*;
2122
use border::*;
2223
use border_image::*;
2324
use border_radius::*;
25+
use transition::*;
2426
use crate::values::{image::*, length::*, rect::*, color::*, time::Time, ident::CustomIdent, easing::EasingFunction};
2527
use crate::traits::{Parse, ToCss};
2628
use crate::printer::Printer;
@@ -234,7 +236,8 @@ pub enum Property {
234236
TransitionProperty(Vec<CustomIdent>),
235237
TransitionDuration(Vec<Time>),
236238
TransitionDelay(Vec<Time>),
237-
TransitionTimingFunction(Vec<EasingFunction>)
239+
TransitionTimingFunction(Vec<EasingFunction>),
240+
Transition(Vec<Transition>)
238241
}
239242

240243
impl Property {
@@ -430,6 +433,7 @@ impl Property {
430433
"transition-duration" => property!(TransitionDuration, Time, true),
431434
"transition-delay" => property!(TransitionDelay, Time, true),
432435
"transition-timing-function" => property!(TransitionTimingFunction, EasingFunction, true),
436+
"transition" => property!(Transition, Transition, true),
433437
_ => {}
434438
}
435439

@@ -633,6 +637,7 @@ impl Property {
633637
TransitionDuration(val) => property!("transition-duration", val, true),
634638
TransitionDelay(val) => property!("transition-delay", val, true),
635639
TransitionTimingFunction(val) => property!("transition-timing-function", val, true),
640+
Transition(val) => property!("transition", val, true),
636641
Custom(custom) => {
637642
dest.write_str(custom.name.as_ref())?;
638643
dest.delim(':', false)?;

src/properties/transition.rs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
use cssparser::*;
2+
use crate::traits::{Parse, ToCss, PropertyHandler};
3+
use crate::values::{ident::CustomIdent, time::Time, easing::EasingFunction};
4+
use super::Property;
5+
use crate::printer::Printer;
6+
use std::fmt::Write;
7+
8+
/// https://www.w3.org/TR/2018/WD-css-transitions-1-20181011/#transition-shorthand-property
9+
#[derive(Debug, Clone, PartialEq)]
10+
pub struct Transition {
11+
property: CustomIdent,
12+
duration: Time,
13+
delay: Time,
14+
timing_function: EasingFunction
15+
}
16+
17+
impl Parse for Transition {
18+
fn parse<'i, 't>(input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i, ()>> {
19+
let mut property = None;
20+
let mut duration = None;
21+
let mut delay = None;
22+
let mut timing_function = None;
23+
24+
loop {
25+
if duration.is_none() {
26+
if let Ok(value) = input.try_parse(Time::parse) {
27+
duration = Some(value);
28+
continue
29+
}
30+
}
31+
32+
if timing_function.is_none() {
33+
if let Ok(value) = input.try_parse(EasingFunction::parse) {
34+
timing_function = Some(value);
35+
continue
36+
}
37+
}
38+
39+
if delay.is_none() {
40+
if let Ok(value) = input.try_parse(Time::parse) {
41+
delay = Some(value);
42+
continue
43+
}
44+
}
45+
46+
if property.is_none() {
47+
if let Ok(value) = input.try_parse(CustomIdent::parse) {
48+
property = Some(value);
49+
continue
50+
}
51+
}
52+
53+
break
54+
}
55+
56+
Ok(Transition {
57+
property: property.unwrap_or(CustomIdent("all".into())),
58+
duration: duration.unwrap_or(Time::Seconds(0.0)),
59+
delay: delay.unwrap_or(Time::Seconds(0.0)),
60+
timing_function: timing_function.unwrap_or(EasingFunction::Ease)
61+
})
62+
}
63+
}
64+
65+
impl ToCss for Transition {
66+
fn to_css<W>(&self, dest: &mut Printer<W>) -> std::fmt::Result where W: std::fmt::Write {
67+
self.property.to_css(dest)?;
68+
if self.duration != 0.0 {
69+
dest.write_char(' ')?;
70+
self.duration.to_css(dest)?;
71+
}
72+
73+
if self.timing_function != EasingFunction::Ease && self.timing_function != EasingFunction::CubicBezier(0.25, 0.1, 0.25, 1.0) {
74+
dest.write_char(' ')?;
75+
self.timing_function.to_css(dest)?;
76+
}
77+
78+
if self.delay != 0.0 {
79+
dest.write_char(' ')?;
80+
self.delay.to_css(dest)?;
81+
}
82+
83+
Ok(())
84+
}
85+
}

src/values/ident.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::fmt::Write;
55

66
/// https://www.w3.org/TR/css-values-4/#custom-idents
77
#[derive(Debug, Clone, PartialEq)]
8-
pub struct CustomIdent(String);
8+
pub struct CustomIdent(pub String);
99

1010
impl Parse for CustomIdent {
1111
fn parse<'i, 't>(input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i, ()>> {

0 commit comments

Comments
 (0)