mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:12:45 +00:00 
			
		
		
		
	 1edb96376b
			
		
	
	
		1edb96376b
		
	
	
	
	
		
			
			These could fail to allocate the underlying storage needed to store the UTF-16 data. Propagate these errors.
		
			
				
	
	
		
			68 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | ||
|  * Copyright (c) 2022, Linus Groh <linusg@serenityos.org>
 | ||
|  * Copyright (c) 2022, networkException <networkexception@serenityos.org>
 | ||
|  *
 | ||
|  * SPDX-License-Identifier: BSD-2-Clause
 | ||
|  */
 | ||
| 
 | ||
| #include <AK/DeprecatedString.h>
 | ||
| #include <AK/Utf16View.h>
 | ||
| #include <AK/Utf8View.h>
 | ||
| #include <LibWeb/Infra/CharacterTypes.h>
 | ||
| #include <LibWeb/Infra/Strings.h>
 | ||
| 
 | ||
| namespace Web::Infra {
 | ||
| 
 | ||
| // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
 | ||
| DeprecatedString 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);
 | ||
| }
 | ||
| 
 | ||
| // https://infra.spec.whatwg.org/#code-unit-prefix
 | ||
| bool is_code_unit_prefix(StringView potential_prefix, StringView input)
 | ||
| {
 | ||
|     auto potential_prefix_utf16 = utf8_to_utf16(potential_prefix).release_value_but_fixme_should_propagate_errors();
 | ||
|     auto input_utf16 = utf8_to_utf16(input).release_value_but_fixme_should_propagate_errors();
 | ||
| 
 | ||
|     // 1. Let i be 0.
 | ||
|     size_t i = 0;
 | ||
| 
 | ||
|     // 2. While true:
 | ||
|     while (true) {
 | ||
|         // 1. If i is greater than or equal to potentialPrefix’s length, then return true.
 | ||
|         if (i >= potential_prefix.length())
 | ||
|             return true;
 | ||
| 
 | ||
|         // 2. If i is greater than or equal to input’s length, then return false.
 | ||
|         if (i >= input.length())
 | ||
|             return false;
 | ||
| 
 | ||
|         // 3. Let potentialPrefixCodeUnit be the ith code unit of potentialPrefix.
 | ||
|         auto potential_prefix_code_unit = Utf16View(potential_prefix_utf16).code_unit_at(i);
 | ||
| 
 | ||
|         // 4. Let inputCodeUnit be the ith code unit of input.
 | ||
|         auto input_code_unit = Utf16View(input_utf16).code_unit_at(i);
 | ||
| 
 | ||
|         // 5. Return false if potentialPrefixCodeUnit is not inputCodeUnit.
 | ||
|         if (potential_prefix_code_unit != input_code_unit)
 | ||
|             return false;
 | ||
| 
 | ||
|         // 6. Set i to i + 1.
 | ||
|         ++i;
 | ||
|     }
 | ||
| }
 | ||
| 
 | ||
| }
 |