mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-07 08:39:22 +00:00
LibWeb: Generate an enum for generated pseudo-elements
This commit is contained in:
parent
021e3f5c7d
commit
2c86fd539d
Notes:
github-actions[bot]
2025-03-24 09:51:16 +00:00
Author: https://github.com/AtkinsSJ
Commit: 2c86fd539d
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4021
4 changed files with 80 additions and 22 deletions
|
@ -1155,13 +1155,13 @@ DOM::Node* Node::dom_node()
|
||||||
|
|
||||||
DOM::Element const* Node::pseudo_element_generator() const
|
DOM::Element const* Node::pseudo_element_generator() const
|
||||||
{
|
{
|
||||||
VERIFY(m_generated_for != GeneratedFor::NotGenerated);
|
VERIFY(m_generated_for.has_value());
|
||||||
return m_pseudo_element_generator.ptr();
|
return m_pseudo_element_generator.ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
DOM::Element* Node::pseudo_element_generator()
|
DOM::Element* Node::pseudo_element_generator()
|
||||||
{
|
{
|
||||||
VERIFY(m_generated_for != GeneratedFor::NotGenerated);
|
VERIFY(m_generated_for.has_value());
|
||||||
return m_pseudo_element_generator.ptr();
|
return m_pseudo_element_generator.ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,15 +45,10 @@ public:
|
||||||
DOM::Element const* pseudo_element_generator() const;
|
DOM::Element const* pseudo_element_generator() const;
|
||||||
DOM::Element* pseudo_element_generator();
|
DOM::Element* pseudo_element_generator();
|
||||||
|
|
||||||
enum class GeneratedFor {
|
bool is_generated() const { return m_generated_for.has_value(); }
|
||||||
NotGenerated,
|
bool is_generated_for_before_pseudo_element() const { return m_generated_for == CSS::GeneratedPseudoElement::Before; }
|
||||||
PseudoBefore,
|
bool is_generated_for_after_pseudo_element() const { return m_generated_for == CSS::GeneratedPseudoElement::After; }
|
||||||
PseudoAfter
|
void set_generated_for(CSS::GeneratedPseudoElement type, DOM::Element& element)
|
||||||
};
|
|
||||||
bool is_generated() const { return m_generated_for != GeneratedFor::NotGenerated; }
|
|
||||||
bool is_generated_for_before_pseudo_element() const { return m_generated_for == GeneratedFor::PseudoBefore; }
|
|
||||||
bool is_generated_for_after_pseudo_element() const { return m_generated_for == GeneratedFor::PseudoAfter; }
|
|
||||||
void set_generated_for(GeneratedFor type, DOM::Element& element)
|
|
||||||
{
|
{
|
||||||
m_generated_for = type;
|
m_generated_for = type;
|
||||||
m_pseudo_element_generator = &element;
|
m_pseudo_element_generator = &element;
|
||||||
|
@ -213,7 +208,7 @@ private:
|
||||||
|
|
||||||
bool m_has_been_wrapped_in_table_wrapper { false };
|
bool m_has_been_wrapped_in_table_wrapper { false };
|
||||||
|
|
||||||
GeneratedFor m_generated_for { GeneratedFor::NotGenerated };
|
Optional<CSS::GeneratedPseudoElement> m_generated_for {};
|
||||||
|
|
||||||
u32 m_initial_quote_nesting_level { 0 };
|
u32 m_initial_quote_nesting_level { 0 };
|
||||||
};
|
};
|
||||||
|
|
|
@ -225,15 +225,7 @@ void TreeBuilder::create_pseudo_element_if_needed(DOM::Element& element, CSS::Ps
|
||||||
pseudo_element_node->append_child(*list_item_marker);
|
pseudo_element_node->append_child(*list_item_marker);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto generated_for = Node::GeneratedFor::NotGenerated;
|
auto generated_for = CSS::to_generated_pseudo_element(pseudo_element).release_value();
|
||||||
if (pseudo_element == CSS::PseudoElement::Before) {
|
|
||||||
generated_for = Node::GeneratedFor::PseudoBefore;
|
|
||||||
} else if (pseudo_element == CSS::PseudoElement::After) {
|
|
||||||
generated_for = Node::GeneratedFor::PseudoAfter;
|
|
||||||
} else {
|
|
||||||
VERIFY_NOT_REACHED();
|
|
||||||
}
|
|
||||||
|
|
||||||
pseudo_element_node->set_generated_for(generated_for, element);
|
pseudo_element_node->set_generated_for(generated_for, element);
|
||||||
pseudo_element_node->set_initial_quote_nesting_level(initial_quote_nesting_level);
|
pseudo_element_node->set_initial_quote_nesting_level(initial_quote_nesting_level);
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,15 @@ ErrorOr<void> generate_header_file(JsonObject& pseudo_elements_data, Core::File&
|
||||||
SourceGenerator generator { builder };
|
SourceGenerator generator { builder };
|
||||||
|
|
||||||
auto pseudo_element_count = 0u;
|
auto pseudo_element_count = 0u;
|
||||||
pseudo_elements_data.for_each_member([&pseudo_element_count](auto const&, auto const&) { ++pseudo_element_count; });
|
auto generated_pseudo_element_count = 0u;
|
||||||
|
pseudo_elements_data.for_each_member([&](auto const&, JsonValue const& value) {
|
||||||
|
auto& pseudo_element = value.as_object();
|
||||||
|
++pseudo_element_count;
|
||||||
|
if (pseudo_element.get_bool("is-generated"sv).value_or(false))
|
||||||
|
++generated_pseudo_element_count;
|
||||||
|
});
|
||||||
generator.set("pseudo_element_underlying_type", underlying_type_for_enum(pseudo_element_count));
|
generator.set("pseudo_element_underlying_type", underlying_type_for_enum(pseudo_element_count));
|
||||||
|
generator.set("generated_pseudo_element_underlying_type", underlying_type_for_enum(generated_pseudo_element_count));
|
||||||
|
|
||||||
generator.append(R"~~~(
|
generator.append(R"~~~(
|
||||||
#pragma once
|
#pragma once
|
||||||
|
@ -74,6 +81,23 @@ StringView pseudo_element_name(PseudoElement);
|
||||||
|
|
||||||
bool is_has_allowed_pseudo_element(PseudoElement);
|
bool is_has_allowed_pseudo_element(PseudoElement);
|
||||||
|
|
||||||
|
enum class GeneratedPseudoElement : @generated_pseudo_element_underlying_type@ {
|
||||||
|
)~~~");
|
||||||
|
pseudo_elements_data.for_each_member([&](auto& name, JsonValue const& value) {
|
||||||
|
auto& pseudo_element = value.as_object();
|
||||||
|
if (!pseudo_element.get_bool("is-generated"sv).value_or(false))
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto member_generator = generator.fork();
|
||||||
|
member_generator.set("name:titlecase", title_casify(name));
|
||||||
|
member_generator.appendln(" @name:titlecase@,");
|
||||||
|
});
|
||||||
|
generator.append(R"~~~(
|
||||||
|
};
|
||||||
|
|
||||||
|
Optional<GeneratedPseudoElement> to_generated_pseudo_element(PseudoElement);
|
||||||
|
PseudoElement to_pseudo_element(GeneratedPseudoElement);
|
||||||
|
|
||||||
}
|
}
|
||||||
)~~~");
|
)~~~");
|
||||||
|
|
||||||
|
@ -160,6 +184,53 @@ bool is_has_allowed_pseudo_element(PseudoElement pseudo_element)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Optional<GeneratedPseudoElement> to_generated_pseudo_element(PseudoElement pseudo_element)
|
||||||
|
{
|
||||||
|
switch (pseudo_element) {
|
||||||
|
)~~~");
|
||||||
|
|
||||||
|
pseudo_elements_data.for_each_member([&](auto& name, JsonValue const& value) {
|
||||||
|
auto& pseudo_element = value.as_object();
|
||||||
|
if (!pseudo_element.get_bool("is-generated"sv).value_or(false))
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto member_generator = generator.fork();
|
||||||
|
member_generator.set("name:titlecase", title_casify(name));
|
||||||
|
member_generator.append(R"~~~(
|
||||||
|
case PseudoElement::@name:titlecase@:
|
||||||
|
return GeneratedPseudoElement::@name:titlecase@;
|
||||||
|
)~~~");
|
||||||
|
});
|
||||||
|
|
||||||
|
generator.append(R"~~~(
|
||||||
|
default:
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PseudoElement to_pseudo_element(GeneratedPseudoElement generated_pseudo_element)
|
||||||
|
{
|
||||||
|
switch (generated_pseudo_element) {
|
||||||
|
)~~~");
|
||||||
|
|
||||||
|
pseudo_elements_data.for_each_member([&](auto& name, JsonValue const& value) {
|
||||||
|
auto& pseudo_element = value.as_object();
|
||||||
|
if (!pseudo_element.get_bool("is-generated"sv).value_or(false))
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto member_generator = generator.fork();
|
||||||
|
member_generator.set("name:titlecase", title_casify(name));
|
||||||
|
member_generator.append(R"~~~(
|
||||||
|
case GeneratedPseudoElement::@name:titlecase@:
|
||||||
|
return PseudoElement::@name:titlecase@;
|
||||||
|
)~~~");
|
||||||
|
});
|
||||||
|
|
||||||
|
generator.append(R"~~~(
|
||||||
|
}
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
)~~~");
|
)~~~");
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue