diff --git a/Ladybird/AppKit/Utilities/NSString+Ladybird.h b/Ladybird/AppKit/Utilities/NSString+Ladybird.h new file mode 100644 index 00000000000..2d9b2dfdd95 --- /dev/null +++ b/Ladybird/AppKit/Utilities/NSString+Ladybird.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2023, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#import + +@interface NSString (Ladybird) + +- (NSString*)stringByCollapsingConsecutiveWhitespace; + +@end diff --git a/Ladybird/AppKit/Utilities/NSString+Ladybird.mm b/Ladybird/AppKit/Utilities/NSString+Ladybird.mm new file mode 100644 index 00000000000..20394f35b5e --- /dev/null +++ b/Ladybird/AppKit/Utilities/NSString+Ladybird.mm @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2023, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +#import +#import + +static BOOL code_point_is_whitespace(u32 code_point) +{ + static auto white_space_category = Unicode::property_from_string("White_Space"sv); + + if (!white_space_category.has_value()) + return is_ascii_space(code_point); + + return Unicode::code_point_has_property(code_point, *white_space_category); +} + +@implementation NSString (Ladybird) + +- (NSString*)stringByCollapsingConsecutiveWhitespace +{ + auto* result = [NSMutableString string]; + + auto const* string = [self UTF8String]; + Utf8View code_points { StringView { string, strlen(string) } }; + + bool currently_skipping_spaces = false; + + for (auto code_point : code_points) { + if (code_point_is_whitespace(code_point)) { + if (!currently_skipping_spaces) { + currently_skipping_spaces = true; + [result appendString:@" "]; + } + + continue; + } + + auto code_point_string = String::from_code_point(code_point); + [result appendString:Ladybird::string_to_ns_string(code_point_string)]; + + currently_skipping_spaces = false; + } + + return result; +} + +@end diff --git a/Ladybird/CMakeLists.txt b/Ladybird/CMakeLists.txt index d5e406759c6..f2b781eb421 100644 --- a/Ladybird/CMakeLists.txt +++ b/Ladybird/CMakeLists.txt @@ -142,10 +142,11 @@ elseif (APPLE) AppKit/UI/Tab.mm AppKit/UI/TabController.mm AppKit/Utilities/Conversions.mm + AppKit/Utilities/NSString+Ladybird.mm AppKit/Utilities/URL.mm ) target_include_directories(ladybird PRIVATE AppKit) - target_link_libraries(ladybird PRIVATE ${COCOA_LIBRARY}) + target_link_libraries(ladybird PRIVATE ${COCOA_LIBRARY} LibUnicode) target_compile_options(ladybird PRIVATE -fobjc-arc -Wno-deprecated-anon-enum-enum-conversion # Required for CGImageCreate