From 707bcaf6045b1eb36887bbf3af107b87d3def302 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Sat, 26 Oct 2024 15:42:03 -0400 Subject: [PATCH] LibWeb/CSS: Extract code to parse a lab-like color value This is currently only used for `oklab()` but will soon be also used for `lab()` as well. --- .../Libraries/LibWeb/CSS/Parser/Parser.cpp | 41 ++++++++++++++----- Userland/Libraries/LibWeb/CSS/Parser/Parser.h | 1 + 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp index 445c69bdeb2..6f98a75071a 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp @@ -3244,10 +3244,10 @@ RefPtr Parser::parse_hwb_color_value(TokenStream& return CSSHWB::create(h.release_nonnull(), w.release_nonnull(), b.release_nonnull(), alpha.release_nonnull()); } -// https://www.w3.org/TR/css-color-4/#funcdef-oklab -RefPtr Parser::parse_oklab_color_value(TokenStream& outer_tokens) +Optional, 4>> Parser::parse_lab_like_color_value(TokenStream& outer_tokens, StringView function_name) { - // oklab() = oklab( [ | | none] + // This helper is designed to be compatible with lab and oklab and parses a function with a form like: + // f() = f( [ | | none] // [ | | none] // [ | | none] // [ / [ | none] ]? ) @@ -3256,8 +3256,8 @@ RefPtr Parser::parse_oklab_color_value(TokenStream l; RefPtr a; @@ -3269,30 +3269,51 @@ RefPtr Parser::parse_oklab_color_value(TokenStream Parser::parse_oklab_color_value(TokenStream& outer_tokens) +{ + // oklab() = oklab( [ | | none] + // [ | | none] + // [ | | none] + // [ / [ | none] ]? ) + + auto maybe_color_values = parse_lab_like_color_value(outer_tokens, "oklab"sv); + if (!maybe_color_values.has_value()) + return {}; + + auto& color_values = *maybe_color_values; + + return CSSOKLab::create(color_values[0].release_nonnull(), + color_values[1].release_nonnull(), + color_values[2].release_nonnull(), + color_values[3].release_nonnull()); } // https://www.w3.org/TR/css-color-4/#funcdef-oklch diff --git a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h index 32c248fb2fa..ad4b8cabac6 100644 --- a/Userland/Libraries/LibWeb/CSS/Parser/Parser.h +++ b/Userland/Libraries/LibWeb/CSS/Parser/Parser.h @@ -250,6 +250,7 @@ private: RefPtr parse_rgb_color_value(TokenStream&); RefPtr parse_hsl_color_value(TokenStream&); RefPtr parse_hwb_color_value(TokenStream&); + Optional, 4>> parse_lab_like_color_value(TokenStream&, StringView); RefPtr parse_oklab_color_value(TokenStream&); RefPtr parse_oklch_color_value(TokenStream&); RefPtr parse_color_value(TokenStream&);