mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-10-05 07:39:16 +00:00
LibLocale was split off from LibUnicode a couple years ago to reduce the number of applications on SerenityOS that depend on CLDR data. Now that we use ICU, both LibUnicode and LibLocale are actually linking in this data. And since vcpkg gives us static libraries, both libraries are over 30MB in size. This patch reverts the separation and merges LibLocale into LibUnicode again. We now have just one library that includes the ICU data. Further, this will let LibUnicode share the locale cache that previously would only exist in LibLocale.
77 lines
3.3 KiB
C++
77 lines
3.3 KiB
C++
/*
|
|
* Copyright (c) 2021-2024, Tim Flynn <trflynn89@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Span.h>
|
|
#include <AK/String.h>
|
|
#include <AK/Variant.h>
|
|
#include <AK/Vector.h>
|
|
#include <LibJS/Forward.h>
|
|
#include <LibJS/Runtime/Completion.h>
|
|
#include <LibJS/Runtime/Temporal/AbstractOperations.h>
|
|
#include <LibJS/Runtime/Value.h>
|
|
#include <LibUnicode/Locale.h>
|
|
|
|
namespace JS::Intl {
|
|
|
|
using LocaleKey = Variant<Empty, String>;
|
|
Optional<LocaleKey> locale_key_from_value(Value);
|
|
|
|
struct LocaleOptions {
|
|
Value locale_matcher;
|
|
Optional<LocaleKey> ca; // [[Calendar]]
|
|
Optional<LocaleKey> co; // [[Collation]]
|
|
Optional<LocaleKey> hc; // [[HourCycle]]
|
|
Optional<LocaleKey> kf; // [[CaseFirst]]
|
|
Optional<LocaleKey> kn; // [[Numeric]]
|
|
Optional<LocaleKey> nu; // [[NumberingSystem]]
|
|
};
|
|
|
|
struct MatchedLocale {
|
|
String locale;
|
|
Optional<Unicode::Extension> extension;
|
|
};
|
|
|
|
struct ResolvedLocale {
|
|
String locale;
|
|
LocaleKey ca; // [[Calendar]]
|
|
LocaleKey co; // [[Collation]]
|
|
LocaleKey hc; // [[HourCycle]]
|
|
LocaleKey kf; // [[CaseFirst]]
|
|
LocaleKey kn; // [[Numeric]]
|
|
LocaleKey nu; // [[NumberingSystem]]
|
|
};
|
|
|
|
using StringOrBoolean = Variant<StringView, bool>;
|
|
|
|
bool is_structurally_valid_language_tag(StringView locale);
|
|
String canonicalize_unicode_locale_id(StringView locale);
|
|
bool is_well_formed_currency_code(StringView currency);
|
|
bool is_well_formed_unit_identifier(StringView unit_identifier);
|
|
ThrowCompletionOr<Vector<String>> canonicalize_locale_list(VM&, Value locales);
|
|
Optional<MatchedLocale> lookup_matching_locale_by_prefix(ReadonlySpan<String> requested_locales);
|
|
Optional<MatchedLocale> lookup_matching_locale_by_best_fit(ReadonlySpan<String> requested_locales);
|
|
String insert_unicode_extension_and_canonicalize(Unicode::LocaleID locale_id, Vector<String> attributes, Vector<Unicode::Keyword> keywords);
|
|
ResolvedLocale resolve_locale(ReadonlySpan<String> requested_locales, LocaleOptions const& options, ReadonlySpan<StringView> relevant_extension_keys);
|
|
ThrowCompletionOr<Array*> filter_locales(VM& vm, ReadonlySpan<String> requested_locales, Value options);
|
|
ThrowCompletionOr<Object*> coerce_options_to_object(VM&, Value options);
|
|
ThrowCompletionOr<StringOrBoolean> get_boolean_or_string_number_format_option(VM& vm, Object const& options, PropertyKey const& property, ReadonlySpan<StringView> string_values, StringOrBoolean fallback);
|
|
ThrowCompletionOr<Optional<int>> default_number_option(VM&, Value value, int minimum, int maximum, Optional<int> fallback);
|
|
ThrowCompletionOr<Optional<int>> get_number_option(VM&, Object const& options, PropertyKey const& property, int minimum, int maximum, Optional<int> fallback);
|
|
|
|
template<size_t Size>
|
|
ThrowCompletionOr<StringOrBoolean> get_boolean_or_string_number_format_option(VM& vm, Object const& options, PropertyKey const& property, StringView const (&string_values)[Size], StringOrBoolean fallback)
|
|
{
|
|
return get_boolean_or_string_number_format_option(vm, options, property, ReadonlySpan<StringView> { string_values }, move(fallback));
|
|
}
|
|
|
|
// NOTE: ECMA-402's GetOption is being removed in favor of a shared ECMA-262 GetOption in the Temporal proposal.
|
|
// Until Temporal is merged into ECMA-262, our implementation lives in the Temporal-specific AO file & namespace.
|
|
using Temporal::get_option;
|
|
using Temporal::OptionType;
|
|
|
|
}
|