Merge "resourceloader: Remove 'user.styles' dependency from 'user' module"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 23 May 2018 18:04:39 +0000 (18:04 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 23 May 2018 18:04:39 +0000 (18:04 +0000)
17 files changed:
Gruntfile.js
RELEASE-NOTES-1.32
includes/OutputPage.php
jsduck.json
languages/data/CrhExceptions.php
languages/messages/MessagesEs.php
languages/messages/MessagesGor.php
resources/Resources.php
resources/src/jquery/images/marker.png [deleted file]
resources/src/jquery/images/mask.png [deleted file]
resources/src/jquery/images/wheel.png [deleted file]
resources/src/jquery/jquery.farbtastic.css [deleted file]
resources/src/jquery/jquery.farbtastic.js [deleted file]
resources/src/mediawiki.skinning/content.externallinks.css [deleted file]
resources/src/mediawiki.skinning/content.externallinks.less [new file with mode: 0644]
resources/src/mediawiki/mediawiki.js
tests/phpunit/languages/classes/LanguageCrhTest.php

index 3687d28..8018212 100644 (file)
@@ -27,7 +27,6 @@ module.exports = function ( grunt ) {
                                '!node_modules/**',
                                '!resources/lib/**',
                                '!resources/src/jquery.tipsy/**',
-                               '!resources/src/jquery/jquery.farbtastic.js',
                                '!resources/src/mediawiki.libs.jpegmeta/**',
                                // Third-party code of PHPUnit coverage report
                                '!tests/coverage/**',
index b63c644..fa7c962 100644 (file)
@@ -106,6 +106,7 @@ because of Phabricator reports.
 * The es5-shim module, empty and deprecated since 1.29, was removed.
 * The mediawiki.widgets.visibleByteLimit module, deprecated in 1.32, was removed.
   Use mediawiki.widgets.visibleLengthLimit instead.
+* The jquery.farbtastic module, unused since 1.18, was removed.
 
 === Deprecations in 1.32 ===
 * Use of a StartProfiler.php file is deprecated in favour of placing
index c7028db..6c45d9c 100644 (file)
@@ -463,20 +463,22 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add a JavaScript file out of skins/common, or a given relative path.
+        * Add a JavaScript file to be loaded as `<script>` on this page.
+        *
         * Internal use only. Use OutputPage::addModules() if possible.
         *
-        * @param string $file Filename in skins/common or complete on-server path
-        *              (/foo/bar.js)
+        * @param string $file URL to file (absolute path, protocol-relative, or full url)
         * @param string $version Style version of the file. Defaults to $wgStyleVersion
         */
        public function addScriptFile( $file, $version = null ) {
-               // See if $file parameter is an absolute URL or begins with a slash
-               if ( substr( $file, 0, 1 ) == '/' || preg_match( '#^[a-z]*://#i', $file ) ) {
-                       $path = $file;
-               } else {
-                       $path = $this->getConfig()->get( 'StylePath' ) . "/common/{$file}";
+               if ( substr( $file, 0, 1 ) !== '/' && !preg_match( '#^[a-z]*://#i', $file ) ) {
+                       // This is not an absolute path, protocol-relative url, or full scheme url,
+                       // presumed to be an old call intended to include a file from /w/skins/common,
+                       // which doesn't exist anymore as of MediaWiki 1.24 per T71277. Ignore.
+                       wfDeprecated( __METHOD__, '1.24' );
+                       return;
                }
+               $path = $file;
                if ( is_null( $version ) ) {
                        $version = $this->getConfig()->get( 'StyleVersion' );
                }
index 18d514f..e61303d 100644 (file)
@@ -14,8 +14,6 @@
                "resources/src/jquery.tipsy",
                "resources/src/jquery/jquery.color.js",
                "resources/src/jquery/jquery.expandableField.js",
-               "resources/src/jquery/jquery.farbtastic.css",
-               "resources/src/jquery/jquery.farbtastic.js",
                "resources/src/jquery/jquery.highlightText.js",
                "resources/src/jquery/jquery.mw-jump.js",
                "resources/src/mediawiki.legacy",
index 669c802..c759220 100644 (file)
@@ -13,6 +13,8 @@ use CrhConverter as Crh;
 
 class CrhExceptions {
 
+       const WB = '\b'; # default word boundary; may be updated in the future
+
        function __construct() {
                $this->loadRegs();
        }
@@ -102,9 +104,9 @@ class CrhExceptions {
 
                # load C2L and L2C bidirectional affix mappings
                $this->addMappings( $this->prefixMapping,
-                       $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/\b', '/u' );
+                       $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/'.self::WB, '/u' );
                $this->addMappings( $this->suffixMapping,
-                       $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/', '\b/u' );
+                       $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/', self::WB.'/u' );
 
                # tack on one-way mappings to the ends of the prefix and suffix patterns
                $this->Cyrl2LatnPatterns += $this->Cyrl2LatnRegexes;
@@ -284,7 +286,13 @@ class CrhExceptions {
                'доцент' => 'dotsent', 'фармацевт' => 'farmatsevt', 'глицер' => 'glitser',
                'люцерна' => 'lütserna', 'лицей' => 'litsey', 'меццо' => 'metstso', 'наци' => 'natsi',
                'проце' => 'protse', 'рецеп' => 'retsep', 'реценз' => 'retsenz', 'теплица' => 'teplitsa',
-               'вице' => 'vitse', 'швейцар' => 'şveytsar',
+               'вице' => 'vitse', 'швейцар' => 'şveytsar', 'богородиц' => 'bogorodits',
+               'бруцел' => 'brutsel', 'дацюк' => 'datsük', 'доницетти' => 'donitsetti',
+               'драцена' => 'dratsena', 'контрацеп' => 'kontratsep', 'коцюб' => 'kotsüb',
+               'меценат' => 'metsenat', 'мицел' => 'mitsel', 'моцарт' => 'motsart', 'плац' => 'plats',
+               'плацен' => 'platsen', 'прецедент' => 'pretsedent', 'прецес' => 'pretses',
+               'прицеп' => 'pritsep', 'спец' => 'spets', 'троиц' => 'troits', 'шприц' => 'şprits',
+               'эпицентр' => 'epitsentr', 'яценюк' => 'yatsenük',
 
                # слова с тс
                # words with тс
@@ -403,76 +411,76 @@ class CrhExceptions {
                        // TODO: refactor upper/lower/first capital whole words without
                        // regexes into simpler list
 
-                       '/\bКъЮШ\b/u' => 'QYŞ',
-                       '/\bЮШ\b/u' => 'YŞ',
-
-                       '/\bкок\b/u' => 'kök',
-                       '/\bКок\b/u' => 'Kök',
-                       '/\bКОК\b/u' => 'KÖK',
-                       '/\bком-кок\b/u' => 'köm-kök',
-                       '/\bКом-кок\b/u' => 'Köm-kök',
-                       '/\bКОМ-КОК\b/u' => 'KÖM-KÖK',
-
-                       '/\bкоп\b/u' => 'köp',
-                       '/\bКоп\b/u' => 'Köp',
-                       '/\bКОП\b/u' => 'KÖP',
-
-                       '/\bкурк\b/u' => 'kürk',
-                       '/\bКурк\b/u' => 'Kürk',
-                       '/\bКУРК\b/u' => 'KÜRK',
-
-                       '/\bог\b/u' => 'ög',
-                       '/\bОг\b/u' => 'Ög',
-                       '/\bОГ\b/u' => 'ÖG',
-
-                       '/\bюрип\b/u' => 'yürip',
-                       '/\bЮрип\b/u' => 'Yürip',
-                       '/\bЮРИП\b/u' => 'YÜRİP',
-
-                       '/\bюз\b/u' => 'yüz',
-                       '/\bЮз\b/u' => 'Yüz',
-                       '/\bЮЗ\b/u' => 'YÜZ',
-
-                       '/\bюк\b/u' => 'yük',
-                       '/\bЮк\b/u' => 'Yük',
-                       '/\bЮК\b/u' => 'YÜK',
-
-                       '/\bбуюп\b/u' => 'büyüp',
-                       '/\bБуюп\b/u' => 'Büyüp',
-                       '/\bБУЮП\b/u' => 'BÜYÜP',
-
-                       '/\bбуюк\b/u' => 'büyük',
-                       '/\bБуюк\b/u' => 'Büyük',
-                       '/\bБУЮК\b/u' => 'BÜYÜK',
-
-                       '/\bджонк\b/u' => 'cönk',
-                       '/\bДжонк\b/u' => 'Cönk',
-                       '/\bДЖОНК\b/u' => 'CÖNK',
-                       '/\bджонкю\b/u' => 'cönkü',
-                       '/\bДжонкю\b/u' => 'Cönkü',
-                       '/\bДЖОНКЮ\b/u' => 'CÖNKÜ',
-
-                       '/\bустке\b/u' => 'üstke',
-                       '/\bУстке\b/u' => 'Üstke',
-                       '/\bУСТКЕ\b/u' => 'ÜSTKE',
-                       '/\bустте\b/u' => 'üstte',
-                       '/\bУстте\b/u' => 'Üstte',
-                       '/\bУСТТЕ\b/u' => 'ÜSTTE',
-                       '/\bусттен\b/u' => 'üstten',
-                       '/\bУсттен\b/u' => 'Üstten',
-                       '/\bУСТТЕН\b/u' => 'ÜSTTEN',
+                       '/'.self::WB.'КъЮШ'.self::WB.'/u' => 'QYŞ',
+                       '/'.self::WB.'ЮШ'.self::WB.'/u' => 'YŞ',
+
+                       '/'.self::WB.'кок'.self::WB.'/u' => 'kök',
+                       '/'.self::WB.'Кок'.self::WB.'/u' => 'Kök',
+                       '/'.self::WB.'КОК'.self::WB.'/u' => 'KÖK',
+                       '/'.self::WB.'ком-кок'.self::WB.'/u' => 'köm-kök',
+                       '/'.self::WB.'Ком-кок'.self::WB.'/u' => 'Köm-kök',
+                       '/'.self::WB.'КОМ-КОК'.self::WB.'/u' => 'KÖM-KÖK',
+
+                       '/'.self::WB.'коп'.self::WB.'/u' => 'köp',
+                       '/'.self::WB.'Коп'.self::WB.'/u' => 'Köp',
+                       '/'.self::WB.'КОП'.self::WB.'/u' => 'KÖP',
+
+                       '/'.self::WB.'курк'.self::WB.'/u' => 'kürk',
+                       '/'.self::WB.'Курк'.self::WB.'/u' => 'Kürk',
+                       '/'.self::WB.'КУРК'.self::WB.'/u' => 'KÜRK',
+
+                       '/'.self::WB.'ог'.self::WB.'/u' => 'ög',
+                       '/'.self::WB.'Ог'.self::WB.'/u' => 'Ög',
+                       '/'.self::WB.'ОГ'.self::WB.'/u' => 'ÖG',
+
+                       '/'.self::WB.'юрип'.self::WB.'/u' => 'yürip',
+                       '/'.self::WB.'Юрип'.self::WB.'/u' => 'Yürip',
+                       '/'.self::WB.'ЮРИП'.self::WB.'/u' => 'YÜRİP',
+
+                       '/'.self::WB.'юз'.self::WB.'/u' => 'yüz',
+                       '/'.self::WB.'Юз'.self::WB.'/u' => 'Yüz',
+                       '/'.self::WB.'ЮЗ'.self::WB.'/u' => 'YÜZ',
+
+                       '/'.self::WB.'юк'.self::WB.'/u' => 'yük',
+                       '/'.self::WB.'Юк'.self::WB.'/u' => 'Yük',
+                       '/'.self::WB.'ЮК'.self::WB.'/u' => 'YÜK',
+
+                       '/'.self::WB.'буюп'.self::WB.'/u' => 'büyüp',
+                       '/'.self::WB.'Буюп'.self::WB.'/u' => 'Büyüp',
+                       '/'.self::WB.'БУЮП'.self::WB.'/u' => 'BÜYÜP',
+
+                       '/'.self::WB.'буюк'.self::WB.'/u' => 'büyük',
+                       '/'.self::WB.'Буюк'.self::WB.'/u' => 'Büyük',
+                       '/'.self::WB.'БУЮК'.self::WB.'/u' => 'BÜYÜK',
+
+                       '/'.self::WB.'джонк'.self::WB.'/u' => 'cönk',
+                       '/'.self::WB.'Джонк'.self::WB.'/u' => 'Cönk',
+                       '/'.self::WB.'ДЖОНК'.self::WB.'/u' => 'CÖNK',
+                       '/'.self::WB.'джонкю'.self::WB.'/u' => 'cönkü',
+                       '/'.self::WB.'Джонкю'.self::WB.'/u' => 'Cönkü',
+                       '/'.self::WB.'ДЖОНКЮ'.self::WB.'/u' => 'CÖNKÜ',
+
+                       '/'.self::WB.'устке'.self::WB.'/u' => 'üstke',
+                       '/'.self::WB.'Устке'.self::WB.'/u' => 'Üstke',
+                       '/'.self::WB.'УСТКЕ'.self::WB.'/u' => 'ÜSTKE',
+                       '/'.self::WB.'устте'.self::WB.'/u' => 'üstte',
+                       '/'.self::WB.'Устте'.self::WB.'/u' => 'Üstte',
+                       '/'.self::WB.'УСТТЕ'.self::WB.'/u' => 'ÜSTTE',
+                       '/'.self::WB.'усттен'.self::WB.'/u' => 'üstten',
+                       '/'.self::WB.'Усттен'.self::WB.'/u' => 'Üstten',
+                       '/'.self::WB.'УСТТЕН'.self::WB.'/u' => 'ÜSTTEN',
 
                        # отдельно стоящие Ё и Я
                        # stand-alone Ё and Я
-                       '/\bЯ\b/u' => 'Ya',
-                       '/\bЁ\b/u' => 'Yo',
+                       '/'.self::WB.'Я'.self::WB.'/u' => 'Ya',
+                       '/'.self::WB.'Ё'.self::WB.'/u' => 'Yo',
 
                        ############################
                        # относятся к началу слова #
                        # word prefixes            #
                        ############################
-                       '/\bКъЮШн/u' => 'QYŞn',
-                       '/\bЮШн/u' => 'YŞn',
+                       '/'.self::WB.'КъЮШн/u' => 'QYŞn',
+                       '/'.self::WB.'ЮШн/u' => 'YŞn',
 
                        # need to convert digraphs (гъ, къ, нъ, дж) now to match patterns
                        '/гъ/u' => 'ğ',
@@ -485,58 +493,63 @@ class CrhExceptions {
                        '/Д[жЖ]/u' => 'C',
 
                        # о => ö
-                       '/\b(['.Crh::C_M_CONS.'])о(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ö$2$3$4',
-                       '/\bо(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ö$1$2$3',
-                       '/\b(['.Crh::C_M_CONS.'])О(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' =>
-                               '$1Ö$2$3$4',
-                       '/\bО(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2$3',
-
-                       '/\b(['.Crh::C_M_CONS.'])о(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ö$2$3',
-                       '/\bо(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ö$1$2',
-                       '/\b(['.Crh::C_M_CONS.'])О(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ö$2$3',
-                       '/\bО(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2',
+                       '/'.self::WB.'(['.Crh::C_M_CONS.'])о(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u'
+                               => '$1ö$2$3$4',
+                       '/'.self::WB.'о(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ö$1$2$3',
+                       '/'.self::WB.'(['.Crh::C_M_CONS.'])О(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u'
+                               => '$1Ö$2$3$4',
+                       '/'.self::WB.'О(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2$3',
+
+                       '/'.self::WB.'(['.Crh::C_M_CONS.'])о(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ö$2$3',
+                       '/'.self::WB.'о(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ö$1$2',
+                       '/'.self::WB.'(['.Crh::C_M_CONS.'])О(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ö$2$3',
+                       '/'.self::WB.'О(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2',
 
                        # ё => yö
-                       '/\bё(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([ьеюü])/u' => 'yö$1$2$3',
-                       '/\bЁ(['.Crh::C_CONS_LC.'])(['.Crh::C_CONS_LC.'])([ьеюü])/u' => 'Yö$1$2$3',
-                       '/\bЁ(['.Crh::C_CONS_UC.'])(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => 'YÖ$1$2$3',
-                       '/\bё(['.Crh::C_CONS.'])([ьеюü])/u' => 'yö$1$2',
-                       '/\bЁ(['.Crh::C_CONS_LC.'])([ьеюü])/u' => 'Yö$1$2',
-                       '/\bЁ(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => 'YÖ$1$2',
+                       '/'.self::WB.'ё(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([ьеюü])/u' => 'yö$1$2$3',
+                       '/'.self::WB.'Ё(['.Crh::C_CONS_LC.'])(['.Crh::C_CONS_LC.'])([ьеюü])/u' => 'Yö$1$2$3',
+                       '/'.self::WB.'Ё(['.Crh::C_CONS_UC.'])(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => 'YÖ$1$2$3',
+                       '/'.self::WB.'ё(['.Crh::C_CONS.'])([ьеюü])/u' => 'yö$1$2',
+                       '/'.self::WB.'Ё(['.Crh::C_CONS_LC.'])([ьеюü])/u' => 'Yö$1$2',
+                       '/'.self::WB.'Ё(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => 'YÖ$1$2',
 
                        # у => ü, ую => üyü
-                       '/\b(['.Crh::C_M_CONS.'])у(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ü$2$3$4',
-                       '/\bу(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ü$1$2$3',
-                       '/\bую(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'üyü$1$2$3',
-                       '/\b(['.Crh::C_M_CONS.'])У(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' =>
-                               '$1Ü$2$3$4',
-                       '/\bУ(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2$3',
-                       '/\bУю(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'Üyü$1$2$3',
-                       '/\bУЮ(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ÜYÜ$1$2$3',
-
-                       '/\b(['.Crh::C_M_CONS.'])у(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ü$2$3',
-                       '/\bу(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ü$1$2',
-                       '/\bую(['.Crh::C_CONS.'])([еиэюьü])/u' => 'üyü$1$2',
-                       '/\b(['.Crh::C_M_CONS.'])У(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ü$2$3',
-                       '/\bУ(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2',
-                       '/\bУю(['.Crh::C_CONS.'])([еиэюьü])/u' => 'Üyü$1$2',
-                       '/\bУЮ(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ÜYÜ$1$2',
+                       '/'.self::WB.'(['.Crh::C_M_CONS.'])у(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u'
+                               => '$1ü$2$3$4',
+                       '/'.self::WB.'у(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ü$1$2$3',
+                       '/'.self::WB.'ую(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'üyü$1$2$3',
+                       '/'.self::WB.'(['.Crh::C_M_CONS.'])У(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u'
+                               => '$1Ü$2$3$4',
+                       '/'.self::WB.'У(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2$3',
+                       '/'.self::WB.'Ую(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'Üyü$1$2$3',
+                       '/'.self::WB.'УЮ(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ÜYÜ$1$2$3',
+
+                       '/'.self::WB.'(['.Crh::C_M_CONS.'])у(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ü$2$3',
+                       '/'.self::WB.'у(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ü$1$2',
+                       '/'.self::WB.'ую(['.Crh::C_CONS.'])([еиэюьü])/u' => 'üyü$1$2',
+                       '/'.self::WB.'(['.Crh::C_M_CONS.'])У(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ü$2$3',
+                       '/'.self::WB.'У(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2',
+                       '/'.self::WB.'Ую(['.Crh::C_CONS.'])([еиэюьü])/u' => 'Üyü$1$2',
+                       '/'.self::WB.'УЮ(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ÜYÜ$1$2',
 
                        # ю => yü
-                       '/\b([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([ьеюü])/u' => '$1yü$2$3$4',
-                       '/\b([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_LC.'])(['.Crh::C_CONS_LC.'])([ьеюü])/u' => '$1Yü$2$3$4',
-                       '/\b([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_UC.'])(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => '$1YÜ$2$3$4',
-                       '/\b([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.Crh::C_CONS.'])([ьеюü])/u' => '$1yü$2$3',
-                       '/\b([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_LC.'])([ьеюü])/u' => '$1Yü$2$3',
-                       '/\b([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => '$1YÜ$2$3',
+                       '/'.self::WB.'([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([ьеюü])/u'
+                               => '$1yü$2$3$4',
+                       '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_LC.'])(['.Crh::C_CONS_LC.'])([ьеюü])/u'
+                               => '$1Yü$2$3$4',
+                       '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_UC.'])(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u'
+                               => '$1YÜ$2$3$4',
+                       '/'.self::WB.'([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.Crh::C_CONS.'])([ьеюü])/u' => '$1yü$2$3',
+                       '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_LC.'])([ьеюü])/u' => '$1Yü$2$3',
+                       '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => '$1YÜ$2$3',
 
                        # e => ye, я => ya
-                       '/\bе/u' => 'ye',
-                       '/\bЕ(['.Crh::C_LC.'cğñqöü])/u' => 'Ye$1',
-                       '/\bЕ(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YE$1',
-                       '/\bя/u' => 'ya',
-                       '/\bЯ(['.Crh::C_LC.'cğñqöü])/u' => 'Ya$1',
-                       '/\bЯ(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YA$1',
+                       '/'.self::WB.'е/u' => 'ye',
+                       '/'.self::WB.'Е(['.Crh::C_LC.'cğñqöü])/u' => 'Ye$1',
+                       '/'.self::WB.'Е(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YE$1',
+                       '/'.self::WB.'я/u' => 'ya',
+                       '/'.self::WB.'Я(['.Crh::C_LC.'cğñqöü])/u' => 'Ya$1',
+                       '/'.self::WB.'Я(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YA$1',
                        '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])е/u' => '$1ye',
                        '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.Crh::C_LC.'cğñqöü])/u' => '$1Ye$2',
                        '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.Crh::C_UC.'CĞÑQÖÜ])/u' => '$1YE$2',
@@ -580,97 +593,103 @@ class CrhExceptions {
                        // TODO: refactor upper/lower/first capital whole words without
                        // regexes into simpler list
 
-                       '/\ban\b/u' => 'ань',
-                       '/\bAn\b/u' => 'Ань',
-                       '/\bAN\b/u' => 'АНЬ',
-                       '/\bange\b/u' => 'аньге',
-                       '/\bAnge\b/u' => 'Аньге',
-                       '/\bANGE\b/u' => 'АНЬГЕ',
-                       '/\bande\b/u' => 'аньде',
-                       '/\bAnde\b/u' => 'Аньде',
-                       '/\bANDE\b/u' => 'АНЬДЕ',
-                       '/\banki\b/u' => 'аньки',
-                       '/\bAnki\b/u' => 'Аньки',
-                       '/\bANKİ\b/u' => 'АНЬКИ',
-                       '/\bderal\b/u' => 'деръал',
-                       '/\bDeral\b/u' => 'Деръал',
-                       '/\bDERAL\b/u' => 'ДЕРЪАЛ',
-                       '/\bkör\b/u' => 'кёр',
-                       '/\bKör\b/u' => 'Кёр',
-                       '/\bKÖR\b/u' => 'КЁР',
-                       '/\bmer\b/u' => 'мэр',
-                       '/\bMer\b/u' => 'Мэр',
-                       '/\bMER\b/u' => 'МЭР',
-
-                       '/\bджонк/u' => 'cönk',
-                       '/\bДжонк/u' => 'Cönk',
-                       '/\bДЖОНК/u' => 'CÖNK',
-
-                       '/\bкуркчи/u' => 'kürkçi',
-                       '/\bКуркчи/u' => 'Kürkçi',
-                       '/\bКУРКЧИ/u' => 'KÜRKÇI',
+                       '/'.self::WB.'an'.self::WB.'/u' => 'ань',
+                       '/'.self::WB.'An'.self::WB.'/u' => 'Ань',
+                       '/'.self::WB.'AN'.self::WB.'/u' => 'АНЬ',
+                       '/'.self::WB.'ange'.self::WB.'/u' => 'аньге',
+                       '/'.self::WB.'Ange'.self::WB.'/u' => 'Аньге',
+                       '/'.self::WB.'ANGE'.self::WB.'/u' => 'АНЬГЕ',
+                       '/'.self::WB.'ande'.self::WB.'/u' => 'аньде',
+                       '/'.self::WB.'Ande'.self::WB.'/u' => 'Аньде',
+                       '/'.self::WB.'ANDE'.self::WB.'/u' => 'АНЬДЕ',
+                       '/'.self::WB.'anki'.self::WB.'/u' => 'аньки',
+                       '/'.self::WB.'Anki'.self::WB.'/u' => 'Аньки',
+                       '/'.self::WB.'ANKİ'.self::WB.'/u' => 'АНЬКИ',
+                       '/'.self::WB.'deral'.self::WB.'/u' => 'деръал',
+                       '/'.self::WB.'Deral'.self::WB.'/u' => 'Деръал',
+                       '/'.self::WB.'DERAL'.self::WB.'/u' => 'ДЕРЪАЛ',
+                       '/'.self::WB.'kör'.self::WB.'/u' => 'кёр',
+                       '/'.self::WB.'Kör'.self::WB.'/u' => 'Кёр',
+                       '/'.self::WB.'KÖR'.self::WB.'/u' => 'КЁР',
+                       '/'.self::WB.'mer'.self::WB.'/u' => 'мэр',
+                       '/'.self::WB.'Mer'.self::WB.'/u' => 'Мэр',
+                       '/'.self::WB.'MER'.self::WB.'/u' => 'МЭР',
+
+                       '/'.self::WB.'джонк/u' => 'cönk',
+                       '/'.self::WB.'Джонк/u' => 'Cönk',
+                       '/'.self::WB.'ДЖОНК/u' => 'CÖNK',
+
+                       '/'.self::WB.'куркчи/u' => 'kürkçi',
+                       '/'.self::WB.'Куркчи/u' => 'Kürkçi',
+                       '/'.self::WB.'КУРКЧИ/u' => 'KÜRKÇI',
 
                        # буква Ё - первый заход
                        # расставляем Ь после согласных
-                       '/\b([yY])ö(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|\b)/u' => '$1ö$2ь$3',
-                       '/\b([yY])Ö(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|\b)/u' => '$1Ö$2Ь$3',
-                       '/\bAQŞ([^AEI]|\b)/u' => 'АКъШ$1',
+                       '/'.self::WB.'([yY])ö(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1ö$2ь$3',
+                       '/'.self::WB.'([yY])Ö(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1Ö$2Ь$3',
+                       '/'.self::WB.'AQŞ([^AEI]|'.self::WB.')/u' => 'АКъШ$1',
 
                        # буква Ю - первый заход
                        # расставляем Ь после согласных
-                       '/\b([yY])ü(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|\b)/u' => '$1ü$2ь$3',
-                       '/\b([yY])Ü(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|\b)/u' => '$1Ü$2Ь$3',
-
-                       '/\b([bcgkpşBCGKPŞ])ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|\b)/u' => '$1ö$2ь$3',
-                       '/\b([bcgkpşBCGKPŞ])Ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|\b)/u' => '$1Ö$2Ь$3',
-                       '/\b([bcgkpşBCGKPŞ])Ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|\b)/u' => '$1Ö$2Ь$3',
-                       '/\b([bcgkpşBCGKPŞ])ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|\b)/u' => '$1ü$2ь$3',
-                       '/\b([bcgkpşBCGKPŞ])Ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|\b)/u' => '$1Ü$2Ь$3',
-                       '/\b([bcgkpşBCGKPŞ])Ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|\b)/u' => '$1Ü$2Ь$3',
+                       '/'.self::WB.'([yY])ü(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1ü$2ь$3',
+                       '/'.self::WB.'([yY])Ü(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1Ü$2Ь$3',
+
+                       '/'.self::WB.'([bcgkpşBCGKPŞ])ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+                               => '$1ö$2ь$3',
+                       '/'.self::WB.'([bcgkpşBCGKPŞ])Ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+                               => '$1Ö$2Ь$3',
+                       '/'.self::WB.'([bcgkpşBCGKPŞ])Ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+                               => '$1Ö$2Ь$3',
+                       '/'.self::WB.'([bcgkpşBCGKPŞ])ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+                               => '$1ü$2ь$3',
+                       '/'.self::WB.'([bcgkpşBCGKPŞ])Ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+                               => '$1Ü$2Ь$3',
+                       '/'.self::WB.'([bcgkpşBCGKPŞ])Ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+                               => '$1Ü$2Ь$3',
 
                         # ö и ü в начале слова
                         # случаи, когда нужен Ь
-                       '/\bö(['.Crh::L_N_CONS.'pP])(['.Crh::L_CONS.']|\b)/u' => 'ö$1ь$2',
-                       '/\bÖ(['.Crh::L_N_CONS_LC.'p])(['.Crh::L_CONS.']|\b)/u' => 'Ö$1ь$2',
-                       '/\bÖ(['.Crh::L_N_CONS_UC.'P])(['.Crh::L_CONS.']|\b)/u' => 'Ö$1Ь$2',
-                       '/\bü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|\b)/u' => 'ü$1ь$2',
-                       '/\bÜ(['.Crh::L_N_CONS_LC.'])(['.Crh::L_CONS.']|\b)/u' => 'Ü$1ь$2',
-                       '/\bÜ(['.Crh::L_N_CONS_UC.'])(['.Crh::L_CONS.']|\b)/u' => 'Ü$1Ь$2',
-
-                       '/ts\b/u' => 'ц',
-                       '/şç\b/u' => 'щ',
-                       '/Ş[çÇ]\b/u' => 'Щ',
-                       '/T[sS]\b/u' => 'Ц',
+                       '/'.self::WB.'ö(['.Crh::L_N_CONS.'pP])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'ö$1ь$2',
+                       '/'.self::WB.'Ö(['.Crh::L_N_CONS_LC.'p])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ö$1ь$2',
+                       '/'.self::WB.'Ö(['.Crh::L_N_CONS_UC.'P])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ö$1Ь$2',
+                       '/'.self::WB.'ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'ü$1ь$2',
+                       '/'.self::WB.'Ü(['.Crh::L_N_CONS_LC.'])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ü$1ь$2',
+                       '/'.self::WB.'Ü(['.Crh::L_N_CONS_UC.'])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ü$1Ь$2',
+
+                       '/ts'.self::WB.'/u' => 'ц',
+                       '/şç'.self::WB.'/u' => 'щ',
+                       '/Ş[çÇ]'.self::WB.'/u' => 'Щ',
+                       '/T[sS]'.self::WB.'/u' => 'Ц',
 
                        # Ь после Л
                        # add Ь after Л
-                       '/(['.Crh::L_F.'])l(['.Crh::L_CONS_LC.']|\b)/u' => '$1ль$2',
-                       '/(['.Crh::L_F_UC.'])L(['.Crh::L_CONS.']|\b)/u' => '$1ЛЬ$2',
+                       '/(['.Crh::L_F.'])l(['.Crh::L_CONS_LC.']|'.self::WB.')/u' => '$1ль$2',
+                       '/(['.Crh::L_F_UC.'])L(['.Crh::L_CONS.']|'.self::WB.')/u' => '$1ЛЬ$2',
 
-                       '/etsin\b/u' => 'етсин',
-                       '/Etsin\b/u' => 'Етсин',
-                       '/ETSİN\b/u' => 'ЕТСИН',
+                       '/etsin'.self::WB.'/u' => 'етсин',
+                       '/Etsin'.self::WB.'/u' => 'Етсин',
+                       '/ETSİN'.self::WB.'/u' => 'ЕТСИН',
 
                        # относятся к началу слова
-                       '/\bts/u' => 'ц',
-                       '/\bT[sS]/u' => 'Ц',
+                       '/'.self::WB.'ts/u' => 'ц',
+                       '/'.self::WB.'T[sS]/u' => 'Ц',
 
-                       '/\bşç/u' => 'щ',
-                       '/\bŞ[çÇ]/u' => 'Щ',
+                       '/'.self::WB.'şç/u' => 'щ',
+                       '/'.self::WB.'Ş[çÇ]/u' => 'Щ',
 
                        # Э
-                       '/(\b|['.Crh::L_VOW.'аеэяАЕЭЯ])e/u' => '$1э',
-                       '/(\b|['.Crh::L_VOW_UC.'АЕЭЯ])E/u' => '$1Э',
-
-                       '/\b(['.Crh::L_M_CONS.'])ö/u' => '$1о',
-                       '/\b(['.Crh::L_M_CONS.'])Ö/u' => '$1О',
-                       '/\b(['.Crh::L_M_CONS.'])ü/u' => '$1у',
-                       '/\b(['.Crh::L_M_CONS.'])Ü/u' => '$1У',
-
-                       '/\bö/u' => 'о',
-                       '/\bÖ/u' => 'О',
-                       '/\bü/u' => 'у',
-                       '/\bÜ/u' => 'У',
+                       '/('.self::WB.'|['.Crh::L_VOW.'аеэяАЕЭЯ])e/u' => '$1э',
+                       '/('.self::WB.'|['.Crh::L_VOW_UC.'АЕЭЯ])E/u' => '$1Э',
+
+                       '/'.self::WB.'(['.Crh::L_M_CONS.'])ö/u' => '$1о',
+                       '/'.self::WB.'(['.Crh::L_M_CONS.'])Ö/u' => '$1О',
+                       '/'.self::WB.'(['.Crh::L_M_CONS.'])ü/u' => '$1у',
+                       '/'.self::WB.'(['.Crh::L_M_CONS.'])Ü/u' => '$1У',
+
+                       '/'.self::WB.'ö/u' => 'о',
+                       '/'.self::WB.'Ö/u' => 'О',
+                       '/'.self::WB.'ü/u' => 'у',
+                       '/'.self::WB.'Ü/u' => 'У',
 
                        # некоторые исключения
                        # some exceptions
index eed5e7f..5ac45bc 100644 (file)
@@ -97,6 +97,7 @@ $specialPageAliases = [
        'Myuploads'                 => [ 'MisArchivosSubidos', 'Mis_archivos_subidos' ],
        'Newimages'                 => [ 'NuevasImágenes', 'Nuevas_imágenes' ],
        'Newpages'                  => [ 'PáginasNuevas', 'Páginas_nuevas' ],
+       'PasswordPolicies'          => [ 'Política_de_contraseñas' ],
        'PasswordReset'             => [ 'RestablecerContraseña', 'Restablecer_contraseña' ],
        'PermanentLink'             => [ 'EnlacePermanente', 'Enlace_permanente' ],
        'Preferences'               => [ 'Preferencias' ],
index 16d1f7e..eccb66b 100644 (file)
@@ -28,3 +28,116 @@ $namespaceNames = [
        NS_CATEGORY         => "Dalala",
        NS_CATEGORY_TALK    => "Lo'iya_dalala",
 ];
+
+$specialPageAliases = [
+       'Activeusers'               => [ 'TaOhu\'uwoAktif' ],
+       'Allmessages'               => [ 'Nga\'amilaTahuli' ],
+       'AllMyUploads'              => [ 'Nga\'amilaDiletohu\'u', 'Nga\'amilaBerkasi\'u' ],
+       'Allpages'                  => [ 'Nga\'amilaHalaman' ],
+       'ApiHelp'                   => [ 'ApiWubodu' ],
+       'ApiSandbox'                => [ 'ApiBakiLoHungayo' ],
+       'Ancientpages'              => [ 'HalamanMulolo' ],
+       'AutoblockList'             => [ 'AutoblockDaputari', 'DaputariAutoblocks' ],
+       'Badtitle'                  => [ 'JudulMoleto' ],
+       'Blankpage'                 => [ 'HalamanKosongi' ],
+       'Block'                     => [ 'BlockTaOhu\'uwo' ],
+       'Booksources'               => [ 'BukuBungo' ],
+       'BotPasswords'              => [ 'BotTaheU\'unti' ],
+       'BrokenRedirects'           => [ 'BrokenLopobale' ],
+       'Categories'                => [ 'Dalala' ],
+       'ChangeContentModel'        => [ 'Boli\'aTuangoModel' ],
+       'ChangeCredentials'         => [ 'Boli\'aKredensial' ],
+       'ChangeEmail'               => [ 'Boli\'aEmail' ],
+       'ChangePassword'            => [ 'Boli\'aPassword', 'Tulo\'iPass', 'Tulo\'iPassword' ],
+       'ComparePages'              => [ 'PopotadengaHlaman' ],
+       'Confirmemail'              => [ 'KomfirmEmail' ],
+       'Contributions'             => [ 'Kontributor', 'Kontrib' ],
+       'CreateAccount'             => [ 'MohutuAkun' ],
+       'Deadendpages'              => [ 'HalamanBuntu' ],
+       'DeletedContributions'      => [ 'LulutaKontribusi' ],
+       'DoubleRedirects'           => [ 'DubuluRedirects' ],
+       'EditTags'                  => [ 'Boli\'aTags' ],
+       'EditWatchlist'             => [ 'Boli\'aHeAwasiyalo' ],
+       'Emailuser'                 => [ 'EmailTaOhu\'uwo', 'Email' ],
+       'ExpandTemplates'           => [ 'DuhengiTemplates' ],
+       'Export'                    => [ 'Ekspor' ],
+       'Fewestrevisions'           => [ 'RevisiNgo\'idi' ],
+       'FileDuplicateSearch'       => [ 'LoloheBerkasDubulu' ],
+       'GoToInterwiki'             => [ 'NtaliOdeInterwiki' ],
+       'Invalidateemail'           => [ 'TilalaTanggalEmail' ],
+       'BlockList'                 => [ 'BlockDaputari', 'DaputariBlocks', 'IPBlockDputari' ],
+       'LinkSearch'                => [ 'LoloheWumbuta' ],
+       'LinkAccounts'              => [ 'WumbutaAkun' ],
+       'Listadmins'                => [ 'DaputariAdmins' ],
+       'Listbots'                  => [ 'DaputariBots' ],
+       'Listfiles'                 => [ 'DaputariBerkas', 'BerkasDaputari', 'DaputariGambari' ],
+       'Listgrouprights'           => [ 'DaputariGroupRights', 'TaOhu\'uwoGroupRights' ],
+       'Listgrants'                => [ 'DaputariGrants' ],
+       'Listredirects'             => [ 'DaputariLopobale' ],
+       'ListDuplicatedFiles'       => [ 'DaputariBerkasDubulu', 'DaputariBerkasDubulu' ],
+       'Listusers'                 => [ 'DaputariTaOhu\'uwo', 'TaOhu\'uwoDaputari' ],
+       'Lonelypages'               => [ 'HalamanTutuwawu', 'OrphanedHalaman' ],
+       'Longpages'                 => [ 'HalamanHayahaya\'o' ],
+       'MediaStatistics'           => [ 'MediaStatistik' ],
+       'MIMEsearch'                => [ 'MIMELolohe' ],
+       'Mostcategories'            => [ 'DalalaUda\'a' ],
+       'Mostimages'                => [ 'WumbutaBerkasUda\'a', 'BerkasUda\'a', 'GambariUdara' ],
+       'Mostinterwikis'            => [ 'InterwikiUda\'a' ],
+       'Mostlinked'                => [ 'HalamanWumbutaUda\'a', 'WumbutaUda\'a' ],
+       'Mostlinkedcategories'      => [ 'WumbutaDalalaUda\'a', 'DalalaUda\'aPilomake' ],
+       'Mostlinkedtemplates'       => [ 'HalamanTranscludedUda\'a', 'WumbutaUda\'aTemplate', 'TemplateUda\'aPilomake' ],
+       'Mostrevisions'             => [ 'Boli\'oUda\'a' ],
+       'Movepage'                  => [ 'MoheyiHalaman' ],
+       'Mycontributions'           => [ 'Kontribusi\'u' ],
+       'MyLanguage'                => [ 'Bahasa\'u' ],
+       'Mypage'                    => [ 'Halamani\'u' ],
+       'Mytalk'                    => [ 'Lo\'iya\'u' ],
+       'Myuploads'                 => [ 'Diletohu\'u', 'Berkasi\'u' ],
+       'Newimages'                 => [ 'BerkasBohu', 'GambariBaohu' ],
+       'Newpages'                  => [ 'HalamanBohu' ],
+       'PagesWithProp'             => [ 'PagesWithProp', 'Pageswithprop', 'PagesByProp', 'Pagesbyprop' ],
+       'PageData'                  => [ 'DataHalaman' ],
+       'PageLanguage'              => [ 'BahasaHalaman' ],
+       'PasswordReset'             => [ 'ResetTaheU\'unti' ],
+       'PermanentLink'             => [ 'WumbutaKakali', 'WumbKakali' ],
+       'Preferences'               => [ 'Preperensi' ],
+       'Prefixindex'               => [ 'PrefixIndeks' ],
+       'Protectedpages'            => [ 'HalamanOdudaha' ],
+       'Protectedtitles'           => [ 'JudulOdudaha' ],
+       'Randompage'                => [ 'Totonula', 'HalamanTotonula' ],
+       'RandomInCategory'          => [ 'TotonulaLoDalala' ],
+       'Randomredirect'            => [ 'TotonulaMopobale' ],
+       'Randomrootpage'            => [ 'TotonulaRootpage' ],
+       'Recentchanges'             => [ 'BoheliLoboli\'aMola' ],
+       'Recentchangeslinked'       => [ 'WumbutaBoheliLoboli\'aMola', 'RelatedLoboli\'a' ],
+       'Redirect'                  => [ 'Mopobale' ],
+       'RemoveCredentials'         => [ 'YinggilaKredensial' ],
+       'Revisiondelete'            => [ 'MolulutoRevisi' ],
+       'Search'                    => [ 'Lolohe' ],
+       'Shortpages'                => [ 'HalamanLimbu\'o' ],
+       'Specialpages'              => [ 'HalamanSpesial' ],
+       'Statistics'                => [ 'Statistik', 'Stat' ],
+       'TrackingCategories'        => [ 'TrackingDalala' ],
+       'Uncategorizedcategories'   => [ 'DalalaJaOdalala' ],
+       'Uncategorizedimages'       => [ 'BerkasJaOdalala', 'GambariJaOdalala' ],
+       'Uncategorizedpages'        => [ 'HalamanJaOdalala' ],
+       'Uncategorizedtemplates'    => [ 'TemplateJaOdalala' ],
+       'Undelete'                  => [ 'BataliMoluluto' ],
+       'UnlinkAccounts'            => [ 'BataliyaWumbutaLoAkun' ],
+       'Unusedcategories'          => [ 'DalalaJaPilomake' ],
+       'Unusedimages'              => [ 'BerkasJaPilomake', 'GambariJaPilomake' ],
+       'Unusedtemplates'           => [ 'TemplateJaPilomake' ],
+       'Unwatchedpages'            => [ 'HalamanJaOdudaha' ],
+       'Upload'                    => [ 'Detohe' ],
+       'UploadStash'               => [ 'DetoheStash' ],
+       'Userlogin'                 => [ 'TumuwotoTaOhu\'uwo', 'Tumuwoto' ],
+       'Userlogout'                => [ 'LumuwaloTaOhu\'uwo', 'Lumuwalo' ],
+       'Version'                   => [ 'Versi' ],
+       'Wantedcategories'          => [ 'DalalaOtohilawo' ],
+       'Wantedfiles'               => [ 'BerkasOtohilawo' ],
+       'Wantedpages'               => [ 'HalamanOtohilawo', 'WumbutaLorusa' ],
+       'Wantedtemplates'           => [ 'TemplateOtohilawo' ],
+       'Watchlist'                 => [ 'DaputariHe\'awasiyalo' ],
+       'Whatlinkshere'             => [ 'WoloWumbutaTeye' ],
+       'Withoutinterwiki'          => [ 'Diya\'aInterwiki' ]
+];
index 67969ae..4e0a452 100644 (file)
@@ -132,7 +132,7 @@ return [
 
        'mediawiki.skinning.content.externallinks' => [
                'styles' => [
-                       'resources/src/mediawiki.skinning/content.externallinks.css' => [ 'media' => 'screen' ],
+                       'resources/src/mediawiki.skinning/content.externallinks.less' => [ 'media' => 'screen' ],
                ],
        ],
 
@@ -212,11 +212,6 @@ return [
        'jquery.expandableField' => [
                'scripts' => 'resources/src/jquery/jquery.expandableField.js',
        ],
-       'jquery.farbtastic' => [
-               'scripts' => 'resources/src/jquery/jquery.farbtastic.js',
-               'styles' => 'resources/src/jquery/jquery.farbtastic.css',
-               'dependencies' => 'jquery.colorUtil',
-       ],
        'jquery.form' => [
                'scripts' => 'resources/lib/jquery/jquery.form.js',
        ],
diff --git a/resources/src/jquery/images/marker.png b/resources/src/jquery/images/marker.png
deleted file mode 100644 (file)
index 915b347..0000000
Binary files a/resources/src/jquery/images/marker.png and /dev/null differ
diff --git a/resources/src/jquery/images/mask.png b/resources/src/jquery/images/mask.png
deleted file mode 100644 (file)
index c9606b0..0000000
Binary files a/resources/src/jquery/images/mask.png and /dev/null differ
diff --git a/resources/src/jquery/images/wheel.png b/resources/src/jquery/images/wheel.png
deleted file mode 100644 (file)
index d930224..0000000
Binary files a/resources/src/jquery/images/wheel.png and /dev/null differ
diff --git a/resources/src/jquery/jquery.farbtastic.css b/resources/src/jquery/jquery.farbtastic.css
deleted file mode 100644 (file)
index 0cba34f..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * Farbtastic Color Picker 1.2
- * © 2008 Steven Wittens
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-.farbtastic {
-       position: relative;
-}
-.farbtastic * {
-       position: absolute;
-       cursor: crosshair;
-}
-.farbtastic,
-.farbtastic .wheel {
-       width: 195px;
-       height: 195px;
-}
-.farbtastic .color,
-.farbtastic .overlay {
-       top: 47px;
-       left: 47px;
-       width: 101px;
-       height: 101px;
-}
-.farbtastic .wheel {
-       /* @embed */
-       background: url( images/wheel.png ) no-repeat;
-       width: 195px;
-       height: 195px;
-}
-.farbtastic .overlay {
-       /* @embed */
-       background: url( images/mask.png ) no-repeat;
-}
-.farbtastic .marker {
-       width: 17px;
-       height: 17px;
-       margin: -8px 0 0 -8px;
-       overflow: hidden;
-       /* @embed */
-       background: url( images/marker.png ) no-repeat;
-}
diff --git a/resources/src/jquery/jquery.farbtastic.js b/resources/src/jquery/jquery.farbtastic.js
deleted file mode 100644 (file)
index f70913f..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-/**
- * Farbtastic Color Picker 1.2
- * © 2008 Steven Wittens
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-//Adapted to uniform style with jQuery UI widgets and slightly change behavior
-//TODO:
-// - remove duplicated code by replacing it with jquery.colorUtils and modern jQuery
-// - uniform code style
-
-jQuery.fn.farbtastic = function (callback) {
-       $.farbtastic(this, callback);
-       return this;
-};
-
-jQuery.farbtastic = function (container, callback) {
-       var container = $(container).get(0);
-       return container.farbtastic || (container.farbtastic = new jQuery._farbtastic(container, callback));
-}
-
-jQuery._farbtastic = function (container, callback) {
-       // Store farbtastic object
-       var fb = this;
-
-       // Insert markup
-       $(container).html('<div class="farbtastic ui-widget-content"><div class="color"></div><div class="wheel"></div><div class="overlay"></div><div class="h-marker marker"></div><div class="sl-marker marker"></div></div>');
-       $(container).addClass('ui-widget');
-       var e = $('.farbtastic', container);
-       fb.wheel = $('.wheel', container).get(0);
-       // Dimensions
-       fb.radius = 84;
-       fb.square = 100;
-       fb.width = 194;
-
-       // Fix background PNGs in IE6
-       if (navigator.appVersion.match(/MSIE [0-6]\./)) {
-               $('*', e).each(function () {
-                       if (this.currentStyle.backgroundImage != 'none') {
-                               var image = this.currentStyle.backgroundImage;
-                               image = this.currentStyle.backgroundImage.slice(5, image.length - 2);
-                               $(this).css( {
-                                       backgroundImage: 'none',
-                                       filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')"
-                               } );
-                       }
-               });
-       }
-
-       /**
-        * Link to the given element(s) or callback.
-        */
-       fb.linkTo = function (callback) {
-               // Unbind previous nodes
-               if (typeof fb.callback == 'object') {
-                       $(fb.callback).unbind('keyup', fb.updateValue);
-               }
-
-               // Reset color
-               fb.color = null;
-
-               // Bind callback or elements
-               if (typeof callback == 'function') {
-                       fb.callback = callback;
-               }
-               else if (typeof callback == 'object' || typeof callback == 'string') {
-                       fb.callback = $(callback);
-                       fb.callback.bind('keyup', fb.updateValue);
-                       if (fb.callback.get(0).value) {
-                               fb.setColor(fb.callback.get(0).value);
-                       }
-               }
-               return this;
-       }
-       fb.updateValue = function (event) {
-               if (this.value != fb.color) {
-                       fb.setColor(this.value);
-               }
-       }
-
-       /**
-        * Change color with HTML syntax #123456
-        */
-       fb.setColor = function (color) {
-               var rgb = $.colorUtil.getRGB( color );
-               if (fb.color != color && rgb) {
-                       rgb = rgb.slice( 0 ); //make a clone
-                       //TODO: rewrite code so that this is not needed
-                       rgb[0] /= 255;
-                       rgb[1] /= 255;
-                       rgb[2] /= 255;
-                       fb.color = color;
-                       fb.rgb = rgb;
-                       fb.hsl = fb.RGBToHSL(fb.rgb);
-                       fb.updateDisplay();
-               }
-               return this;
-       }
-
-       /**
-        * Change color with HSL triplet [0..1, 0..1, 0..1]
-        */
-       fb.setHSL = function (hsl) {
-               fb.hsl = hsl;
-               fb.rgb = fb.HSLToRGB(hsl);
-               fb.color = fb.pack(fb.rgb);
-               fb.updateDisplay();
-               return this;
-       }
-
-       /////////////////////////////////////////////////////
-
-       /**
-        * Retrieve the coordinates of the given event relative to the center
-        * of the widget.
-        */
-       fb.widgetCoords = function (event) {
-               var ref = $( fb.wheel ).offset();
-               return {
-                       x: event.pageX - ref.left - fb.width / 2,
-                       y: event.pageY - ref.top - fb.width / 2
-               };
-       }
-
-       /**
-        * Mousedown handler
-        */
-       fb.mousedown = function (event) {
-               // Capture mouse
-               if (!document.dragging) {
-                       $(document).bind('mousemove', fb.mousemove).bind('mouseup', fb.mouseup);
-                       document.dragging = true;
-               }
-
-               // Check which area is being dragged
-               var pos = fb.widgetCoords(event);
-               fb.circleDrag = Math.max(Math.abs(pos.x), Math.abs(pos.y)) * 2 > fb.square;
-
-               // Process
-               fb.mousemove(event);
-               return false;
-       }
-
-       /**
-        * Mousemove handler
-        */
-       fb.mousemove = function (event) {
-               // Get coordinates relative to color picker center
-               var pos = fb.widgetCoords(event);
-
-               // Set new HSL parameters
-               if (fb.circleDrag) {
-                       var hue = Math.atan2(pos.x, -pos.y) / 6.28;
-                       if (hue < 0) hue += 1;
-                       fb.setHSL([hue, fb.hsl[1], fb.hsl[2]]);
-               }
-               else {
-                       var sat = Math.max(0, Math.min(1, -(pos.x / fb.square) + .5));
-                       var lum = Math.max(0, Math.min(1, -(pos.y / fb.square) + .5));
-                       fb.setHSL([fb.hsl[0], sat, lum]);
-               }
-               return false;
-       }
-
-       /**
-        * Mouseup handler
-        */
-       fb.mouseup = function () {
-               // Uncapture mouse
-               $(document).unbind('mousemove', fb.mousemove);
-               $(document).unbind('mouseup', fb.mouseup);
-               document.dragging = false;
-       }
-
-       /**
-        * Update the markers and styles
-        */
-       fb.updateDisplay = function () {
-               // Markers
-               var angle = fb.hsl[0] * 6.28;
-               $('.h-marker', e).css({
-                       left: Math.round(Math.sin(angle) * fb.radius + fb.width / 2) + 'px',
-                       top: Math.round(-Math.cos(angle) * fb.radius + fb.width / 2) + 'px'
-               });
-
-               $('.sl-marker', e).css({
-                       left: Math.round(fb.square * (.5 - fb.hsl[1]) + fb.width / 2) + 'px',
-                       top: Math.round(fb.square * (.5 - fb.hsl[2]) + fb.width / 2) + 'px'
-               });
-
-               // Saturation/Luminance gradient
-               $('.color', e).css('backgroundColor', fb.pack(fb.HSLToRGB([fb.hsl[0], 1, 0.5])));
-
-               // Linked elements or callback
-               if (typeof fb.callback == 'object') {
-                       // Set background/foreground color
-                       $(fb.callback).css({
-                               backgroundColor: fb.color,
-                               color: fb.hsl[2] > 0.5 ? '#000' : '#fff'
-                       });
-
-                       // Change linked value
-                       $(fb.callback).each(function() {
-                               if ( $( this ).val() != fb.color) {
-                                       $( this ).val( fb.color ).change();
-                               }
-                       });
-               }
-               else if (typeof fb.callback == 'function') {
-                       fb.callback.call(fb, fb.color);
-               }
-       }
-
-       /* Various color utility functions */
-       fb.pack = function (rgb) {
-               var r = Math.round(rgb[0] * 255);
-               var g = Math.round(rgb[1] * 255);
-               var b = Math.round(rgb[2] * 255);
-               return '#' + (r < 16 ? '0' : '') + r.toString(16) +
-                                        (g < 16 ? '0' : '') + g.toString(16) +
-                                        (b < 16 ? '0' : '') + b.toString(16);
-       }
-
-       fb.HSLToRGB = function (hsl) {
-               var m1, m2, r, g, b;
-               var h = hsl[0], s = hsl[1], l = hsl[2];
-               m2 = (l <= 0.5) ? l * (s + 1) : l + s - l*s;
-               m1 = l * 2 - m2;
-               return [this.hueToRGB(m1, m2, h+0.33333),
-                               this.hueToRGB(m1, m2, h),
-                               this.hueToRGB(m1, m2, h-0.33333)];
-       }
-
-       fb.hueToRGB = function (m1, m2, h) {
-               h = (h < 0) ? h + 1 : ((h > 1) ? h - 1 : h);
-               if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;
-               if (h * 2 < 1) return m2;
-               if (h * 3 < 2) return m1 + (m2 - m1) * (0.66666 - h) * 6;
-               return m1;
-       }
-
-       fb.RGBToHSL = function (rgb) {
-               var min, max, delta, h, s, l;
-               var r = rgb[0], g = rgb[1], b = rgb[2];
-               min = Math.min(r, Math.min(g, b));
-               max = Math.max(r, Math.max(g, b));
-               delta = max - min;
-               l = (min + max) / 2;
-               s = 0;
-               if (l > 0 && l < 1) {
-                       s = delta / (l < 0.5 ? (2 * l) : (2 - 2 * l));
-               }
-               h = 0;
-               if (delta > 0) {
-                       if (max == r && max != g) h += (g - b) / delta;
-                       if (max == g && max != b) h += (2 + (b - r) / delta);
-                       if (max == b && max != r) h += (4 + (r - g) / delta);
-                       h /= 6;
-               }
-               return [h, s, l];
-       }
-
-       // Install mousedown handler (the others are set on the document on-demand)
-       $('*', e).mousedown(fb.mousedown);
-
-               // Init color
-       fb.setColor('#000000');
-
-       // Set linked elements/callback
-       if (callback) {
-               fb.linkTo(callback);
-       }
-}
diff --git a/resources/src/mediawiki.skinning/content.externallinks.css b/resources/src/mediawiki.skinning/content.externallinks.css
deleted file mode 100644 (file)
index 5afa51d..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*!
- * Icons and colors for external links.
- */
-
-/* T68091 is blocking is from converting this file to LESS
- * and using the .background-image-svg mixin. */
-
-/* SVG support using a transparent gradient to guarantee cross-browser
- * compatibility ( browsers able to understand gradient syntax support also SVG ).
- * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
-
-.mw-parser-output a.external,
-.link-https {
-       background: url( images/external-ltr.png ) center right no-repeat;
-       /* @embed */
-       background-image: -webkit-linear-gradient( transparent, transparent ), url( images/external-ltr.svg );
-       /* @embed */
-       background-image: linear-gradient( transparent, transparent ), url( images/external-ltr.svg );
-       padding-right: 13px;
-}
-
-.mw-parser-output a.external[ href^='mailto:' ],
-.link-mailto {
-       background: url( images/mail.png ) center right no-repeat;
-       /* @embed */
-       background-image: linear-gradient( transparent, transparent ), url( images/mail.svg );
-       padding-right: 13px;
-}
-
-.mw-parser-output a.external[ href^='ftp://' ],
-.link-ftp {
-       background: url( images/ftp-ltr.png ) center right no-repeat;
-       /* @embed */
-       background-image: linear-gradient( transparent, transparent ), url( images/ftp-ltr.svg );
-       padding-right: 13px;
-}
-
-.mw-parser-output a.external[ href^='irc://' ],
-.mw-parser-output a.external[ href^='ircs://' ],
-.link-irc {
-       background: url( images/chat-ltr.png ) center right no-repeat;
-       /* @embed */
-       background-image: linear-gradient( transparent, transparent ), url( images/chat-ltr.svg );
-       padding-right: 13px;
-}
-
-.mw-parser-output a.external[ href$='.ogg' ],
-.mw-parser-output a.external[ href$='.OGG' ],
-.mw-parser-output a.external[ href$='.mid' ],
-.mw-parser-output a.external[ href$='.MID' ],
-.mw-parser-output a.external[ href$='.midi' ],
-.mw-parser-output a.external[ href$='.MIDI' ],
-.mw-parser-output a.external[ href$='.mp3' ],
-.mw-parser-output a.external[ href$='.MP3' ],
-.mw-parser-output a.external[ href$='.wav' ],
-.mw-parser-output a.external[ href$='.WAV' ],
-.mw-parser-output a.external[ href$='.wma' ],
-.mw-parser-output a.external[ href$='.WMA' ],
-.link-audio {
-       background: url( images/audio-ltr.png ) center right no-repeat;
-       /* @embed */
-       background-image: linear-gradient( transparent, transparent ), url( images/audio-ltr.svg );
-       padding-right: 13px;
-}
-
-.mw-parser-output a.external[ href$='.ogm' ],
-.mw-parser-output a.external[ href$='.OGM' ],
-.mw-parser-output a.external[ href$='.avi' ],
-.mw-parser-output a.external[ href$='.AVI' ],
-.mw-parser-output a.external[ href$='.mpeg' ],
-.mw-parser-output a.external[ href$='.MPEG' ],
-.mw-parser-output a.external[ href$='.mpg' ],
-.mw-parser-output a.external[ href$='.MPG' ],
-.link-video {
-       background: url( images/video.png ) center right no-repeat;
-       /* @embed */
-       background-image: linear-gradient( transparent, transparent ), url( images/video.svg );
-       padding-right: 13px;
-}
-
-.mw-parser-output a.external[ href$='.pdf' ],
-.mw-parser-output a.external[ href$='.PDF' ],
-.mw-parser-output a.external[ href*='.pdf#' ],
-.mw-parser-output a.external[ href*='.PDF#' ],
-.mw-parser-output a.external[ href*='.pdf?' ],
-.mw-parser-output a.external[ href*='.PDF?' ],
-.link-document {
-       background: url( images/document-ltr.png ) center right no-repeat;
-       /* @embed */
-       background-image: linear-gradient( transparent, transparent ), url( images/document-ltr.svg );
-       padding-right: 13px;
-}
-
-/* Interwiki styling */
-.mw-parser-output a.extiw,
-.mw-parser-output a.extiw:active {
-       color: #36b;
-}
-
-/* External link color */
-.mw-parser-output a.external {
-       color: #36b;
-}
diff --git a/resources/src/mediawiki.skinning/content.externallinks.less b/resources/src/mediawiki.skinning/content.externallinks.less
new file mode 100644 (file)
index 0000000..c6390c0
--- /dev/null
@@ -0,0 +1,96 @@
+/*!
+ * Icons and colors for external links.
+ */
+
+@import 'mediawiki.mixins';
+
+.mw-parser-output a.external,
+.link-https {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg( 'images/external-ltr.svg', 'images/external-ltr.png' );
+       padding-right: 13px;
+}
+
+.mw-parser-output a.external[ href^='mailto:' ],
+.link-mailto {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg( 'images/mail.svg', 'images/mail.png' );
+       padding-right: 13px;
+}
+
+.mw-parser-output a.external[ href^='ftp://' ],
+.link-ftp {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg( 'images/ftp-ltr.svg', 'images/ftp-ltr.png' );
+       padding-right: 13px;
+}
+
+.mw-parser-output a.external[ href^='irc://' ],
+.mw-parser-output a.external[ href^='ircs://' ],
+.link-irc {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg( 'images/chat-ltr.svg', 'images/chat-ltr.png' );
+       padding-right: 13px;
+}
+
+.mw-parser-output a.external[ href$='.ogg' ],
+.mw-parser-output a.external[ href$='.OGG' ],
+.mw-parser-output a.external[ href$='.mid' ],
+.mw-parser-output a.external[ href$='.MID' ],
+.mw-parser-output a.external[ href$='.midi' ],
+.mw-parser-output a.external[ href$='.MIDI' ],
+.mw-parser-output a.external[ href$='.mp3' ],
+.mw-parser-output a.external[ href$='.MP3' ],
+.mw-parser-output a.external[ href$='.wav' ],
+.mw-parser-output a.external[ href$='.WAV' ],
+.mw-parser-output a.external[ href$='.wma' ],
+.mw-parser-output a.external[ href$='.WMA' ],
+.link-audio {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg( 'images/audio-ltr.svg', 'images/audio-ltr.png' );
+       padding-right: 13px;
+}
+
+.mw-parser-output a.external[ href$='.ogm' ],
+.mw-parser-output a.external[ href$='.OGM' ],
+.mw-parser-output a.external[ href$='.avi' ],
+.mw-parser-output a.external[ href$='.AVI' ],
+.mw-parser-output a.external[ href$='.mpeg' ],
+.mw-parser-output a.external[ href$='.MPEG' ],
+.mw-parser-output a.external[ href$='.mpg' ],
+.mw-parser-output a.external[ href$='.MPG' ],
+.link-video {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg( 'images/video.svg', 'images/video.png' );
+       padding-right: 13px;
+}
+
+.mw-parser-output a.external[ href$='.pdf' ],
+.mw-parser-output a.external[ href$='.PDF' ],
+.mw-parser-output a.external[ href*='.pdf#' ],
+.mw-parser-output a.external[ href*='.PDF#' ],
+.mw-parser-output a.external[ href*='.pdf?' ],
+.mw-parser-output a.external[ href*='.PDF?' ],
+.link-document {
+       background-position: center right;
+       background-repeat: no-repeat;
+       .background-image-svg( 'images/document-ltr.svg', 'images/document-ltr.png' );
+       padding-right: 13px;
+}
+
+/* Interwiki styling */
+.mw-parser-output a.extiw,
+.mw-parser-output a.extiw:active {
+       color: #36b;
+}
+
+/* External link color */
+.mw-parser-output a.external {
+       color: #36b;
+}
index 9837ce8..702c18d 100644 (file)
        mw.trackSubscribe( 'resourceloader.exception', logError );
        mw.trackSubscribe( 'resourceloader.assert', logError );
 
-       /**
-        * Fired when all modules associated with the page have finished loading.
-        *
-        * @event resourceloader_loadEnd
-        * @member mw.hook
-        */
-       $( function () {
-               // Get a list of modules currently in loading state
-               var modules = mw.loader.getModuleNames().filter( function ( module ) {
-                       return mw.loader.getState( module ) === 'loading';
-               } );
-               // Wait for them to complete loading (regardles of failures). First, try a single
-               // mw.loader.using() call. That's efficient, but has the drawback of being rejected
-               // upon first failure. Fall back to tracking each module separately. We usually avoid
-               // that because of high overhead for that internally to mw.loader.
-               mw.loader.using( modules ).catch( function () {
-                       return $.Deferred( function ( deferred ) {
-                               var i, count = modules.length;
-                               function decrement() {
-                                       count--;
-                                       if ( count === 0 ) {
-                                               deferred.resolve();
-                                       }
-                               }
-                               for ( i = 0; i < modules.length; i++ ) {
-                                       mw.loader.using( modules[ i ] ).always( decrement );
-                               }
-                       } );
-               } ).then( function () {
-                       if ( window.performance && performance.mark ) {
-                               performance.mark( 'mwLoadEnd' );
-                       }
-                       mw.hook( 'resourceloader.loadEnd' ).fire();
-               } );
-       } );
-
        // Attach to window and globally alias
        window.mw = window.mediaWiki = mw;
 }( jQuery ) );
index 5a554a0..11c1097 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @covers LanguageCrh
  * @covers CrhConverter
+ * @covers MediaWiki\Languages\Data\CrhExceptions
  */
 class LanguageCrhTest extends LanguageClassesTestCase {
        /**
@@ -103,6 +104,14 @@ class LanguageCrhTest extends LanguageClassesTestCase {
                                ],
                                'ДЖУРЬМЕК CÜRMEK кетсин ketsin джумлеси cümlesi ильи ilyi Ильи İlyi'
                        ],
+                       [ // recent problem words, part 7
+                               [
+                                       'crh'      => 'бруцел brutsel коцюб kotsüb плацен platsen эпицентр epitsentr',
+                                       'crh-cyrl' => 'бруцел бруцел коцюб коцюб плацен плацен эпицентр эпицентр',
+                                       'crh-latn' => 'brutsel brutsel kotsüb kotsüb platsen platsen epitsentr epitsentr',
+                               ],
+                               'бруцел brutsel коцюб kotsüb плацен platsen эпицентр epitsentr'
+                       ],
                        [ // regex pattern words
                                [
                                        'crh'      => 'köyünden коюнден ange аньге',