From 0578bec65572ef77b88c2651a83e48e2c70600b8 Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Fri, 8 Dec 2023 17:06:04 +0000 Subject: [PATCH] LibWeb: Parse math-depth property using TokenStream We don't need to skip whitespace at the top level because that's already done before we're called. But we do still have to skip it inside the `add()` function --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 20 +++++++++++-------- Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 6da4b4496d..b075c8b4a7 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -4443,21 +4443,21 @@ RefPtr Parser::parse_list_style_value(TokenStream& t { list_position.release_nonnull(), list_image.release_nonnull(), list_type.release_nonnull() }); } -RefPtr Parser::parse_math_depth_value(Vector const& component_values) +RefPtr Parser::parse_math_depth_value(TokenStream& tokens) { // https://w3c.github.io/mathml-core/#propdef-math-depth // auto-add | add() | - auto tokens = TokenStream { component_values }; + auto transaction = tokens.begin_transaction(); - tokens.skip_whitespace(); auto token = tokens.next_token(); - tokens.skip_whitespace(); if (tokens.has_next_token()) return nullptr; // auto-add - if (token.is_ident("auto-add"sv)) + if (token.is_ident("auto-add"sv)) { + transaction.commit(); return MathDepthStyleValue::create_auto_add(); + } // FIXME: Make it easier to parse "thing that might be or literally anything that resolves to it" and get rid of this auto parse_something_that_resolves_to_integer = [this](ComponentValue& token) -> RefPtr { @@ -4476,14 +4476,18 @@ RefPtr Parser::parse_math_depth_value(Vector const& add_tokens.skip_whitespace(); if (add_tokens.has_next_token()) return nullptr; - if (auto integer_value = parse_something_that_resolves_to_integer(integer_token)) + if (auto integer_value = parse_something_that_resolves_to_integer(integer_token)) { + transaction.commit(); return MathDepthStyleValue::create_add(integer_value.release_nonnull()); + } return nullptr; } // - if (auto integer_value = parse_something_that_resolves_to_integer(token)) + if (auto integer_value = parse_something_that_resolves_to_integer(token)) { + transaction.commit(); return MathDepthStyleValue::create_integer(integer_value.release_nonnull()); + } return nullptr; } @@ -5907,7 +5911,7 @@ Parser::ParseErrorOr> Parser::parse_css_value(Property return parsed_value.release_nonnull(); return ParseError::SyntaxError; case PropertyID::MathDepth: - if (auto parsed_value = parse_math_depth_value(component_values)) + if (auto parsed_value = parse_math_depth_value(tokens); parsed_value && !tokens.has_next_token()) return parsed_value.release_nonnull(); return ParseError::SyntaxError; case PropertyID::Overflow: diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index c1e02b5870..c088924b56 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -241,7 +241,7 @@ private: RefPtr parse_font_value(TokenStream&); RefPtr parse_font_family_value(TokenStream&); RefPtr parse_list_style_value(TokenStream&); - RefPtr parse_math_depth_value(Vector const&); + RefPtr parse_math_depth_value(TokenStream&); RefPtr parse_overflow_value(Vector const&); RefPtr parse_place_content_value(Vector const&); RefPtr parse_place_items_value(Vector const&);