jenkins-bot has submitted this change and it was merged.

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.

Remove now-unneeded test and expand existing tests
to test language variants.

Bug: 58988
Change-Id: I706e29d554bf09393ba27523f360e5d28f4576b8
---
M javascripts/common/Page.js
M javascripts/common/PageApi.js
M javascripts/modules/languagesNew/languages.js
M templates/modules/languagesNew/LanguageOverlay.html
M tests/javascripts/common/test_PageApi.js
5 files changed, 128 insertions(+), 88 deletions(-)

Approvals:
  Jdlrobson: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/javascripts/common/Page.js b/javascripts/common/Page.js
index e5e275c..98cd720 100644
--- a/javascripts/common/Page.js
+++ b/javascripts/common/Page.js
@@ -56,12 +56,12 @@
 
                                        // FIXME: remove when Special:Languages 
link goes stable
                                        if ( !M.isBetaGroupMember() ) {
-                                               M.pageApi.getPageLanguages( 
pageTitle ).done( function( langlinks ) {
+                                               M.pageApi.getPageLanguages( 
pageTitle ).done( function( langdata ) {
                                                        var template = 
M.template.get( 'languageSection' ),
                                                                data = {
-                                                                       
langlinks: langlinks,
+                                                                       
langlinks: langdata.languages,
                                                                        
heading: mw.msg( 'mobile-frontend-language-article-heading' ),
-                                                                       
description: mw.msg( 'mobile-frontend-language-header', langlinks.length )
+                                                                       
description: mw.msg( 'mobile-frontend-language-header', 
langdata.languages.length )
                                                                };
 
                                                        $el.find( 
'#mw-mf-language-section' ).html( template.render( data ) );
diff --git a/javascripts/common/PageApi.js b/javascripts/common/PageApi.js
index 4b59e9e..52058b6 100644
--- a/javascripts/common/PageApi.js
+++ b/javascripts/common/PageApi.js
@@ -102,58 +102,88 @@
                },
 
                /**
-                * 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;
-                               } );
+               _getLanguagesFromApiResponse: function( data ) {
+                       // allAvailableLanguages is a mapping of all codes to 
language names
+                       var pages, langlinks, allAvailableLanguages = {};
+                       data.query.languages.forEach( function( item ) {
+                               allAvailableLanguages[ item.code ] = item[ '*' 
];
+                       } );
+
+                       // FIXME: API returns an object when a list makes much 
more sense
+                       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
+                */
+               _getLanguageVariantsFromApiResponse: function( title, data ) {
+                       var generalData = data.query.general,
+                               variantPath = generalData.variantarticlepath,
+                               variants = [];
+
+                       if ( !generalData.variants ) {
+                               return false;
                        }
-                       return this._languageCache;
+
+                       // Create the data object for each variant and store it
+                       generalData.variants.forEach( function( item ) {
+                               var variant = {
+                                       langname: item.name,
+                                       lang: item.code
+                               };
+                               if ( variantPath ) {
+                                       variant.url = variantPath
+                                               .replace( '$1', item.code )
+                                               .replace( '$2', title );
+                               } else {
+                                       variant.url = mw.util.getUrl( title, { 
'variant' : item.code } );
+                               }
+                               variants.push( variant );
+                       } );
+
+                       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._getLanguagesFromApiResponse( resp ),
+                                               variants: 
self._getLanguageVariantsFromApiResponse( 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>
diff --git a/tests/javascripts/common/test_PageApi.js 
b/tests/javascripts/common/test_PageApi.js
index 89074e7..5a22b2f 100644
--- a/tests/javascripts/common/test_PageApi.js
+++ b/tests/javascripts/common/test_PageApi.js
@@ -142,45 +142,7 @@
                PageApi.prototype.get.restore();
        } );
 
-       QUnit.test( '#_getAllLanguages', 2, function( assert ) {
-               sinon.stub( PageApi.prototype, 'get' ).returns( 
$.Deferred().resolve( {
-                       "query":{
-                               "languages":[
-                                       {
-                                               "code":"en",
-                                               "*":"English"
-                                       },
-                                       {
-                                               "code":"es",
-                                               "*":"espa\u00f1ol"
-                                       },
-                                       {
-                                               "code":"pl",
-                                               "*":"polski"
-                                       },
-                                       {
-                                               "code":"sr",
-                                               
"*":"\u0441\u0440\u043f\u0441\u043a\u0438 / srpski"
-                                       }
-                               ]
-                       }
-               } ) );
-
-               pageApi._getAllLanguages().done( function( resp ) {
-                       assert.deepEqual( resp, {
-                               en: "English",
-                               es: "espa\u00f1ol",
-                               pl: "polski",
-                               sr: "\u0441\u0440\u043f\u0441\u043a\u0438 / 
srpski"
-                       }, 'return languages object' );
-               } );
-               pageApi._getAllLanguages();
-               assert.ok( pageApi.get.calledOnce, 'cache languages' );
-
-               PageApi.prototype.get.restore();
-       } );
-
-       QUnit.test( '#getPageLanguages', 1, function( assert ) {
+       QUnit.test( '#getPageLanguages', 2, function( assert ) {
                sinon.stub( PageApi.prototype, 'get' ).returns( 
$.Deferred().resolve( {
                        "query":{
                                "pages":{
@@ -206,22 +168,54 @@
                                                        }
                                                ]
                                        }
-                               }
+                               },
+                               "general": {
+                                       "variants": [
+                                               {
+                                                       "code": "sr",
+                                                       "name": "sr"
+                                               },
+                                               {
+                                                       "code": "sr-ec",
+                                                       "name": 
"\u040b\u0438\u0440\u0438\u043b\u0438\u0446\u0430"
+                                               },
+                                               {
+                                                       "code": "sr-el",
+                                                       "name": "Latinica"
+                                               }
+                                       ],
+                                       "variantarticlepath": "/wiki/$1/$2",
+                               },
+                               "languages": [
+                                       {
+                                               "code": "sr",
+                                               "*": 
"\u0441\u0440\u043f\u0441\u043a\u0438 / srpski"
+                                       },
+                                       {
+                                               "code": "sr-ec",
+                                               "*": 
"\u0441\u0440\u043f\u0441\u043a\u0438 
(\u045b\u0438\u0440\u0438\u043b\u0438\u0446\u0430)\u200e"
+                                       },
+                                       {
+                                               "code": "sr-el",
+                                               "*": "srpski (latinica)\u200e"
+                                       },
+                                       {
+                                               "code": "es",
+                                               "*": "espa\u00f1ol"
+                                       },
+                                       {
+                                               "code": "pl",
+                                               "*": "polski"
+                                       }
+                               ]
                        },
                        "limits":{
                                "langlinks":500
                        }
                } ) );
 
-               sinon.stub( pageApi, '_getAllLanguages' ).returns( 
$.Deferred().resolve( {
-                       en: "English",
-                       es: "espa\u00f1ol",
-                       pl: "polski",
-                       sr: "\u0441\u0440\u043f\u0441\u043a\u0438 / srpski"
-               } ) );
-
                pageApi.getPageLanguages( 'Test' ).done( function( resp ) {
-                       assert.deepEqual( resp, [
+                       assert.deepEqual( resp.languages, [
                                {
                                        "lang":"es",
                                        
"url":"http://es.wikipedia.org/wiki/San_Francisco_(California)",
@@ -241,10 +235,27 @@
                                        langname: 
"\u0441\u0440\u043f\u0441\u043a\u0438 / srpski"
                                }
                        ], 'return augmented language links' );
+
+                       assert.deepEqual( resp.variants, [
+                               {
+                                       "lang":"sr",
+                                       "langname":"sr",
+                                       "url":"/wiki/sr/Test",
+                               },
+                               {
+                                       "lang":"sr-ec",
+                                       
"langname":"\u040b\u0438\u0440\u0438\u043b\u0438\u0446\u0430",
+                                       "url":"/wiki/sr-ec/Test",
+                               },
+                               {
+                                       "lang":"sr-el",
+                                       "langname":"Latinica",
+                                       "url":"/wiki/sr-el/Test",
+                               }
+                       ], 'return augmented language variant links' );
                } );
 
                PageApi.prototype.get.restore();
-               pageApi._getAllLanguages.restore();
        } );
 
        QUnit.test( '#getPage (html headings get stripped)', 1, function( 
assert ) {

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I706e29d554bf09393ba27523f360e5d28f4576b8
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/MobileFrontend
Gerrit-Branch: master
Gerrit-Owner: Theopolisme <[email protected]>
Gerrit-Reviewer: Jdlrobson <[email protected]>
Gerrit-Reviewer: Theopolisme <[email protected]>
Gerrit-Reviewer: jenkins-bot

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

Reply via email to