diff options
author | Sam Atkins <atkinssj@serenityos.org> | 2021-11-24 14:12:35 +0000 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-11-24 22:57:46 +0100 |
commit | 42176d37fce566cf0df09251e4cd11e091562458 (patch) | |
tree | 2c476fb2cd0b1f91ae66089b8219337de9853338 /Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h | |
parent | b40388584bc1f72941d8c403c8f1c69b7ff0998b (diff) | |
download | serenity-42176d37fce566cf0df09251e4cd11e091562458.zip |
LibWeb: Implement independent GeneralEnclosed class
This is `<general-enclosed>` in CSS grammar. It represents a section of
a `@media` or `@supports` rule that exists in some future standard that
we don't understand yet, but don't want to make the entire rule invalid.
There's not much that it can usefully do, but we store a string
representation of its contents so that it can be serialized out.
Diffstat (limited to 'Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h')
-rw-r--r-- | Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h b/Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h new file mode 100644 index 0000000000..05788ca713 --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/GeneralEnclosed.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/String.h> + +namespace Web::CSS { + +// Corresponds to Kleene 3-valued logic. +// https://www.w3.org/TR/mediaqueries-4/#evaluating +enum class MatchResult { + False, + True, + Unknown, +}; + +inline MatchResult as_match_result(bool value) +{ + return value ? MatchResult::True : MatchResult::False; +} + +inline MatchResult negate(MatchResult value) +{ + switch (value) { + case MatchResult::False: + return MatchResult::True; + case MatchResult::True: + return MatchResult::False; + case MatchResult::Unknown: + return MatchResult::Unknown; + } + VERIFY_NOT_REACHED(); +} + +template<typename Collection, typename Evaluate> +inline MatchResult evaluate_and(Collection& collection, Evaluate evaluate) +{ + size_t true_results = 0; + for (auto& item : collection) { + auto item_match = evaluate(item); + if (item_match == MatchResult::False) + return MatchResult::False; + if (item_match == MatchResult::True) + true_results++; + } + if (true_results == collection.size()) + return MatchResult::True; + return MatchResult::Unknown; +} + +template<typename Collection, typename Evaluate> +inline MatchResult evaluate_or(Collection& collection, Evaluate evaluate) +{ + size_t false_results = 0; + for (auto& item : collection) { + auto item_match = evaluate(item); + if (item_match == MatchResult::True) + return MatchResult::True; + if (item_match == MatchResult::False) + false_results++; + } + if (false_results == collection.size()) + return MatchResult::False; + return MatchResult::Unknown; +} + +// https://www.w3.org/TR/mediaqueries-4/#typedef-general-enclosed +class GeneralEnclosed { +public: + GeneralEnclosed(String serialized_contents) + : m_serialized_contents(move(serialized_contents)) + { + } + + MatchResult evaluate() const { return MatchResult::Unknown; } + StringView to_string() const { return m_serialized_contents.view(); } + +private: + String m_serialized_contents; +}; +} |