Merge "Introduce InterwikiLookupAdapter on top of SiteLookup"
[lhc/web/wiklou.git] / languages / classes / LanguageRu.php
index f50640a..62de390 100644 (file)
@@ -31,7 +31,6 @@
  * @ingroup Language
  */
 class LanguageRu extends Language {
-
        /**
         * Convert from the nominative form of a noun to some other case
         * Invoked with {{grammar:case|word}}
@@ -46,128 +45,25 @@ class LanguageRu extends Language {
                        return $wgGrammarForms['ru'][$case][$word];
                }
 
-               # These rules don't cover the whole language, and are intended only for
-               # names of languages and Wikimedia sites.
-
-               # substr doesn't support Unicode and mb_substr has issues,
-               # so break it to characters using preg_match_all and then use array_slice and join
-               $chars = array();
-               preg_match_all( '/./us', $word, $chars );
-               if ( !preg_match( "/[a-zA-Z_]/us", $word ) ) {
-                       switch ( $case ) {
-                               case 'genitive': # родительный падеж
-                                       if ( join( '', array_slice( $chars[0], -1 ) ) === 'ь' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'я';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ия' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ии';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ка' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ки';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ти' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'тей';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ды' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'дов';
-                                       } elseif ( join( '', array_slice( $chars[0], -1 ) ) === 'д' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'да';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ник' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ника';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ные' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ных';
-                                       }
-                                       break;
-                               case 'dative': # дательный падеж
-                                       # stub
-                                       break;
-                               case 'accusative': # винительный падеж
-                                       # stub
-                                       break;
-                               case 'instrumental': # творительный падеж
-                                       # stub
-                                       break;
-                               case 'prepositional': # предложный падеж
-                                       if ( join( '', array_slice( $chars[0], -1 ) ) === 'ь' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'е';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ия' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ии';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ка' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'ке';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ти' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'тях';
-                                       } elseif ( join( '', array_slice( $chars[0], -2 ) ) === 'ды' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -2 ) ) . 'дах';
-                                       } elseif ( join( '', array_slice( $chars[0], -1 ) ) === 'д' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -1 ) ) . 'де';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ник' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'нике';
-                                       } elseif ( join( '', array_slice( $chars[0], -3 ) ) === 'ные' ) {
-                                               $word = join( '', array_slice( $chars[0], 0, -3 ) ) . 'ных';
-                                       }
-                                       break;
-                               case 'languagegen': # язык в родительном падеже ("(с) русского")
-                                       $suffix = join( '', array_slice( $chars[0], -3 ) );
-                                       if ( $suffix === 'кий' ) {
-                                               $word = join(
-                                                       '',
-                                                       array_slice( $chars[0], 0, count( $chars[0] ) - 2 )
-                                               ) . 'ого';
-
-                                               break;
-                                       }
-
-                                       if ( in_array( $word, array( 'иврит', 'идиш' ) ) ) {
-                                               $word = $word . 'а';
-
-                                               break;
-                                       }
-
-                                       break;
-                               case 'languageprep': # язык в предложном падеже ("(на) русском")
-                                       $suffix = join( '', array_slice( $chars[0], -3 ) );
-                                       if ( $suffix === 'кий' ) {
-                                               $word = join(
-                                                       '',
-                                                       array_slice( $chars[0], 0, count( $chars[0] ) - 2 )
-                                               ) . 'ом';
-
-                                               break;
-                                       }
-
-                                       if ( in_array( $word, array( 'иврит', 'идиш' ) ) ) {
-                                               $word = $word . 'е';
-
-                                               break;
-                                       }
-
-                                       break;
-                               case 'languageadverb': # наречие с названием языка ("по-русски")
-                                       $suffix = join( '', array_slice( $chars[0], -3 ) );
-                                       if ( $suffix === 'кий' ) {
-                                               $word = 'по-' . join(
-                                                       '',
-                                                       array_slice( $chars[0], 0, count( $chars[0] ) - 1 )
-                                               );
-
-                                               break;
-                                       }
+               $grammarTransformations = $this->getGrammarTransformations();
 
-                                       if ( in_array( $word, array( 'иврит', 'идиш' ) ) ) {
-                                               $word = 'на ' . $word . 'е';
+               if ( isset( $grammarTransformations[$case] ) ) {
+                       foreach ( array_values( $grammarTransformations[$case] ) as $rule ) {
+                               $form = $rule[0];
 
-                                               break;
-                                       }
+                               if ( $form === '@metadata' ) {
+                                       continue;
+                               }
 
-                                       // Known particular cases of undeclinable names
-                                       // Известные несклоняемые
-                                       if ( in_array( $word, array( 'идо', 'урду', 'хинди', 'эсперанто' ) ) ) {
-                                               $word = "на $word";
+                               $replacement = $rule[1];
 
-                                               break;
-                                       }
+                               $regex = "/$form/";
 
-                                       // Undeclinable
-                                       // Остальные несклоняемые
-                                       $word = "на языке $word";
+                               if ( preg_match( $regex, $word ) ) {
+                                       $word = preg_replace( $regex, $replacement, $word );
 
                                        break;
+                               }
                        }
                }
 
@@ -176,7 +72,7 @@ class LanguageRu extends Language {
 
        /**
         * Four-digit number should be without group commas (spaces)
-        * See manual of style at http://ru.wikipedia.org/wiki/Википедия:Оформление_статей
+        * See manual of style at https://ru.wikipedia.org/wiki/Википедия:Оформление_статей
         * So "1 234 567", "12 345" but "1234"
         *
         * @param string $_