Compact links: Execute the compact strategies on need basis
We were executing all compacting strategies even when we have more than enough items as candidates. If the strategy is expensive, (performance wise) this is a problem. In this commit, we execute them one by one and stop when we have enough candidates. The methods in CompactInterlanguageList class also arranged as individual function declarations than comma seperated method list. Change-Id: Idce6489387d139852125f4448d0e192f6a7e1353
This commit is contained in:
committed by
Niklas Laxström
parent
d46be65c68
commit
d109bddf20
@@ -21,22 +21,18 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var DEFAULT_LIST_SIZE = 9;
|
var DEFAULT_LIST_SIZE = 9;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For the given array, remove duplicates
|
* Concatenate two arrays, remove duplicates
|
||||||
*
|
*
|
||||||
* @param {Array} originalArray
|
* @param {Array} a First array
|
||||||
* @return {Array} de-duplicated array
|
* @param {Array} b Second array
|
||||||
|
* @return {Array} Resulting array
|
||||||
*/
|
*/
|
||||||
function unique( originalArray ) {
|
function concatWithoutDuplicates( a, b ) {
|
||||||
var uniqueArray = [];
|
return a.concat( b.filter( function ( item ) {
|
||||||
|
return a.indexOf( item ) < 0;
|
||||||
$.each( originalArray, function ( i, v ) {
|
} ) );
|
||||||
if ( $.inArray( v, uniqueArray ) === -1 ) {
|
|
||||||
uniqueArray.push( v );
|
|
||||||
}
|
|
||||||
} );
|
|
||||||
|
|
||||||
return uniqueArray;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,330 +49,346 @@
|
|||||||
this.listSize = 0;
|
this.listSize = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CompactInterlanguageList.prototype = {
|
/**
|
||||||
/**
|
* Initialize the plugin
|
||||||
* Initialize the plugin
|
*/
|
||||||
*/
|
CompactInterlanguageList.prototype.init = function () {
|
||||||
init: function () {
|
var self = this,
|
||||||
var self = this,
|
max = this.options.max || DEFAULT_LIST_SIZE;
|
||||||
max = this.options.max || DEFAULT_LIST_SIZE;
|
|
||||||
|
|
||||||
this.interlanguageList = this.getInterlanguageList();
|
this.interlanguageList = this.getInterlanguageList();
|
||||||
this.listSize = Object.keys( this.interlanguageList ).length;
|
this.listSize = Object.keys( this.interlanguageList ).length;
|
||||||
|
|
||||||
if ( this.listSize <= max ) {
|
if ( this.listSize <= max ) {
|
||||||
// Not enough languages to compact the list
|
// Not enough languages to compact the list
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mw.loader.using( 'ext.uls.init' ).done( function () {
|
mw.loader.using( 'ext.uls.init' ).done( function () {
|
||||||
// If we're only a bit beyond max, limit to 7 instead of 9.
|
// If we're only a bit beyond max, limit to 7 instead of 9.
|
||||||
// FIXME: This assumes the max is 9.
|
// FIXME: This assumes the max is 9.
|
||||||
self.compactSize = ( self.listSize <= 12 ) ? 7 : max;
|
self.compactSize = ( self.listSize <= 12 ) ? 7 : max;
|
||||||
self.compactList = self.getCompactList();
|
self.compactList = self.getCompactList();
|
||||||
self.hideOriginal();
|
self.hideOriginal();
|
||||||
self.render();
|
self.render();
|
||||||
self.listen();
|
self.listen();
|
||||||
} );
|
} );
|
||||||
},
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render the compacted interlanguage list and triggers
|
* Render the compacted interlanguage list and triggers
|
||||||
*/
|
*/
|
||||||
render: function () {
|
CompactInterlanguageList.prototype.render = function () {
|
||||||
var language;
|
var language;
|
||||||
|
|
||||||
for ( language in this.compactList ) {
|
for ( language in this.compactList ) {
|
||||||
this.compactList[ language ].element.parentNode.style.display = '';
|
this.compactList[ language ].element.parentNode.style.display = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addTrigger();
|
this.addTrigger();
|
||||||
},
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attaches the actual selector to the trigger.
|
* Attaches the actual selector to the trigger.
|
||||||
*
|
*
|
||||||
* @param {jQuery} $trigger Element to use as trigger.
|
* @param {jQuery} $trigger Element to use as trigger.
|
||||||
*/
|
*/
|
||||||
createSelector: function ( $trigger ) {
|
CompactInterlanguageList.prototype.createSelector = function ( $trigger ) {
|
||||||
var languages,
|
var languages,
|
||||||
self = this,
|
self = this,
|
||||||
dir = $( 'html' ).prop( 'dir' ),
|
dir = $( 'html' ).prop( 'dir' ),
|
||||||
ulsLanguageList = {};
|
ulsLanguageList = {};
|
||||||
|
|
||||||
languages = $.map( this.interlanguageList, function ( language, languageCode ) {
|
languages = $.map( this.interlanguageList, function ( language, languageCode ) {
|
||||||
ulsLanguageList[ languageCode ] = language.autonym;
|
ulsLanguageList[ languageCode ] = language.autonym;
|
||||||
|
|
||||||
return languageCode;
|
return languageCode;
|
||||||
} );
|
} );
|
||||||
|
|
||||||
// Attach ULS to the trigger
|
// Attach ULS to the trigger
|
||||||
$trigger.uls( {
|
$trigger.uls( {
|
||||||
onReady: function () {
|
onReady: function () {
|
||||||
this.$menu.addClass( 'interlanguage-uls-menu' );
|
this.$menu.addClass( 'interlanguage-uls-menu' );
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* Language selection handler
|
* Language selection handler
|
||||||
*
|
*
|
||||||
* @param {string} language language code
|
* @param {string} language language code
|
||||||
*/
|
*/
|
||||||
onSelect: function ( language ) {
|
onSelect: function ( language ) {
|
||||||
self.$trigger.removeClass( 'selector-open' );
|
self.$trigger.removeClass( 'selector-open' );
|
||||||
mw.uls.addPreviousLanguage( language );
|
mw.uls.addPreviousLanguage( language );
|
||||||
location.href = self.interlanguageList[ language ].href;
|
location.href = self.interlanguageList[ language ].href;
|
||||||
},
|
},
|
||||||
onVisible: function () {
|
onVisible: function () {
|
||||||
var offset, height, width, triangleWidth;
|
var offset, height, width, triangleWidth;
|
||||||
// The panel is positioned carefully so that our pointy triangle,
|
// The panel is positioned carefully so that our pointy triangle,
|
||||||
// which is implemented as a square box rotated 45 degrees with
|
// which is implemented as a square box rotated 45 degrees with
|
||||||
// rotation origin in the middle. See the corresponding style file.
|
// rotation origin in the middle. See the corresponding style file.
|
||||||
|
|
||||||
// These are for the trigger
|
// These are for the trigger
|
||||||
offset = $trigger.offset();
|
offset = $trigger.offset();
|
||||||
width = $trigger.outerWidth();
|
width = $trigger.outerWidth();
|
||||||
height = $trigger.outerHeight();
|
height = $trigger.outerHeight();
|
||||||
|
|
||||||
// Triangle width is: Math.sqrt( 2 * Math.pow( 25, 2 ) ) / 2 =~ 17.7;
|
// Triangle width is: Math.sqrt( 2 * Math.pow( 25, 2 ) ) / 2 =~ 17.7;
|
||||||
// Box width = 24 + 1 for border.
|
// Box width = 24 + 1 for border.
|
||||||
// The resulting value is rounded up 20 to have a small space between.
|
// The resulting value is rounded up 20 to have a small space between.
|
||||||
triangleWidth = 20;
|
triangleWidth = 20;
|
||||||
|
|
||||||
if ( dir === 'rtl' ) {
|
if ( dir === 'rtl' ) {
|
||||||
this.left = offset.left - this.$menu.outerWidth() - triangleWidth;
|
this.left = offset.left - this.$menu.outerWidth() - triangleWidth;
|
||||||
} else {
|
} else {
|
||||||
this.left = offset.left + width + triangleWidth;
|
this.left = offset.left + width + triangleWidth;
|
||||||
}
|
}
|
||||||
// Offset -250px from the middle of the trigger
|
// Offset -250px from the middle of the trigger
|
||||||
this.top = offset.top + ( height / 2 ) - 250;
|
this.top = offset.top + ( height / 2 ) - 250;
|
||||||
|
|
||||||
this.$menu.css( {
|
this.$menu.css( {
|
||||||
left: this.left,
|
left: this.left,
|
||||||
top: this.top
|
top: this.top
|
||||||
} );
|
|
||||||
$trigger.addClass( 'selector-open' );
|
|
||||||
},
|
|
||||||
languageDecorator: function ( $languageLink, language ) {
|
|
||||||
var data = self.interlanguageList[ language ];
|
|
||||||
// set href and text exactly same as what was in
|
|
||||||
// interlanguage link. The ULS autonym might be different in some
|
|
||||||
// cases like sr. In ULS it is "српски", while in interlanguage links
|
|
||||||
// it is "српски / srpski"
|
|
||||||
$languageLink
|
|
||||||
.prop( 'href', data.href )
|
|
||||||
.text( data.autonym );
|
|
||||||
|
|
||||||
// This code is to support badges used in Wikimedia
|
|
||||||
$languageLink.parent().addClass( data.element.parentNode.className );
|
|
||||||
},
|
|
||||||
onCancel: function () {
|
|
||||||
$trigger.removeClass( 'selector-open' );
|
|
||||||
},
|
|
||||||
languages: ulsLanguageList,
|
|
||||||
// Show common languages
|
|
||||||
quickList: self.getCommonLanguages( languages )
|
|
||||||
} );
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bind to event handlers and listen for events
|
|
||||||
*/
|
|
||||||
listen: function () {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
this.$trigger.one( 'click', function () {
|
|
||||||
// Load the ULS now.
|
|
||||||
mw.loader.using( 'ext.uls.mediawiki' ).done( function () {
|
|
||||||
self.createSelector( self.$trigger );
|
|
||||||
self.$trigger.click();
|
|
||||||
} );
|
} );
|
||||||
|
$trigger.addClass( 'selector-open' );
|
||||||
|
},
|
||||||
|
languageDecorator: function ( $languageLink, language ) {
|
||||||
|
var data = self.interlanguageList[ language ];
|
||||||
|
// set href and text exactly same as what was in
|
||||||
|
// interlanguage link. The ULS autonym might be different in some
|
||||||
|
// cases like sr. In ULS it is "српски", while in interlanguage links
|
||||||
|
// it is "српски / srpski"
|
||||||
|
$languageLink
|
||||||
|
.prop( 'href', data.href )
|
||||||
|
.text( data.autonym );
|
||||||
|
|
||||||
|
// This code is to support badges used in Wikimedia
|
||||||
|
$languageLink.parent().addClass( data.element.parentNode.className );
|
||||||
|
},
|
||||||
|
onCancel: function () {
|
||||||
|
$trigger.removeClass( 'selector-open' );
|
||||||
|
},
|
||||||
|
languages: ulsLanguageList,
|
||||||
|
// Show common languages
|
||||||
|
quickList: self.getCommonLanguages( languages )
|
||||||
|
} );
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bind to event handlers and listen for events
|
||||||
|
*/
|
||||||
|
CompactInterlanguageList.prototype.listen = function () {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
this.$trigger.one( 'click', function () {
|
||||||
|
// Load the ULS now.
|
||||||
|
mw.loader.using( 'ext.uls.mediawiki' ).done( function () {
|
||||||
|
self.createSelector( self.$trigger );
|
||||||
|
self.$trigger.click();
|
||||||
} );
|
} );
|
||||||
},
|
} );
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the compacted interlanguage list as associative array
|
* Get the compacted interlanguage list as associative array
|
||||||
*
|
*
|
||||||
* @return {Object}
|
* @return {Object}
|
||||||
*/
|
*/
|
||||||
getCompactList: function () {
|
CompactInterlanguageList.prototype.getCompactList = function () {
|
||||||
var language, languages, compactLanguages, i,
|
var language, languages, compactLanguages, i,
|
||||||
compactedList = {};
|
compactedList = {};
|
||||||
|
|
||||||
languages = $.map( this.interlanguageList, function ( item, languageCode ) {
|
languages = $.map( this.interlanguageList, function ( item, languageCode ) {
|
||||||
return languageCode;
|
return languageCode;
|
||||||
} );
|
} );
|
||||||
|
|
||||||
compactLanguages = this.compact( languages );
|
compactLanguages = this.compact( languages );
|
||||||
|
|
||||||
for ( i = 0; i < compactLanguages.length; i++ ) {
|
for ( i = 0; i < compactLanguages.length; i++ ) {
|
||||||
language = compactLanguages[ i ];
|
language = compactLanguages[ i ];
|
||||||
compactedList[ language ] = this.interlanguageList[ language ];
|
compactedList[ language ] = this.interlanguageList[ language ];
|
||||||
}
|
}
|
||||||
|
|
||||||
return compactedList;
|
return compactedList;
|
||||||
},
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compact a given array of languages
|
* Get compacting strategies.
|
||||||
*
|
* The items will be executed in the given order till the required
|
||||||
* @param {Array} languages
|
* compact size is achieved. Each item should be an array and should
|
||||||
* @return {Array} Compacted array
|
* take the whole language list as argument.
|
||||||
*/
|
*
|
||||||
compact: function ( languages ) {
|
* @return {Function[]} Array of comacting functions
|
||||||
var compactLanguages = [];
|
*/
|
||||||
|
CompactInterlanguageList.prototype.getCompactStrategies = function () {
|
||||||
|
return [
|
||||||
|
// Add user-defined assistant languages on wikis with Translate extension.
|
||||||
|
filterByAssistantLanguages,
|
||||||
|
// Add previously selected languages.
|
||||||
|
// Previous languages are always the better suggestion
|
||||||
|
// because the user has explicitly chosen them.
|
||||||
|
filterByPreviousLanguages,
|
||||||
|
// Add all common languages to the beginning of array.
|
||||||
|
// These are the most probable languages predicted by ULS.
|
||||||
|
this.getCommonLanguages,
|
||||||
|
// Some global fallbacks to avoid showing languages in the beginning of the alphabet
|
||||||
|
getExtraCommonLanguages,
|
||||||
|
// Finally add the whole languages array too.
|
||||||
|
// We will remove duplicates and cut down to required size.
|
||||||
|
this.finalFallback
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
compactLanguages = compactLanguages.concat(
|
/**
|
||||||
// Add user-defined assistant languages on wikis with Translate extension.
|
* Compact a given array of languages
|
||||||
this.filterByAssistantLanguages( languages ),
|
*
|
||||||
|
* @param {Array} languages
|
||||||
|
* @return {Array} Compacted array
|
||||||
|
*/
|
||||||
|
CompactInterlanguageList.prototype.compact = function ( languages ) {
|
||||||
|
var i, strategies,
|
||||||
|
compactLanguages = [];
|
||||||
|
|
||||||
// Add previously selected languages.
|
strategies = this.getCompactStrategies();
|
||||||
// Previous languages are always the better suggestion
|
for ( i = 0; i < strategies.length; i++ ) {
|
||||||
// because the user has explicitly chosen them.
|
compactLanguages = concatWithoutDuplicates(
|
||||||
this.filterByPreviousLanguages( languages ),
|
compactLanguages, strategies[ i ].call( this, languages )
|
||||||
|
|
||||||
// Add all common languages to the beginning of array.
|
|
||||||
// These are the most probable languages predicted by ULS.
|
|
||||||
this.getCommonLanguages( languages ),
|
|
||||||
|
|
||||||
// Some global fallbacks to avoid showing languages in the beginning of the alphabet
|
|
||||||
this.getExtraCommonLanguages( languages ),
|
|
||||||
|
|
||||||
// Finally add the whole languages array too.
|
|
||||||
// We will remove duplicates and cut down to required size.
|
|
||||||
languages
|
|
||||||
);
|
);
|
||||||
// Remove duplicates
|
if ( compactLanguages.length >= this.compactSize ) {
|
||||||
compactLanguages = unique( compactLanguages );
|
// We have more than enough items. Stop here.
|
||||||
|
compactLanguages = compactLanguages.slice( 0, this.compactSize );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Cut to compact size and sort
|
return compactLanguages;
|
||||||
compactLanguages = compactLanguages.slice( 0, this.compactSize ).sort();
|
};
|
||||||
|
|
||||||
return compactLanguages;
|
/**
|
||||||
},
|
* Filter the language list by previous languages.
|
||||||
|
* Not all previous languages will be present in interlanguage links,
|
||||||
|
* so we are filtering them.
|
||||||
|
*
|
||||||
|
* @return {Array} List of language codes supported by the article
|
||||||
|
*/
|
||||||
|
function filterByPreviousLanguages( languages ) {
|
||||||
|
var previousLanguages = mw.uls.getPreviousLanguages();
|
||||||
|
|
||||||
/**
|
return $.grep( previousLanguages, function ( language ) {
|
||||||
* Filter the language list by previous languages.
|
return $.inArray( language, languages ) >= 0;
|
||||||
* Not all previous languages will be present in interlanguage links,
|
} );
|
||||||
* so we are filtering them.
|
}
|
||||||
*
|
|
||||||
* @return {Array} List of language codes supported by the article
|
|
||||||
*/
|
|
||||||
filterByPreviousLanguages: function ( languages ) {
|
|
||||||
var previousLanguages = mw.uls.getPreviousLanguages();
|
|
||||||
|
|
||||||
return $.grep( previousLanguages, function ( language ) {
|
/**
|
||||||
return $.inArray( language, languages ) >= 0;
|
* Filter the language list by common languages.
|
||||||
} );
|
* Common languages are the most probable languages predicted by ULS.
|
||||||
},
|
*
|
||||||
|
* @return {Array} List of language codes supported by the article
|
||||||
|
*/
|
||||||
|
function filterByCommonLanguages( languages ) {
|
||||||
|
var commonLanguages = mw.uls.getFrequentLanguageList();
|
||||||
|
|
||||||
/**
|
return $.grep( commonLanguages, function ( language ) {
|
||||||
* Filter the language list by common languages.
|
return $.inArray( language, languages ) >= 0;
|
||||||
* Common languages are the most probable languages predicted by ULS.
|
} );
|
||||||
*
|
}
|
||||||
* @return {Array} List of language codes supported by the article
|
|
||||||
*/
|
|
||||||
filterByCommonLanguages: function ( languages ) {
|
|
||||||
var commonLanguages = mw.uls.getFrequentLanguageList();
|
|
||||||
|
|
||||||
return $.grep( commonLanguages, function ( language ) {
|
/**
|
||||||
return $.inArray( language, languages ) >= 0;
|
* Filter the language list by globally common languages, i.e.
|
||||||
} );
|
* this list is not user specific.
|
||||||
},
|
*
|
||||||
|
* @return {Array} List of language codes supported by the article
|
||||||
/**
|
*/
|
||||||
* Filter the language list by globally common languages, i.e.
|
function getExtraCommonLanguages( languages ) {
|
||||||
* this list is not user specific.
|
var commonLanguages = [ 'zh', 'en', 'hi', 'ur', 'es', 'ar', 'ru', 'id', 'ms', 'pt',
|
||||||
*
|
|
||||||
* @return {Array} List of language codes supported by the article
|
|
||||||
*/
|
|
||||||
getExtraCommonLanguages: function ( languages ) {
|
|
||||||
var commonLanguages = [ 'zh', 'en', 'hi', 'ur', 'es', 'ar', 'ru', 'id', 'ms', 'pt',
|
|
||||||
'fr', 'de', 'bn', 'ja', 'pnb', 'pa', 'jv', 'te', 'ta', 'ko', 'mr', 'tr', 'vi',
|
'fr', 'de', 'bn', 'ja', 'pnb', 'pa', 'jv', 'te', 'ta', 'ko', 'mr', 'tr', 'vi',
|
||||||
'it', 'fa', 'sv', 'nl', 'pl' ];
|
'it', 'fa', 'sv', 'nl', 'pl' ];
|
||||||
|
|
||||||
return $.grep( commonLanguages, function ( language ) {
|
return $.grep( commonLanguages, function ( language ) {
|
||||||
|
return $.inArray( language, languages ) >= 0;
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter the language list by Translate's assistant languages.
|
||||||
|
* Where available, they're languages deemed useful by the user.
|
||||||
|
*
|
||||||
|
* @return {Array} List of those language codes which are supported by article
|
||||||
|
*/
|
||||||
|
function filterByAssistantLanguages( languages ) {
|
||||||
|
var assistantLanguages = mw.user.options.get( 'translate-editlangs' );
|
||||||
|
|
||||||
|
if ( assistantLanguages && assistantLanguages !== 'default' ) {
|
||||||
|
return $.grep( assistantLanguages.split( /,\s*/ ), function ( language ) {
|
||||||
return $.inArray( language, languages ) >= 0;
|
return $.inArray( language, languages ) >= 0;
|
||||||
} );
|
} );
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Filter the language list by Translate's assistant languages.
|
|
||||||
* Where available, they're languages deemed useful by the user.
|
|
||||||
*
|
|
||||||
* @return {Array} List of those language codes which are supported by article
|
|
||||||
*/
|
|
||||||
filterByAssistantLanguages: function ( languages ) {
|
|
||||||
var assistantLanguages = mw.user.options.get( 'translate-editlangs' );
|
|
||||||
|
|
||||||
if ( assistantLanguages && assistantLanguages !== 'default' ) {
|
|
||||||
return $.grep( assistantLanguages.split( /,\s*/ ), function ( language ) {
|
|
||||||
return $.inArray( language, languages ) >= 0;
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
return [];
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find out the existing languages supported
|
|
||||||
* by the article and fetch their href.
|
|
||||||
*
|
|
||||||
* @return {Object} List of existing language codes and their hrefs
|
|
||||||
*/
|
|
||||||
getInterlanguageList: function () {
|
|
||||||
var interlanguageList = {};
|
|
||||||
|
|
||||||
this.$interlanguageList.find( 'li.interlanguage-link > a' ).each( function () {
|
|
||||||
var langCode = this.getAttribute( 'lang' );
|
|
||||||
|
|
||||||
// We keep interlanguageList with redirect resolved language codes as keys.
|
|
||||||
langCode = $.uls.data.isRedirect( langCode ) || langCode;
|
|
||||||
interlanguageList[ langCode ] = {
|
|
||||||
href: this.getAttribute( 'href' ),
|
|
||||||
autonym: $( this ).text(),
|
|
||||||
element: this
|
|
||||||
};
|
|
||||||
} );
|
|
||||||
|
|
||||||
return interlanguageList;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get common languages - the most probable languages predicted by ULS.
|
|
||||||
*
|
|
||||||
* @param {Array} languages Array of all languages.
|
|
||||||
*/
|
|
||||||
getCommonLanguages: function ( languages ) {
|
|
||||||
if ( this.commonInterlanguageList === null ) {
|
|
||||||
this.commonInterlanguageList = this.filterByCommonLanguages( languages );
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.commonInterlanguageList;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hide the original interlanguage list
|
|
||||||
*/
|
|
||||||
hideOriginal: function () {
|
|
||||||
this.$interlanguageList.find( '.interlanguage-link' ).css( 'display', 'none' );
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add the trigger at the bottom of the language list
|
|
||||||
*/
|
|
||||||
addTrigger: function () {
|
|
||||||
var $trigger;
|
|
||||||
|
|
||||||
$trigger = $( '<button>' )
|
|
||||||
.addClass( 'mw-interlanguage-selector mw-ui-button' )
|
|
||||||
.prop( 'title', mw.msg( 'ext-uls-compact-link-info' ) )
|
|
||||||
.text( mw.msg(
|
|
||||||
'ext-uls-compact-link-count',
|
|
||||||
mw.language.convertNumber( this.listSize - this.compactSize )
|
|
||||||
) );
|
|
||||||
|
|
||||||
this.$interlanguageList.append( $trigger );
|
|
||||||
this.$trigger = $trigger;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find out the existing languages supported
|
||||||
|
* by the article and fetch their href.
|
||||||
|
*
|
||||||
|
* @return {Object} List of existing language codes and their hrefs
|
||||||
|
*/
|
||||||
|
CompactInterlanguageList.prototype.getInterlanguageList = function () {
|
||||||
|
var interlanguageList = {};
|
||||||
|
|
||||||
|
this.$interlanguageList.find( 'li.interlanguage-link > a' ).each( function () {
|
||||||
|
var langCode = this.getAttribute( 'lang' );
|
||||||
|
|
||||||
|
// We keep interlanguageList with redirect resolved language codes as keys.
|
||||||
|
langCode = $.uls.data.isRedirect( langCode ) || langCode;
|
||||||
|
interlanguageList[ langCode ] = {
|
||||||
|
href: this.getAttribute( 'href' ),
|
||||||
|
autonym: $( this ).text(),
|
||||||
|
element: this
|
||||||
|
};
|
||||||
|
} );
|
||||||
|
|
||||||
|
return interlanguageList;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get common languages - the most probable languages predicted by ULS.
|
||||||
|
*
|
||||||
|
* @param {Array} languages Array of all languages.
|
||||||
|
*/
|
||||||
|
CompactInterlanguageList.prototype.getCommonLanguages = function ( languages ) {
|
||||||
|
if ( this.commonInterlanguageList === null ) {
|
||||||
|
this.commonInterlanguageList = filterByCommonLanguages( languages );
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.commonInterlanguageList;
|
||||||
|
};
|
||||||
|
|
||||||
|
CompactInterlanguageList.prototype.finalFallback = function ( languages ) {
|
||||||
|
return languages;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hide the original interlanguage list
|
||||||
|
*/
|
||||||
|
CompactInterlanguageList.prototype.hideOriginal = function () {
|
||||||
|
this.$interlanguageList.find( '.interlanguage-link' ).css( 'display', 'none' );
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the trigger at the bottom of the language list
|
||||||
|
*/
|
||||||
|
CompactInterlanguageList.prototype.addTrigger = function () {
|
||||||
|
var $trigger;
|
||||||
|
|
||||||
|
$trigger = $( '<button>' )
|
||||||
|
.addClass( 'mw-interlanguage-selector mw-ui-button' )
|
||||||
|
.prop( 'title', mw.msg( 'ext-uls-compact-link-info' ) )
|
||||||
|
.text( mw.msg(
|
||||||
|
'ext-uls-compact-link-count',
|
||||||
|
mw.language.convertNumber( this.listSize - this.compactSize )
|
||||||
|
) );
|
||||||
|
|
||||||
|
this.$interlanguageList.append( $trigger );
|
||||||
|
this.$trigger = $trigger;
|
||||||
};
|
};
|
||||||
|
|
||||||
$( document ).ready( function () {
|
$( document ).ready( function () {
|
||||||
|
|||||||
Reference in New Issue
Block a user