From 0c6af2d5b49a95567be168d942aea5b00c1d9f1b Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 29 Sep 2019 16:22:15 +0200 Subject: [PATCH] LibHTML: Add Node::text_content() This returns a String built from all of a Node's text descendants, including itself. --- Libraries/LibHTML/DOM/Node.cpp | 24 ++++++++++++++++++++---- Libraries/LibHTML/DOM/Node.h | 2 ++ Libraries/LibHTML/DOM/Text.h | 2 ++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Libraries/LibHTML/DOM/Node.cpp b/Libraries/LibHTML/DOM/Node.cpp index 0126f4c13d..d477cfd1a5 100644 --- a/Libraries/LibHTML/DOM/Node.cpp +++ b/Libraries/LibHTML/DOM/Node.cpp @@ -1,11 +1,12 @@ -#include +#include +#include #include #include -#include -#include +#include #include #include #include +#include #include Node::Node(Document& document, NodeType type) @@ -39,7 +40,6 @@ RefPtr Node::create_layout_node(const StyleResolver& resolver, const ASSERT_NOT_REACHED(); } - RefPtr Node::create_layout_tree(const StyleResolver& resolver, const StyleProperties* parent_properties) const { auto layout_node = create_layout_node(resolver, parent_properties); @@ -88,3 +88,19 @@ const HTMLElement* Node::enclosing_html_element() const return static_cast(this); return parent() ? parent()->enclosing_html_element() : nullptr; } + +String Node::text_content() const +{ + Vector strings; + StringBuilder builder; + for (auto* child = first_child(); child; child = child->next_sibling()) { + auto text = child->text_content(); + if (!text.is_empty()) { + builder.append(child->text_content()); + builder.append(' '); + } + } + if (builder.length() > 1) + builder.trim(1); + return builder.to_string(); +} diff --git a/Libraries/LibHTML/DOM/Node.h b/Libraries/LibHTML/DOM/Node.h index 24bbf9f0ad..25659e5a29 100644 --- a/Libraries/LibHTML/DOM/Node.h +++ b/Libraries/LibHTML/DOM/Node.h @@ -36,6 +36,8 @@ public: virtual String tag_name() const = 0; + virtual String text_content() const; + Document& document() { return m_document; } const Document& document() const { return m_document; } diff --git a/Libraries/LibHTML/DOM/Text.h b/Libraries/LibHTML/DOM/Text.h index 79b3d6730d..adc5fcb265 100644 --- a/Libraries/LibHTML/DOM/Text.h +++ b/Libraries/LibHTML/DOM/Text.h @@ -12,6 +12,8 @@ public: virtual String tag_name() const override { return "#text"; } + virtual String text_content() const override { return m_data; } + private: String m_data; };