Skip to content

Commit 7645fd2

Browse files
committed
Scroll margin and padding
1 parent bd08075 commit 7645fd2

File tree

7 files changed

+171
-47
lines changed

7 files changed

+171
-47
lines changed

src/parser.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::fmt;
44
use std::cell::RefCell;
55
use crate::media_query::*;
66
use crate::properties::*;
7+
use crate::values::traits::PropertyHandler;
78

89
#[derive(Debug, Clone)]
910
pub struct Selectors;
@@ -380,20 +381,30 @@ impl StyleRule {
380381
use crate::values::border::*;
381382
use crate::properties::margin_padding::*;
382383

384+
// TODO: somehow macro-ify this
383385
let mut border_handler = BorderHandler::default();
384386
let mut margin_handler = MarginHandler::default();
385387
let mut padding_handler = PaddingHandler::default();
388+
let mut scroll_margin_handler = MarginHandler::default();
389+
let mut scroll_padding_handler = PaddingHandler::default();
386390

387391
let mut decls = vec![];
388392
for decl in self.declarations.iter() {
389-
if !border_handler.handle_property(decl) && !margin_handler.handle_property(decl) && !padding_handler.handle_property(decl) {
393+
if !border_handler.handle_property(decl) &&
394+
!margin_handler.handle_property(decl) &&
395+
!padding_handler.handle_property(decl) &&
396+
!scroll_margin_handler.handle_property(decl) &&
397+
!scroll_padding_handler.handle_property(decl)
398+
{
390399
decls.push(decl.clone());
391400
}
392401
}
393402

394403
decls.extend(border_handler.finalize());
395404
decls.extend(margin_handler.finalize());
396405
decls.extend(padding_handler.finalize());
406+
decls.extend(scroll_margin_handler.finalize());
407+
decls.extend(scroll_padding_handler.finalize());
397408
self.declarations = decls;
398409
}
399410
}

src/properties/margin_padding.rs

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::values::{length::{Size2D, LengthPercentageOrAuto}, rect::Rect};
22
use crate::properties::Property;
3+
use crate::values::traits::PropertyHandler;
34

45
#[derive(Debug, PartialEq)]
56
enum SideCategory {
@@ -29,8 +30,8 @@ macro_rules! side_handler {
2930
decls: Vec<Property>
3031
}
3132

32-
impl $name {
33-
pub fn handle_property(&mut self, property: &Property) -> bool {
33+
impl PropertyHandler for $name {
34+
fn handle_property(&mut self, property: &Property) -> bool {
3435
use Property::*;
3536
use SideCategory::*;
3637

@@ -83,6 +84,13 @@ macro_rules! side_handler {
8384
true
8485
}
8586

87+
fn finalize(&mut self) -> Vec<Property> {
88+
self.flush();
89+
std::mem::take(&mut self.decls)
90+
}
91+
}
92+
93+
impl $name {
8694
fn flush(&mut self) {
8795
use Property::*;
8896

@@ -137,11 +145,6 @@ macro_rules! side_handler {
137145
logical_side!(block_start, block_end, $block_shorthand, $block_start, $block_end);
138146
logical_side!(inline_start, inline_end, $inline_shorthand, $inline_start, $inline_end);
139147
}
140-
141-
pub fn finalize(&mut self) -> Vec<Property> {
142-
self.flush();
143-
std::mem::take(&mut self.decls)
144-
}
145148
}
146149
};
147150
}
@@ -175,3 +178,33 @@ side_handler!(
175178
PaddingBlock,
176179
PaddingInline
177180
);
181+
182+
side_handler!(
183+
ScrollMarginHandler,
184+
ScrollMarginTop,
185+
ScrollMarginBottom,
186+
ScrollMarginLeft,
187+
ScrollMarginRight,
188+
ScrollMarginBlockStart,
189+
ScrollMarginBlockEnd,
190+
ScrollMarginInlineStart,
191+
ScrollMarginInlineEnd,
192+
ScrollMargin,
193+
ScrollMarginBlock,
194+
ScrollMarginInline
195+
);
196+
197+
side_handler!(
198+
ScrollPaddingHandler,
199+
ScrollPaddingTop,
200+
ScrollPaddingBottom,
201+
ScrollPaddingLeft,
202+
ScrollPaddingRight,
203+
ScrollPaddingBlockStart,
204+
ScrollPaddingBlockEnd,
205+
ScrollPaddingInlineStart,
206+
ScrollPaddingInlineEnd,
207+
ScrollPadding,
208+
ScrollPaddingBlock,
209+
ScrollPaddingInline
210+
);

src/properties/mod.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,30 @@ pub enum Property {
144144
PaddingInline(Size2D<LengthPercentageOrAuto>),
145145
Padding(Rect<LengthPercentageOrAuto>),
146146

147+
ScrollMarginTop(LengthPercentageOrAuto),
148+
ScrollMarginBottom(LengthPercentageOrAuto),
149+
ScrollMarginLeft(LengthPercentageOrAuto),
150+
ScrollMarginRight(LengthPercentageOrAuto),
151+
ScrollMarginBlockStart(LengthPercentageOrAuto),
152+
ScrollMarginBlockEnd(LengthPercentageOrAuto),
153+
ScrollMarginInlineStart(LengthPercentageOrAuto),
154+
ScrollMarginInlineEnd(LengthPercentageOrAuto),
155+
ScrollMarginBlock(Size2D<LengthPercentageOrAuto>),
156+
ScrollMarginInline(Size2D<LengthPercentageOrAuto>),
157+
ScrollMargin(Rect<LengthPercentageOrAuto>),
158+
159+
ScrollPaddingTop(LengthPercentageOrAuto),
160+
ScrollPaddingBottom(LengthPercentageOrAuto),
161+
ScrollPaddingLeft(LengthPercentageOrAuto),
162+
ScrollPaddingRight(LengthPercentageOrAuto),
163+
ScrollPaddingBlockStart(LengthPercentageOrAuto),
164+
ScrollPaddingBlockEnd(LengthPercentageOrAuto),
165+
ScrollPaddingInlineStart(LengthPercentageOrAuto),
166+
ScrollPaddingInlineEnd(LengthPercentageOrAuto),
167+
ScrollPaddingBlock(Size2D<LengthPercentageOrAuto>),
168+
ScrollPaddingInline(Size2D<LengthPercentageOrAuto>),
169+
ScrollPadding(Rect<LengthPercentageOrAuto>),
170+
147171
// ScrollMargin
148172
// ScrollPadding
149173
}
@@ -269,6 +293,28 @@ impl Property {
269293
"padding-block" => property!(PaddingBlock, Size2D),
270294
"padding-inline" => property!(PaddingInline, Size2D),
271295
"padding" => property!(Padding, Rect),
296+
"scroll-margin-left" => property!(ScrollMarginLeft, LengthPercentageOrAuto),
297+
"scroll-margin-right" => property!(ScrollMarginRight, LengthPercentageOrAuto),
298+
"scroll-margin-top" => property!(ScrollMarginTop, LengthPercentageOrAuto),
299+
"scroll-margin-bottom" => property!(ScrollMarginBottom, LengthPercentageOrAuto),
300+
"scroll-margin-block-start" => property!(ScrollMarginBlockStart, LengthPercentageOrAuto),
301+
"scroll-margin-block-end" => property!(ScrollMarginBlockEnd, LengthPercentageOrAuto),
302+
"scroll-margin-inline-start" => property!(ScrollMarginInlineStart, LengthPercentageOrAuto),
303+
"scroll-margin-inline-end" => property!(ScrollMarginInlineEnd, LengthPercentageOrAuto),
304+
"scroll-margin-block" => property!(ScrollMarginBlock, Size2D),
305+
"scroll-margin-inline" => property!(ScrollMarginInline, Size2D),
306+
"scroll-margin" => property!(ScrollMargin, Rect),
307+
"scroll-padding-left" => property!(ScrollPaddingLeft, LengthPercentageOrAuto),
308+
"scroll-padding-right" => property!(ScrollPaddingRight, LengthPercentageOrAuto),
309+
"scroll-padding-top" => property!(ScrollPaddingTop, LengthPercentageOrAuto),
310+
"scroll-padding-bottom" => property!(ScrollPaddingBottom, LengthPercentageOrAuto),
311+
"scroll-padding-block-start" => property!(ScrollPaddingBlockStart, LengthPercentageOrAuto),
312+
"scroll-padding-block-end" => property!(ScrollPaddingBlockEnd, LengthPercentageOrAuto),
313+
"scroll-padding-inline-start" => property!(ScrollPaddingInlineStart, LengthPercentageOrAuto),
314+
"scroll-padding-inline-end" => property!(ScrollPaddingInlineEnd, LengthPercentageOrAuto),
315+
"scroll-padding-block" => property!(ScrollPaddingBlock, Size2D),
316+
"scroll-padding-inline" => property!(ScrollPaddingInline, Size2D),
317+
"scroll-padding" => property!(ScrollPadding, Rect),
272318
_ => {}
273319
}
274320

@@ -406,6 +452,28 @@ impl Property {
406452
PaddingBlock(val) => property!("padding-block", val),
407453
PaddingInline(val) => property!("padding-inline", val),
408454
Padding(val) => property!("padding", val),
455+
ScrollMarginLeft(val) => property!("scroll-margin-left", val),
456+
ScrollMarginRight(val) => property!("scroll-margin-right", val),
457+
ScrollMarginTop(val) => property!("scroll-margin-top", val),
458+
ScrollMarginBottom(val) => property!("scroll-margin-bottom", val),
459+
ScrollMarginBlockStart(val) => property!("scroll-margin-block-start", val),
460+
ScrollMarginBlockEnd(val) => property!("scroll-margin-block-end", val),
461+
ScrollMarginInlineStart(val) => property!("scroll-margin-inline-start", val),
462+
ScrollMarginInlineEnd(val) => property!("scroll-margin-inline-end", val),
463+
ScrollMarginBlock(val) => property!("scroll-margin-block", val),
464+
ScrollMarginInline(val) => property!("scroll-margin-inline", val),
465+
ScrollMargin(val) => property!("scroll-margin", val),
466+
ScrollPaddingLeft(val) => property!("scroll-padding-left", val),
467+
ScrollPaddingRight(val) => property!("scroll-padding-right", val),
468+
ScrollPaddingTop(val) => property!("scroll-padding-top", val),
469+
ScrollPaddingBottom(val) => property!("scroll-padding-bottom", val),
470+
ScrollPaddingBlockStart(val) => property!("scroll-padding-block-start", val),
471+
ScrollPaddingBlockEnd(val) => property!("scroll-padding-block-end", val),
472+
ScrollPaddingInlineStart(val) => property!("scroll-padding-inline-start", val),
473+
ScrollPaddingInlineEnd(val) => property!("scroll-padding-inline-end", val),
474+
ScrollPaddingBlock(val) => property!("scroll-padding-block", val),
475+
ScrollPaddingInline(val) => property!("scroll-padding-inline", val),
476+
ScrollPadding(val) => property!("scroll-padding", val),
409477
Custom(custom) => {
410478
dest.write_str(custom.name.as_ref())?;
411479
dest.write_str(": ")?;

src/values/border.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::length::*;
22
use cssparser::*;
3-
use super::traits::{Parse, ToCss};
3+
use super::traits::{Parse, ToCss, PropertyHandler};
44
use super::color::CssColor;
55
use crate::properties::Property;
66
use super::rect::Rect;
@@ -198,8 +198,8 @@ pub struct BorderHandler {
198198
border_radius_handler: BorderRadiusHandler
199199
}
200200

201-
impl BorderHandler {
202-
pub fn handle_property(&mut self, property: &Property) -> bool {
201+
impl PropertyHandler for BorderHandler {
202+
fn handle_property(&mut self, property: &Property) -> bool {
203203
use Property::*;
204204
use BorderCategory::*;
205205

@@ -316,6 +316,15 @@ impl BorderHandler {
316316
true
317317
}
318318

319+
fn finalize(&mut self) -> Vec<Property> {
320+
self.flush();
321+
self.decls.extend(self.border_image_handler.finalize());
322+
self.decls.extend(self.border_radius_handler.finalize());
323+
std::mem::take(&mut self.decls)
324+
}
325+
}
326+
327+
impl BorderHandler {
319328
fn flush(&mut self) {
320329
use Property::*;
321330

@@ -518,11 +527,4 @@ impl BorderHandler {
518527
self.border_inline_start.reset();
519528
self.border_inline_end.reset();
520529
}
521-
522-
pub fn finalize(&mut self) -> Vec<Property> {
523-
self.flush();
524-
self.decls.extend(self.border_image_handler.finalize());
525-
self.decls.extend(self.border_radius_handler.finalize());
526-
std::mem::take(&mut self.decls)
527-
}
528530
}

src/values/border_image.rs

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::length::{*, NumberOrPercentage};
22
use cssparser::*;
3-
use super::traits::{Parse, ToCss};
3+
use super::traits::{Parse, ToCss, PropertyHandler};
44
use crate::properties::Property;
55
use super::rect::Rect;
66
use super::image::Image;
@@ -246,8 +246,8 @@ pub struct BorderImageHandler {
246246
repeat: Option<BorderImageRepeat>
247247
}
248248

249-
impl BorderImageHandler {
250-
pub fn handle_property(&mut self, property: &Property) -> bool {
249+
impl PropertyHandler for BorderImageHandler {
250+
fn handle_property(&mut self, property: &Property) -> bool {
251251
use Property::*;
252252
match property {
253253
BorderImageSource(val) => self.source = Some(val.clone()),
@@ -262,23 +262,7 @@ impl BorderImageHandler {
262262
true
263263
}
264264

265-
pub fn reset(&mut self) {
266-
self.source = None;
267-
self.slice = None;
268-
self.width = None;
269-
self.outset = None;
270-
self.repeat = None;
271-
}
272-
273-
pub fn set_border_image(&mut self, border_image: &BorderImage) {
274-
self.source = Some(border_image.source.clone());
275-
self.slice = Some(border_image.slice.clone());
276-
self.width = Some(border_image.width.clone());
277-
self.outset = Some(border_image.outset.clone());
278-
self.repeat = Some(border_image.repeat.clone());
279-
}
280-
281-
pub fn finalize(&mut self) -> Vec<Property> {
265+
fn finalize(&mut self) -> Vec<Property> {
282266
let mut decls = vec![];
283267
let source = std::mem::take(&mut self.source);
284268
let slice = std::mem::take(&mut self.slice);
@@ -319,3 +303,21 @@ impl BorderImageHandler {
319303
decls
320304
}
321305
}
306+
307+
impl BorderImageHandler {
308+
pub fn reset(&mut self) {
309+
self.source = None;
310+
self.slice = None;
311+
self.width = None;
312+
self.outset = None;
313+
self.repeat = None;
314+
}
315+
316+
pub fn set_border_image(&mut self, border_image: &BorderImage) {
317+
self.source = Some(border_image.source.clone());
318+
self.slice = Some(border_image.slice.clone());
319+
self.width = Some(border_image.width.clone());
320+
self.outset = Some(border_image.outset.clone());
321+
self.repeat = Some(border_image.repeat.clone());
322+
}
323+
}

src/values/border_radius.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::length::*;
22
use cssparser::*;
3-
use super::traits::{Parse, ToCss};
3+
use super::traits::{Parse, ToCss, PropertyHandler};
44
use crate::properties::Property;
55
use super::rect::Rect;
66

@@ -54,8 +54,8 @@ pub struct BorderRadiusHandler {
5454
decls: Vec<Property>
5555
}
5656

57-
impl BorderRadiusHandler {
58-
pub fn handle_property(&mut self, property: &Property) -> bool {
57+
impl PropertyHandler for BorderRadiusHandler {
58+
fn handle_property(&mut self, property: &Property) -> bool {
5959
use Property::*;
6060
match property {
6161
BorderTopLeftRadius(val) => self.top_left = Some(val.clone()),
@@ -79,7 +79,14 @@ impl BorderRadiusHandler {
7979
true
8080
}
8181

82-
pub fn flush(&mut self) {
82+
fn finalize(&mut self) -> Vec<Property> {
83+
self.flush();
84+
std::mem::take(&mut self.decls)
85+
}
86+
}
87+
88+
impl BorderRadiusHandler {
89+
fn flush(&mut self) {
8390
let top_left = std::mem::take(&mut self.top_left);
8491
let top_right = std::mem::take(&mut self.top_right);
8592
let bottom_left = std::mem::take(&mut self.bottom_left);
@@ -110,9 +117,4 @@ impl BorderRadiusHandler {
110117
}
111118
}
112119
}
113-
114-
pub fn finalize(&mut self) -> Vec<Property> {
115-
self.flush();
116-
std::mem::take(&mut self.decls)
117-
}
118120
}

src/values/traits.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use cssparser::*;
2+
use crate::properties::Property;
23

34
pub trait Parse: Sized {
45
/// Parse a value of this type.
@@ -33,3 +34,8 @@ where
3334
(*self).to_css(dest)
3435
}
3536
}
37+
38+
pub trait PropertyHandler: Sized {
39+
fn handle_property(&mut self, property: &Property) -> bool;
40+
fn finalize(&mut self) -> Vec<Property>;
41+
}

0 commit comments

Comments
 (0)