62 public function process(
string $word,
string $case, ?array $overrideForms = [] ): string {
63 $langCode = $this->provider->getLanguageCode();
65 if ( isset( $overrideForms[$langCode][$case][$word] ) ) {
66 return $overrideForms[$langCode][$case][$word];
69 $grammarTransformations = $this->provider->getGrammarTransformationsProvider()->getTransformations();
71 if ( array_key_exists( $case, $grammarTransformations ) ) {
72 $forms = $grammarTransformations[$case];
77 if ( is_string( $forms ) ) {
79 if ( isset( $grammarTransformations[$alias] ) && is_array( $grammarTransformations[$alias] ) ) {
80 $forms = $grammarTransformations[$alias];
83 'Expected alias {alias} to resolve to an array in grammar transformations.',
91 if ( !is_array( $forms ) ) {
93 'Invalid type for grammar forms. Expected array, got {type}.',
94 [
'type' => gettype( $forms ) ]
100 foreach ( $forms as $rule ) {
101 if ( !is_array( $rule ) || !isset( $rule[0] ) || !isset( $rule[1] ) ) {
102 $this->logger->warning(
103 'Skipping malformed grammar rule. Expected [pattern, replacement]. Case: {case}, Rule: {rule}',
106 'rule' => json_encode( $rule ),
112 if ( !is_string( $rule[0] ) ) {
113 $this->logger->warning(
114 'Invalid grammar rule format: first element must be string. Case: {case}, Rule: {rule}',
117 'rule' => json_encode( $rule ),
125 if ( $form ===
'@metadata' ) {
129 $replacement = is_string( $rule[1] ) ? $rule[1] :
'';
131 $regex =
'/' . addcslashes( $form,
'/' ) .
'/u';
132 $patternMatches = preg_match( $regex, $word );
134 if ( $patternMatches ===
false ) {
135 $this->logger->error(
136 'An error occurred while processing grammar: {error}. Word: {word}. Regex: /{form}/.',
138 'error' => preg_last_error_msg(),
143 } elseif ( $patternMatches === 1 ) {
144 $word = preg_replace( $regex, $replacement, $word ) ?? $word;
149 $word = $this->postProcessor->apply( $this->provider->getLanguageCode(), $word, $case );