aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRavi Shankar <wafflespeanut@gmail.com>2017-05-24 17:40:19 +0530
committerRavi Shankar <wafflespeanut@gmail.com>2017-05-24 19:46:03 +0530
commit101e09e560667b8a7d3a457e7f1da66294a920fb (patch)
tree8792a0872b2eeaffad2fa1a35d16e6ee215f5a72
parent7b68d8d8bf9e6fe8a3ea9979ffc58d49fdb68919 (diff)
downloadservo-101e09e560667b8a7d3a457e7f1da66294a920fb.tar.gz
servo-101e09e560667b8a7d3a457e7f1da66294a920fb.zip
Add shorthand parsing and serialization for grid
-rw-r--r--components/style/properties/shorthand/position.mako.rs103
1 files changed, 103 insertions, 0 deletions
diff --git a/components/style/properties/shorthand/position.mako.rs b/components/style/properties/shorthand/position.mako.rs
index 1573a6a43e0..94158701ac6 100644
--- a/components/style/properties/shorthand/position.mako.rs
+++ b/components/style/properties/shorthand/position.mako.rs
@@ -394,6 +394,109 @@
}
</%helpers:shorthand>
+<%helpers:shorthand name="grid"
+ sub_properties="grid-template-rows grid-template-columns grid-template-areas
+ grid-auto-rows grid-auto-columns grid-row-gap grid-column-gap
+ grid-auto-flow"
+ spec="https://drafts.csswg.org/css-grid/#propdef-grid"
+ disable_when_testing="True"
+ products="gecko">
+ use properties::longhands::{grid_auto_columns, grid_auto_rows, grid_auto_flow};
+ use properties::longhands::{grid_template_columns, grid_template_rows};
+ use properties::longhands::grid_auto_flow::computed_value::{AutoFlow, T as SpecifiedAutoFlow};
+ use values::{Either, None_};
+ use values::specified::{LengthOrPercentage, TrackSize};
+
+ pub fn parse_value(context: &ParserContext, input: &mut Parser) -> Result<Longhands, ()> {
+ let mut temp_rows = Either::Second(None_);
+ let mut temp_cols = Either::Second(None_);
+ let mut temp_areas = Either::Second(None_);
+ let mut auto_rows = TrackSize::default();
+ let mut auto_cols = TrackSize::default();
+ let mut flow = grid_auto_flow::get_initial_value();
+
+ fn parse_auto_flow(input: &mut Parser, is_row: bool) -> Result<SpecifiedAutoFlow, ()> {
+ let mut auto_flow = None;
+ let mut dense = false;
+ for _ in 0..2 {
+ if input.try(|i| i.expect_ident_matching("auto-flow")).is_ok() {
+ auto_flow = if is_row {
+ Some(AutoFlow::Row)
+ } else {
+ Some(AutoFlow::Column)
+ };
+ } else if input.try(|i| i.expect_ident_matching("dense")).is_ok() {
+ dense = true;
+ } else {
+ break
+ }
+ }
+
+ auto_flow.map(|flow| {
+ SpecifiedAutoFlow {
+ autoflow: flow,
+ dense: dense,
+ }
+ }).ok_or(())
+ }
+
+ if let Ok((rows, cols, areas)) = input.try(|i| super::grid_template::parse_grid_template(context, i)) {
+ temp_rows = rows;
+ temp_cols = cols;
+ temp_areas = areas;
+ } else if let Ok(rows) = input.try(|i| grid_template_rows::parse(context, i)) {
+ temp_rows = rows;
+ input.expect_delim('/')?;
+ flow = parse_auto_flow(input, false)?;
+ auto_cols = grid_auto_columns::parse(context, input).unwrap_or_default();
+ } else {
+ flow = parse_auto_flow(input, true)?;
+ auto_rows = input.try(|i| grid_auto_rows::parse(context, i)).unwrap_or_default();
+ input.expect_delim('/')?;
+ temp_cols = grid_template_columns::parse(context, input)?;
+ }
+
+ Ok(expanded! {
+ grid_template_rows: temp_rows,
+ grid_template_columns: temp_cols,
+ grid_template_areas: temp_areas,
+ grid_auto_rows: auto_rows,
+ grid_auto_columns: auto_cols,
+ grid_auto_flow: flow,
+ // This shorthand also resets grid gap
+ grid_row_gap: LengthOrPercentage::zero(),
+ grid_column_gap: LengthOrPercentage::zero(),
+ })
+ }
+
+ impl<'a> ToCss for LonghandsToSerialize<'a> {
+ fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ if let Either::First(_) = *self.grid_template_areas {
+ super::grid_template::serialize_grid_template(self.grid_template_rows,
+ self.grid_template_columns,
+ self.grid_template_areas, dest)
+ } else if self.grid_auto_flow.autoflow == AutoFlow::Row {
+ self.grid_template_rows.to_css(dest)?;
+ dest.write_str(" / auto-flow")?;
+ if self.grid_auto_flow.dense {
+ dest.write_str(" dense")?;
+ }
+
+ self.grid_auto_columns.to_css(dest)
+ } else {
+ dest.write_str("auto-flow ")?;
+ if self.grid_auto_flow.dense {
+ dest.write_str("dense ")?;
+ }
+
+ self.grid_auto_rows.to_css(dest)?;
+ dest.write_str(" / ")?;
+ self.grid_template_columns.to_css(dest)
+ }
+ }
+ }
+</%helpers:shorthand>
+
<%helpers:shorthand name="place-content" sub_properties="align-content justify-content"
spec="https://drafts.csswg.org/css-align/#propdef-place-content"
products="gecko" disable_when_testing="True">