#pragma once #include #include class Attribute { public: Attribute(const String& name, const String& value) : m_name(name) , m_value(value) { } const String& name() const { return m_name; } const String& value() const { return m_value; } void set_value(const String& value) { m_value = value; } private: String m_name; String m_value; }; class Element : public ParentNode { public: Element(Document&, const String& tag_name); virtual ~Element() override; virtual String tag_name() const final { return m_tag_name; } String attribute(const String& name) const; void set_attribute(const String& name, const String& value); void set_attributes(Vector&&); template void for_each_attribute(Callback callback) const { for (auto& attribute : m_attributes) callback(attribute.name(), attribute.value()); } bool has_class(const StringView&) const; virtual void apply_presentational_hints(StyleProperties&) const {} virtual void parse_attribute(const String& name, const String& value); private: RefPtr create_layout_node(const StyleResolver&, const StyleProperties* parent_style) const override; Attribute* find_attribute(const String& name); const Attribute* find_attribute(const String& name) const; String m_tag_name; Vector m_attributes; }; template<> inline bool is(const Node& node) { return node.is_element(); }