From 79766402510e542c59860a9faa3f2cb744413ce2 Mon Sep 17 00:00:00 2001 From: Ravi Shankar Date: Fri, 16 Dec 2016 11:51:59 +0530 Subject: [PATCH] Add GridLine type for grids --- components/style/values/specified/grid.rs | 96 +++++++++++++++++++++++ components/style/values/specified/mod.rs | 1 + 2 files changed, 97 insertions(+) create mode 100644 components/style/values/specified/grid.rs diff --git a/components/style/values/specified/grid.rs b/components/style/values/specified/grid.rs new file mode 100644 index 000000000000..8e6eca56372c --- /dev/null +++ b/components/style/values/specified/grid.rs @@ -0,0 +1,96 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use cssparser::Parser; +use parser::{Parse, ParserContext}; +use std::fmt; +use style_traits::ToCss; +use values::NoViewportPercentage; +use values::computed::ComputedValueAsSpecified; + +// https://drafts.csswg.org/css-grid/#typedef-grid-row-start-grid-line +#[derive(PartialEq, Clone, Debug)] +#[cfg_attr(feature = "servo", derive(HeapSizeOf))] +pub struct GridLine { + pub is_span: bool, + pub ident: Option, + pub integer: Option, +} + +impl Default for GridLine { + fn default() -> Self { + GridLine { + is_span: false, + ident: None, + integer: None, + } + } +} + +impl ToCss for GridLine { + fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + if !self.is_span && self.ident.is_none() && self.integer.is_none() { + return dest.write_str("auto") + } + + if self.is_span { + try!(dest.write_str("span")); + } + + if let Some(i) = self.integer { + try!(write!(dest, " {}", i)); + } + + if let Some(ref s) = self.ident { + try!(write!(dest, " {}", s)); + } + + Ok(()) + } +} + +impl Parse for GridLine { + fn parse(_context: &ParserContext, input: &mut Parser) -> Result { + let mut grid_line = Default::default(); + if input.try(|i| i.expect_ident_matching("auto")).is_ok() { + return Ok(grid_line) + } + + for _ in 0..3 { // Maximum possible entities for + if input.try(|i| i.expect_ident_matching("span")).is_ok() { + if grid_line.is_span { + return Err(()) + } + grid_line.is_span = true; + } else if let Ok(i) = input.try(|i| i.expect_integer()) { + if i == 0 || grid_line.integer.is_some() { + return Err(()) + } + grid_line.integer = Some(i); + } else if let Ok(name) = input.try(|i| i.expect_ident()) { + if grid_line.ident.is_some() { + return Err(()) + } + grid_line.ident = Some(name.into_owned()); + } else { + break + } + } + + if grid_line.is_span { + if let Some(i) = grid_line.integer { + if i < 0 { // disallow negative integers for grid spans + return Err(()) + } + } else { + grid_line.integer = Some(1); + } + } + + Ok(grid_line) + } +} + +impl ComputedValueAsSpecified for GridLine {} +impl NoViewportPercentage for GridLine {} diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 68caac3f7c48..7fd47b0da902 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -24,6 +24,7 @@ pub use self::length::{Percentage, LengthOrNone, LengthOrNumber, LengthOrPercent pub use self::length::{LengthOrPercentageOrNone, LengthOrPercentageOrAutoOrContent, CalcUnit}; pub mod basic_shape; +pub mod grid; pub mod image; pub mod length; pub mod position;