'debugRaw' => false
) ),
'mediawiki.specials.preferences' => new ResourceLoaderFileModule( array(
- 'scripts' => 'resources/mediawiki/mediawiki.specials.preferences.js',
+ 'scripts' => 'resources/mediawiki.specials/mediawiki.specials.preferences.js',
) ),
'mediawiki.specials.search' => new ResourceLoaderFileModule( array(
- 'scripts' => 'resources/mediawiki/mediawiki.specials.search.js',
+ 'scripts' => 'resources/mediawiki.specials/mediawiki.specials.search.js',
) ),
'mediawiki.views.history' => new ResourceLoaderFileModule( array(
- 'scripts' => 'resources/mediawiki/mediawiki.views.history.js',
+ 'scripts' => 'resources/mediawiki.views/mediawiki.views.history.js',
'dependencies' => 'mediawiki.legacy.history',
) ),
+ 'mediawiki.language' => new ResourceLoaderFileModule( array(
+ 'scripts' => 'resources/mediawiki.language/mediawiki.language.js',
+ 'languageScripts' => array(
+ 'am' => 'resources/mediawiki.language/languages/am.js',
+ 'ar' => 'resources/mediawiki.language/languages/ar.js',
+ 'bat-smg' => 'resources/mediawiki.language/languages/bat-smg.js',
+ 'be' => 'resources/mediawiki.language/languages/be.js',
+ 'be-tarask' => 'resources/mediawiki.language/languages/be-tarask.js',
+ 'bh' => 'resources/mediawiki.language/languages/bh.js',
+ 'bs' => 'resources/mediawiki.language/languages/bs.js',
+ 'cs' => 'resources/mediawiki.language/languages/cs.js',
+ 'cu' => 'resources/mediawiki.language/languages/cu.js',
+ 'cy' => 'resources/mediawiki.language/languages/cy.js',
+ 'dsb' => 'resources/mediawiki.language/languages/dsb.js',
+ 'fr' => 'resources/mediawiki.language/languages/fr.js',
+ 'ga' => 'resources/mediawiki.language/languages/ga.js',
+ 'gd' => 'resources/mediawiki.language/languages/gd.js',
+ 'gv' => 'resources/mediawiki.language/languages/gv.js',
+ 'he' => 'resources/mediawiki.language/languages/he.js',
+ 'hi' => 'resources/mediawiki.language/languages/hi.js',
+ 'hr' => 'resources/mediawiki.language/languages/hr.js',
+ 'hsb' => 'resources/mediawiki.language/languages/hsb.js',
+ 'hy' => 'resources/mediawiki.language/languages/hy.js',
+ 'ksh' => 'resources/mediawiki.language/languages/ksh.js',
+ 'ln' => 'resources/mediawiki.language/languages/ln.js',
+ 'lt' => 'resources/mediawiki.language/languages/lt.js',
+ 'lv' => 'resources/mediawiki.language/languages/lv.js',
+ 'mg' => 'resources/mediawiki.language/languages/mg.js',
+ 'mk' => 'resources/mediawiki.language/languages/mk.js',
+ 'mo' => 'resources/mediawiki.language/languages/mo.js',
+ 'mt' => 'resources/mediawiki.language/languages/mt.js',
+ 'nso' => 'resources/mediawiki.language/languages/nso.js',
+ 'pl' => 'resources/mediawiki.language/languages/pl.js',
+ 'pt-br' => 'resources/mediawiki.language/languages/pt-br.js',
+ 'ro' => 'resources/mediawiki.language/languages/ro.js',
+ 'ru' => 'resources/mediawiki.language/languages/ru.js',
+ 'se' => 'resources/mediawiki.language/languages/se.js',
+ 'sh' => 'resources/mediawiki.language/languages/sh.js',
+ 'sk' => 'resources/mediawiki.language/languages/sk.js',
+ 'sl' => 'resources/mediawiki.language/languages/sl.js',
+ 'sma' => 'resources/mediawiki.language/languages/sma.js',
+ 'sr-ec' => 'resources/mediawiki.language/languages/sr-ec.js',
+ 'sr-el' => 'resources/mediawiki.language/languages/sr-el.js',
+ 'sr' => 'resources/mediawiki.language/languages/sr.js',
+ 'ti' => 'resources/mediawiki.language/languages/ti.js',
+ 'tl' => 'resources/mediawiki.language/languages/tl.js',
+ 'uk' => 'resources/mediawiki.language/languages/uk.js',
+ 'wa' => 'resources/mediawiki.language/languages/wa.js',
+ ),
+ ) ),
'mediawiki.util' => new ResourceLoaderFileModule( array(
- 'scripts' => 'resources/mediawiki/mediawiki.util.js',
- 'debugScripts' => 'resources/mediawiki/mediawiki.utiltest.js',
+ 'scripts' => 'resources/mediawiki.util/mediawiki.util.js',
+ 'debugScripts' => 'resources/mediawiki.util/mediawiki.util.test.js',
) ),
- /* MediaWiki Legacy */
+ /* mediawiki Legacy */
'mediawiki.legacy.ajax' => new ResourceLoaderFileModule( array(
'scripts' => 'skins/common/ajax.js',
) ),
'mediawiki.legacy.wikibits' => new ResourceLoaderFileModule( array(
'scripts' => 'skins/common/wikibits.js',
+ 'dependencies' => 'mediawiki.language',
'messages' => array( 'showtoc', 'hidetoc' ),
) ),
'mediawiki.legacy.wikiprintable' => new ResourceLoaderFileModule( array(
--- /dev/null
+/**
+ * Amharic (አማርኛ) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Arabic (العربية) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 6 );
+ if ( count == 0 ) {
+ return forms[0];
+ }
+ if ( count == 1 ) {
+ return forms[1];
+ }
+ if ( count == 2 ) {
+ return forms[2];
+ }
+ if ( count % 100 >= 3 && count % 100 <= 10 ) {
+ return forms[3];
+ }
+ if ( count % 100 >= 11 && count % 100 <= 99 ) {
+ return forms[4];
+ }
+ return forms[5];
+}
+
+mediaWiki.language.digitTransformTable = {
+ '0': 'Ÿ†', // ٠
+ '1': 'Ÿ°', // ١
+ '2': 'Ÿ¢', // ٢
+ '3': 'Ÿ£', // ٣
+ '4': 'Ÿ§', // ٤
+ '5': 'Ÿ•', // ٥
+ '6': 'Ÿ¶', // ٦
+ '7': 'Ÿß', // ٧
+ '8': 'Ÿ®', // ٨
+ '9': 'Ÿ©', // ٩
+ '.': 'Ÿ´', // ٫ wrong table ?
+ ',': 'Ÿ¨' // ٬
+};
--- /dev/null
+/**
+ * Samogitian (Žemaitėška) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ count = Math.abs( count );
+ if ( count === 0 || ( count % 100 === 0 || ( count % 100 >= 10 && count % 100 < 20 ) ) ) {
+ return forms[2];
+ }
+ if ( count % 10 === 1 ) {
+ return forms[0];
+ }
+ if ( count % 10 === 2 ) {
+ return forms[1];
+ }
+ return forms[3];
+}
--- /dev/null
+/**
+ * Belarusian in Taraškievica orthography (Беларуская тарашкевіца) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Belarusian normative (–ë–µ–ª–∞—Ä—É—Å–∫–∞—è –º–æ–≤–∞) language functions
+ */
+
+mediaWiki.language.convertPlural = function convertPlural( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Bihari (भोजपुरी) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Bosnian (bosanski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Czech (čeština [subst.], český [adj.], česky [adv.]) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ switch ( count ) {
+ case 1:
+ return forms[0];
+ break;
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ break;
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Old Church Slavonic (—®–∑—ã–∫—ä —Å–ª–æ–≤—£–Ω—å—Å–∫—ä) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ return forms[1];
+ case 3:
+ case 4:
+ return forms[2];
+ default:
+ return forms[3];
+ }
+}
--- /dev/null
+/**
+ * Welsh (Cymraeg) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 6 );
+ count = Math.abs( count );
+ if ( count >= 0 && count <= 3 ) {
+ return forms[count];
+ }
+ if ( count == 6 ) {
+ return forms[4];
+ }
+ return forms[5];
+}
--- /dev/null
+/**
+ * Lower Sorbian (Dolnoserbski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ switch ( Math.abs( count ) % 100 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ return forms[1];
+ case 3:
+ case 4:
+ return forms[2];
+ default:
+ return forms[3];
+ }
+}
--- /dev/null
+/**
+ * French (Français) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Irish (Gaeilge) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 2 ) {
+ return forms[1];
+ }
+ return forms[2];
+}
--- /dev/null
+/**
+ * Scots Gaelic (Gàidhlig) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ count = Math.abs( count );
+ if ( count === 1 ) {
+ return forms[0];
+ }
+ if ( count === 2 ) {
+ return forms[1];
+ }
+ if ( count >= 3 && count <= 10 ) {
+ return forms[2];
+ }
+ return forms[3];
+}
--- /dev/null
+/**
+ * Manx (Gaelg) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ if ( count > 0 && ( count % 20 ) === 0 ) {
+ return forms[0];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[1];
+ case 2:
+ return forms[2];
+ default:
+ return forms[3];
+ }
+}
--- /dev/null
+/**
+ * Hebrew (עברית) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 2 && forms[2] ) {
+ return forms[2];
+ }
+ return forms[1];
+}
--- /dev/null
+/**
+ * Hindi (हिन्दी) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Croatian (hrvatski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Upper Sorbian (Hornjoserbsce) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ switch ( Math.abs( count ) % 100 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ return forms[1];
+ case 3:
+ case 4:
+ return forms[2];
+ default:
+ return forms[3];
+ }
+}
--- /dev/null
+/**
+ * Armenian (Հայերեն) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( Math.abs( count ) <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Ripuarian (Ripoarƒósh) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 0 ) {
+ return forms[2];
+ }
+ return forms[1];
+}
--- /dev/null
+/**
+ * Lingala (Lingála) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Lithuanian (Lietuvi≈≥) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length == 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count % 10 == 1 && count % 100 != 11 ) {
+ return forms[0];
+ }
+ if ( count % 10 >= 2 && ( count % 100 < 10 || count % 100 >= 20 ) ) {
+ return forms[1];
+ }
+ return forms[2];
+}
--- /dev/null
+/**
+ * Latvian (Latviešu) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( ( count % 10 == 1 ) && ( count % 100 != 11 ) ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Malagasy (Malagasy) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Macedonian (Македонски) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count % 10 === 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Moldavian (Молдовеняскэ) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 0 || count % 100 < 20 ) {
+ return forms[1];
+ }
+ return forms[2];
+}
--- /dev/null
+/**
+ * Maltese (Malti) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 0 || ( count % 100 > 1 && count % 100 < 11 ) ) {
+ return forms[1];
+ }
+ if ( count % 100 > 10 && count % 100 < 20 ) {
+ return forms[2];
+ }
+ return forms[3];
+}
--- /dev/null
+/**
+ * Northern Sotho (Sesotho sa Leboa) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Polish (polski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ count = Math.abs( count );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ switch ( count % 10 ) {
+ case 2:
+ case 3:
+ case 4:
+ if ( count / 10 % 10 != 1 ) {
+ return forms[1];
+ }
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Brazilian Portugese (Portuguêsi do Brasil) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Romanian (Română) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 0 || count % 100 < 20 ) {
+ return forms[1];
+ }
+ return forms[2];
+}
--- /dev/null
+/**
+ * Russian (—Ä—É—Å—Å–∫–∏–π —è–∑—ã–∫) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Northern Sami (Sámegiella) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( count == 0 ) {
+ return '';
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[1];
+ }
+ if ( count == 2 ) {
+ return forms[2];
+ }
+ return ''
+}
--- /dev/null
+/**
+ * Serbo-Croatian (Srpskohrvatski / Српскохрватски) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Slovak (Slovenčina) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count == 1 ) {
+ return forms[0];
+ }
+ if ( count == 2 || count == 3 || count == 4 ) {
+ return forms[1];
+ }
+ return forms[2];
+}
--- /dev/null
+/**
+ * Slovenian (Slovenščina) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 5 );
+ if ( count % 100 == 1 ) {
+ return forms[0];
+ }
+ if ( count % 100 == 2 ) {
+ return forms[1];
+ }
+ if ( count % 100 == 3 || count % 100 == 4 ) {
+ return forms[2];
+ }
+ if ( count != 0 ) {
+ return forms[3];
+ }
+ return forms[4];
+}
--- /dev/null
+/**
+ * Southern Sami (Åarjelsaemien) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 4 );
+ if ( count == 1 ) {
+ return forms[1];
+ }
+ if ( count == 2 ) {
+ return forms[2];
+ }
+ return forms[3];
+}
--- /dev/null
+/**
+ * Serbian (cyrillic script) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Serbian (latin script) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Serbian (Српски / Srpski) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return ( count == 1 ) ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+};
--- /dev/null
+/**
+ * Tigrinya (ትግርኛ) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural(forms, 2);
+ return (count <= 1) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Tagalog (Tagalog) language functions
+ */
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Ukrainian (—É–∫—Ä–∞—ó–Ω—Å—å–∫–∞ –º–æ–≤–∞) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ if ( forms.length === 2 ) {
+ return count == 1 ? forms[0] : forms[1];
+ }
+ forms = mediaWiki.language.preConvertPlural( forms, 3 );
+ if ( count > 10 && Math.floor( ( count % 100 ) / 10 ) == 1 ) {
+ return forms[2];
+ }
+ switch ( count % 10 ) {
+ case 1:
+ return forms[0];
+ case 2:
+ case 3:
+ case 4:
+ return forms[1];
+ default:
+ return forms[2];
+ }
+}
--- /dev/null
+/**
+ * Walloon (Walon) language functions
+ */
+
+mediaWiki.language.convertPlural = function( count, forms ) {
+ forms = mediaWiki.language.preConvertPlural( forms, 2 );
+ return ( count <= 1 ) ? forms[0] : forms[1];
+}
--- /dev/null
+/**
+ * Base language object
+ *
+ * Localized Language support attempts to mirror some of the functionality of Language.php in MediaWiki. This object
+ * contains methods for loading and transforming message text.
+ */
+
+mediaWiki.language = {
+ /**
+ * Process the PLURAL template substitution
+ *
+ * @param {object} template Template object
+ * @format template
+ * {
+ * 'title': [title of template],
+ * 'parameters': [template parameters]
+ * }
+ * @example {{Template:title|params}}
+ */
+ 'procPLURAL': function( template ) {
+ if( template.title && template.parameters && mediaWiki.language.convertPlural) {
+ // Check if we have forms to replace
+ if ( template.parameters.length == 0 ) {
+ return '';
+ }
+ // Restore the count into a Number ( if it got converted earlier )
+ var count = mediaWiki.language.convertNumber( template.title, true );
+ // Do convertPlural call
+ return mediaWiki.language.convertPlural( parseInt( count ), template.parameters );
+ }
+ // Could not process plural return first form or nothing
+ if( template.parameters[0] ) {
+ return template.parameters[0];
+ }
+ return '';
+ },
+ /**
+ * Plural form transformations, needed for some languages.
+ *
+ * @param {integer} count Non-localized quantifier
+ * @param {array} forms List of plural forms
+ * @return {string} Correct form for quantifier in this language
+ */
+ 'convertPlural': function( count, forms ){
+ if ( !forms || forms.length == 0 ) {
+ return '';
+ }
+ return ( parseInt( count ) == 1 ) ? forms[0] : forms[1];
+ },
+ /**
+ * Pads an array to a specific length by copying the last one element.
+ *
+ * @param {array} forms Number of forms given to convertPlural
+ * @param {integer} count Number of forms required
+ * @return {array} Padded array of forms
+ */
+ 'preConvertPlural': function( forms, count ) {
+ while ( forms.length < count ) {
+ forms.push( forms[ forms.length-1 ] );
+ }
+ return forms;
+ },
+ /**
+ * Converts a number using digitTransformTable.
+ *
+ * @param {number} number Value to be converted
+ * @param {boolean} integer Convert the return value to an integer
+ */
+ 'convertNumber': function( number, integer ) {
+ if ( !mediaWiki.language.digitTransformTable ) {
+ return number;
+ }
+ // Set the target Transform table:
+ var transformTable = mediaWiki.language.digitTransformTable;
+ // Check if the "restore" to Latin number flag is set:
+ if ( integer ) {
+ if ( parseInt( number ) == number ) {
+ return number;
+ }
+ var tmp = [];
+ for ( var i in transformTable ) {
+ tmp[ transformTable[ i ] ] = i;
+ }
+ transformTable = tmp;
+ }
+ var numberString = '' + number;
+ var convertedNumber = '';
+ for ( var i = 0; i < numberString.length; i++ ) {
+ if ( transformTable[ numberString[i] ] ) {
+ convertedNumber += transformTable[numberString[i]];
+ } else {
+ convertedNumber += numberString[i];
+ }
+ }
+ return integer ? parseInt( convertedNumber) : convertedNumber;
+ },
+ // Digit Transform Table, populated by language classes where applicable
+ 'digitTransformTable': null
+};
--- /dev/null
+/*
+ * JavaScript for Special:Preferences
+ */
+
+$( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
+$( '#preferences' )
+ .addClass( 'jsprefs' )
+ .before( $( '<ul id="preftoc"></ul>' ) )
+ .children( 'fieldset' )
+ .hide()
+ .addClass( 'prefsection' )
+ .children( 'legend' )
+ .addClass( 'mainLegend' )
+ .each( function( i ) {
+ $(this).parent().attr( 'id', 'prefsection-' + i );
+ if ( i === 0 ) {
+ $(this).parent().show();
+ }
+ $( '#preftoc' ).append(
+ $( '<li></li>' )
+ .addClass( i === 0 ? 'selected' : null )
+ .append(
+ $( '<a></a>')
+ .text( $(this).text() )
+ .attr( 'href', '#prefsection-' + i )
+ .mousedown( function( e ) {
+ $(this).parent().parent().find( 'li' ).removeClass( 'selected' );
+ $(this).parent().addClass( 'selected' );
+ e.preventDefault();
+ return false;
+ } )
+ .click( function( e ) {
+ $( '#preferences > fieldset' ).hide();
+ $( '#prefsection-' + i ).show();
+ e.preventDefault();
+ return false;
+ } )
+ )
+ );
+ } );
--- /dev/null
+/*
+ * JavaScript for Specical:Search
+ */
+
+// Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
+if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
+ $( 'input[autofocus]' ).focus();
+}
--- /dev/null
+/*
+ * Utilities
+ */
+
+(function ($, mw) {
+
+ mediaWiki.util = {
+
+ /* Initialisation */
+ 'initialised' : false,
+ 'init' : function () {
+ if (this.initialised === false) {
+ this.initialised = true;
+
+ // Set tooltipAccessKeyPrefix
+ if (is_opera) {
+ this.tooltipAccessKeyPrefix = 'shift-esc-';
+ } else if (is_chrome) {
+ this.tooltipAccessKeyPrefix = is_chrome_mac ? 'ctrl-option-' : 'alt-';
+ } else if (!is_safari_win && is_safari && webkit_version > 526) {
+ this.tooltipAccessKeyPrefix = 'ctrl-alt-';
+ } else if (!is_safari_win &&
+ (is_safari || clientPC.indexOf('mac') !== -1 || clientPC.indexOf('konqueror') !== -1)) {
+ this.tooltipAccessKeyPrefix = 'ctrl-';
+ } else if (is_ff2) {
+ this.tooltipAccessKeyPrefix = 'alt-shift-';
+ }
+
+ // Setup CheckboxShiftClick
+ $.fn.enableCheckboxShiftClick = function () {
+ var prevCheckbox = null;
+ var $box = this;
+ $box.click(function (e) {
+ if (prevCheckbox !== null && e.shiftKey) {
+ $box.slice(
+ Math.min($box.index(prevCheckbox), $box.index(e.target)),
+ Math.max($box.index(prevCheckbox), $box.index(e.target)) + 1
+ ).attr({checked: e.target.checked ? 'checked' : ''});
+ }
+ prevCheckbox = e.target;
+ });
+ return $box;
+ };
+
+ // Prototype enhancements
+ if (typeof String.prototype.ucFirst === 'undefined') {
+ String.prototype.ucFirst = function () {
+ return this.substr(0, 1).toUpperCase() + this.substr(1, this.length);
+ };
+ }
+
+ // Any initialisation after the DOM is ready
+ $(function () {
+
+ // Enable CheckboxShiftClick
+ $('input[type=checkbox]:not(.noshiftselect)').enableCheckboxShiftClick();
+
+ // Fill bodyContant var
+ if ($('#bodyContent').length) {
+ mw.util.$content = $('#bodyContent');
+ } else if ($('#article').length) {
+ mw.util.$content = $('#article');
+ } else {
+ mw.util.$content = $('#content');
+ }
+ });
+
+
+ return true;
+ }
+ return false;
+ },
+
+ /* Main body */
+
+ /**
+ * Encodes the string like PHP's rawurlencode
+ *
+ * @param String str string to be encoded
+ */
+ 'rawurlencode' : function (str) {
+ str = (str + '').toString();
+ return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28')
+ .replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/~/g, '%7E');
+ },
+
+ /**
+ * Encode pagetitles for use in a URL
+ * We want / and : to be included as literal characters in our title URLs
+ * as they otherwise fatally break the title
+ *
+ * @param String str string to be encoded
+ */
+ 'wikiUrlencode' : function (str) {
+ return this.rawurlencode(str).replace(/%20/g, '_').replace(/%3A/g, ':').replace(/%2F/g, '/');
+ },
+
+ /**
+ * Get the full url to a pagename
+ *
+ * @param String str pagename to link to
+ */
+ 'getWikilink' : function (str) {
+ return wgServer + wgArticlePath.replace('$1', this.wikiUrlencode(str));
+ },
+
+ /**
+ * Check is a variable is empty. Support for strings, booleans, arrays and objects.
+ * String "0" is considered empty. String containing only whitespace (ie. " ") is considered not empty.
+ *
+ * @param Mixed v the variable to check for empty ness
+ */
+ 'isEmpty' : function (v) {
+ var key;
+ if (v === "" || v === 0 || v === "0" || v === null || v === false || typeof v === 'undefined') {
+ return true;
+ }
+ if (v.length === 0) {
+ return true;
+ }
+ if (typeof v === 'object') {
+ for (key in v) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ },
+
+
+ /**
+ * Grabs the url parameter value for the given parameter
+ * Returns null if not found
+ *
+ * @param String param paramter name
+ * @param String url url to search through (optional)
+ */
+ 'getParamValue' : function (param, url) {
+ url = url ? url : document.location.href;
+ var re = new RegExp('[^#]*[&?]' + param + '=([^&#]*)'); // Get last match, stop at hash
+ var m = re.exec(url);
+ if (m && m.length > 1) {
+ return decodeURIComponent(m[1]);
+ }
+ return null;
+ },
+
+ /**
+ * Converts special characters to their HTML entities
+ *
+ * @param String str text to escape
+ * @param Bool quotes if true escapes single and double quotes aswell (by default false)
+ */
+ 'htmlEscape' : function (str, quotes) {
+ str = $('<div/>').text(str).html();
+ if (typeof quotes === 'undefined') {
+ quotes = false;
+ }
+ if (quotes === true) {
+ str = str.replace(/'/g, ''').replace(/"/g, '"');
+ }
+ return str;
+ },
+
+ /**
+ * Converts HTML entities back to text
+ *
+ * @param String str text to unescape
+ */
+ 'htmlUnescape' : function (str) {
+ return $('<div/>').html(str).text();
+ },
+
+ // Access key prefix
+ // will be re-defined based on browser/operating system detection in mw.util.init()
+ 'tooltipAccessKeyPrefix' : 'alt-',
+
+ // Regex to match accesskey tooltips
+ 'tooltipAccessKeyRegexp': /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
+
+ /**
+ * Add the appropriate prefix to the accesskey shown in the tooltip.
+ * If the nodeList parameter is given, only those nodes are updated;
+ * otherwise, all the nodes that will probably have accesskeys by
+ * default are updated.
+ *
+ * @param Mixed nodeList jQuery object, or array of elements
+ */
+ 'updateTooltipAccessKeys' : function (nodeList) {
+ var $nodes;
+ if (nodeList instanceof jQuery) {
+ $nodes = nodeList;
+ } else if (nodeList) {
+ $nodes = $(nodeList);
+ } else {
+ // Rather than scanning all links, just
+ $('#column-one a, #mw-head a, #mw-panel a, #p-logo a');
+
+ // these are rare enough that no such optimization is needed
+ this.updateTooltipAccessKeys($('input'));
+ this.updateTooltipAccessKeys($('label'));
+ return;
+ }
+
+ $nodes.each(function (i) {
+ var tip = $(this).attr('title');
+ if (!!tip && mw.util.tooltipAccessKeyRegexp.exec(tip)) {
+ tip = tip.replace(mw.util.tooltipAccessKeyRegexp, '[' + mw.util.tooltipAccessKeyPrefix + "$5]");
+ $(this).attr('title', tip);
+ }
+ });
+ },
+
+ // jQuery object that refers to the page-content element
+ // Populated by init()
+ '$content' : null,
+
+
+ /**
+ * Add a link to a portlet menu on the page, such as:
+ *
+ * p-cactions (Content actions), p-personal (Personal tools), p-navigation (Navigation), p-tb (Toolbox)
+ *
+ * The first three paramters are required, others are optionals. Though
+ * providing an id and tooltip is recommended.
+ *
+ * By default the new link will be added to the end of the list. To add the link before a given existing item,
+ * pass the DOM node (document.getElementById('foobar') or the jQuery-selector ('#foobar') of that item.
+ *
+ * @example mw.util.addPortletLink('p-tb', 'http://mediawiki.org/', 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print')
+ *
+ * @param String portlet id of the target portlet ('p-cactions' or 'p-personal' etc.)
+ * @param String href link URL
+ * @param String text link text (will be automatically lowercased by CSS for p-cactions in Monobook)
+ * @param String id id of the new item, should be unique and preferably have the appropriate prefix ('ca-', 'pt-', 'n-' or 't-')
+ * @param String tooltip text to show when hovering over the link, without accesskey suffix
+ * @param String accesskey accesskey to activate this link (one character, try to avoid conflicts. Use $('[accesskey=x').get() in the console to see if 'x' is already used.
+ * @param mixed nextnode DOM node or jQuery-selector of the item that the new item should be added before, should be another item in the same list will be ignored if not the so
+ *
+ * @return Node the DOM node of the new item (a LI element, or A element for older skins) or null
+ */
+ 'addPortletLink' : function (portlet, href, text, id, tooltip, accesskey, nextnode) {
+ var $link = $('<a />').attr('href', href).text(text);
+
+ // Some skins don't have portlets
+ // Just add it to the bottom of their 'sidebar' element ignoring the specified portlet target
+ switch (skin) {
+ case 'standard' :
+ case 'cologneblue' :
+ $("#quickbar").append($link.after('<br />'));
+ return $link.get(0);
+ case 'nostalgia' :
+ $("#searchform").before($link).before(' | ');
+ return $link.get(0);
+ default : // chick, modern, monobook, myskin, simple, vector...
+
+ var $portlet = $('#' + portlet);
+ if ($portlet.length === 0) {
+ return null;
+ }
+ var $ul = $portlet.find('ul').eq(0);
+ if ($ul.length === 0) {
+ if ($portlet.find('div').length === 0) {
+ $portlet.append('<ul />');
+ } else {
+ $portlet.find('div').eq(-1).append('<ul />');
+ }
+ $ul = $portlet.find('ul').eq(0);
+ }
+ if ($ul.length === 0) {
+ return null;
+ }
+
+ // unhide portlet if it was hidden before
+ $portlet.removeClass('emptyPortlet');
+
+ var $item = $link.wrap('<li><span /></li>').parent().parent();
+
+ if (id) {
+ $item.attr('id', id);
+ }
+ if (accesskey) {
+ $link.attr('accesskey', accesskey);
+ tooltip += ' [' + accesskey + ']';
+ }
+ if (tooltip) {
+ $link.attr('title', tooltip);
+ }
+ if (accesskey && tooltip) {
+ this.updateTooltipAccessKeys($link);
+ }
+
+ // Append using DOM-element passing
+ if (nextnode && nextnode.parentNode == $ul.get(0)) {
+ $(nextnode).before($item);
+ } else {
+ // If the jQuery selector isn't found within the <ul>, just append it at the end
+ if ($ul.find(nextnode).length === 0) {
+ $ul.append($item);
+ } else {
+ // Append using jQuery CSS selector
+ $ul.find(nextnode).eq(0).before($item);
+ }
+ }
+
+ return $item.get(0);
+ }
+ }
+
+ };
+
+ mediaWiki.util.init();
+
+})(jQuery, mediaWiki);
\ No newline at end of file
--- /dev/null
+/*
+ * mediaWiki Debug Test Suit.
+ * Available on "/Special:BlankPage?action=mwutiltest&debug=true")
+ */
+
+(function ($, mw) {
+
+ mediaWiki.test = {
+
+ /* Variables */
+ '$table' : null,
+ 'addedTests' : [],
+
+ /* Functions */
+
+ /**
+ * Adds a row to the test-table
+ *
+ * @param String code Code of the test to be executed
+ * @param String result Expected result in 'var (vartype)' form
+ * @param String contain Important part of the result, if result is different but does contain this it will not return ERROR but PARTIALLY
+ */
+ 'addTest' : function (code, result, contain) {
+ if (!contain) {
+ contain = result;
+ }
+ this.addedTests.push([code, result, contain]);
+ this.$table.append('<tr><td>' + mw.util.htmlEscape(code) + '</td><td>' + mw.util.htmlEscape(result) + '<td></td></td><td>?</td></tr>');
+ },
+
+ /* Initialisation */
+ 'initialised' : false,
+ 'init' : function () {
+ if (this.initialised === false) {
+ this.initialised = true;
+ $(function () {
+ if (wgCanonicalSpecialPageName == 'Blankpage' && mw.util.getParamValue('action') === 'mwutiltest') {
+
+ // Build page
+ document.title = 'mediaWiki.util JavaScript Test - ' + wgSiteName;
+ $('#firstHeading').text('mediaWiki.util JavaScript Test');
+ mw.util.$content.html(
+ '<p>Below is a list of tests to confirm proper functionality of the mediaWiki.util functions</p>' +
+ '<hr />' +
+ '<table id="mw-mwutiltest-table" class="wikitable sortable"><tr><th>Exec</th><th>Should return</th><th>Does return</th><th>Equal ?</th></tr></table>'
+ );
+ mw.test.$table = $('table#mw-mwutiltest-table');
+
+ // Populate tests
+ mw.test.addTest('typeof String.prototype.trim',
+ 'function (string)');
+ mw.test.addTest('typeof String.prototype.trimLeft',
+ 'function (string)');
+ mw.test.addTest('typeof String.prototype.trimRight',
+ 'function (string)');
+ mw.test.addTest('typeof Array.prototype.compare',
+ 'function (string)');
+ mw.test.addTest('typeof Array.prototype.indexOf',
+ 'function (string)');
+ mw.test.addTest('4',
+ '4 (number)');
+ mw.test.addTest('typeof mediaWiki',
+ 'object (string)');
+ mw.test.addTest('typeof mw',
+ 'object (string)');
+ mw.test.addTest('typeof mw.util',
+ 'object (string)');
+ mw.test.addTest('typeof String.prototype.ucFirst',
+ 'function (string)');
+ mw.test.addTest('\'mediawiki\'.ucFirst()',
+ 'Mediawiki (string)');
+ mw.test.addTest('typeof $.fn.enableCheckboxShiftClick',
+ 'function (string)');
+ mw.test.addTest('typeof mw.util.rawurlencode',
+ 'function (string)');
+ mw.test.addTest('mw.util.rawurlencode(\'Test: A&B/Here\')',
+ 'Test%3A%20A%26B%2FHere (string)');
+ mw.test.addTest('typeof mw.util.getWikilink',
+ 'function (string)');
+ mw.test.addTest('typeof mw.util.getParamValue',
+ 'function (string)');
+ mw.test.addTest('mw.util.getParamValue(\'action\')',
+ 'mwutiltest (string)');
+ mw.test.addTest('typeof mw.util.htmlEscape',
+ 'function (string)');
+ mw.test.addTest('mw.util.htmlEscape(\'<a href="http://mw.org/?a=b&c=d">link</a>\')',
+ '<a href="http://mw.org/?a=b&c=d">link</a> (string)');
+ mw.test.addTest('typeof mw.util.htmlUnescape',
+ 'function (string)');
+ mw.test.addTest('mw.util.htmlUnescape(\'<a href="http://mw.org/?a=b&c=d">link</a>\')',
+ '<a href="http://mw.org/?a=b&c=d">link</a> (string)');
+ mw.test.addTest('typeof mw.util.tooltipAccessKeyRegexp',
+ 'function (string)');
+ mw.test.addTest('typeof mw.util.updateTooltipAccessKeys',
+ 'function (string)');
+ mw.test.addTest('typeof mw.util.addPortletLink',
+ 'function (string)');
+ mw.test.addTest('typeof mw.util.addPortletLink("p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print")',
+ 'object (string)');
+ mw.test.addTest('a = mw.util.addPortletLink("p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print"); if(a){ a.outerHTML; }',
+ '<li id="t-mworg"><span><a href="http://mediawiki.org/" accesskey="m" title="Go to MediaWiki.org [ctrl-alt-m]">MediaWiki.org</a></span></li> (string)',
+ 'href="http://mediawiki.org/"');
+
+ // Run tests and compare results
+ var exec,
+ result,
+ resulttype,
+ numberoftests = 0,
+ numberofpasseds = 0,
+ numberofpartials = 0,
+ numberoferrors = 0,
+ $testrows;
+ $testrows = mw.test.$table.find('tr');
+ $.each(mw.test.addedTests, (function (i) {
+ numberoftests++;
+
+ exec = mw.test.addedTests[i][0];
+ shouldreturn = mw.test.addedTests[i][1];
+ shouldcontain = mw.test.addedTests[i][2];
+ doesreturn = eval(exec);
+ doesreturn = doesreturn + ' (' + typeof doesreturn + ')';
+ $thisrow = $testrows.eq(i + 1);
+ $thisrow.find('> td').eq(2).text(doesreturn);
+
+ if (doesreturn.indexOf(shouldcontain) !== -1) {
+ if (doesreturn == shouldreturn){
+ $thisrow.find('> td').eq(3).css('background', '#EFE').text('OK');
+ numberofpasseds++;
+ } else {
+ $thisrow.find('> td').eq(3).css('background', '#FFE').html('<small>PARTIALLY</small>');
+ numberofpartials++;
+ }
+ } else {
+ $thisrow.find('> td').eq(3).css('background', '#FEE').text('ERROR');
+ numberoferrors++;
+ }
+
+ })
+ );
+ mw.test.$table.before('<p><strong>Ran ' + numberoftests + ' tests. ' + numberofpasseds + ' passed test(s). ' + numberoferrors + ' error(s). ' + numberofpartials + ' partially passed test(s). </p>');
+
+ }
+ });
+ }
+ }
+ };
+
+ mediaWiki.test.init();
+
+})(jQuery, mediaWiki);
\ No newline at end of file
--- /dev/null
+/*
+ * JavaScript for History view
+ */
+
+// Replaces histrowinit
+$( '#pagehistory li input[name=diff], #pagehistory li input[name=oldid]' ).click( diffcheck );
+diffcheck();
\ No newline at end of file
*/
// New fallback String trimming functionality, was introduced natively in JavaScript 1.8.1
-if (typeof String.prototype.trim === 'undefined') {
-// Add removing trailing and leading whitespace functionality cross-browser
-// See also: http://blog.stevenlevithan.com/archives/faster-trim-javascript
- String.prototype.trim = function () {
- return this.replace(/^\s+|\s+$/g, '');
+if ( typeof String.prototype.trim === 'undefined' ) {
+ // Add removing trailing and leading whitespace functionality cross-browser
+ // See also: http://blog.stevenlevithan.com/archives/faster-trim-javascript
+ String.prototype.trim = function() {
+ return this.replace( /^\s+|\s+$/g, '' );
};
}
-if (typeof String.prototype.trimLeft === 'undefined') {
- String.prototype.trimLeft = function () {
- return this.replace(/^\s\s*/, "");
+if ( typeof String.prototype.trimLeft === 'undefined' ) {
+ String.prototype.trimLeft = function() {
+ return this.replace( /^\s\s*/, "" );
};
}
-if (typeof String.prototype.trimRight === 'undefined') {
- String.prototype.trimRight = function () {
+if ( typeof String.prototype.trimRight === 'undefined' ) {
+ String.prototype.trimRight = function() {
return this.replace(/\s\s*$/, "");
};
}
-// Add array comparison functionality
-if (typeof Array.prototype.compare === 'undefined') {
- Array.prototype.compare = function (against) {
- if (this.length !== against.length) {
- return false;
- }
- for (var i = 0; i < against.length; i++) {
- if (this[i].compare) {
- if (!this[i].compare(against[i])) {
- return false;
- }
- }
- if (this[i] !== against[i]) {
- return false;
- }
- }
- return true;
- };
-}
-
-// Make calling .indexOf() on an array work on older browsers
-if (typeof Array.prototype.indexOf === 'undefined') {
- Array.prototype.indexOf = function (needle) {
- for (var i = 0; i < this.length; i++) {
- if (this[i] === needle) {
- return i;
- }
- }
- return -1;
- };
-}
-
/*
* Core MediaWiki JavaScript Library
*/
+
// Attach to window
window.mediaWiki = new ( function( $ ) {
-
+
/* Constants */
-
+
// This will not change until we are 100% ready to turn off legacy globals
var LEGACY_GLOBALS = true;
-
+
/* Private Members */
-
- var that = this;
-
+
+ // List of messages that have been requested to be loaded
+ var messageQueue = {};
+
/* Prototypes */
-
- this.prototypes = {
- /*
- * An object which allows single and multiple get/set/exists functionality on a list of key / value pairs
- *
- * @param {boolean} global whether to get/set/exists values on the window object or a private object
- * @param {function} parser function to perform extra processing; in the form of function( value, options )
- * @param {function} fallback function to format default fallback; in the form of function( key )
- * where value is the data to be parsed and options is additional data passed through to the parser
- */
- 'map': function( global, parser, fallback ) {
-
- /* Private Members */
-
- var that = this;
- var values = global === true ? window : {};
-
- /* Public Methods */
-
- /**
- * Gets one or more values
- *
- * If called with no arguments, all values will be returned. If a parser is in use, no parsing will take
- * place when calling with no arguments or calling with an array of names.
- *
- * @param {mixed} selection string name of value to get, array of string names of values to get, or object
- * of name/option pairs
- * @param {object} options optional set of options which are also passed to a parser if in use; only used
- * when selection is a string
- * @format options
- * {
- * // Value to use if key does not exist
- * 'fallback': ''
- * }
- */
- this.get = function( selection, options ) {
- if ( typeof selection === 'object' ) {
- var results = {};
- for ( var s in selection ) {
- if ( selection.hasOwnProperty( s ) ) {
- if ( typeof s === 'string' ) {
- return that.get( values[s], selection[s] );
- } else {
- return that.get( selection[s] );
- }
- }
- }
- return results;
- } else if ( typeof selection === 'string' ) {
- if ( typeof values[selection] === 'undefined' ) {
- if ( typeof options === 'object' && 'fallback' in options ) {
- return options.fallback;
- } else if ( typeof fallback === 'function' ) {
- return fallback( selection );
- } else {
- return null;
- }
- } else {
- if ( typeof parser === 'function' ) {
- return parser( values[selection], options );
- } else {
- return values[selection];
- }
- }
- } else {
- return values;
- }
- };
-
- /**
- * Sets one or multiple configuration values using a key and a value or an object of keys and values
- *
- * @param {mixed} key string of name by which value will be made accessible, or object of name/value pairs
- * @param {mixed} value optional value to set, only in use when key is a string
- */
- this.set = function( selection, value ) {
- if ( typeof selection === 'object' ) {
- for ( var s in selection ) {
- values[s] = selection[s];
- }
- } else if ( typeof selection === 'string' && typeof value !== 'undefined' ) {
- values[selection] = value;
+
+ /**
+ * An object which allows single and multiple get/set/exists functionality on a list of key / value pairs.
+ *
+ * @param {boolean} global Whether to get/set/exists values on the window object or a private object
+ */
+ function Map( global ) {
+ this.values = ( global === true ) ? window : {};
+ };
+
+ /**
+ * Gets the value of a key, or a list of key/value pairs for an array of keys.
+ *
+ * If called with no arguments, all values will be returned.
+ *
+ * @param {mixed} selection Key or array of keys to get values for
+ * @param {mixed} fallback Value to use in case key(s) do not exist (optional)
+ */
+ Map.prototype.get = function( selection, fallback ) {
+ if ( typeof selection === 'object' ) {
+ selection = $.makeArray( selection );
+ var results = {};
+ for ( var i = 0; i < selection.length; i++ ) {
+ results[selection[i]] = this.get( selection[i], fallback );
+ }
+ return results;
+ } else if ( typeof selection === 'string' ) {
+ if ( typeof this.values[selection] === 'undefined' ) {
+ if ( typeof fallback !== 'undefined' ) {
+ return fallback;
}
- };
-
- /**
- * Checks if one or multiple configuration fields exist
- */
- this.exists = function( selection ) {
- if ( typeof keys === 'object' ) {
- for ( var s = 0; s < selection.length; s++ ) {
- if ( !( selection[s] in values ) ) {
- return false;
- }
- }
- return true;
- } else {
- return selection in values;
+ return null;
+ }
+ return this.values[selection];
+ }
+ return this.values;
+ };
+
+ /**
+ * Sets one or multiple key/value pairs.
+ *
+ * @param {mixed} selection Key or object of key/value pairs to set
+ * @param {mixed} value Value to set (optional, only in use when key is a string)
+ */
+ Map.prototype.set = function( selection, value ) {
+ if ( typeof selection === 'object' ) {
+ for ( var s in selection ) {
+ this.values[s] = selection[s];
+ }
+ } else if ( typeof selection === 'string' && typeof value !== 'undefined' ) {
+ this.values[selection] = value;
+ }
+ };
+
+ /**
+ * Checks if one or multiple keys exist.
+ *
+ * @param {mixed} key Key or array of keys to check
+ * @return {boolean} Existence of key(s)
+ */
+ Map.prototype.exists = function( selection ) {
+ if ( typeof keys === 'object' ) {
+ for ( var s = 0; s < selection.length; s++ ) {
+ if ( !( selection[s] in this.values ) ) {
+ return false;
}
- };
+ }
+ return true;
+ } else {
+ return selection in this.values;
}
};
-
- /* Methods */
+
+ /**
+ * Message object, similar to Message in PHP
+ */
+ function Message( map, key, parameters ) {
+ this.format = 'parse';
+ this.map = map;
+ this.key = key;
+ this.parameters = typeof parameters === 'undefined' ? [] : $.makeArray( parameters );
+ };
+
+ /**
+ * Appends parameters for replacement
+ *
+ * @param {mixed} args First in a list of variadic arguments to append as message parameters
+ */
+ Message.prototype.params = function( parameters ) {
+ for ( var i = 0; i < parameters.length; i++ ) {
+ this.parameters[this.parameters.length] = parameters[i];
+ }
+ return this;
+ };
+
+ /**
+ * Converts message object to it's string form based on the state of format
+ *
+ * @return {string} String form of message
+ */
+ Message.prototype.toString = function() {
+ if ( !this.map.exists( this.key ) ) {
+ // Return <key> if key does not exist
+ return '<' + key + '>';
+ }
+ var text = this.map.get( this.key );
+ var parameters = this.parameters;
+ text = text.replace( /\$(\d+)/g, function( string, match ) {
+ var index = parseInt( match, 10 ) - 1;
+ return index in parameters ? parameters[index] : '$' + match;
+ } );
+ /* This should be fixed up when we have a parser
+ if ( this.format === 'parse' && 'language' in mediaWiki ) {
+ text = mediaWiki.language.parse( text );
+ }
+ */
+ return text;
+ };
+
+ /**
+ * Changes format to parse and converts message to string
+ *
+ * @return {string} String form of parsed message
+ */
+ Message.prototype.parse = function() {
+ this.format = 'parse';
+ return this.toString();
+ };
+
+ /**
+ * Changes format to plain and converts message to string
+ *
+ * @return {string} String form of plain message
+ */
+ Message.prototype.plain = function() {
+ this.format = 'plain';
+ return this.toString();
+ };
+
+ /**
+ * Checks if message exists
+ *
+ * @return {string} String form of parsed message
+ */
+ Message.prototype.exists = function() {
+ return this.map.exists( this.key );
+ };
+
+ /**
+ * User object
+ */
+ function User() {
+ this.options = new Map();
+ }
+
+ /* Public Members */
/*
* Dummy function which in debug mode can be replaced with a function that does something clever
*
* In legacy mode the values this object wraps will be in the global space
*/
- this.config = new this.prototypes.map( LEGACY_GLOBALS );
+ this.config = new Map( LEGACY_GLOBALS );
/*
* Information about the current user
*/
- this.user = new ( function() {
-
- /* Public Members */
-
- this.options = new that.prototypes.map();
- } )();
-
+ this.user = new User();
+
/*
- * Basic parser, can be replaced with something more robust
+ * Localization system
+ */
+ this.messages = new Map();
+
+ /* Public Methods */
+
+ /**
+ * Gets a message object, similar to wfMessage()
+ *
+ * @param {string} key Key of message to get
+ * @param {mixed} params First argument in a list of variadic arguments, each a parameter for $ replacement
*/
- this.parser = function( text, options ) {
- if ( typeof options === 'object' && typeof options.parameters === 'object' ) {
- text = text.replace( /\$(\d+)/g, function( str, match ) {
- var index = parseInt( match, 10 ) - 1;
- return index in options.parameters ? options.parameters[index] : '$' + match;
- } );
+ this.message = function( key, parameters ) {
+ // Support variadic arguments
+ if ( typeof parameters !== 'undefined' ) {
+ parameters = $.makeArray( arguments);
+ parameters.shift();
+ } else {
+ parameters = [];
}
- return text;
+ return new Message( mediaWiki.messages, key, parameters );
};
-
- /*
- * Localization system
- */
- this.msg = new that.prototypes.map( false, this.parser, function( key ) { return '<' + key + '>'; } );
-
- /*
+
+ /**
* Client-side module loader which integrates with the MediaWiki ResourceLoader
*/
this.loader = new ( function() {
/* Private Members */
var that = this;
- /*
+ /**
* Mapping of registered modules
*
* The jquery module is pre-registered, because it must have already been provided for this object to have
/* Private Methods */
+ function compare( a, b ) {
+ if ( a.length != b.length ) {
+ return false;
+ }
+ for ( var i = 0; i < b.length; i++ ) {
+ if ( $.isArray( a[i] ) ) {
+ if ( !compare( a[i], b[i] ) ) {
+ return false;
+ }
+ }
+ if ( a[i] !== b[i] ) {
+ return false;
+ }
+ }
+ return true;
+ };
+
/**
* Generates an ISO8601 "basic" string from a UNIX timestamp
*/
* Recursively resolves dependencies and detects circular references
*/
function recurse( module, resolved, unresolved ) {
- unresolved[unresolved.length] = module;
+ if ( typeof registry[module] === 'undefined' ) {
+ throw new Error( 'Unknown dependency: ' + module );
+ }
// Resolves dynamic loader function and replaces it with it's own results
if ( typeof registry[module].dependencies === 'function' ) {
registry[module].dependencies = registry[module].dependencies();
}
// Tracks down dependencies
for ( var n = 0; n < registry[module].dependencies.length; n++ ) {
- if ( resolved.indexOf( registry[module].dependencies[n] ) === -1 ) {
- if ( unresolved.indexOf( registry[module].dependencies[n] ) !== -1 ) {
+ if ( $.inArray( registry[module].dependencies[n], resolved ) === -1 ) {
+ if ( $.inArray( registry[module].dependencies[n], unresolved ) !== -1 ) {
throw new Error(
'Circular reference detected: ' + module + ' -> ' + registry[module].dependencies[n]
);
}
}
resolved[resolved.length] = module;
- unresolved.splice( unresolved.indexOf( module ), 1 );
+ unresolved.splice( $.inArray( module, unresolved ), 1 );
}
/**
}
// Add localizations to message system
if ( typeof registry[module].messages === 'object' ) {
- mediaWiki.msg.set( registry[module].messages );
+ mediaWiki.messages.set( registry[module].messages );
}
// Execute script
try {
registry[module].state = 'ready';
// Run jobs who's dependencies have just been met
for ( var j = 0; j < jobs.length; j++ ) {
- if ( filter( 'ready', jobs[j].dependencies ).compare( jobs[j].dependencies ) ) {
+ if ( compare( filter( 'ready', jobs[j].dependencies ), jobs[j].dependencies ) ) {
if ( typeof jobs[j].ready === 'function' ) {
jobs[j].ready();
}
// Execute modules who's dependencies have just been met
for ( r in registry ) {
if ( registry[r].state == 'loaded' ) {
- if ( filter( ['ready'], registry[r].dependencies ).compare( registry[r].dependencies ) ) {
+ if ( compare( filter( ['ready'], registry[r].dependencies ), registry[r].dependencies ) ) {
execute( r );
}
}
registry[module].state = 'error';
// Run error callbacks of jobs affected by this condition
for ( var j = 0; j < jobs.length; j++ ) {
- if ( jobs[j].dependencies.indexOf( module ) !== -1 ) {
+ if ( $.inArray( module, jobs[j].dependencies ) !== -1 ) {
if ( typeof jobs[j].error === 'function' ) {
jobs[j].error();
}
// Queue up any dependencies that are undefined or registered
dependencies = filter( ['undefined', 'registered'], dependencies );
for ( var n = 0; n < dependencies.length; n++ ) {
- if ( queue.indexOf( dependencies[n] ) === -1 ) {
+ if ( $.inArray( dependencies[n], queue ) === -1 ) {
queue[queue.length] = dependencies[n];
}
}
// Only request modules which are undefined or registered
if ( !( queue[q] in registry ) || registry[queue[q]].state == 'registered' ) {
// Prevent duplicate entries
- if ( batch.indexOf( queue[q] ) === -1 ) {
+ if ( $.inArray( queue[q], batch ) === -1 ) {
batch[batch.length] = queue[q];
// Mark registered modules as loading
if ( queue[q] in registry ) {
registry[module].messages = localization;
}
// Execute or queue callback
- if ( filter( ['ready'], registry[module].dependencies ).compare( registry[module].dependencies ) ) {
+ if ( compare( filter( ['ready'], registry[module].dependencies ), registry[module].dependencies ) ) {
execute( module );
} else {
request( module );
// Resolve entire dependency map
dependencies = resolve( dependencies );
// If all dependencies are met, execute ready immediately
- if ( filter( ['ready'], dependencies ).compare( dependencies ) ) {
+ if ( compare( filter( ['ready'], dependencies ), dependencies ) ) {
if ( typeof ready === 'function' ) {
ready();
}
// Resolve entire dependency map
modules = resolve( modules );
// If all modules are ready, nothing dependency be done
- if ( filter( ['ready'], modules ).compare( modules ) ) {
+ if ( compare( filter( ['ready'], modules ), modules ) ) {
return true;
}
// If any modules have errors return false
+++ /dev/null
-/*
- * JavaScript for Special:Preferences
- */
-
-$( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
-$( '#preferences' )
- .addClass( 'jsprefs' )
- .before( $( '<ul id="preftoc"></ul>' ) )
- .children( 'fieldset' )
- .hide()
- .addClass( 'prefsection' )
- .children( 'legend' )
- .addClass( 'mainLegend' )
- .each( function( i ) {
- $(this).parent().attr( 'id', 'prefsection-' + i );
- if ( i === 0 ) {
- $(this).parent().show();
- }
- $( '#preftoc' ).append(
- $( '<li></li>' )
- .addClass( i === 0 ? 'selected' : null )
- .append(
- $( '<a></a>')
- .text( $(this).text() )
- .attr( 'href', '#prefsection-' + i )
- .mousedown( function( e ) {
- $(this).parent().parent().find( 'li' ).removeClass( 'selected' );
- $(this).parent().addClass( 'selected' );
- e.preventDefault();
- return false;
- } )
- .click( function( e ) {
- $( '#preferences > fieldset' ).hide();
- $( '#prefsection-' + i ).show();
- e.preventDefault();
- return false;
- } )
- )
- );
- } );
+++ /dev/null
-/*
- * JavaScript for Specical:Search
- */
-
-// Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
-if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
- $( 'input[autofocus]' ).focus();
-}
+++ /dev/null
-/*
- * Utilities
- */
-
-(function ($, mw) {
-
- mediaWiki.util = {
-
- /* Initialisation */
- 'initialised' : false,
- 'init' : function () {
- if (this.initialised === false) {
- this.initialised = true;
-
- // Set tooltipAccessKeyPrefix
- if (is_opera) {
- this.tooltipAccessKeyPrefix = 'shift-esc-';
- } else if (is_chrome) {
- this.tooltipAccessKeyPrefix = is_chrome_mac ? 'ctrl-option-' : 'alt-';
- } else if (!is_safari_win && is_safari && webkit_version > 526) {
- this.tooltipAccessKeyPrefix = 'ctrl-alt-';
- } else if (!is_safari_win &&
- (is_safari || clientPC.indexOf('mac') !== -1 || clientPC.indexOf('konqueror') !== -1)) {
- this.tooltipAccessKeyPrefix = 'ctrl-';
- } else if (is_ff2) {
- this.tooltipAccessKeyPrefix = 'alt-shift-';
- }
-
- // Setup CheckboxShiftClick
- $.fn.enableCheckboxShiftClick = function () {
- var prevCheckbox = null;
- var $box = this;
- $box.click(function (e) {
- if (prevCheckbox !== null && e.shiftKey) {
- $box.slice(
- Math.min($box.index(prevCheckbox), $box.index(e.target)),
- Math.max($box.index(prevCheckbox), $box.index(e.target)) + 1
- ).attr({checked: e.target.checked ? 'checked' : ''});
- }
- prevCheckbox = e.target;
- });
- return $box;
- };
-
- // Prototype enhancements
- if (typeof String.prototype.ucFirst === 'undefined') {
- String.prototype.ucFirst = function () {
- return this.substr(0, 1).toUpperCase() + this.substr(1, this.length);
- };
- }
-
- // Any initialisation after the DOM is ready
- $(function () {
-
- // Enable CheckboxShiftClick
- $('input[type=checkbox]:not(.noshiftselect)').enableCheckboxShiftClick();
-
- // Fill bodyContant var
- if ($('#bodyContent').length) {
- mw.util.$content = $('#bodyContent');
- } else if ($('#article').length) {
- mw.util.$content = $('#article');
- } else {
- mw.util.$content = $('#content');
- }
- });
-
-
- return true;
- }
- return false;
- },
-
- /* Main body */
-
- /**
- * Encodes the string like PHP's rawurlencode
- *
- * @param String str string to be encoded
- */
- 'rawurlencode' : function (str) {
- str = (str + '').toString();
- return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28')
- .replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/~/g, '%7E');
- },
-
- /**
- * Encode pagetitles for use in a URL
- * We want / and : to be included as literal characters in our title URLs
- * as they otherwise fatally break the title
- *
- * @param String str string to be encoded
- */
- 'wikiUrlencode' : function (str) {
- return this.rawurlencode(str).replace(/%20/g, '_').replace(/%3A/g, ':').replace(/%2F/g, '/');
- },
-
- /**
- * Get the full url to a pagename
- *
- * @param String str pagename to link to
- */
- 'getWikilink' : function (str) {
- return wgServer + wgArticlePath.replace('$1', this.wikiUrlencode(str));
- },
-
- /**
- * Check is a variable is empty. Support for strings, booleans, arrays and objects.
- * String "0" is considered empty. String containing only whitespace (ie. " ") is considered not empty.
- *
- * @param Mixed v the variable to check for empty ness
- */
- 'isEmpty' : function (v) {
- var key;
- if (v === "" || v === 0 || v === "0" || v === null || v === false || typeof v === 'undefined') {
- return true;
- }
- if (v.length === 0) {
- return true;
- }
- if (typeof v === 'object') {
- for (key in v) {
- return false;
- }
- return true;
- }
- return false;
- },
-
-
- /**
- * Grabs the url parameter value for the given parameter
- * Returns null if not found
- *
- * @param String param paramter name
- * @param String url url to search through (optional)
- */
- 'getParamValue' : function (param, url) {
- url = url ? url : document.location.href;
- var re = new RegExp('[^#]*[&?]' + param + '=([^&#]*)'); // Get last match, stop at hash
- var m = re.exec(url);
- if (m && m.length > 1) {
- return decodeURIComponent(m[1]);
- }
- return null;
- },
-
- /**
- * Converts special characters to their HTML entities
- *
- * @param String str text to escape
- * @param Bool quotes if true escapes single and double quotes aswell (by default false)
- */
- 'htmlEscape' : function (str, quotes) {
- str = $('<div/>').text(str).html();
- if (typeof quotes === 'undefined') {
- quotes = false;
- }
- if (quotes === true) {
- str = str.replace(/'/g, ''').replace(/"/g, '"');
- }
- return str;
- },
-
- /**
- * Converts HTML entities back to text
- *
- * @param String str text to unescape
- */
- 'htmlUnescape' : function (str) {
- return $('<div/>').html(str).text();
- },
-
- // Access key prefix
- // will be re-defined based on browser/operating system detection in mw.util.init()
- 'tooltipAccessKeyPrefix' : 'alt-',
-
- // Regex to match accesskey tooltips
- 'tooltipAccessKeyRegexp': /\[(ctrl-)?(alt-)?(shift-)?(esc-)?(.)\]$/,
-
- /**
- * Add the appropriate prefix to the accesskey shown in the tooltip.
- * If the nodeList parameter is given, only those nodes are updated;
- * otherwise, all the nodes that will probably have accesskeys by
- * default are updated.
- *
- * @param Mixed nodeList jQuery object, or array of elements
- */
- 'updateTooltipAccessKeys' : function (nodeList) {
- var $nodes;
- if (nodeList instanceof jQuery) {
- $nodes = nodeList;
- } else if (nodeList) {
- $nodes = $(nodeList);
- } else {
- // Rather than scanning all links, just
- $('#column-one a, #mw-head a, #mw-panel a, #p-logo a');
-
- // these are rare enough that no such optimization is needed
- this.updateTooltipAccessKeys($('input'));
- this.updateTooltipAccessKeys($('label'));
- return;
- }
-
- $nodes.each(function (i) {
- var tip = $(this).attr('title');
- if (!!tip && mw.util.tooltipAccessKeyRegexp.exec(tip)) {
- tip = tip.replace(mw.util.tooltipAccessKeyRegexp, '[' + mw.util.tooltipAccessKeyPrefix + "$5]");
- $(this).attr('title', tip);
- }
- });
- },
-
- // jQuery object that refers to the page-content element
- // Populated by init()
- '$content' : null,
-
-
- /**
- * Add a link to a portlet menu on the page, such as:
- *
- * p-cactions (Content actions), p-personal (Personal tools), p-navigation (Navigation), p-tb (Toolbox)
- *
- * The first three paramters are required, others are optionals. Though
- * providing an id and tooltip is recommended.
- *
- * By default the new link will be added to the end of the list. To add the link before a given existing item,
- * pass the DOM node (document.getElementById('foobar') or the jQuery-selector ('#foobar') of that item.
- *
- * @example mw.util.addPortletLink('p-tb', 'http://mediawiki.org/', 'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org ', 'm', '#t-print')
- *
- * @param String portlet id of the target portlet ('p-cactions' or 'p-personal' etc.)
- * @param String href link URL
- * @param String text link text (will be automatically lowercased by CSS for p-cactions in Monobook)
- * @param String id id of the new item, should be unique and preferably have the appropriate prefix ('ca-', 'pt-', 'n-' or 't-')
- * @param String tooltip text to show when hovering over the link, without accesskey suffix
- * @param String accesskey accesskey to activate this link (one character, try to avoid conflicts. Use $('[accesskey=x').get() in the console to see if 'x' is already used.
- * @param mixed nextnode DOM node or jQuery-selector of the item that the new item should be added before, should be another item in the same list will be ignored if not the so
- *
- * @return Node the DOM node of the new item (a LI element, or A element for older skins) or null
- */
- 'addPortletLink' : function (portlet, href, text, id, tooltip, accesskey, nextnode) {
- var $link = $('<a />').attr('href', href).text(text);
-
- // Some skins don't have portlets
- // Just add it to the bottom of their 'sidebar' element ignoring the specified portlet target
- switch (skin) {
- case 'standard' :
- case 'cologneblue' :
- $("#quickbar").append($link.after('<br />'));
- return $link.get(0);
- case 'nostalgia' :
- $("#searchform").before($link).before(' | ');
- return $link.get(0);
- default : // chick, modern, monobook, myskin, simple, vector...
-
- var $portlet = $('#' + portlet);
- if ($portlet.length === 0) {
- return null;
- }
- var $ul = $portlet.find('ul').eq(0);
- if ($ul.length === 0) {
- if ($portlet.find('div').length === 0) {
- $portlet.append('<ul />');
- } else {
- $portlet.find('div').eq(-1).append('<ul />');
- }
- $ul = $portlet.find('ul').eq(0);
- }
- if ($ul.length === 0) {
- return null;
- }
-
- // unhide portlet if it was hidden before
- $portlet.removeClass('emptyPortlet');
-
- var $item = $link.wrap('<li><span /></li>').parent().parent();
-
- if (id) {
- $item.attr('id', id);
- }
- if (accesskey) {
- $link.attr('accesskey', accesskey);
- tooltip += ' [' + accesskey + ']';
- }
- if (tooltip) {
- $link.attr('title', tooltip);
- }
- if (accesskey && tooltip) {
- this.updateTooltipAccessKeys($link);
- }
-
- // Append using DOM-element passing
- if (nextnode && nextnode.parentNode == $ul.get(0)) {
- $(nextnode).before($item);
- } else {
- // If the jQuery selector isn't found within the <ul>, just append it at the end
- if ($ul.find(nextnode).length === 0) {
- $ul.append($item);
- } else {
- // Append using jQuery CSS selector
- $ul.find(nextnode).eq(0).before($item);
- }
- }
-
- return $item.get(0);
- }
- }
-
- };
-
- mediaWiki.util.init();
-
-})(jQuery, mediaWiki);
\ No newline at end of file
+++ /dev/null
-/*
- * mediaWiki Debug Test Suit.
- * Available on "/Special:BlankPage?action=mwutiltest&debug=true")
- */
-
-(function ($, mw) {
-
- mediaWiki.test = {
-
- /* Variables */
- '$table' : null,
- 'addedTests' : [],
-
- /* Functions */
-
- /**
- * Adds a row to the test-table
- *
- * @param String code Code of the test to be executed
- * @param String result Expected result in 'var (vartype)' form
- * @param String contain Important part of the result, if result is different but does contain this it will not return ERROR but PARTIALLY
- */
- 'addTest' : function (code, result, contain) {
- if (!contain) {
- contain = result;
- }
- this.addedTests.push([code, result, contain]);
- this.$table.append('<tr><td>' + mw.util.htmlEscape(code) + '</td><td>' + mw.util.htmlEscape(result) + '<td></td></td><td>?</td></tr>');
- },
-
- /* Initialisation */
- 'initialised' : false,
- 'init' : function () {
- if (this.initialised === false) {
- this.initialised = true;
- $(function () {
- if (wgCanonicalSpecialPageName == 'Blankpage' && mw.util.getParamValue('action') === 'mwutiltest') {
-
- // Build page
- document.title = 'mediaWiki.util JavaScript Test - ' + wgSiteName;
- $('#firstHeading').text('mediaWiki.util JavaScript Test');
- mw.util.$content.html(
- '<p>Below is a list of tests to confirm proper functionality of the mediaWiki.util functions</p>' +
- '<hr />' +
- '<table id="mw-mwutiltest-table" class="wikitable sortable"><tr><th>Exec</th><th>Should return</th><th>Does return</th><th>Equal ?</th></tr></table>'
- );
- mw.test.$table = $('table#mw-mwutiltest-table');
-
- // Populate tests
- mw.test.addTest('typeof String.prototype.trim',
- 'function (string)');
- mw.test.addTest('typeof String.prototype.trimLeft',
- 'function (string)');
- mw.test.addTest('typeof String.prototype.trimRight',
- 'function (string)');
- mw.test.addTest('typeof Array.prototype.compare',
- 'function (string)');
- mw.test.addTest('typeof Array.prototype.indexOf',
- 'function (string)');
- mw.test.addTest('4',
- '4 (number)');
- mw.test.addTest('typeof mediaWiki',
- 'object (string)');
- mw.test.addTest('typeof mw',
- 'object (string)');
- mw.test.addTest('typeof mw.util',
- 'object (string)');
- mw.test.addTest('typeof String.prototype.ucFirst',
- 'function (string)');
- mw.test.addTest('\'mediawiki\'.ucFirst()',
- 'Mediawiki (string)');
- mw.test.addTest('typeof $.fn.enableCheckboxShiftClick',
- 'function (string)');
- mw.test.addTest('typeof mw.util.rawurlencode',
- 'function (string)');
- mw.test.addTest('mw.util.rawurlencode(\'Test: A&B/Here\')',
- 'Test%3A%20A%26B%2FHere (string)');
- mw.test.addTest('typeof mw.util.getWikilink',
- 'function (string)');
- mw.test.addTest('typeof mw.util.getParamValue',
- 'function (string)');
- mw.test.addTest('mw.util.getParamValue(\'action\')',
- 'mwutiltest (string)');
- mw.test.addTest('typeof mw.util.htmlEscape',
- 'function (string)');
- mw.test.addTest('mw.util.htmlEscape(\'<a href="http://mw.org/?a=b&c=d">link</a>\')',
- '<a href="http://mw.org/?a=b&c=d">link</a> (string)');
- mw.test.addTest('typeof mw.util.htmlUnescape',
- 'function (string)');
- mw.test.addTest('mw.util.htmlUnescape(\'<a href="http://mw.org/?a=b&c=d">link</a>\')',
- '<a href="http://mw.org/?a=b&c=d">link</a> (string)');
- mw.test.addTest('typeof mw.util.tooltipAccessKeyRegexp',
- 'function (string)');
- mw.test.addTest('typeof mw.util.updateTooltipAccessKeys',
- 'function (string)');
- mw.test.addTest('typeof mw.util.addPortletLink',
- 'function (string)');
- mw.test.addTest('typeof mw.util.addPortletLink("p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print")',
- 'object (string)');
- mw.test.addTest('a = mw.util.addPortletLink("p-tb", "http://mediawiki.org/", "MediaWiki.org", "t-mworg", "Go to MediaWiki.org ", "m", "#t-print"); if(a){ a.outerHTML; }',
- '<li id="t-mworg"><span><a href="http://mediawiki.org/" accesskey="m" title="Go to MediaWiki.org [ctrl-alt-m]">MediaWiki.org</a></span></li> (string)',
- 'href="http://mediawiki.org/"');
-
- // Run tests and compare results
- var exec,
- result,
- resulttype,
- numberoftests = 0,
- numberofpasseds = 0,
- numberofpartials = 0,
- numberoferrors = 0,
- $testrows;
- $testrows = mw.test.$table.find('tr');
- $.each(mw.test.addedTests, (function (i) {
- numberoftests++;
-
- exec = mw.test.addedTests[i][0];
- shouldreturn = mw.test.addedTests[i][1];
- shouldcontain = mw.test.addedTests[i][2];
- doesreturn = eval(exec);
- doesreturn = doesreturn + ' (' + typeof doesreturn + ')';
- $thisrow = $testrows.eq(i + 1);
- $thisrow.find('> td').eq(2).text(doesreturn);
-
- if (doesreturn.indexOf(shouldcontain) !== -1) {
- if (doesreturn == shouldreturn){
- $thisrow.find('> td').eq(3).css('background', '#EFE').text('OK');
- numberofpasseds++;
- } else {
- $thisrow.find('> td').eq(3).css('background', '#FFE').html('<small>PARTIALLY</small>');
- numberofpartials++;
- }
- } else {
- $thisrow.find('> td').eq(3).css('background', '#FEE').text('ERROR');
- numberoferrors++;
- }
-
- })
- );
- mw.test.$table.before('<p><strong>Ran ' + numberoftests + ' tests. ' + numberofpasseds + ' passed test(s). ' + numberoferrors + ' error(s). ' + numberofpartials + ' partially passed test(s). </p>');
-
- }
- });
- }
- }
- };
-
- mediaWiki.test.init();
-
-})(jQuery, mediaWiki);
\ No newline at end of file
+++ /dev/null
-/*
- * JavaScript for History view
- */
-
-// Replaces histrowinit
-$( '#pagehistory li input[name=diff], #pagehistory li input[name=oldid]' ).click( diffcheck );
-diffcheck();
\ No newline at end of file
if ( action == 'watch' || action == 'unwatch' ) {
// save the accesskey from the title
var keyCommand = $link.attr( 'title' ).match( /\[.*?\]$/ ) ? $link.attr( 'title' ).match( /\[.*?\]$/ )[0] : '';
- $link.attr( 'title', mediaWiki.msg.get( 'tooltip-ca-' + action ) + ' ' + keyCommand );
+ $link.attr( 'title', mediaWiki.message( 'tooltip-ca-' + action ) + ' ' + keyCommand );
}
if ( $link.data( 'icon' ) ) {
- $link.attr( 'alt', mediaWiki.msg.get( action ) );
+ $link.attr( 'alt', mediaWiki.message( action ) );
if ( action == 'watching' || action == 'unwatching' ) {
$link.addClass( 'loading' );
} else {
$link.removeClass( 'loading' );
}
} else {
- $link.html( mediaWiki.msg.get( action ) );
+ $link.html( mediaWiki.message( action ) );
}
};
if( $link.parents( 'li' ).attr( 'id' ) == 'ca-' + action ) {
$link.parents( 'li' ).attr( 'id', 'ca-' + otheraction );
// update the link text with the new message
- $link.text( mediaWiki.msg.get( otheraction ) );
+ $link.text( mediaWiki.message( otheraction ) );
}
};
return false;
toggleLink.href = '#';
addClickHandler( toggleLink, function( evt ) { toggleToc(); return killEvt( evt ); } );
- toggleLink.appendChild( document.createTextNode( mediaWiki.msg.get( 'hidetoc' ) ) );
+ toggleLink.appendChild( document.createTextNode( mediaWiki.message( 'hidetoc' ) ) );
outerSpan.appendChild( document.createTextNode( '[' ) );
outerSpan.appendChild( toggleLink );
var toggleLink = document.getElementById( 'togglelink' );
if ( toc && toggleLink && toc.style.display == 'none' ) {
- changeText( toggleLink, mediaWiki.msg.get( 'hidetoc' ) );
+ changeText( toggleLink, mediaWiki.message( 'hidetoc' ) );
toc.style.display = 'block';
document.cookie = "hidetoc=0";
tocmain.className = 'toc';
} else {
- changeText( toggleLink, mediaWiki.msg.get( 'showtoc' ) );
+ changeText( toggleLink, mediaWiki.message( 'showtoc' ) );
toc.style.display = 'none';
document.cookie = "hidetoc=1";
tocmain.className = 'toc tochidden';