56 public function process(
string $word,
string $case, ?array $overrideForms = [] ): string {
57 $langCode = $this->provider->getLanguageCode();
59 if ( isset( $overrideForms[$langCode][$case][$word] ) ) {
60 return $overrideForms[$langCode][$case][$word];
63 $grammarTransformations = $this->provider->getGrammarTransformationsProvider()->getTransformations();
65 if ( array_key_exists( $case, $grammarTransformations ) ) {
66 $forms = $grammarTransformations[$case];
71 if ( is_string( $forms ) ) {
73 if ( isset( $grammarTransformations[$alias] ) && is_array( $grammarTransformations[$alias] ) ) {
74 $forms = $grammarTransformations[$alias];
77 'Expected alias {alias} to resolve to an array in grammar transformations.',
85 if ( !is_array( $forms ) ) {
87 'Invalid type for grammar forms. Expected array, got {type}.',
88 [
'type' => gettype( $forms ) ]
94 foreach ( $forms as $rule ) {
95 if ( !is_array( $rule ) || !isset( $rule[0] ) || !isset( $rule[1] ) ) {
96 $this->logger->warning(
97 'Skipping malformed grammar rule. Expected [pattern, replacement]. Case: {case}, Rule: {rule}',
100 'rule' => json_encode( $rule ),
106 if ( !is_string( $rule[0] ) ) {
107 $this->logger->warning(
108 'Invalid grammar rule format: first element must be string. Case: {case}, Rule: {rule}',
111 'rule' => json_encode( $rule ),
119 if ( $form ===
'@metadata' ) {
123 $replacement = is_string( $rule[1] ) ? $rule[1] :
'';
125 $regex =
'/' . addcslashes( $form,
'/' ) .
'/u';
126 $patternMatches = preg_match( $regex, $word );
128 if ( $patternMatches ===
false ) {
129 $this->logger->error(
130 'An error occurred while processing grammar: {error}. Word: {word}. Regex: /{form}/.',
132 'error' => preg_last_error_msg(),
137 } elseif ( $patternMatches === 1 ) {
138 $word = preg_replace( $regex, $replacement, $word ) ?? $word;
143 $word = $this->postProcessor->apply( $this->provider->getLanguageCode(), $word, $case );