diff --git a/AK/String.cpp b/AK/String.cpp index 6965731b3a6..789b18dc8c2 100644 --- a/AK/String.cpp +++ b/AK/String.cpp @@ -369,18 +369,42 @@ int String::replace(const String& needle, const String& replacement, bool all_oc return positions.size(); } -String String::trim_spaces() const +String String::trim_whitespace(TrimMode mode) const { - size_t start = 0; - size_t end = length(); - while (characters()[start] == ' ') - ++start; - while (characters()[end] == ' ') { - if (end <= start) - return ""; - --end; + auto is_whitespace_character = [](char ch) -> bool { + return ch == '\t' + || ch == '\n' + || ch == '\v' + || ch == '\f' + || ch == '\r' + || ch == ' '; + }; + + size_t substring_start = 0; + size_t substring_length = length(); + + if (mode == TrimMode::Left || mode == TrimMode::Both) { + for (size_t i = 0; i < length(); ++i) { + if (substring_length == 0) + return ""; + if (!is_whitespace_character(characters()[i])) + break; + ++substring_start; + --substring_length; + } } - return substring(start, end - start); + + if (mode == TrimMode::Right || mode == TrimMode::Both) { + for (size_t i = length() - 1; i > 0; --i) { + if (substring_length == 0) + return ""; + if (!is_whitespace_character(characters()[i])) + break; + --substring_length; + } + } + + return substring(substring_start, substring_length); } String escape_html_entities(const StringView& html) diff --git a/AK/String.h b/AK/String.h index 943a65bebd1..1f06490696e 100644 --- a/AK/String.h +++ b/AK/String.h @@ -114,7 +114,12 @@ public: String to_lowercase() const; String to_uppercase() const; - String trim_spaces() const; + enum class TrimMode { + Left, + Right, + Both + }; + String trim_whitespace(TrimMode mode = TrimMode::Both) const; bool equals_ignoring_case(const StringView&) const; diff --git a/Libraries/LibWeb/CSS/StyleProperties.cpp b/Libraries/LibWeb/CSS/StyleProperties.cpp index 917d44bb311..552e58d6993 100644 --- a/Libraries/LibWeb/CSS/StyleProperties.cpp +++ b/Libraries/LibWeb/CSS/StyleProperties.cpp @@ -144,7 +144,7 @@ void StyleProperties::load_font() const // FIXME: Do this properly, with quote handling etc. for (auto& font_name : font_family.split(',')) { - font_name = font_name.trim_spaces(); + font_name = font_name.trim_whitespace(); if (font_name == "monospace") font_name = "Csilla";