Theopolisme has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/104168


Change subject: Add support for language variants in LanguageOverlay
......................................................................

Add support for language variants in LanguageOverlay

Also consolidate API requests so that only one is
necessary to get langage and language variant data.

Bug: 58988
Change-Id: I706e29d554bf09393ba27523f360e5d28f4576b8
---
M javascripts/common/PageApi.js
M javascripts/modules/languagesNew/languages.js
M templates/modules/languagesNew/LanguageOverlay.html
3 files changed, 61 insertions(+), 36 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MobileFrontend 
refs/changes/68/104168/1

diff --git a/javascripts/common/PageApi.js b/javascripts/common/PageApi.js
index 4b59e9e..394dcc1 100644
--- a/javascripts/common/PageApi.js
+++ b/javascripts/common/PageApi.js
@@ -102,58 +102,84 @@
                },
 
                /**
-                * Gathers a mapping of all available language codes on the 
site and their human readable names
+                * Gets language list for a page; helper function for 
getPageLanguages()
                 *
-                * @return {jQuery.Deferred} where argument is a javascript 
object with language codes as keys
+                * @param  {object} data Data from API
+                * @return {array} List of language objects
                 */
-               _getAllLanguages: function() {
-                       if ( !this._languageCache ) {
-                               this._languageCache = this.get( {
-                                       action: 'query',
-                                       meta: 'siteinfo',
-                                       siprop: 'languages'
-                               } ).then( function( data ) {
-                                       var languages = {};
-                                       data.query.languages.forEach( function( 
item ) {
-                                               languages[ item.code ] = item[ 
'*' ];
-                                       } );
-                                       return languages;
-                               } );
+               _getLanguagesFromData: function( data ) {
+                       // allAvailableLanguages is a mapping of all codes to 
language names
+                       var allAvailableLanguages = {};
+                       data.query.languages.forEach( function( item ) {
+                               allAvailableLanguages[ item.code ] = item[ '*' 
];
+                       } );
+
+                       // FIXME: API returns an object when a list makes much 
more sense
+                       var pages = $.map( data.query.pages, function( v ) { 
return v; } ),
+                       // FIXME: "|| []" wouldn't be needed if API was more 
consistent
+                       langlinks = pages[0] ? pages[0].langlinks || [] : [];
+
+                       langlinks.forEach( function( item, i ) {
+                               langlinks[ i ].langname = 
allAvailableLanguages[ item.lang ];
+                       } );
+
+                       return langlinks;
+               },
+
+               /**
+                * Gets language variant list for a page; helper function for 
getPageLanguages()
+                *
+                * @param  {string} title Name of the page to obtain variants 
for
+                * @param  {object} data Data from API
+                * @return {array} List of language variant objects
+                */
+               _getLanguageVariantsFromData: function( title, data ) {
+                       var generalData = data.query.general,
+                               variantPath = generalData.variantarticlepath,
+                               variants = [];
+
+                       // Fallback if variant path not set
+                       if ( !variantPath ) {
+                               variantPath = mw.util.getUrl( title, { 
'variant' : '' } ) + '$1';
                        }
-                       return this._languageCache;
+
+                       // Create the data object for each variant and store it
+                       generalData.variants.forEach( function( item ) {
+                               variants.push( {
+                                       langname: item.name,
+                                       lang: item.code,
+                                       url: variantPath
+                                               .replace( '$1', item.code )
+                                               .replace( '$2', title )
+                               } );
+                       } );
+
+                       return variants;
                },
 
                /**
                 * Retrieve available languages for a given title
                 *
-                * FIXME: Return language variants as well. Requires an 
upstream change.
-                *
                 * @param {string} title the title of the page languages should 
be retrieved for
-                * @return {jQuery.Deferred} which is called with a mapping of 
language codes to language names
+                * @return {jQuery.Deferred} which is called with an object 
containing langlinks and variant links
                 */
                getPageLanguages: function( title ) {
                        var self = this, result = $.Deferred();
 
-                       this._getAllLanguages().done( function( 
allAvailableLanguages ) {
-                               self.get( {
+                       self.get( {
                                        action: 'query',
+                                       meta: 'siteinfo',
+                                       siprop: 'general|languages',
                                        prop: 'langlinks',
                                        llurl: true,
                                        lllimit: 'max',
                                        titles: title
                                } ).done( function( resp ) {
-                                       // FIXME: API returns an object when a 
list makes much more sense
-                                       var pages = $.map( resp.query.pages, 
function( v ) { return v; } ),
-                                       // FIXME: "|| []" wouldn't be needed if 
API was more consistent
-                                       langlinks = pages[0] ? 
pages[0].langlinks || [] : [];
-
-                                       langlinks.forEach( function( item, i ) {
-                                               langlinks[ i ].langname = 
allAvailableLanguages[ item.lang ];
+                                       result.resolve( {
+                                               languages: 
self._getLanguagesFromData( resp ),
+                                               variants: 
self._getLanguageVariantsFromData( title, resp )
                                        } );
-
-                                       result.resolve( langlinks );
                                } ).fail( $.proxy( result, 'reject' ) );
-                       } );
 
                        return result;
                }
diff --git a/javascripts/modules/languagesNew/languages.js 
b/javascripts/modules/languagesNew/languages.js
index ca04175..239999e 100644
--- a/javascripts/modules/languagesNew/languages.js
+++ b/javascripts/modules/languagesNew/languages.js
@@ -17,11 +17,10 @@
                                        loadingOverlay = new LoadingOverlay();
                                loadingOverlay.show();
 
-                               // FIXME: Once getPageLanguages() can return 
language variants,
-                               // pass these to languageOverlay as well.
-                               M.pageApi.getPageLanguages( mw.config.get( 
'wgPageName' ) ).done( function ( langlinks ) {
+                               M.pageApi.getPageLanguages( mw.config.get( 
'wgPageName' ) ).done( function ( data ) {
                                        var languageOverlay = new 
LanguageOverlay( {
-                                                       languages: langlinks
+                                                       languages: 
data.languages,
+                                                       variants: data.variants
                                                } );
                                        loadingOverlay.hide();
                                        languageOverlay.show();
diff --git a/templates/modules/languagesNew/LanguageOverlay.html 
b/templates/modules/languagesNew/LanguageOverlay.html
index b79ba1a..ef90450 100644
--- a/templates/modules/languagesNew/LanguageOverlay.html
+++ b/templates/modules/languagesNew/LanguageOverlay.html
@@ -6,7 +6,7 @@
 <ul class="page-list">
        {{#variants}}
                <li>
-                       <a href="{{url}}" hreflang="{{lang}}" 
lang="{{lang}}"><span>{{langname}}</span>{{#*}} ({{*}}){{/*}}</a>
+                       <a href="{{url}}" hreflang="{{lang}}" 
lang="{{lang}}">{{langname}}</a>
                </li>
        {{/variants}}
 </ul>

-- 
To view, visit https://gerrit.wikimedia.org/r/104168
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I706e29d554bf09393ba27523f360e5d28f4576b8
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MobileFrontend
Gerrit-Branch: master
Gerrit-Owner: Theopolisme <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to