/* * Copyright (c) 2022, Linus Groh * Copyright (c) 2022, networkException * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include namespace Web::Infra { // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace String 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); auto input_utf16 = utf8_to_utf16(input); // 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; } } }