/* 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 https://mozilla.org/MPL/2.0/. */ //! Generic types for text properties. use crate::parser::ParserContext; use crate::values::animated::ToAnimatedZero; use cssparser::Parser; use style_traits::ParseError; /// A generic value for the `initial-letter` property. #[derive( Clone, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToComputedValue, ToCss, ToResolvedValue, ToShmem, )] pub enum InitialLetter { /// `normal` Normal, /// ` ?` Specified(Number, Option), } impl InitialLetter { /// Returns `normal`. #[inline] pub fn normal() -> Self { InitialLetter::Normal } } /// A generic spacing value for the `letter-spacing` and `word-spacing` properties. #[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToCss, ToShmem)] pub enum Spacing { /// `normal` Normal, /// `` Value(Value), } impl Spacing { /// Returns `normal`. #[inline] pub fn normal() -> Self { Spacing::Normal } /// Parses. #[inline] pub fn parse_with<'i, 't, F>( context: &ParserContext, input: &mut Parser<'i, 't>, parse: F, ) -> Result> where F: FnOnce(&ParserContext, &mut Parser<'i, 't>) -> Result>, { if input .try_parse(|i| i.expect_ident_matching("normal")) .is_ok() { return Ok(Spacing::Normal); } parse(context, input).map(Spacing::Value) } } #[cfg(feature = "gecko")] fn line_height_moz_block_height_enabled(context: &ParserContext) -> bool { context.in_ua_sheet() || static_prefs::pref!("layout.css.line-height-moz-block-height.content.enabled") } /// A generic value for the `line-height` property. #[derive( Animate, Clone, ComputeSquaredDistance, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToAnimatedValue, ToCss, ToShmem, Parse, )] #[repr(C, u8)] pub enum GenericLineHeight { /// `normal` Normal, /// `-moz-block-height` #[cfg(feature = "gecko")] #[parse(condition = "line_height_moz_block_height_enabled")] MozBlockHeight, /// `` Number(N), /// `` Length(L), } pub use self::GenericLineHeight as LineHeight; impl ToAnimatedZero for LineHeight { #[inline] fn to_animated_zero(&self) -> Result { Err(()) } } impl LineHeight { /// Returns `normal`. #[inline] pub fn normal() -> Self { LineHeight::Normal } } /// Implements type for text-decoration-thickness /// which takes the grammar of auto | from-font | | /// /// https://drafts.csswg.org/css-text-decor-4/ #[repr(C, u8)] #[cfg_attr(feature = "servo", derive(Deserialize, Serialize))] #[derive( Animate, Clone, Copy, ComputeSquaredDistance, ToAnimatedZero, Debug, Eq, MallocSizeOf, Parse, PartialEq, SpecifiedValueInfo, ToComputedValue, ToCss, ToResolvedValue, ToShmem, )] #[allow(missing_docs)] pub enum GenericTextDecorationLength { LengthPercentage(L), Auto, FromFont, }