summaryrefslogtreecommitdiffstats
path: root/servo/components/style/properties_and_values/syntax/data_type.rs
diff options
context:
space:
mode:
Diffstat (limited to 'servo/components/style/properties_and_values/syntax/data_type.rs')
-rw-r--r--servo/components/style/properties_and_values/syntax/data_type.rs134
1 files changed, 134 insertions, 0 deletions
diff --git a/servo/components/style/properties_and_values/syntax/data_type.rs b/servo/components/style/properties_and_values/syntax/data_type.rs
new file mode 100644
index 0000000000..be331e2222
--- /dev/null
+++ b/servo/components/style/properties_and_values/syntax/data_type.rs
@@ -0,0 +1,134 @@
+/* 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/. */
+
+//! Used for parsing and serializing component names from the syntax string.
+
+use super::{Component, ComponentName, Multiplier};
+use std::fmt::{self, Debug, Write};
+use style_traits::{CssWriter, ToCss};
+
+/// <https://drafts.css-houdini.org/css-properties-values-api-1/#supported-names>
+#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq)]
+pub enum DataType {
+ /// Any valid `<length>` value
+ Length,
+ /// `<number>` values
+ Number,
+ /// Any valid <percentage> value
+ Percentage,
+ /// Any valid `<length>` or `<percentage>` value, any valid `<calc()>` expression combining
+ /// `<length>` and `<percentage>` components.
+ LengthPercentage,
+ /// Any valid `<color>` value
+ Color,
+ /// Any valid `<image>` value
+ Image,
+ /// Any valid `<url>` value
+ Url,
+ /// Any valid `<integer>` value
+ Integer,
+ /// Any valid `<angle>` value
+ Angle,
+ /// Any valid `<time>` value
+ Time,
+ /// Any valid `<resolution>` value
+ Resolution,
+ /// Any valid `<transform-function>` value
+ TransformFunction,
+ /// Any valid `<custom-ident>` value
+ CustomIdent,
+ /// A list of valid `<transform-function>` values. Note that "<transform-list>" is a pre-multiplied
+ /// data type name equivalent to "<transform-function>+"
+ TransformList,
+ /// Any valid `<string>` value
+ ///
+ /// <https://github.com/w3c/css-houdini-drafts/issues/1103>
+ String,
+}
+
+impl DataType {
+ /// Converts a component name from a pre-multiplied data type to its un-pre-multiplied equivalent.
+ ///
+ /// <https://drafts.css-houdini.org/css-properties-values-api-1/#pre-multiplied-data-type-name>
+ pub fn unpremultiply(&self) -> Option<Component> {
+ match *self {
+ DataType::TransformList => Some(Component {
+ name: ComponentName::DataType(DataType::TransformFunction),
+ multiplier: Some(Multiplier::Space),
+ }),
+ _ => None,
+ }
+ }
+
+ /// Parses a syntax component name.
+ pub fn from_str(ty: &str) -> Option<Self> {
+ Some(match ty.as_bytes() {
+ b"length" => DataType::Length,
+ b"number" => DataType::Number,
+ b"percentage" => DataType::Percentage,
+ b"length-percentage" => DataType::LengthPercentage,
+ b"color" => DataType::Color,
+ b"image" => DataType::Image,
+ b"url" => DataType::Url,
+ b"integer" => DataType::Integer,
+ b"angle" => DataType::Angle,
+ b"time" => DataType::Time,
+ b"resolution" => DataType::Resolution,
+ b"transform-function" => DataType::TransformFunction,
+ b"custom-ident" => DataType::CustomIdent,
+ b"transform-list" => DataType::TransformList,
+ b"string" => DataType::String,
+ _ => return None,
+ })
+ }
+
+ /// Returns true if this data type requires deferring computation to properly
+ /// resolve font-dependent lengths.
+ pub fn may_reference_font_relative_length(&self) -> bool {
+ match self {
+ DataType::Length |
+ DataType::LengthPercentage |
+ DataType::TransformFunction |
+ DataType::TransformList => true,
+ DataType::Number |
+ DataType::Percentage |
+ DataType::Color |
+ DataType::Image |
+ DataType::Url |
+ DataType::Integer |
+ DataType::Angle |
+ DataType::Time |
+ DataType::Resolution |
+ DataType::CustomIdent |
+ DataType::String => false,
+ }
+ }
+}
+
+impl ToCss for DataType {
+ fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
+ where
+ W: Write,
+ {
+ dest.write_char('<')?;
+ dest.write_str(match *self {
+ DataType::Length => "length",
+ DataType::Number => "number",
+ DataType::Percentage => "percentage",
+ DataType::LengthPercentage => "length-percentage",
+ DataType::Color => "color",
+ DataType::Image => "image",
+ DataType::Url => "url",
+ DataType::Integer => "integer",
+ DataType::Angle => "angle",
+ DataType::Time => "time",
+ DataType::Resolution => "resolution",
+ DataType::TransformFunction => "transform-function",
+ DataType::CustomIdent => "custom-ident",
+ DataType::TransformList => "transform-list",
+ DataType::String => "string",
+ })?;
+ dest.write_char('>')
+ }
+}