Documentation may be created at User:Majr/fileNuke.js/doc.
Note: After saving, you have to bypass your browser's cache to see the changes.
Google Chrome, Firefox, Microsoft Edge, and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button.
For details and instructions about other browsers, see Wikipedia:Bypass your cache.
mw.loader.using( 'mediawiki.api', function() {
'use strict';
var api = new mw.Api();
var $galleryList = $( '#gallery-list' );
var deleteFiles = function( files, reason, count ) {
if ( count === undefined ) {
count = 0;
} else if ( $galleryList.length ) {
var $textbox = $galleryList.children( 'textarea' );
$textbox.prop( 'value', function( $, text ) {
return text.replace( files[count - 1], '' ).replace( /\n+/g, '\n' ).trim();
} );
$textbox[0].scrollTop = 0;
}
if ( !files[count] ) {
return;
}
api.get( {
action: 'query',
list: 'backlinks',
blredirect: true,
bltitle: files[count]
} ).then( function( data ) {
var backlinks = data.query.backlinks;
if ( backlinks.length > 1 || ( backlinks.length === 1 && backlinks[0].title !== files[count] ) ) {
console.info( 'Skipped:', files[count] );
mw.notify( 'Skipped: ' + files[count] );
return;
}
var deleteReq = api.postWithToken( 'csrf', {
action: 'delete',
title: files[count],
reason: reason
} );
return deleteReq.then( null, function( code, data ) {
// File was probably deleted, check if it's now missing
if ( code === 'http' && data.textStatus === 'timeout' ) {
return api.get( {
action: 'query',
titles: files[count],
formatversion: 2
} ).then( function( data ) {
if ( !data.query.pages[0].missing ) {
// Still there... return original error
return deleteReq;
}
} );
}
return this;
} ).done( function() {
console.info( 'Deleted:', files[count] );
mw.notify( 'Deleted: ' + files[count] );
} );
} ).then( function() {
deleteFiles( files, reason, count + 1 );
}, function( code, data ) {
handleError( code, data, files[count] );
} );
};
var handleError = function( code, data, file ) {
var title, text;
if ( code === 'http' ) {
if ( data.textStatus === 'error' ) {
text = 'Connection error';
} else {
title = 'HTTP error';
text = data.textStatus;
}
} else {
title = 'API error';
text = data.error.info;
}
console.error( text + ':', file );
mw.notify( [ text + '<br>' + file ], { title: title, autoHide: false } );
};
if ( $galleryList.length ) {
$galleryList
.append( $( '<button>' ).addClass( 'mw-ui-button mw-ui-destructive delete' ).text( 'Delete' ) )
.append( $( '<input>' ).addClass( 'mw-ui-input reason' ).css( {
display: 'block',
width: '100%',
boxSizing: 'border-box',
marginTop: '1px'
} ).val( 'Unused file' ) );
$galleryList.find( '.delete' ).click( function() {
var reason = $galleryList.find( '.reason' ).val();
deleteFiles( $galleryList.find( 'textarea' ).val().split( '\n' ), reason );
} );
}
} );