aboutsummaryrefslogtreecommitdiffstats
path: root/components/style/values/generics/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/style/values/generics/mod.rs')
-rw-r--r--components/style/values/generics/mod.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/components/style/values/generics/mod.rs b/components/style/values/generics/mod.rs
index 604d6e21238..9ad4668f4da 100644
--- a/components/style/values/generics/mod.rs
+++ b/components/style/values/generics/mod.rs
@@ -5,9 +5,13 @@
//! Generic types that share their serialization implementations
//! for both specified and computed values.
+use counter_style::parse_counter_style_name;
+use cssparser::Parser;
use euclid::size::Size2D;
+use parser::{Parse, ParserContext};
use std::fmt;
use style_traits::ToCss;
+use super::CustomIdent;
use super::HasViewportPercentage;
use super::computed::{Context, ToComputedValue};
@@ -75,3 +79,49 @@ impl<L: ToComputedValue> ToComputedValue for BorderRadiusSize<L> {
BorderRadiusSize(Size2D::new(w, h))
}
}
+
+/// https://drafts.csswg.org/css-counter-styles/#typedef-counter-style
+///
+/// Since wherever <counter-style> is used, 'none' is a valid value as
+/// well, we combine them into one type to make code simpler.
+#[derive(Clone, PartialEq, Eq, Debug)]
+pub enum CounterStyleOrNone {
+ /// none
+ None_,
+ /// <counter-style-name>
+ Name(CustomIdent),
+}
+
+impl CounterStyleOrNone {
+ /// disc value
+ pub fn disc() -> Self {
+ CounterStyleOrNone::Name(CustomIdent(atom!("disc")))
+ }
+
+ /// decimal value
+ pub fn decimal() -> Self {
+ CounterStyleOrNone::Name(CustomIdent(atom!("decimal")))
+ }
+}
+
+no_viewport_percentage!(CounterStyleOrNone);
+
+impl Parse for CounterStyleOrNone {
+ fn parse(_: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
+ input.try(|input| {
+ parse_counter_style_name(input).map(CounterStyleOrNone::Name)
+ }).or_else(|_| {
+ input.expect_ident_matching("none").map(|_| CounterStyleOrNone::None_)
+ })
+ }
+}
+
+impl ToCss for CounterStyleOrNone {
+ #[inline]
+ fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ match self {
+ &CounterStyleOrNone::None_ => dest.write_str("none"),
+ &CounterStyleOrNone::Name(ref name) => name.to_css(dest),
+ }
+ }
+}