2016-07-25 13:35:41 +00:00
|
|
|
( function ( mw, $ ) {
|
|
|
|
/**
|
|
|
|
* @param {string} apiUrl
|
|
|
|
* @constructor
|
|
|
|
*/
|
|
|
|
var Api = function ( apiUrl ) {
|
|
|
|
this.url = apiUrl;
|
|
|
|
};
|
|
|
|
|
|
|
|
$.extend( Api.prototype, {
|
|
|
|
url: '',
|
|
|
|
|
2016-06-27 14:00:13 +00:00
|
|
|
/**
|
|
|
|
* Fetches a batch of revision data, including a gender setting for users who edited the revision
|
|
|
|
*
|
|
|
|
* @param {string} pageName
|
|
|
|
* @param {Object} options - Options containing callbacks for `success` and `error` as well as
|
|
|
|
* optional fields for: `dir (defaults to `older`), `limit` (defaults to 500), `startId`, `endId`,
|
|
|
|
* `knownUserGenders`
|
|
|
|
*/
|
|
|
|
fetchRevisionData: function ( pageName, options ) {
|
|
|
|
var self = this;
|
|
|
|
this.fetchRevisions( pageName, options )
|
|
|
|
.done( function ( data ) {
|
|
|
|
var revs = data.query.pages[ 0 ].revisions,
|
|
|
|
/*jshint -W024 */
|
|
|
|
revContinue = data.continue,
|
|
|
|
/*jshint +W024 */
|
|
|
|
genderData = typeof options.knownUserGenders !== 'undefined' ? options.knownUserGenders : {},
|
|
|
|
userNames;
|
|
|
|
|
|
|
|
if ( !revs ) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
userNames = self.getUserNames( revs, genderData );
|
|
|
|
|
|
|
|
self.fetchUserGenderData( userNames )
|
|
|
|
.done( function ( data ) {
|
|
|
|
var users = typeof data !== 'undefined' ? data.query.users : [];
|
|
|
|
|
|
|
|
if ( users.length > 0 ) {
|
|
|
|
$.extend( genderData, self.getUserGenderData( users, genderData ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
revs.forEach( function ( rev ) {
|
|
|
|
if ( typeof rev.user !== 'undefined' && typeof genderData[ rev.user ] !== 'undefined' ) {
|
|
|
|
rev.userGender = genderData[ rev.user ];
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
options.success( { revisions: revs, 'continue': revContinue } );
|
|
|
|
} )
|
|
|
|
.fail( options.error );
|
|
|
|
} )
|
|
|
|
.fail( options.error );
|
|
|
|
},
|
|
|
|
|
2016-07-25 13:35:41 +00:00
|
|
|
/**
|
|
|
|
* Fetches up to 500 revisions at a time
|
|
|
|
*
|
2016-06-27 14:00:13 +00:00
|
|
|
* @param {string} pageName
|
|
|
|
* @param {Object} options object containing optional options, fields: `dir` (defaults to `older`),
|
|
|
|
* `limit` (defaults to 500), `startId`, `endId`
|
|
|
|
* @return {jQuery}
|
2016-07-25 13:35:41 +00:00
|
|
|
*/
|
2016-06-27 14:00:13 +00:00
|
|
|
fetchRevisions: function ( pageName, options ) {
|
|
|
|
var dir = options.dir !== undefined ? options.dir : 'older',
|
|
|
|
data = {
|
2016-07-25 13:35:41 +00:00
|
|
|
action: 'query',
|
|
|
|
prop: 'revisions',
|
|
|
|
format: 'json',
|
|
|
|
rvprop: 'ids|timestamp|user|comment|parsedcomment|size|flags',
|
2016-06-27 14:00:13 +00:00
|
|
|
titles: pageName,
|
2016-07-25 13:35:41 +00:00
|
|
|
formatversion: 2,
|
|
|
|
'continue': '',
|
2016-06-27 14:00:13 +00:00
|
|
|
rvlimit: 500,
|
|
|
|
rvdir: dir
|
|
|
|
};
|
|
|
|
|
|
|
|
if ( options.startId !== undefined ) {
|
|
|
|
data.rvstartid = options.startId;
|
|
|
|
}
|
|
|
|
if ( options.endId !== undefined ) {
|
|
|
|
data.rvendid = options.endId;
|
|
|
|
}
|
|
|
|
if ( options.limit !== undefined && options.limit <= 500 ) {
|
|
|
|
data.rvlimit = options.limit;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $.ajax( {
|
|
|
|
url: this.url,
|
|
|
|
data: data
|
2016-07-25 13:35:41 +00:00
|
|
|
} );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Fetches gender data for up to 500 user names
|
|
|
|
*
|
2016-06-27 14:00:13 +00:00
|
|
|
* @param {string[]} users
|
|
|
|
* @return {jQuery}
|
2016-07-25 13:35:41 +00:00
|
|
|
*/
|
2016-06-27 14:00:13 +00:00
|
|
|
fetchUserGenderData: function ( users ) {
|
|
|
|
if ( users.length === 0 ) {
|
|
|
|
return $.Deferred().resolve();
|
|
|
|
}
|
|
|
|
return $.ajax( {
|
2016-07-25 13:35:41 +00:00
|
|
|
url: this.url,
|
|
|
|
data: {
|
|
|
|
action: 'query',
|
|
|
|
list: 'users',
|
|
|
|
format: 'json',
|
|
|
|
usprop: 'gender',
|
2016-06-27 14:00:13 +00:00
|
|
|
ususers: users.join( '|' ),
|
2016-07-25 13:35:41 +00:00
|
|
|
uslimit: 500
|
2016-06-27 14:00:13 +00:00
|
|
|
}
|
|
|
|
} );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Array} revs
|
|
|
|
* @param {Object} knownUserGenders
|
|
|
|
* @return {string[]}
|
|
|
|
*/
|
|
|
|
getUserNames: function ( revs, knownUserGenders ) {
|
|
|
|
var allUsers = revs.map( function ( rev ) {
|
|
|
|
return typeof rev.user !== 'undefined' ? rev.user : '';
|
|
|
|
} );
|
|
|
|
return allUsers.filter( function ( value, index, array ) {
|
|
|
|
return value !== '' && typeof knownUserGenders[ value ] === 'undefined' && array.indexOf( value ) === index;
|
|
|
|
} );
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Array} data
|
|
|
|
* @return {Object}
|
|
|
|
*/
|
|
|
|
getUserGenderData: function ( data ) {
|
|
|
|
var genderData = {},
|
|
|
|
usersWithGender = data.filter( function ( item ) {
|
|
|
|
return typeof item.gender !== 'undefined' && item.gender !== 'unknown';
|
|
|
|
} );
|
|
|
|
usersWithGender.forEach( function ( item ) {
|
|
|
|
genderData[ item.name ] = item.gender;
|
2016-07-25 13:35:41 +00:00
|
|
|
} );
|
2016-06-27 14:00:13 +00:00
|
|
|
return genderData;
|
2016-07-25 13:35:41 +00:00
|
|
|
}
|
|
|
|
} );
|
|
|
|
|
|
|
|
mw.libs.revisionSlider = mw.libs.revisionSlider || {};
|
|
|
|
mw.libs.revisionSlider.Api = Api;
|
|
|
|
}( mediaWiki, jQuery ) );
|