Просмотр исходного кода

LibWeb: Extract CalculationNode::constant_type_from_string() function

This is needed by some upcoming generated code. Renamed "PI" member to
"Pi" while I was at it.
Sam Atkins 2 лет назад
Родитель
Сommit
136dc7a1c3

+ 3 - 22
Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp

@@ -8932,28 +8932,9 @@ ErrorOr<OwnPtr<CalculationNode>> Parser::parse_a_calculation(Vector<ComponentVal
         }
 
         if (value.is(Token::Type::Ident)) {
-            if (value.token().ident().equals_ignoring_ascii_case("e"sv)) {
-                TRY(values.try_append({ TRY(ConstantCalculationNode::create(CalculationNode::ConstantType::E)) }));
-                continue;
-            }
-
-            if (value.token().ident().equals_ignoring_ascii_case("pi"sv)) {
-                TRY(values.try_append({ TRY(ConstantCalculationNode::create(CalculationNode::ConstantType::PI)) }));
-                continue;
-            }
-
-            if (value.token().ident().equals_ignoring_ascii_case("infinity"sv)) {
-                TRY(values.try_append({ TRY(ConstantCalculationNode::create(CalculationNode::ConstantType::Infinity)) }));
-                continue;
-            }
-
-            if (value.token().ident().equals_ignoring_ascii_case("-infinity"sv)) {
-                TRY(values.try_append({ TRY(ConstantCalculationNode::create(CalculationNode::ConstantType::MinusInfinity)) }));
-                continue;
-            }
-
-            if (value.token().ident().equals_ignoring_ascii_case("NaN"sv)) {
-                TRY(values.try_append({ TRY(ConstantCalculationNode::create(CalculationNode::ConstantType::NaN)) }));
+            auto maybe_constant = CalculationNode::constant_type_from_string(value.token().ident());
+            if (maybe_constant.has_value()) {
+                TRY(values.try_append({ TRY(ConstantCalculationNode::create(maybe_constant.value())) }));
                 continue;
             }
         }

+ 22 - 2
Userland/Libraries/LibWeb/CSS/StyleValues/CalculatedStyleValue.cpp

@@ -87,6 +87,26 @@ static CalculatedStyleValue::CalculationResult to_resolved_type(CalculatedStyleV
     VERIFY_NOT_REACHED();
 }
 
+Optional<CalculationNode::ConstantType> CalculationNode::constant_type_from_string(StringView string)
+{
+    if (string.equals_ignoring_ascii_case("e"sv))
+        return CalculationNode::ConstantType::E;
+
+    if (string.equals_ignoring_ascii_case("pi"sv))
+        return CalculationNode::ConstantType::Pi;
+
+    if (string.equals_ignoring_ascii_case("infinity"sv))
+        return CalculationNode::ConstantType::Infinity;
+
+    if (string.equals_ignoring_ascii_case("-infinity"sv))
+        return CalculationNode::ConstantType::MinusInfinity;
+
+    if (string.equals_ignoring_ascii_case("NaN"sv))
+        return CalculationNode::ConstantType::NaN;
+
+    return {};
+}
+
 CalculationNode::CalculationNode(Type type)
     : m_type(type)
 {
@@ -974,7 +994,7 @@ ErrorOr<String> ConstantCalculationNode::to_string() const
     switch (m_constant) {
     case CalculationNode::ConstantType::E:
         return "e"_short_string;
-    case CalculationNode::ConstantType::PI:
+    case CalculationNode::ConstantType::Pi:
         return "pi"_short_string;
     case CalculationNode::ConstantType::Infinity:
         return "infinity"_string;
@@ -1005,7 +1025,7 @@ CalculatedStyleValue::CalculationResult ConstantCalculationNode::resolve([[maybe
     switch (m_constant) {
     case CalculationNode::ConstantType::E:
         return { Number(Number::Type::Number, M_E) };
-    case CalculationNode::ConstantType::PI:
+    case CalculationNode::ConstantType::Pi:
         return { Number(Number::Type::Number, M_PI) };
     // FIXME: We need to keep track of Infinity and NaN across all nodes, since they require special handling.
     case CalculationNode::ConstantType::Infinity:

+ 2 - 1
Userland/Libraries/LibWeb/CSS/StyleValues/CalculatedStyleValue.h

@@ -124,11 +124,12 @@ public:
     // https://drafts.csswg.org/css-values-4/#calc-error-constants
     enum class ConstantType {
         E,
-        PI,
+        Pi,
         NaN,
         Infinity,
         MinusInfinity,
     };
+    static Optional<ConstantType> constant_type_from_string(StringView);
 
     enum class Type {
         Numeric,