diff --git a/Libraries/LibWeb/CMakeLists.txt b/Libraries/LibWeb/CMakeLists.txt index 5bc60eb94e0..e97aeb8ccaa 100644 --- a/Libraries/LibWeb/CMakeLists.txt +++ b/Libraries/LibWeb/CMakeLists.txt @@ -116,6 +116,7 @@ set(SOURCES CSS/MediaQueryList.cpp CSS/MediaQueryListEvent.cpp CSS/Number.cpp + CSS/PageSelector.cpp CSS/ParsedFontFace.cpp CSS/Parser/ComponentValue.cpp CSS/Parser/DescriptorParsing.cpp diff --git a/Libraries/LibWeb/CSS/CSSPageRule.cpp b/Libraries/LibWeb/CSS/CSSPageRule.cpp index 1114144ce9a..059b5be1a6d 100644 --- a/Libraries/LibWeb/CSS/CSSPageRule.cpp +++ b/Libraries/LibWeb/CSS/CSSPageRule.cpp @@ -15,50 +15,6 @@ namespace Web::CSS { GC_DEFINE_ALLOCATOR(CSSPageRule); -Optional page_pseudo_class_from_string(StringView input) -{ - if (input.equals_ignoring_ascii_case("blank"sv)) - return PagePseudoClass::Blank; - if (input.equals_ignoring_ascii_case("first"sv)) - return PagePseudoClass::First; - if (input.equals_ignoring_ascii_case("left"sv)) - return PagePseudoClass::Left; - if (input.equals_ignoring_ascii_case("right"sv)) - return PagePseudoClass::Right; - return {}; -} - -StringView to_string(PagePseudoClass pseudo_class) -{ - switch (pseudo_class) { - case PagePseudoClass::Blank: - return "blank"sv; - case PagePseudoClass::First: - return "first"sv; - case PagePseudoClass::Left: - return "left"sv; - case PagePseudoClass::Right: - return "right"sv; - } - VERIFY_NOT_REACHED(); -} - -PageSelector::PageSelector(Optional name, Vector pseudo_classes) - : m_name(move(name)) - , m_pseudo_classes(move(pseudo_classes)) -{ -} - -String PageSelector::serialize() const -{ - StringBuilder builder; - if (m_name.has_value()) - builder.append(m_name.value()); - for (auto pseudo_class : m_pseudo_classes) - builder.appendff(":{}", to_string(pseudo_class)); - return builder.to_string_without_validation(); -} - GC::Ref CSSPageRule::create(JS::Realm& realm, PageSelectorList&& selectors, GC::Ref style, CSSRuleList& rules) { return realm.create(realm, move(selectors), style, rules); diff --git a/Libraries/LibWeb/CSS/CSSPageRule.h b/Libraries/LibWeb/CSS/CSSPageRule.h index 85050c8b497..a03e9e38e78 100644 --- a/Libraries/LibWeb/CSS/CSSPageRule.h +++ b/Libraries/LibWeb/CSS/CSSPageRule.h @@ -8,32 +8,10 @@ #include #include +#include namespace Web::CSS { -enum class PagePseudoClass : u8 { - Left, - Right, - First, - Blank, -}; -Optional page_pseudo_class_from_string(StringView); -StringView to_string(PagePseudoClass); - -class PageSelector { -public: - PageSelector(Optional name, Vector); - - Optional name() const { return m_name; } - Vector const& pseudo_classes() const { return m_pseudo_classes; } - String serialize() const; - -private: - Optional m_name; - Vector m_pseudo_classes; -}; -using PageSelectorList = Vector; - // https://drafts.csswg.org/css-page-3/#at-ruledef-page class CSSPageRule final : public CSSGroupingRule { WEB_PLATFORM_OBJECT(CSSPageRule, CSSGroupingRule); diff --git a/Libraries/LibWeb/CSS/PageSelector.cpp b/Libraries/LibWeb/CSS/PageSelector.cpp new file mode 100644 index 00000000000..a9d71653c4f --- /dev/null +++ b/Libraries/LibWeb/CSS/PageSelector.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025, Sam Atkins + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace Web::CSS { + +Optional page_pseudo_class_from_string(StringView input) +{ + if (input.equals_ignoring_ascii_case("blank"sv)) + return PagePseudoClass::Blank; + if (input.equals_ignoring_ascii_case("first"sv)) + return PagePseudoClass::First; + if (input.equals_ignoring_ascii_case("left"sv)) + return PagePseudoClass::Left; + if (input.equals_ignoring_ascii_case("right"sv)) + return PagePseudoClass::Right; + return {}; +} + +StringView to_string(PagePseudoClass pseudo_class) +{ + switch (pseudo_class) { + case PagePseudoClass::Blank: + return "blank"sv; + case PagePseudoClass::First: + return "first"sv; + case PagePseudoClass::Left: + return "left"sv; + case PagePseudoClass::Right: + return "right"sv; + } + VERIFY_NOT_REACHED(); +} + +PageSelector::PageSelector(Optional name, Vector pseudo_classes) + : m_name(move(name)) + , m_pseudo_classes(move(pseudo_classes)) +{ +} + +String PageSelector::serialize() const +{ + StringBuilder builder; + if (m_name.has_value()) + builder.append(m_name.value()); + for (auto pseudo_class : m_pseudo_classes) + builder.appendff(":{}", to_string(pseudo_class)); + return builder.to_string_without_validation(); +} + +} diff --git a/Libraries/LibWeb/CSS/PageSelector.h b/Libraries/LibWeb/CSS/PageSelector.h new file mode 100644 index 00000000000..2d2988ad9bd --- /dev/null +++ b/Libraries/LibWeb/CSS/PageSelector.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2025, Sam Atkins + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::CSS { + +enum class PagePseudoClass : u8 { + Left, + Right, + First, + Blank, +}; +Optional page_pseudo_class_from_string(StringView); +StringView to_string(PagePseudoClass); + +class PageSelector { +public: + PageSelector(Optional name, Vector); + + Optional name() const { return m_name; } + Vector const& pseudo_classes() const { return m_pseudo_classes; } + String serialize() const; + +private: + Optional m_name; + Vector m_pseudo_classes; +}; +using PageSelectorList = Vector; + +}