Ver Fonte

AK: Replace String::trim_spaces() with String::trim_whitespace()

As suggested by @awesomekling in a code review and (initially) ignored
by me :^)

Implementation is roughly based on LibJS's trim_string(), but with a fix
for trimming all-whitespace strings.
Linus Groh há 5 anos atrás
pai
commit
1febee768d
3 ficheiros alterados com 42 adições e 13 exclusões
  1. 35 11
      AK/String.cpp
  2. 6 1
      AK/String.h
  3. 1 1
      Libraries/LibWeb/CSS/StyleProperties.cpp

+ 35 - 11
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
-{
-    size_t start = 0;
-    size_t end = length();
-    while (characters()[start] == ' ')
-        ++start;
-    while (characters()[end] == ' ') {
-        if (end <= start)
-            return "";
-        --end;
+String String::trim_whitespace(TrimMode mode) const
+{
+    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)

+ 6 - 1
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;
 

+ 1 - 1
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";