3,319
edits
(that apparently broke the rollback links...) |
(update per enwiki) |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1:
// <nowiki>
(function($) {
Line 19:
Twinkle.fluff = {
spanTag: function(color, content) {
var span = document.createElement('span');
span.style.color = color;
span.appendChild(document.createTextNode(content));
return span;
},
buildLink: function(color, text) {
var link = document.createElement('a');
link.appendChild(Twinkle.fluff.spanTag('Black', '['));
link.appendChild(Twinkle.fluff.spanTag(color, text));
link.appendChild(Twinkle.fluff.spanTag('Black', ']'));
return link;
},
auto: function() {
if
// not latest revision
alert("Can't rollback, page has changed in the meantime.");
Line 26 ⟶ 41:
}
var vandal = $(
Twinkle.fluff.revert(
},
contributions: function() {
// $('sp-contributions-footer-anon-range') relies on the fmbox
// id in [[MediaWiki:Sp-contributions-footer-anon-range]] and
// is used to show rollback/vandalism links for IP ranges
if
// Get the username these contributions are for
var username = mw.config.get('wgRelevantUserName');
if
(
(
var list = $(
var revNode = document.createElement('strong');
var revLink =
revNode.appendChild(revLink);
var revVandNode = document.createElement('strong');
var revVandLink =
revVandNode.appendChild(revVandLink);
list.each(function(key, current) {
var href = $(current).find(
current.appendChild(
var tmpNode = revNode.cloneNode(
tmpNode.firstChild.setAttribute(
current.appendChild(
current.appendChild(
tmpNode = revVandNode.cloneNode(
tmpNode.firstChild.setAttribute(
current.appendChild(
});
}
}
},
diff: function() {
// Add a [restore this revision] link to the older revision
// Don't show if there's a single revision or weird diff (cur on latest)
if (mw.config.get('wgDiffOldId') && (mw.config.get('wgDiffOldId') !== mw.config.get('wgDiffNewId'))) {
var revertToRevision = document.createElement('div');
revertToRevision.setAttribute(
revertToRevision.style.fontWeight = 'bold';
var revertToRevisionLink =
revertToRevisionLink.href =
$(revertToRevisionLink).click(function() {
Twinkle.fluff.revertToRevision(
});
var otitle = document.getElementById('mw-diff-otitle1').parentNode;
otitle.insertBefore(revertToRevision, otitle.firstChild);
}
// Add either restore or rollback links to the newer revision
// Don't show if there's a single revision or weird diff (prev on first)
if (document.getElementById('differences-nextlink')) {
// Not latest revision
var revertToRevisionNLink = Twinkle.fluff.buildLink('SaddleBrown', 'restore this version');
revertToRevisionNLink.href = '#';
$(revertToRevisionNLink).click(function() {
Twinkle.fluff.revertToRevision(mw.config.get('wgDiffNewId').toString());
});
revertToRevisionN.appendChild(revertToRevisionNLink);
ntitle.insertBefore(revertToRevisionN, ntitle.firstChild);
} else if (Twinkle.getPref('showRollbackLinks').indexOf('diff') !== -1 && mw.config.get('wgDiffOldId') && (mw.config.get('wgDiffOldId') !== mw.config.get('wgDiffNewId') || document.getElementById('differences-prevlink'))) {
var vandal = $('#mw-diff-ntitle2').find('a').first().text();
revertNode.setAttribute('id', 'tw-revert');
var agfLink = Twinkle.fluff.buildLink('DarkOliveGreen', 'rollback (AGF)');
var vandLink = Twinkle.fluff.buildLink('Red', 'rollback (VANDAL)');
vandLink.href = '#';
normLink.href = '#';
$(agfLink).click(function() {
Twinkle.fluff.revert('agf', vandal);
});
$(vandLink).click(function() {
Twinkle.fluff.revert('vand', vandal);
});
$(normLink).click(function() {
Twinkle.fluff.revert('norm', vandal);
});
revertNode.appendChild(document.createTextNode(' || '));
revertNode.appendChild(vandNode);
ntitle.insertBefore(revertNode, ntitle.firstChild);
}
},
oldid: function() { // Add a [restore this revision] link on old revisions
revertToRevision.setAttribute('id', 'tw-revert-to-orevision');
revertToRevision.style.fontWeight = 'bold';
var revertToRevisionLink = Twinkle.fluff.buildLink('SaddleBrown', 'restore this version');
revertToRevisionLink.href = '#';
$(revertToRevisionLink).click(function() {
Twinkle.fluff.revertToRevision(mw.config.get('wgRevisionId').toString());
});
revertToRevision.appendChild(revertToRevisionLink);
var otitle = document.getElementById('mw-revision-info').parentNode;
otitle.insertBefore(revertToRevision, otitle.firstChild);
}
};
Twinkle.fluff.revert = function revertPage(
if (mw.util.isIPv6Address(vandal)) {
vandal = Morebits.sanitizeIPv6(vandal);
Line 208 ⟶ 182:
var revid = rev || mw.config.get('wgCurRevisionId');
Morebits.status.init(
$(
var params = {
Line 226 ⟶ 200:
'intoken': 'edit'
};
var wikipedia_api = new Morebits.wiki.api(
wikipedia_api.params = params;
wikipedia_api.post();
};
Twinkle.fluff.revertToRevision = function revertToRevision(
Morebits.status.init(
var query = {
'action': 'query',
'prop': ['info',
'titles': mw.config.get('wgPageName'),
'rvlimit': 1,
Line 245 ⟶ 219:
'format': 'xml'
};
var wikipedia_api = new Morebits.wiki.api(
wikipedia_api.params = { rev: oldrev };
wikipedia_api.post();
};
Twinkle.fluff.userIpLink = function(
return (mw.util.isIPAddress(user) ?
};
Twinkle.fluff.callbacks = {
toRevision: {
main: function(
var xmlDoc = self.responseXML;
var lastrevid = parseInt(
var touched = $(xmlDoc).find('page').attr('touched');
var starttimestamp = $(xmlDoc).find('page').attr('starttimestamp');
Line 267 ⟶ 241:
if (revertToRevID !== self.params.rev) {
self.statitem.error(
return;
}
var optional_summary = prompt(
if (optional_summary === null) {
self.statelem.error('Aborted by user.');
return;
}
var summary = Twinkle.fluff.formatSummary(
var query = {
Line 288 ⟶ 261:
'basetimestamp': touched,
'starttimestamp': starttimestamp,
'watchlist': Twinkle.getPref('watchRevertedPages').indexOf(
'minor': Twinkle.getPref('markRevertedPagesAsMinor').indexOf(
};
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice =
var wikipedia_api = new Morebits.wiki.api(
wikipedia_api.params = self.params;
wikipedia_api.post();
Line 301 ⟶ 274:
}
},
main: function(
var xmlDoc = self.responseXML;
var lastrevid = parseInt(
var touched = $(xmlDoc).find('page').attr('touched');
var starttimestamp = $(xmlDoc).find('page').attr('starttimestamp');
Line 312 ⟶ 285:
var revs = $(xmlDoc).find('rev');
if (
self.statelem.error(
return;
}
var top = revs[0];
if (
Morebits.status.error(
return;
}
var index = 1;
if (
Morebits.status.warn(
if (
switch (
case 'vand':
Morebits.status.info(
break;
case 'agf':
Morebits.status.warn(
return;
default:
Morebits.status.warn(
return;
}
} else if (self.params.type === 'vand' &&
Twinkle.fluff.whiteList.indexOf(top.getAttribute('user')) !== -1 && revs.length > 1 &&
Morebits.status.info('Info', [ 'Latest revision was made by ', Morebits.htmlNode('strong', lastuser), ', a trusted bot, and the revision before was made by our vandal, so we will proceed with the revert.' ]);
index = 2;
} else {
Morebits.status.error(
return;
}
Line 349 ⟶ 321:
}
if
switch (
case 'vand':
Morebits.status.info(
index = 2;
self.params.user = revs[1].getAttribute(
break;
case 'agf':
Morebits.status.warn(
return;
case 'norm':
/* falls through */
default:
var cont = confirm(
if (
Morebits.status.info(
index = 2;
self.params.user = revs[1].getAttribute(
} else {
Morebits.status.warn(
}
break;
}
}
Line 376 ⟶ 348:
var count = 0;
for
++count;
if
found = i;
break;
Line 384 ⟶ 356:
}
if (
self.statelem.error(
return;
}
if (
Morebits.status.error(
return;
}
var good_revision = revs[
var userHasAlreadyConfirmedAction = false;
if (self.params.type !== 'vand' && count > 1) {
if (
Morebits.status.info(
return;
}
Line 406 ⟶ 378:
self.params.count = count;
self.params.goodid = good_revision.getAttribute(
self.params.gooduser = good_revision.getAttribute(
self.statelem.status(
var summary, extra_summary;
switch (
case 'agf':
extra_summary = prompt(
if (extra_summary === null) {
self.statelem.error('Aborted by user.');
return;
userHasAlreadyConfirmedAction = true;
summary = Twinkle.fluff.formatSummary(
break;
case 'vand':
summary =
self.params.user +
self.params.gooduser + Twinkle.getPref('summaryAd');
break;
case 'norm':
/* falls through */
default:
if (
extra_summary = prompt(
if (extra_summary === null) {
self.statelem.error('Aborted by user.');
return;
userHasAlreadyConfirmedAction = true;
}
summary = Twinkle.fluff.formatSummary(
break;
}
if (Twinkle.getPref('confirmOnFluff') && !userHasAlreadyConfirmedAction && !confirm(
self.statelem.error(
return;
}
var query;
if
Twinkle.getPref('openTalkPage').indexOf(
mw.config.get('wgUserName') !== self.params.user
Morebits.status.info(
query = {
Line 472 ⟶ 442:
};
switch (
case 'tab':
window.open(
break;
case 'blank':
window.open(
'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800'
break;
case 'window':
/* falls through */
default:
window.open(
'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800'
break;
}
}
Line 494 ⟶ 464:
if ((Morebits.userIsInGroup('reviewer') || Morebits.userIsInGroup('sysop')) &&
$flagged.length &&
$flagged.attr(
$flagged.attr(
self.params.reviewRevert = true;
self.params.edittoken = edittoken;
Line 509 ⟶ 479:
'basetimestamp': touched,
'starttimestamp': starttimestamp,
'watchlist'
'minor': Twinkle.getPref('markRevertedPagesAsMinor').indexOf(
};
Morebits.wiki.actionCompleted.redirect = self.params.pagename;
Morebits.wiki.actionCompleted.notice =
var wikipedia_api = new Morebits.wiki.api(
wikipedia_api.params = self.params;
wikipedia_api.post();
Line 528 ⟶ 498:
if (blacklist) {
var code = document.createElement('code');
code.style.fontFamily =
code.appendChild(document.createTextNode(blacklist));
apiobj.statelem.error(['Could not rollback, because the URL ', code, ' is on the spam blacklist.']);
} else if (
apiobj.statelem.error(
} else if (
apiobj.statelem.error('The edit was disallowed by the edit filter rule "' + $edit.attr('info').substring(17) + '".');
} else if (
var div = document.createElement('div');
div.className =
div.style.fontWeight =
div.style.color =
div.innerHTML = $edit.attr('warning');
apiobj.statelem.error([ 'The following warning was returned by the edit filter: ', div, 'If you wish to proceed with the rollback, please reload this page (F5 or Ctrl+R) and carry it out again. This warning will not appear a second time.' ]);
} else if ($edit.attr('nochange') === '') {
apiobj.statelem.warn(
} else {
apiobj.statelem.info(
// review the revert, if needed
Line 576 ⟶ 546:
// a contributions or contributions+talk link if it doesn't push the edit summary
// over the 255-byte limit
var resultLen = unescape(encodeURIComponent(result.replace(
var contribsLink =
var contribsLen = unescape(encodeURIComponent(contribsLink)).length;
if (resultLen + contribsLen <= 255) {
var talkLink =
if (resultLen + contribsLen + unescape(encodeURIComponent(talkLink)).length <= 255) {
result = Morebits.string.safeReplace(result,
} else {
result = Morebits.string.safeReplace(result,
}
} else {
result = Morebits.string.safeReplace(result,
}
Line 594 ⟶ 564:
Twinkle.fluff.init = function twinklefluffinit() {
if (Twinkle.userAuthorized) {
// A list of usernames, usually only bots, that vandalism revert is jumped over; that is,
// if vandalism revert was chosen on such username, then its target is on the revision before.
Line 606 ⟶ 575:
];
if (
// Return if the user can't edit the page in question
if (!mw.config.get('wgIsProbablyEditable')) {
alert("Unable to edit the page, it's probably protected.");
} else {
Twinkle.fluff.auto();
}
} else if (mw.config.get('wgCanonicalSpecialPageName') === 'Contributions') {
Twinkle.fluff.contributions();
} else if (mw.config.get('wgIsProbablyEditable')) {
// Only proceed if the user can actually edit the page
// in question (ignored for contributions, see #632).
// wgIsProbablyEditable should take care of
// namespace/contentModel restrictions as well as
// explicit protections; it won't take care of
// cascading or TitleBlacklist restrictions
if (mw.config.get('wgDiffNewId') || mw.config.get('wgDiffOldId')) { // wgDiffOldId included for clarity in if else loop [[phab:T214985]]
mw.hook('wikipage.diff').add(function () { // Reload alongside the revision slider
Twinkle.fluff.diff();
});
} else if (mw.config.get('wgAction') === 'view' && mw.config.get('wgCurRevisionId') !== mw.config.get('wgRevisionId')) {
Twinkle.fluff.oldid();
}
}
}
Line 616 ⟶ 604:
// </nowiki>
|