| 
									
										
										
										
											2022-10-01 18:39:40 +01:00
										 |  |  |  | /*
 | 
					
						
							|  |  |  |  |  * Copyright (c) 2022, Linus Groh <linusg@serenityos.org> | 
					
						
							| 
									
										
										
										
											2022-10-23 04:02:56 +02:00
										 |  |  |  |  * Copyright (c) 2022, networkException <networkexception@serenityos.org> | 
					
						
							| 
									
										
										
										
											2022-10-01 18:39:40 +01:00
										 |  |  |  |  * | 
					
						
							|  |  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  |  */ | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-04 18:02:33 +00:00
										 |  |  |  | #include <AK/DeprecatedString.h>
 | 
					
						
							| 
									
										
										
										
											2022-10-23 04:02:56 +02:00
										 |  |  |  | #include <AK/Utf16View.h>
 | 
					
						
							| 
									
										
										
										
											2022-10-01 18:39:40 +01:00
										 |  |  |  | #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
 | 
					
						
							| 
									
										
										
										
											2022-12-04 18:02:33 +00:00
										 |  |  |  | DeprecatedString strip_and_collapse_whitespace(StringView string) | 
					
						
							| 
									
										
										
										
											2022-10-01 18:39:40 +01:00
										 |  |  |  | { | 
					
						
							|  |  |  |  |     // 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); | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-23 04:02:56 +02:00
										 |  |  |  | // https://infra.spec.whatwg.org/#code-unit-prefix
 | 
					
						
							|  |  |  |  | bool is_code_unit_prefix(StringView potential_prefix, StringView input) | 
					
						
							|  |  |  |  | { | 
					
						
							| 
									
										
										
										
											2023-01-06 13:19:34 -05:00
										 |  |  |  |     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(); | 
					
						
							| 
									
										
										
										
											2022-10-23 04:02:56 +02:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  |     // 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; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-01 18:39:40 +01:00
										 |  |  |  | } |