مستخدم:Salam32/twinklefluff.js: الفرق بين النسختين

تم إزالة 21٬392 بايت ، ‏ قبل 10 سنوات
ط
لا يوجد ملخص تحرير
ط
/**
TwinkleConfig.userTalkPageMode may take arguments:
'window': open a new window, remmenberremember the opened window
'tab': opens in a new tab, if possible.
'blank': force open in a new window, even if a such window exist
}
 
if( wgNam
if( wgNamespaceNumber == -1 && wgCanonicalSpecialPageName == "Contributions" ) {
//Get the username these contributions are for
username = document.evaluate( 'substring-after(//div[@id="contentSub"]//a[@title="Special:Log"][last()]/@href, "user=")', document, null, XPathResult.STRING_TYPE, null).stringValue;
if( TwinkleConfig.showRollbackLinks.indexOf('contribs') != -1 || ( wgUserName != username && TwinkleConfig.showRollbackLinks.indexOf('others') != -1 ) || ( wgUserName == username && TwinkleConfig.showRollbackLinks.indexOf('mine') != -1 ) ) {
var list1 = document.evaluate( '//div[@id="bodyContent"]//ul/li/span[contains(span[@class="mw-uctop"], "(أعلى)")]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
var list2 = document.evaluate( '//div[@id="bodyContent"]//ul/li[contains(span[@class="mw-uctop"], "(أعلى)")]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null );
var vandal = document.evaluate( '//div[@id="contentSub"]/a[1]/@title', document, null, XPathResult.STRING_TYPE, null ).stringValue.replace(/^User( talk)?:/ , '').replace("'", "\\'");
 
var revNode = document.createElement('strong');
var revLink = document.createElement('a');
revLink.appendChild( spanTag( 'Black', ' [' ) );
revLink.appendChild( spanTag( 'SteelBlue', 'استرجاع' ) );
revLink.appendChild( spanTag( 'Black', ']' ) );
revNode.appendChild(revLink);
 
var revVandNode = document.createElement('strong');
var revVandLink = document.createElement('a');
revVandLink.appendChild( spanTag( 'Black', ' [' ) );
revVandLink.appendChild( spanTag( 'Red', 'تخريب' ) );
revVandLink.appendChild( spanTag( 'Black', ']' ) );
revVandNode.appendChild(revVandLink);
 
for(var i = 0; i < list1.snapshotLength; ++i ) {
var current = list1.snapshotItem(i);
 
var href = document.evaluate( 'a[2]/@href', current, null, XPathResult.STRING_TYPE, null ).stringValue;
var tmpNode = revNode.cloneNode( true );
tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'twinklerevert': 'norm' } ) );
current.appendChild( tmpNode );
var tmpNode = revVandNode.cloneNode( true );
tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'twinklerevert': 'vand' } ) );
current.appendChild( tmpNode );
}
 
for(var i = 0; i < list2.snapshotLength; ++i ) {
var current = list2.snapshotItem(i);
 
var href = document.evaluate( 'a[2]/@href', current, null, XPathResult.STRING_TYPE, null ).stringValue;
var tmpNode = revNode.cloneNode( true );
tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'twinklerevert': 'norm' } ) );
current.appendChild( tmpNode );
var tmpNode = revVandNode.cloneNode( true );
tmpNode.firstChild.setAttribute( 'href', href + '&' + QueryString.create( { 'twinklerevert': 'vand' } ) );
current.appendChild( tmpNode );
}
}
} else {
if( wgCanonicalSpecialPageName == "Special:Undelete" ) {
//You can't rollback deleted pages!
return;
}
 
 
var body = document.getElementById('bodyContent');
 
var firstRev = document.evaluate( 'boolean(/div[@class="firstrevisionheader"])', body, null, XPathResult.BOOLEAN_TYPE, null ).booleanValue;
if( firstRev ) {
// we have first revision here, nothing to do.
return;
}
 
try {
var otitle1 = document.getElementById('mw-diff-otitle1');
var ntitle1 = document.getElementById('mw-diff-ntitle1');
if (!otitle1 || !ntitle1) return;
var otitle = otitle1.parentNode;
var ntitle = ntitle1.parentNode;
} catch( e ) {
// no old, nor new title, nothing to do really, return;
return;
}
 
var old_rev_url = document.evaluate( '//div[@id="mw-diff-otitle1"]//strong/a/@href', document, null, XPathResult.STRING_TYPE, null ).stringValue;
 
// Lets first add a [edit this revision] link
var query = new QueryString( old_rev_url.split( '?', 2 )[1] );
 
var oldrev = query.get( 'oldid' );
 
var revertToRevision = document.createElement('div');
revertToRevision.setAttribute( 'id', 'tw-revert-to-revision' );
revertToRevision.style.fontWeight = 'bold';
 
var revertToRevisionLink = revertToRevision.appendChild( document.createElement('a') );
revertToRevisionLink.href = "javascript:twinklefluff.revertToRevision('" + oldrev + "')";
revertToRevisionLink.appendChild( spanTag( 'Black', '[' ) );
revertToRevisionLink.appendChild( spanTag( 'SaddleBrown', 'استرجع هذه النسخة' ) );
revertToRevisionLink.appendChild( spanTag( 'Black', ']' ) );
 
otitle.insertBefore( revertToRevision, otitle.firstChild );
 
if( document.getElementById('differences-nextlink') ) {
// Not latest revision
curVersion = false;
 
var new_rev_url = document.evaluate( '//div[@id="mw-diff-ntitle1"]//strong/a/@href', document, null, XPathResult.STRING_TYPE, null ).stringValue;
var query = new QueryString( new_rev_url.split( '?', 2 )[1] );
var newrev = query.get( 'oldid' );
var revertToRevision = document.createElement('div');
revertToRevision.setAttribute( 'id', 'tw-revert-to-nrevision' );
revertToRevision.style.fontWeight = 'bold';
var revertToRevisionLink = revertToRevision.appendChild( document.createElement('a') );
revertToRevisionLink.href = "javascript:twinklefluff.revertToRevision('" + newrev + "')";
revertToRevisionLink.appendChild( spanTag( 'Black', '[' ) );
revertToRevisionLink.appendChild( spanTag( 'SaddleBrown', 'restore this version' ) );
revertToRevisionLink.appendChild( spanTag( 'Black', ']' ) );
ntitle.insertBefore( revertToRevision, ntitle.firstChild );
 
return;
}
if( TwinkleConfig.showRollbackLinks.indexOf('diff') != -1 ) {
vandal = document.evaluate( 'a', document.getElementById('mw-diff-ntitle2') , null, XPathResult.STRING_TYPE, null ).stringValue.replace("'", "\\'");
 
var revertNode = document.createElement('div');
revertToRevision.setAttribute( 'id', 'tw-revert' );
 
var agfNode = document.createElement('strong');
var vandNode = document.createElement('strong');
var normNode = document.createElement('strong');
 
var agfLink = document.createElement('a');
var vandLink = document.createElement('a');
var normLink = document.createElement('a');
 
agfLink.href = "javascript:twinklefluff.revert('agf' , '" + vandal + "')";
vandLink.href = "javascript:twinklefluff.revert('vand' , '" + vandal + "')";
normLink.href = "javascript:twinklefluff.revert('norm' , '" + vandal + "')";
 
agfLink.appendChild( spanTag( 'Black', '[' ) );
agfLink.appendChild( spanTag( 'DarkOliveGreen', 'استرجاع (نية حسنة)' ) );
agfLink.appendChild( spanTag( 'Black', ']' ) );
 
vandLink.appendChild( spanTag( 'Black', '[' ) );
vandLink.appendChild( spanTag( 'Red', 'استرجاع (مخرب)' ) );
vandLink.appendChild( spanTag( 'Black', ']' ) );
 
normLink.appendChild( spanTag( 'Black', '[' ) );
normLink.appendChild( spanTag( 'SteelBlue', 'استرجاع' ) );
normLink.appendChild( spanTag( 'Black', ']' ) );
 
agfNode.appendChild(agfLink);
vandNode.appendChild(vandLink);
normNode.appendChild(normLink);
 
revertNode.appendChild( agfNode );
revertNode.appendChild( document.createTextNode(' || ') );
revertNode.appendChild( normNode );
revertNode.appendChild( document.createTextNode(' || ') );
revertNode.appendChild( vandNode );
 
ntitle.insertBefore( revertNode, ntitle.firstChild );
}
}
}
}
 
twinklefluff.revert = function revertPage( type, vandal, rev, page ) {
 
wgPageName = page || wgPageName;
wgCurRevisionId = rev || wgCurRevisionId;
 
Status.init( document.getElementById('bodyContent') );
var params = {
type: type,
user: vandal
}
var query = {
'action': 'query',
'prop': 'revisions',
'titles': wgPageName,
'rvlimit': 50, // max possible
'rvprop': [ 'ids', 'timestamp', 'user', 'comment' ]
}
var wikipedia_api = new Wikipedia.api( 'يتم سحب بيانات المراجعة الأقدم', query, twinklefluff.callbacks.main );
wikipedia_api.params = params;
wikipedia_api.post();
}
 
twinklefluff.revertToRevision = function revertToRevision( oldrev ) {
 
Status.init( document.getElementById('bodyContent') );
 
var query = {
'action': 'query',
'prop': 'revisions',
'titles': wgPageName,
'rvlimit': 1,
'rvstartid': oldrev,
'rvprop': [ 'ids', 'timestamp', 'user', 'comment', 'content' ],
'format': 'xml'
}
 
var wikipedia_api = new Wikipedia.api( 'جلب بيانات المراجعة الأقدم', query, twinklefluff.callbacks.toRevision.main );
wikipedia_api.params = { rev: oldrev };
wikipedia_api.post();
}
 
twinklefluff.callbacks = {
toRevision: {
main: function( self ) {
var xmlDoc = self.responseXML;
self.params.revision = xmlDoc.evaluate('//rev', xmlDoc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue;
var query = {
'title': wgPageName,
'action': 'submit'
};
var wikipedia_wiki = new Wikipedia.wiki( 'يجري استرجاع الصفحة', query, twinklefluff.callbacks.toRevision.reverting );
wikipedia_wiki.params = self.params;
wikipedia_wiki.get();
 
},
reverting: function( self ) {
var form = self.responseXML.getElementById( 'editform' );
var text = self.params.revision.textContent;
 
if( !form ) {
self.statelem.error( 'couldn\'t grab element "editform", aborting, this could indicate failed response from the server' );
return;
}
 
var optional_summary = prompt( "حدد سبب للاسترجاع لو سمحت" );
if (optional_summary == null)
{
self.statelem.error( 'تم الإيقاف من قبل المستخدم.' );
return;
}
var summary = sprintf( "تم الاسترجاع إلى المراجعة %d بواسطة [[Special:Contributions/%s|%2$s]]%s.%s",
self.params.revision.getAttribute( 'revid' ),
self.params.revision.getAttribute( 'user' ),
optional_summary ? "; " + optional_summary : '',
TwinkleConfig.summaryAd
);
var postData = {
'wpMinoredit': TwinkleConfig.markRevertedPagesAsMinor.indexOf( 'torev' ) != -1 ? '' : undefined,
'wpWatchthis': TwinkleConfig.watchRevertedPages.indexOf( 'torev' ) != -1 ? '' : form.wpWatchthis.checked ? '' : undefined,
'wpStarttime': form.wpStarttime.value,
'wpEdittime': form.wpEdittime.value,
'wpAutoSummary': form.wpAutoSummary.value,
'wpEditToken': form.wpEditToken.value,
'wpSection': '',
'wpSummary': summary,
'wpTextbox1': text
};
Wikipedia.actionCompleted.redirect = wgPageName;
Wikipedia.actionCompleted.notice = "اكتمل الاسترجاع"
 
self.post( postData );
}
},
main: function( self ) {
 
var xmlDoc = self.responseXML;
var revs = xmlDoc.evaluate( '//rev', xmlDoc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
 
if( revs.snapshotLength < 1 ) {
self.statitem.error( 'We have less than one additional revision, thus impossible to revert' );
return;
}
var top = revs.snapshotItem(0);
if( top.getAttribute( 'revid' ) < wgCurRevisionId ) {
Status.error( 'خطأ', [ 'The received top revision id ', htmlNode( 'strong', top.getAttribute('revid') ), ' is less than our current revision id, this could indicate that the current revision has been deleted, the server is lagging, or that bad data has been received. Will stop proceeding at this point.' ] );
return;
}
var index = 1;
if( wgCurRevisionId != top.getAttribute('revid') ) {
Status.warn( 'تحذير', [ 'إن المراجعة الأخيرة ', htmlNode( 'strong', top.getAttribute('revid') ), ' لا تساوي المراجعة الحالية ', htmlNode( 'strong', wgCurRevisionId) ] );
if( top.getAttribute( 'user' ) == self.params.user ) {
switch( self.params.type ) {
case 'vand':
Status.info( 'ملاحظة', [ 'تم القيام بآخر تعديل من قبل ', htmlNode( 'strong', self.params.user ) , ', as we assume vandalism, we continue to revert' ]);
break;
case 'agf':
Status.warn( 'تحذير', [ 'تم القيام بآخر تعديل من قبل ', htmlNode( 'strong', self.params.user ) , ', as we assume good faith, we stop reverting, as the problem might have been fixed.' ]);
return;
default:
Status.warn( 'ملاحظة', [ 'تم القيام بآخر تعديل من قبل ', htmlNode( 'strong', self.params.user ) , ', but we will stop reverting anyway.' ] );
return;
}
}
else if(
self.params.type == 'vand' &&
WHITELIST.indexOf( top.getAttribute( 'user' ) ) != -1 && revs.snapshotLength > 1 &&
revs.snapshotItem(1).getAttribute( 'pageId' ) == wgCurRevisionId
) {
Status.info( 'ملاحظة', [ 'تم القيام بآخر تعديل من قبل ', htmlNode( 'strong', top.getAttribute( 'user' ) ), ', a trusted bot, and the revision before was made by our vandal, so we proceed with the revert.' ] );
index = 2;
} else {
Status.error( 'خطأ', [ 'تم القيام بآخر تعديل من قبل ', htmlNode( 'strong', top.getAttribute( 'user' ) ), ', لذا يحتمل أنه قام بالاسترجاع، يتم إيقاف الاسترجاع.'] );
return;
}
 
}
 
if( WHITELIST.indexOf( self.params.user ) != -1 ) {
switch( self.params.type ) {
case 'vand':
Status.info( 'ملاحظة', [ 'Vandalism revert was chosen on ', htmlNode( 'strong', self.params.user ), ', as this is a whitelisted bot, we assume you wanted to revert vandalism made by the previous user instead.' ] );
index = 2;
vandal = revs.snapshotItem(1).getAttribute( 'user' );
self.params.user = revs.snapshotItem(1).getAttribute( 'user' );
break;
case 'agf':
Status.warn( 'ملاحظة', [ 'Good faith revert was chosen on ', htmlNode( 'strong', self.params.user ), ', as this is a whitelisted bot, it makes no sense at all to revert it as a good faith edit, will stop reverting.' ] );
return;
 
break;
case 'norm':
default:
var cont = confirm( 'Normal revert was chosen, but the top user (' + self.params.user + ') is a whitelisted bot, do you want to revert the revision before instead?' );
if( cont ) {
Status.info( 'ملاحظة', [ 'Normal revert was chosen on ', htmlNode( 'strong', self.params.user ), ', as this is a whitelisted bot, and per confirm, we\'ll revert the previous revision instead.' ] );
index = 2;
self.params.user = revs.snapshotItem(1).getAttribute( 'user' );
} else {
Status.warn( 'ملاحظة', [ 'Normal revert was chosen on ', htmlNode( 'strong', self.params.user ), ', this is a whitelisted bot, but per confirmation, revert on top revision will proceed.' ] );
}
break;
}
}
var found = false;
var count = 0;
 
for( var i = index; i < revs.snapshotLength; ++i ) {
++count;
if( revs.snapshotItem(i).getAttribute( 'user' ) != self.params.user ) {
found = i;
break;
}
}
 
 
if( ! found ) {
self.statelem.error( [ 'لم يتم العثور على مساهم أقدم، لعل ', htmlNode( 'strong', self.params.user ), ' هو المساهم الوحيد، أو قام بأكثر من ' + TwinkleConfig.revertMaxRevisions + ' تحرير متتالي.' ] );
return;
 
}
 
if( count == 0 ) {
Status.error( 'خطأ', "We were to revert zero revisions. As that makes no sense, we'll stop reverting this time. It could be that the edit already have been reverted, but the revision id was still the same." );
return;
}
 
var good_revision = revs.snapshotItem( found );
 
if(
self.params.type != 'vand' &&
count > 1 &&
!confirm( self.params.user + ' قام بـ ' + count + ' تعديل متتالي. هل أنت متأكد من أنك تريد الاسترجاع؟' )
) {
Status.info( 'ملاحظة', 'تم إيقاف الاسترجاع بطلب من المستخدم' );
return;
}
 
self.params.count = count;
 
self.params.goodid = good_revision.getAttribute( 'revid' );
self.params.gooduser = good_revision.getAttribute( 'user' );
 
 
self.statelem.status( [ ' مراجعة ', htmlNode( 'strong', good_revision.getAttribute( 'revid' ) ), ' التي تمت قبل ', htmlNode( 'strong', count ), ' مراجعات من قبل ', htmlNode( 'strong', good_revision.getAttribute( 'user' ) ) ] );
 
var query = {
'action': 'query',
'prop': 'revisions',
'titles': wgPageName,
'rvlimit': 1,
'rvprop': 'content',
'rvstartid': good_revision.getAttribute( 'revid' )
}
 
var wikipedia_api = new Wikipedia.api( [ 'جلب محتوى المراجعة ', htmlNode( 'strong', good_revision.getAttribute( 'revid' ) ) ], query, twinklefluff.callbacks.grabbing );
wikipedia_api.params = self.params;
wikipedia_api.post();
},
grabbing: function( self ) {
 
xmlDoc = self.responseXML;
 
self.params.content = xmlDoc.evaluate( '//rev[1]', xmlDoc, null, XPathResult.STRING_TYPE, null ).stringValue;
 
var query = {
'title': wgPageName,
'action': 'submit'
};
var wikipedia_wiki = new Wikipedia.wiki( 'يجري استرجاع الصفحة', query, twinklefluff.callbacks.reverting );
wikipedia_wiki.params = self.params;
wikipedia_wiki.get();
},
reverting: function( self ) {
var doc = self.responseXML;
 
var form = doc.getElementById( 'editform' );
if( !form ) {
self.statelem.error( 'couldn\'t grab element "editform", aborting, this could indicate failed response from the server' );
return;
}
 
var text = self.params.content;
if( !text ) {
self.statelem.error( 'we received no revision, something is wrong, bailing out!' );
return;
}
 
var summary;
 
switch( self.params.type ) {
case 'agf':
var extra_summary = prompt( "يمكنك ترك تعليق في ملخص التعديل إذا أردت:" );
if (extra_summary == null)
{
self.statelem.error( 'تم الإيقاف من قبل المستخدم.' );
return;
}
summary = sprintf( "تم استرجاع التعديلات ذات [[ويكيبيديا:افترض حسن النية|النية الحسنة]] بواسطة [[Special:Contributions/%s|%1$s]]%s.%s",
self.params.user.replace("\\'", "'"),
extra_summary ? "; " + extra_summary.toUpperCaseFirstChar() : '',
TwinkleConfig.summaryAd
);
break;
case 'vand':
summary = sprintf( "تم استرجاع %d %s بواسطة [[Special:Contributions/%s|%3$s]] إلى آخر مراجعة بواسطة [[User:%s|%4$s]].%s لأنها [[ويكيبيديا:تخريب|تخريب]]",
self.params.count,
self.params.count > 1 ? 'تعديل': 'تعديل',
self.params.user.replace("\\'", "'"),
self.params.gooduser.replace("\\'", "'"),
TwinkleConfig.summaryAd
);
break;
case 'norm':
if( TwinkleConfig.offerReasonOnNormalRevert ) {
var extra_summary = prompt( "يمكنك ترك تعليق في ملخص التعديل إذا أردت:" );
if (extra_summary == null)
{
self.statelem.error( 'تم الإيقاف من قبل المستخدم.' );
return;
}
}
summary = sprintf( "تم استرجاع %d %s بواسطة [[Special:Contributions/%s|%3$s]]%s.%s",
self.params.count,
self.params.count > 1 ? 'تعديل': 'تعديل',
self.params.user.replace("\\'", "'"),
extra_summary ? "; " + extra_summary.toUpperCaseFirstChar() : '',
TwinkleConfig.summaryAd
);
}
 
if( TwinkleConfig.openTalkPage.indexOf( self.params.type ) != -1 ) {
Status.info( 'ملاحظة', [ 'يتم فتح صفحة نقاش المستخدم ', htmlNode( 'strong', self.params.user ) ] );
var query = {
'title': 'User talk:' + self.params.user,
'action': 'edit',
'preview': 'yes',
'vanarticle': wgPageName.replace(/_/g, ' '),
'vanarticlerevid': wgCurRevisionId,
'vanarticlegoodrevid': self.params.goodid,
'type': self.params.type,
'count': self.params.count
}
 
switch( TwinkleConfig.userTalkPageMode ) {
case 'tab':
window.open( wgServer + wgScriptPath + '/index.php?' + QueryString.create( query ), '_tab' );
break;
case 'blank':
window.open( wgServer + wgScriptPath + '/index.php?' + QueryString.create( query ), '_blank', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
break;
case 'window':
default:
window.open( wgServer + wgScriptPath + '/index.php?' + QueryString.create( query ), 'twinklewarnwindow', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
break;
}
}
 
var postData = {
'wpMinoredit': TwinkleConfig.markRevertedPagesAsMinor.indexOf( self.params.type ) != -1 ? '' : undefined,
'wpWatchthis': TwinkleConfig.watchRevertedPages.indexOf( self.params.type ) != -1 ? '' : form.wpWatchthis.checked ? '' : undefined,
'wpStarttime': form.wpStarttime.value,
'wpEdittime': form.wpEdittime.value,
'wpAutoSummary': form.wpAutoSummary.value,
'wpEditToken': form.wpEditToken.value,
'wpSection': '',
'wpSummary': summary,
'wpTextbox1': text
};
 
Wikipedia.actionCompleted.redirect = wgPageName;
Wikipedia.actionCompleted.notice = "اكتمل الاسترجاع"
 
self.post( postData );
}
}
}
 
addOnloadHook( function() {
if( QueryString.exists( 'twinklerevert' ) ) {
twinklefluff.auto();
} else {
twinklefluff.normal();
}
}
);