Skip to content

Commit d7b2e50

Browse files
committed
Handle border-image
1 parent a1ccfd5 commit d7b2e50

File tree

9 files changed

+527
-50
lines changed

9 files changed

+527
-50
lines changed

src/lib.rs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ mod tests {
119119
}
120120
"#, indoc! {r#"
121121
.foo {
122-
border: 2.0px solid #f00;
122+
border: 2px solid #f00;
123123
}"#
124124
});
125125

@@ -296,4 +296,42 @@ mod tests {
296296
}"#
297297
});
298298
}
299+
300+
#[test]
301+
pub fn test_border_image() {
302+
test(r#"
303+
.foo {
304+
border-image: url(test.png) 60;
305+
}
306+
"#, indoc! {r#"
307+
.foo {
308+
border-image: url(test.png) 60;
309+
}"#
310+
});
311+
312+
test(r#"
313+
.foo {
314+
border-image: url(test.png) 60;
315+
border-image-source: url(foo.png);
316+
}
317+
"#, indoc! {r#"
318+
.foo {
319+
border-image: url(foo.png) 60;
320+
}"#
321+
});
322+
323+
test(r#"
324+
.foo {
325+
border-image-source: url(foo.png);
326+
border-image-slice: 10 40 10 40 fill;
327+
border-image-width: 10px;
328+
border-image-outset: 0;
329+
border-image-repeat: round round;
330+
}
331+
"#, indoc! {r#"
332+
.foo {
333+
border-image: url(foo.png) 10 40 fill / 10px round;
334+
}"#
335+
});
336+
}
299337
}

src/properties/mod.rs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ mod custom;
22

33
use cssparser::*;
44
use custom::*;
5-
use crate::values::{image::*, length::*, border::*, rect::*, color::*};
5+
use crate::values::{image::*, length::*, border::*, border_image::*, rect::*, color::*};
66
use super::values::traits::Parse;
77

88
#[derive(Debug, Clone)]
@@ -85,12 +85,18 @@ pub enum Property {
8585
// BorderEndEndRadius
8686
// BorderRadius
8787

88-
// BorderImageSource
89-
// BorderImageOutset
90-
// BorderImageRepeat
91-
// BorderImageWidth
92-
// BorderImageSlice
93-
// BorderImage
88+
/// https://www.w3.org/TR/css-backgrounds-3/#border-image-source
89+
BorderImageSource(Image),
90+
/// https://www.w3.org/TR/css-backgrounds-3/#border-image-outset
91+
BorderImageOutset(Rect<LengthOrNumber>),
92+
/// https://www.w3.org/TR/css-backgrounds-3/#border-image-repeat
93+
BorderImageRepeat(BorderImageRepeat),
94+
/// https://www.w3.org/TR/css-backgrounds-3/#border-image-width
95+
BorderImageWidth(Rect<BorderImageSideWidth>),
96+
/// https://www.w3.org/TR/css-backgrounds-3/#border-image-slice
97+
BorderImageSlice(BorderImageSlice),
98+
/// https://www.w3.org/TR/css-backgrounds-3/#border-image
99+
BorderImage(BorderImage),
94100

95101
BorderColor(Rect<CssColor>),
96102
BorderStyle(Rect<BorderStyle>),
@@ -208,6 +214,12 @@ impl Property {
208214
"border-inline" => property!(BorderInline, Border),
209215
"border-inline-start" => property!(BorderInlineStart, Border),
210216
"border-inline-end" => property!(BorderInlineEnd, Border),
217+
"border-image-source" => property!(BorderImageSource, Image),
218+
"border-image-outset" => property!(BorderImageOutset, Rect),
219+
"border-image-repeat" => property!(BorderImageRepeat, BorderImageRepeat),
220+
"border-image-width" => property!(BorderImageWidth, Rect),
221+
"border-image-slice" => property!(BorderImageSlice, BorderImageSlice),
222+
"border-image" => property!(BorderImage, BorderImage),
211223
_ => {}
212224
}
213225

@@ -308,6 +320,12 @@ impl Property {
308320
BorderInline(val) => property!("border-inline", val),
309321
BorderInlineStart(val) => property!("border-inline-start", val),
310322
BorderInlineEnd(val) => property!("border-inline-end", val),
323+
BorderImageSource(val) => property!("border-image-source", val),
324+
BorderImageOutset(val) => property!("border-image-outset", val),
325+
BorderImageRepeat(val) => property!("border-image-repeat", val),
326+
BorderImageWidth(val) => property!("border-image-width", val),
327+
BorderImageSlice(val) => property!("border-image-slice", val),
328+
BorderImage(val) => property!("border-image", val),
311329
Custom(custom) => {
312330
dest.write_str(custom.name.as_ref())?;
313331
dest.write_str(": ")?;

src/values/border.rs

Lines changed: 10 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ use super::traits::Parse;
44
use super::color::CssColor;
55
use crate::properties::Property;
66
use super::rect::Rect;
7+
#[macro_use]
8+
use super::macros::*;
9+
use super::border_image::*;
710

811
#[derive(Debug, Clone, PartialEq)]
912
pub enum BorderSideWidth {
@@ -44,40 +47,6 @@ impl ToCss for BorderSideWidth {
4447
}
4548
}
4649

47-
macro_rules! enum_property {
48-
($name: ident, $( $x: ident ),+) => {
49-
#[derive(Debug, Clone, PartialEq)]
50-
pub enum $name {
51-
$(
52-
$x,
53-
)+
54-
}
55-
56-
impl Parse for $name {
57-
fn parse<'i, 't>(input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i, ()>> {
58-
let ident = input.expect_ident()?;
59-
match &ident[..] {
60-
$(
61-
s if s.eq_ignore_ascii_case(stringify!($x)) => Ok($name::$x),
62-
)+
63-
_ => return Err(input.new_error(BasicParseErrorKind::QualifiedRuleInvalid))
64-
}
65-
}
66-
}
67-
68-
impl ToCss for $name {
69-
fn to_css<W>(&self, dest: &mut W) -> std::fmt::Result where W: std::fmt::Write {
70-
use $name::*;
71-
match self {
72-
$(
73-
$x => dest.write_str(&stringify!($x).to_lowercase()),
74-
)+
75-
}
76-
}
77-
}
78-
};
79-
}
80-
8150
enum_property!(BorderStyle,
8251
Hidden,
8352
None,
@@ -224,7 +193,8 @@ pub struct BorderHandler {
224193
border_inline_start: BorderShorthand,
225194
border_inline_end: BorderShorthand,
226195
category: BorderCategory,
227-
decls: Vec<Property>
196+
decls: Vec<Property>,
197+
border_image_handler: BorderImageHandler
228198
}
229199

230200
impl BorderHandler {
@@ -333,14 +303,15 @@ impl BorderHandler {
333303
self.border_block_end.reset();
334304
self.border_inline_start.reset();
335305
self.border_inline_end.reset();
306+
307+
// Setting the `border` property resets `border-image`.
308+
self.border_image_handler.reset();
336309
}
337310
_ => {
338-
return false
311+
return self.border_image_handler.handle_property(property)
339312
}
340313
}
341314

342-
println!("{:?}", self);
343-
344315
true
345316
}
346317

@@ -549,6 +520,7 @@ impl BorderHandler {
549520

550521
pub fn finalize(&mut self) -> Vec<Property> {
551522
self.flush();
523+
self.decls.extend(self.border_image_handler.finalize());
552524
std::mem::take(&mut self.decls)
553525
}
554526
}

0 commit comments

Comments
 (0)