From 7760c007140f8acbd6f214898a7c8e7a565f4875 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sat, 1 Oct 2022 18:39:40 +0100 Subject: [PATCH] LibWeb: Move strip_and_collapse_whitespace() to Infra/ ...and make it spec compliant by considering all ASCII whitespace, greatly simplifying it in the process :^) --- Userland/Libraries/LibWeb/CMakeLists.txt | 1 + .../LibWeb/HTML/HTMLOptionElement.cpp | 30 ++--------------- Userland/Libraries/LibWeb/Infra/Strings.cpp | 32 +++++++++++++++++++ Userland/Libraries/LibWeb/Infra/Strings.h | 15 +++++++++ 4 files changed, 50 insertions(+), 28 deletions(-) create mode 100644 Userland/Libraries/LibWeb/Infra/Strings.cpp create mode 100644 Userland/Libraries/LibWeb/Infra/Strings.h diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 867988cc29..8d5ae47578 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -277,6 +277,7 @@ set(SOURCES HighResolutionTime/Performance.cpp Infra/ByteSequences.cpp Infra/JSON.cpp + Infra/Strings.cpp IntersectionObserver/IntersectionObserver.cpp Layout/AvailableSpace.cpp Layout/BlockContainer.cpp diff --git a/Userland/Libraries/LibWeb/HTML/HTMLOptionElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLOptionElement.cpp index 30022010d0..270337d22d 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLOptionElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLOptionElement.cpp @@ -13,8 +13,7 @@ #include #include #include -#include -#include +#include namespace Web::HTML { @@ -76,31 +75,6 @@ void HTMLOptionElement::set_value(String value) set_attribute(HTML::AttributeNames::value, value); } -// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace -static String strip_and_collapse_whitespace(StringView string) -{ - // Replace any sequence of one or more consecutive code points that are ASCII whitespace in the string with a single U+0020 SPACE code point. - StringBuilder builder; - for (size_t i = 0; i < string.length(); ++i) { - if (isspace(string[i])) { - builder.append(' '); - while (i < string.length()) { - if (isspace(string[i])) { - ++i; - continue; - } - builder.append(string[i]); - break; - } - continue; - } - builder.append(string[i]); - } - - // ...and then remove any leading and trailing ASCII whitespace from that string. - return builder.to_string().trim(Infra::ASCII_WHITESPACE); -} - static void concatenate_descendants_text_content(DOM::Node const* node, StringBuilder& builder) { // FIXME: SVGScriptElement should also be skipped, but it doesn't exist yet. @@ -126,7 +100,7 @@ String HTMLOptionElement::text() const }); // Return the result of stripping and collapsing ASCII whitespace from the above concatenation. - return strip_and_collapse_whitespace(builder.to_string()); + return Infra::strip_and_collapse_whitespace(builder.string_view()); } // https://html.spec.whatwg.org/multipage/form-elements.html#dom-option-text diff --git a/Userland/Libraries/LibWeb/Infra/Strings.cpp b/Userland/Libraries/LibWeb/Infra/Strings.cpp new file mode 100644 index 0000000000..3b415bd6d3 --- /dev/null +++ b/Userland/Libraries/LibWeb/Infra/Strings.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2022, Linus Groh + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +namespace Web::Infra { + +// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace +String strip_and_collapse_whitespace(StringView string) +{ + // Replace any sequence of one or more consecutive code points that are ASCII whitespace in the string with a single U+0020 SPACE code point. + StringBuilder builder; + for (auto code_point : Utf8View { string }) { + if (Infra::is_ascii_whitespace(code_point)) { + if (!builder.string_view().ends_with(' ')) + builder.append(' '); + continue; + } + builder.append_code_point(code_point); + } + + // ...and then remove any leading and trailing ASCII whitespace from that string. + return builder.string_view().trim(Infra::ASCII_WHITESPACE); +} + +} diff --git a/Userland/Libraries/LibWeb/Infra/Strings.h b/Userland/Libraries/LibWeb/Infra/Strings.h new file mode 100644 index 0000000000..f73b435519 --- /dev/null +++ b/Userland/Libraries/LibWeb/Infra/Strings.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2022, Linus Groh + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::Infra { + +String strip_and_collapse_whitespace(StringView string); + +}