diff options
Diffstat (limited to 'Userland/Libraries/LibWeb/DOM')
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Range.cpp | 30 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Range.h | 2 | ||||
-rw-r--r-- | Userland/Libraries/LibWeb/DOM/Range.idl | 2 |
3 files changed, 34 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/DOM/Range.cpp b/Userland/Libraries/LibWeb/DOM/Range.cpp index a989de8432..ce20127b3c 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.cpp +++ b/Userland/Libraries/LibWeb/DOM/Range.cpp @@ -9,6 +9,7 @@ #include <LibWeb/DOM/DocumentType.h> #include <LibWeb/DOM/Node.h> #include <LibWeb/DOM/Range.h> +#include <LibWeb/DOM/Text.h> #include <LibWeb/HTML/Window.h> namespace Web::DOM { @@ -498,4 +499,33 @@ ExceptionOr<i16> Range::compare_point(Node const& node, u32 offset) const return 0; } +// https://dom.spec.whatwg.org/#dom-range-stringifier +String Range::to_string() const +{ + // 1. Let s be the empty string. + StringBuilder builder; + + // 2. If this’s start node is this’s end node and it is a Text node, + // then return the substring of that Text node’s data beginning at this’s start offset and ending at this’s end offset. + if (start_container() == end_container() && is<Text>(*start_container())) + return static_cast<Text const&>(*start_container()).data().substring(start_offset(), end_offset()); + + // 3. If this’s start node is a Text node, then append the substring of that node’s data from this’s start offset until the end to s. + if (is<Text>(*start_container())) + builder.append(static_cast<Text const&>(*start_container()).data().substring_view(start_offset())); + + // 4. Append the concatenation of the data of all Text nodes that are contained in this, in tree order, to s. + for (Node const* node = start_container()->next_in_pre_order(); node && node != end_container(); node = node->next_in_pre_order()) { + if (is<Text>(*node)) + builder.append(static_cast<Text const&>(*node).data()); + } + + // 5. If this’s end node is a Text node, then append the substring of that node’s data from its start until this’s end offset to s. + if (is<Text>(*end_container())) + builder.append(static_cast<Text const&>(*end_container()).data().substring_view(0, end_offset())); + + // 6. Return s. + return builder.to_string(); +} + } diff --git a/Userland/Libraries/LibWeb/DOM/Range.h b/Userland/Libraries/LibWeb/DOM/Range.h index 64047345d1..9fd7562135 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.h +++ b/Userland/Libraries/LibWeb/DOM/Range.h @@ -61,6 +61,8 @@ public: ExceptionOr<bool> is_point_in_range(Node const&, u32 offset) const; ExceptionOr<i16> compare_point(Node const&, u32 offset) const; + String to_string() const; + private: explicit Range(Document&); diff --git a/Userland/Libraries/LibWeb/DOM/Range.idl b/Userland/Libraries/LibWeb/DOM/Range.idl index 900c9ceec0..966de1cbe6 100644 --- a/Userland/Libraries/LibWeb/DOM/Range.idl +++ b/Userland/Libraries/LibWeb/DOM/Range.idl @@ -32,4 +32,6 @@ interface Range : AbstractRange { boolean intersectsNode(Node node); + stringifier; + }; |