From cf80c07d6d514152c255b3b5cb8ad0a0426c7d68 Mon Sep 17 00:00:00 2001 From: Ravi Shankar Date: Mon, 13 Feb 2017 23:38:21 +0530 Subject: [PATCH] Add parsing/serialization for --- components/style/values/specified/grid.rs | 65 ++++++++++++++++++++++- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/components/style/values/specified/grid.rs b/components/style/values/specified/grid.rs index 4f3e64142e7..2fb304cd0ec 100644 --- a/components/style/values/specified/grid.rs +++ b/components/style/values/specified/grid.rs @@ -4,12 +4,13 @@ //! A grid line type. -use cssparser::Parser; +use cssparser::{Parser, Token}; use parser::{Parse, ParserContext}; use std::fmt; use style_traits::ToCss; -use values::HasViewportPercentage; +use values::{CSSFloat, HasViewportPercentage}; use values::computed::ComputedValueAsSpecified; +use values::specified::LengthOrPercentage; #[derive(PartialEq, Clone, Debug)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] @@ -97,3 +98,63 @@ impl Parse for GridLine { impl ComputedValueAsSpecified for GridLine {} no_viewport_percentage!(GridLine); + +define_css_keyword_enum!{ TrackKeyword: + "auto" => Auto, + "max-content" => MaxContent, + "min-content" => MinContent +} + +#[allow(missing_docs)] +#[derive(Clone, PartialEq, Debug)] +#[cfg_attr(feature = "servo", derive(HeapSizeOf))] +/// https://drafts.csswg.org/css-grid/#typedef-track-breadth +pub enum TrackBreadth { + Breadth(L), + Flex(CSSFloat), + Keyword(TrackKeyword), +} + +/// Parse a single flexible length. +pub fn parse_flex(input: &mut Parser) -> Result { + match try!(input.next()) { + Token::Dimension(ref value, ref unit) if unit.to_lowercase() == "fr" && value.value.is_sign_positive() + => Ok(value.value), + _ => Err(()), + } +} + +impl Parse for TrackBreadth { + fn parse(_context: &ParserContext, input: &mut Parser) -> Result { + if let Ok(lop) = input.try(LengthOrPercentage::parse_non_negative) { + Ok(TrackBreadth::Breadth(lop)) + } else { + if let Ok(f) = input.try(parse_flex) { + Ok(TrackBreadth::Flex(f)) + } else { + TrackKeyword::parse(input).map(TrackBreadth::Keyword) + } + } + } +} + +impl ToCss for TrackBreadth { + fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + match *self { + TrackBreadth::Breadth(ref lop) => lop.to_css(dest), + TrackBreadth::Flex(ref value) => write!(dest, "{}fr", value), + TrackBreadth::Keyword(ref k) => k.to_css(dest), + } + } +} + +impl HasViewportPercentage for TrackBreadth { + #[inline] + fn has_viewport_percentage(&self) -> bool { + if let TrackBreadth::Breadth(ref lop) = *self { + lop.has_viewport_percentage() + } else { + false + } + } +}