1 // © 2024 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 6 #ifndef MESSAGEFORMAT2_H 7 #define MESSAGEFORMAT2_H 9 #if U_SHOW_CPLUSPLUS_API 11 #if !UCONFIG_NO_NORMALIZATION 13 #if !UCONFIG_NO_FORMATTING 23 #include "unicode/messageformat2_data_model.h" 24 #include "unicode/messageformat2_function_registry.h" 28 #ifndef U_HIDE_DEPRECATED_API 55 // Note: This class does not currently inherit from the existing 159 U_MF_BEST_EFFORT = 0,
168 } UMFErrorHandlingBehavior;
180 // The pattern to be parsed to generate the formatted message 182 bool hasPattern =
false;
183 bool hasDataModel =
false;
184 // The data model to be used to generate the formatted message 185 // Initialized either by `setDataModel()`, or by the parser 186 // through a call to `setPattern()` 188 // Normalized representation of the pattern; 189 // ignored if `setPattern()` wasn't called 191 // Errors (internal representation of parse errors) 192 // Ignored if `setPattern()` wasn't called 193 StaticErrors* errors;
197 // Error behavior; see comment in `MessageFormatter` class 198 bool signalErrors =
false;
318 };
// class MessageFormatter::Builder 320 // TODO: Shouldn't be public; only used for testing 335 friendclassMessageContext;
341 // Do not define default assignment operator 346 // Takes a vector of FormattedPlaceholders 347 void resolveSelectors(MessageContext&,
const Environment& env,
UErrorCode&, UVector&)
const;
348 // Takes a vector of vectors of strings (input) and a vector of PrioritizedVariants (output) 349 void filterVariants(
const UVector&, UVector&,
UErrorCode&)
const;
350 // Takes a vector of vectors of strings (input) and a vector of PrioritizedVariants (input/output) 351 void sortVariants(
const UVector&, UVector&,
UErrorCode&)
const;
352 // Takes a vector of strings (input) and a vector of strings (output) 353 void matchSelectorKeys(
const UVector&, MessageContext&, InternalValue* rv, UVector&,
UErrorCode&)
const;
354 // Takes a vector of FormattedPlaceholders (input), 355 // and a vector of vectors of strings (output) 356 void resolvePreferences(MessageContext&, UVector&, UVector&,
UErrorCode&)
const;
358 // Formatting methods 362 // Evaluates a function call 363 // Dispatches on argument type 365 MessageContext& context,
367 // Dispatches on function name 368 [[nodiscard]] InternalValue* evalFunctionCall(
constFunctionName& functionName,
369 InternalValue* argument,
371 MessageContext& context,
373 // Formats an expression that appears in a pattern or as the definition of a local variable 374 [[nodiscard]] InternalValue* formatExpression(
constUnicodeString&,
380 [[nodiscard]] InternalValue* formatOperand(
constUnicodeString&,
389 void formatSelectors(MessageContext& context,
const Environment& env,
UErrorCode &status,
UnicodeString& result)
const;
391 // Function registry methods 392 bool hasCustomMFFunctionRegistry()
const{
393 return (customMFFunctionRegistry !=
nullptr);
396 // Precondition: custom function registry exists 397 // Note: this is non-const because the values in the MFFunctionRegistry are mutable 398 // (a FormatterFactory can have mutable state) 399 const MFFunctionRegistry& getCustomMFFunctionRegistry()
const;
401 bool isCustomFormatter(
const FunctionName&)
const;
402 FormatterFactory* lookupFormatterFactory(
const FunctionName&,
UErrorCode& status)
const;
403 bool isBuiltInSelector(
const FunctionName&)
const;
404 bool isBuiltInFormatter(
const FunctionName&)
const;
405 bool isCustomSelector(
const FunctionName&)
const;
406 const SelectorFactory* lookupSelectorFactory(MessageContext&,
const FunctionName&,
UErrorCode&)
const;
407 bool isSelector(
const FunctionName& fn)
const{
return isBuiltInSelector(fn) || isCustomSelector(fn); }
408 bool isFormatter(
const FunctionName& fn)
const{
return isBuiltInFormatter(fn) || isCustomFormatter(fn); }
409 const Formatter* lookupFormatter(
const FunctionName&,
UErrorCode&)
const;
411 Selector* getSelector(MessageContext&,
const FunctionName&,
UErrorCode&)
const;
412 Formatter* getFormatter(
const FunctionName&,
UErrorCode&)
const;
413 bool getDefaultFormatterNameByType(
const UnicodeString&, FunctionName&)
const;
415 // Checking for resolution errors 416 void checkDeclarations(MessageContext&, Environment*&,
UErrorCode&)
const;
417 void check(MessageContext&,
const Environment&,
const data_model::Expression&,
UErrorCode&)
const;
418 void check(MessageContext&,
const Environment&,
const data_model::Operand&,
UErrorCode&)
const;
419 void check(MessageContext&,
const Environment&,
const OptionMap&,
UErrorCode&)
const;
422 void clearErrors()
const;
423 void cleanup() noexcept;
425 // The locale this MessageFormatter was created with 426 /* const */ Locale locale;
428 // Registry for built-in functions 429 MFFunctionRegistry standardMFFunctionRegistry;
430 // Registry for custom functions; may be null if no custom registry supplied 431 // Note: this is *not* owned by the MessageFormatter object 432 // The reason for this choice is to have a non-destructive MessageFormatter::Builder, 433 // while also not requiring the function registry to be deeply-copyable. Making the 434 // function registry copyable would impose a requirement on any implementations 435 // of the FormatterFactory and SelectorFactory interfaces to implement a custom 436 // clone() method, which is necessary to avoid sharing between copies of the 437 // function registry (and thus double-frees) 438 // Not deeply immutable (the values in the function registry are mutable, 439 // as a FormatterFactory can have mutable state 440 const MFFunctionRegistry* customMFFunctionRegistry;
442 // Data model, representing the parsed message 443 MFDataModel dataModel;
445 // Normalized version of the input string (optional whitespace removed) 446 UnicodeString normalizedInput;
448 // Errors -- only used while parsing and checking for data model errors; then 449 // the MessageContext keeps track of errors 450 // Must be a raw pointer to avoid including the internal header file 451 // defining StaticErrors 453 StaticErrors* errors =
nullptr;
455 // Error handling behavior. 456 // If true, then formatting methods set their UErrorCode arguments 457 // to signal MessageFormat errors, and no useful output is returned. 458 // If false, then MessageFormat errors are not signaled and the 459 // formatting methods return best-effort output. 460 // The default is false. 461 bool signalErrors = false;
463 };
// class MessageFormatter 465 }
// namespace message2 469 #endif// U_HIDE_DEPRECATED_API 471 #endif/* #if !UCONFIG_NO_MF2 */ 473 #endif/* #if !UCONFIG_NO_FORMATTING */ 475 #endif/* #if !UCONFIG_NO_NORMALIZATION */ 477 #endif/* U_SHOW_CPLUSPLUS_API */ 479 #endif// MESSAGEFORMAT2_H A Locale object represents a specific geographical, political, or cultural region.
UObject is the common ICU "boilerplate" class.
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Not yet implemented: The result of a message formatting operation.
A FormattablePlaceholder encapsulates an input value (a message2::Formattable) together with an optio...
Structure encapsulating named options passed to a custom selector or formatter.
Defines mappings from names of formatters and selectors to functions implementing them.
The MessageArguments class represents the named arguments to a message.
The mutable Builder class allows each part of the MessageFormatter to be initialized separately; call...
U_I18N_API Builder & setPattern(const UnicodeString &pattern, UParseError &parseError, UErrorCode &status)
Sets the pattern (contents of the message) and parses it into a data model.
U_I18N_API Builder & setErrorHandlingBehavior(UMFErrorHandlingBehavior type)
Set the error handling behavior for this formatter.
U_I18N_API Builder & setFunctionRegistry(const MFFunctionRegistry &functionRegistry)
Sets a custom function registry.
U_I18N_API Builder & setDataModel(MFDataModel &&dataModel)
Sets a data model.
U_I18N_API Builder & setLocale(const Locale &locale)
Sets the locale to use for formatting.
virtual U_I18N_API ~Builder()
Destructor.
U_I18N_API Builder(UErrorCode &status)
Default constructor.
U_I18N_API MessageFormatter build(UErrorCode &status) const
Constructs a new immutable MessageFormatter using the pattern or data model that was previously set,...
U_I18N_API const UnicodeString & getNormalizedPattern() const
Returns a string consisting of the input with optional spaces removed.
U_I18N_API const MFDataModel & getDataModel() const
Accesses the data model referred to by this MessageFormatter object.
U_I18N_API MessageFormatter & operator=(MessageFormatter &&) noexcept
Move assignment operator: The source MessageFormatter will be left in a valid but undefined state.
U_I18N_API const Locale & getLocale() const
Accesses the locale that this MessageFormatter object was created with.
U_I18N_API UnicodeString getPattern() const
Serializes the data model as a string in MessageFormat 2.0 syntax.
UMFErrorHandlingBehavior
Used in conjunction with the MessageFormatter::Builder::setErrorHandlingBehavior() method.
The Expression class corresponds to the expression nonterminal in the MessageFormat 2 grammar and the...
The Literal class corresponds to the literal nonterminal in the MessageFormat 2 grammar,...
The MFDataModel class describes a parsed representation of the text of a message.
The Operand class corresponds to the operand nonterminal in the MessageFormat 2 grammar,...
A Pattern is a sequence of formattable parts.
C++ API: Formats messages using the draft MessageFormat 2.0.
C++ API: New API for Unicode Normalization.
A UParseError struct is used to returned detailed information about parsing errors.
Basic definitions for ICU, for both C and C++ APIs.
UErrorCode
Standard ICU4C error code type, a substitute for exceptions.
@ U_UNSUPPORTED_ERROR
Requested operation not supported in current context.
#define U_SUCCESS(x)
Does the error code indicate success?
#define U_I18N_API_CLASS
Set to export library symbols from inside the i18n library, and to import them from outside,...
#define U_I18N_API
Set to export library symbols from inside the i18n library, and to import them from outside.