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