mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-19 07:22:21 +00:00
LibWeb/CSS: Reimplement var()/attr() as arbitrary substitution functions
"Arbitrary substitution functions" are a family of functions that includes var() and attr(). All of them resolve to an arbitrary set of component values that are not known at parse-time, so they have to be substituted at computed-value time. Besides it being nice to follow the spec closely, this means we'll be able to implement the others (such as `if()` and `inherit()`) more easily. The main omission here is the new "spread syntax", which can be implemented in the future.
This commit is contained in:
parent
b417d13a7b
commit
b6032b0fcd
Notes:
github-actions[bot]
2025-07-09 15:45:46 +00:00
Author: https://github.com/AtkinsSJ
Commit: b6032b0fcd
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5226
Reviewed-by: https://github.com/tcl3 ✅
11 changed files with 480 additions and 346 deletions
54
Libraries/LibWeb/CSS/Parser/ArbitrarySubstitutionFunctions.h
Normal file
54
Libraries/LibWeb/CSS/Parser/ArbitrarySubstitutionFunctions.h
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* Copyright (c) 2025, Sam Atkins <sam@ladybird.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <LibWeb/CSS/Parser/Parser.h>
|
||||
|
||||
namespace Web::CSS::Parser {
|
||||
|
||||
// https://drafts.csswg.org/css-values-5/#substitution-context
|
||||
struct SubstitutionContext {
|
||||
enum class DependencyType : u8 {
|
||||
Property,
|
||||
Attribute,
|
||||
Function,
|
||||
};
|
||||
DependencyType dependency_type;
|
||||
String first;
|
||||
Optional<String> second {};
|
||||
|
||||
bool is_cyclic { false };
|
||||
|
||||
bool operator==(SubstitutionContext const&) const;
|
||||
String to_string() const;
|
||||
};
|
||||
|
||||
class GuardedSubstitutionContexts {
|
||||
public:
|
||||
void guard(SubstitutionContext&);
|
||||
void unguard(SubstitutionContext const&);
|
||||
|
||||
private:
|
||||
Vector<SubstitutionContext&> m_contexts;
|
||||
};
|
||||
|
||||
enum class ArbitrarySubstitutionFunction : u8 {
|
||||
Attr,
|
||||
Var,
|
||||
};
|
||||
[[nodiscard]] Optional<ArbitrarySubstitutionFunction> to_arbitrary_substitution_function(FlyString const& name);
|
||||
|
||||
bool contains_guaranteed_invalid_value(Vector<ComponentValue> const&);
|
||||
|
||||
[[nodiscard]] Vector<ComponentValue> substitute_arbitrary_substitution_functions(DOM::AbstractElement&, GuardedSubstitutionContexts&, Vector<ComponentValue> const&, Optional<SubstitutionContext> = {});
|
||||
|
||||
using ArbitrarySubstitutionFunctionArguments = Vector<Vector<ComponentValue>>;
|
||||
[[nodiscard]] Optional<ArbitrarySubstitutionFunctionArguments> parse_according_to_argument_grammar(ArbitrarySubstitutionFunction, Vector<ComponentValue> const&);
|
||||
|
||||
[[nodiscard]] Vector<ComponentValue> replace_an_arbitrary_substitution_function(DOM::AbstractElement&, GuardedSubstitutionContexts&, ArbitrarySubstitutionFunction, ArbitrarySubstitutionFunctionArguments const&);
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue