User:Ale jrb/Scripts/userhist.js
if (histlimit === undefined) var histlimit = 40;
if (typeof histwidth === 'undefined') var histwidth = 200;
function UserHistory() {
var me = this;
this.displayBox = function(user) {
// if user is set, this name will automatically be displayed on load
if (user == null) {
user = '';
} else {
user = user.replace(/(_|%20)/gi, ' ');
user = user.replace(/(%3A)/gi, ':');
}
var box = document.createElement( 'input' );
box.setAttribute('id', 'userhist-isolate');
box.setAttribute('type', 'text');
box.setAttribute('value', user);
box.setAttribute('style', 'width: ' + histwidth + 'px');
var button = document.createElement( 'input' );
button.setAttribute('type', 'button');
button.setAttribute('value', 'Isolate history');
button.setAttribute('style', 'margin-left: 4px;');
button.addEventListener('click', function() {
userHist.getUserHist(document.getElementById('userhist-isolate').value);
}, false);
box.addEventListener('keyup', function(e) {
if (e.which === 13) {
e.preventDefault();
userHist.getUserHist(document.getElementById('userhist-isolate').value);
}
});
var span = document.createElement('span');
span.setAttribute('style','display: block; margin-top: 12px;');
span.appendChild(box);
span.appendChild(button);
document.getElementById( 'mw-history-searchform' ).parentNode.appendChild(span);
};
this.getUserHist = function(user) {
var api = 'https://en.wikipedia.org/w/api.php';
if (typeof user === 'undefined' || !user) {
return false;
}
user = user.replace(/ /g, '_');
user = user.replace(/User(:|%3A)/gi, '');
// remove useless interface
var histPar = document.getElementById('mw-history-compare');
histPar.innerHTML = 'isolating edits by ' + user + ' - please wait...';
var apiLink = '?action=query&format=xml&prop=revisions&titles='+mw.config.get('wgPageName')+'&rvprop=ids|timestamp|flags|comment|user|size&rvlimit=500&rvuser='+user+'';
this.req = new wa_ajaxcall();
this.req.requestUrl = api + apiLink;
this.req.get ( function() {
userHist.data = userHist.req.response;
userHist.showUserHist ();
return true;
} );
};
this.showUserHist = function() {
var data = this.data;
if (data.getElementsByTagName('rev').length <= 0) {
this.showError('That user has never edited this page.');
return false;
}
// get output
var output = [];
for (var i = 0; i < data.getElementsByTagName('rev').length; ++i) {
var dataset = data.getElementsByTagName('rev')[i];
output[i] = [];
output[i][0] = dataset.getAttribute('revid'); // oldid
output[i][1] = dataset.getAttribute('user'); // user
output[i][2] = dataset.getAttribute('timestamp'); // timestamp
output[i][3] = dataset.getAttribute('comment'); // comment
output[i][4] = dataset.getAttribute('size'); // size
output[i][5] = dataset.getAttribute('minor'); // minor
}
// build our own interface
var newInt = '
- ';
- (cur | prev) '+timestamp+' '+output[i][1]+' '+m+'('+output[i][4]+' bytes) '+comment+' ';
var url = 'https://en.wikipedia.org/w/index.php?title=' + mw.config.get('wgPageName');
for (var i = 0; i < output.length; i ++) {
var timestamp = me.convertTimestamp(output[i][2]);
var comment = me.parseComment(output[i][3]);
if ( output[i][5] != null ) { var m = 'm '; } else { var m = ''; }
newInt = newInt + '
}
newInt += '
var histPar = document.getElementById('mw-history-compare');
histPar.innerHTML = newInt;
};
this.showError = function(errorMessage) {
var container = document.getElementById('mw-history-compare');
container.innerHTML = 'userhist error: ' + errorMessage + '';
return true;
};
this.convertTimestamp = function(timestamp) {
var regTest = /([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z/g;
regTest.lastIndex = 0;
time = regTest.exec(timestamp);
if (time == null) return 'failed to parse timestamp';
var d = new Date();
var hourOffset = (d.getTimezoneOffset() / 60) * -1;
var h = parseInt( time[4], 10 ) + hourOffset;
if (h < 10 ) h = '0' + h;
var months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
var month = parseInt(time[2], 10);
var newStamp = h + ':' + time[5] + ', ' + time[3] + ' ' + months[month-1] + ' ' + time[1];
return newStamp;
};
this.parseComment = function(comment) {
if (comment == null) return '';
comment = comment.replace('/*', '→');
comment = comment.replace('*/', '');
comment = comment.replace(/\[\[(.+?)(#.+?)?(?:\|(.+?))\]\]/g, "$3");
comment = comment.replace(/\[\[(.+?)(#.+?)?\]\]/g, "$1");
comment = '(' + comment + ')';
return comment;
};
this.manageSize = function() {
var regTest = /class="history-size">\(([,0-9]+?) +?bytes\)<\/span>/ig, regMatch;
var col = { 'add': '#006400', 'remove': '#8b0000' }, results = [], i = 0;
while (regMatch = regTest.exec(document.getElementById('pagehistory').innerHTML)) {
results [ i ++ ] = parseInt(regMatch [1].replace(',', ''), 10);
if (i > histlimit) break;
}
for (var i = 0, l = results.length; i < (l - 1); ++i) {
var addition = results [i] - results [i + 1];
if (addition === 0) { var rep = '0'; } else
if (addition < 0) { var rep = '' + addition + ''; } else { var rep = '+' + addition + ''; }
document.getElementById('pagehistory').innerHTML = document.getElementById('pagehistory').innerHTML.replace(/class="history-size">\(([,0-9]+?) +?bytes\)<\/span>/i, "class=\"historysize\">(" + rep + ", $1 bytes)");
}
};
this.init = function() {
if (mw.config.get('wgAction') == 'history' && mw.config.get('wgArticleId')) {
if ( ( window.location.href.indexOf('&isolate=') > -1) && (window.location.href.indexOf('&offset=') == -1) && (window.location.href.indexOf('&limit=') == -1)) {
var user = window.location.href.substr(window.location.href.indexOf('&isolate=') + 9);
me.getUserHist(user);
} else {
//me.manageSize (); - FIXME: prevents the history diff selectors from working correctly
var user = '';
}
me.displayBox(user);
} else if ((mw.config.get('wgAction') == 'view') && (mw.config.get('wgCanonicalSpecialPageName') == 'Contributions') && (mw.config.exists('wgRelevantUserName'))) {
var user = mw.config.get('wgRelevantUserName');
user = mw.util.isIPAddress(user) ? user : 'User:' + user;
var list = $('.mw-changeslist-history');
list.each(function(idx, el) {
var span = document.createElement('span');
span.innerHTML = "all";
el.parentNode.parentNode.insertBefore(span, null);
});
}
};
}
importScript('User:Ale_jrb/Scripts/waLib.js');
var userHist = new UserHistory();
$(userHist.init);