<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://informatiestandaarden.test-nictiz.nl/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinkledelimages.js</id>
	<title>MediaWiki:Gadget-twinkledelimages.js - Bewerkingsoverzicht</title>
	<link rel="self" type="application/atom+xml" href="https://informatiestandaarden.test-nictiz.nl/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinkledelimages.js"/>
	<link rel="alternate" type="text/html" href="https://informatiestandaarden.test-nictiz.nl/index.php?title=MediaWiki:Gadget-twinkledelimages.js&amp;action=history"/>
	<updated>2026-04-23T18:49:50Z</updated>
	<subtitle>Bewerkingsoverzicht voor deze pagina op de wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://informatiestandaarden.test-nictiz.nl/index.php?title=MediaWiki:Gadget-twinkledelimages.js&amp;diff=3295&amp;oldid=prev</id>
		<title>Ahenket: 1 versie: Twinkle</title>
		<link rel="alternate" type="text/html" href="https://informatiestandaarden.test-nictiz.nl/index.php?title=MediaWiki:Gadget-twinkledelimages.js&amp;diff=3295&amp;oldid=prev"/>
		<updated>2013-07-19T18:37:38Z</updated>

		<summary type="html">&lt;p&gt;1 versie: Twinkle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nieuwe pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;//&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(function($){&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
****************************************&lt;br /&gt;
*** twinkledelimages.js: Batch deletion of images (sysops only)&lt;br /&gt;
****************************************&lt;br /&gt;
* Mode of invocation:     Tab (&amp;quot;Deli-batch&amp;quot;)&lt;br /&gt;
* Active on:              Existing non-special pages&lt;br /&gt;
* Config directives in:   TwinkleConfig&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
Twinkle.delimages = function twinkledeli() {&lt;br /&gt;
	if( mw.config.get( &amp;#039;wgNamespaceNumber&amp;#039; ) &amp;lt; 0 || !mw.config.get( &amp;#039;wgCurRevisionId&amp;#039; ) ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if( Morebits.userIsInGroup( &amp;#039;sysop&amp;#039; ) ) {&lt;br /&gt;
		Twinkle.addPortletLink( Twinkle.delimages.callback, &amp;quot;Deli-batch&amp;quot;, &amp;quot;tw-deli&amp;quot;, &amp;quot;Delete files found on page&amp;quot; );&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.delimages.unlinkCache = {};&lt;br /&gt;
Twinkle.delimages.callback = function twinkledeliCallback() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow( 800, 400 );&lt;br /&gt;
	Window.setTitle( &amp;quot;Batch file deletion&amp;quot; );&lt;br /&gt;
	Window.setScriptName( &amp;quot;Twinkle&amp;quot; );&lt;br /&gt;
	Window.addFooterLink( &amp;quot;Twinkle help&amp;quot;, &amp;quot;WP:TW/DOC#delimages&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm( Twinkle.delimages.callback.evaluate );&lt;br /&gt;
	form.append( {&lt;br /&gt;
		type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
		list: [&lt;br /&gt;
			{&lt;br /&gt;
				label: &amp;#039;Delete files&amp;#039;,&lt;br /&gt;
				name: &amp;#039;delete_image&amp;#039;,&lt;br /&gt;
				value: &amp;#039;delete&amp;#039;,&lt;br /&gt;
				checked: true&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				label: &amp;#039;Unlink uses of this file&amp;#039;,&lt;br /&gt;
				name: &amp;#039;unlink_image&amp;#039;,&lt;br /&gt;
				value: &amp;#039;unlink&amp;#039;,&lt;br /&gt;
				checked: true&lt;br /&gt;
			}&lt;br /&gt;
		]&lt;br /&gt;
	} );&lt;br /&gt;
	form.append( {&lt;br /&gt;
		type: &amp;#039;textarea&amp;#039;,&lt;br /&gt;
		name: &amp;#039;reason&amp;#039;,&lt;br /&gt;
		label: &amp;#039;Reason: &amp;#039;&lt;br /&gt;
	} );&lt;br /&gt;
	var query;&lt;br /&gt;
	if( mw.config.get( &amp;#039;wgNamespaceNumber&amp;#039; ) === 14 ) {  // Category:&lt;br /&gt;
		query = {&lt;br /&gt;
			&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
			&amp;#039;generator&amp;#039;: &amp;#039;categorymembers&amp;#039;,&lt;br /&gt;
			&amp;#039;gcmtitle&amp;#039;: mw.config.get( &amp;#039;wgPageName&amp;#039; ),&lt;br /&gt;
			&amp;#039;gcmnamespace&amp;#039;: 6,  // File:&lt;br /&gt;
			&amp;#039;gcmlimit&amp;#039; : Twinkle.getPref(&amp;#039;deliMax&amp;#039;), &lt;br /&gt;
			&amp;#039;prop&amp;#039;: [ &amp;#039;imageinfo&amp;#039;, &amp;#039;categories&amp;#039;, &amp;#039;revisions&amp;#039; ],&lt;br /&gt;
			&amp;#039;grvlimit&amp;#039;: 1,&lt;br /&gt;
			&amp;#039;grvprop&amp;#039;: [ &amp;#039;user&amp;#039; ]&lt;br /&gt;
		};&lt;br /&gt;
	} else {&lt;br /&gt;
		query = {&lt;br /&gt;
			&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
			&amp;#039;generator&amp;#039;: &amp;#039;images&amp;#039;,&lt;br /&gt;
			&amp;#039;titles&amp;#039;: mw.config.get( &amp;#039;wgPageName&amp;#039; ),&lt;br /&gt;
			&amp;#039;prop&amp;#039;: [ &amp;#039;imageinfo&amp;#039;, &amp;#039;categories&amp;#039;, &amp;#039;revisions&amp;#039; ],&lt;br /&gt;
			&amp;#039;gimlimit&amp;#039;: &amp;#039;max&amp;#039;&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api( &amp;#039;Grabbing files&amp;#039;, query, function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
		var images = $(xmlDoc).find(&amp;#039;page[imagerepository=&amp;quot;local&amp;quot;]&amp;#039;);&lt;br /&gt;
		var list = [];&lt;br /&gt;
&lt;br /&gt;
		$.each(images, function() {&lt;br /&gt;
			var $self = $(this);&lt;br /&gt;
			var image = $self.attr(&amp;#039;title&amp;#039;);&lt;br /&gt;
			var user = $self.find(&amp;#039;imageinfo ii&amp;#039;).attr(&amp;#039;user&amp;#039;);&lt;br /&gt;
			var last_edit = $self.find(&amp;#039;revisions rev&amp;#039;).attr(&amp;#039;user&amp;#039;);&lt;br /&gt;
			var disputed = $self.find(&amp;#039;categories cl[title=&amp;quot;Category:Contested candidates for speedy deletion&amp;quot;]&amp;#039;).size() &amp;gt; 0;&lt;br /&gt;
			list.push( {&lt;br /&gt;
				&amp;#039;label&amp;#039;: image + &amp;#039; - author: &amp;#039; + user + &amp;#039;, last edit from: &amp;#039; + last_edit + ( disputed ? &amp;#039; DISPUTED&amp;#039; : &amp;#039;&amp;#039; ),&lt;br /&gt;
				&amp;#039;value&amp;#039;: image,&lt;br /&gt;
				&amp;#039;checked&amp;#039;: !disputed&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		self.params.form.append({&lt;br /&gt;
			type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
			name: &amp;#039;images&amp;#039;,&lt;br /&gt;
			list: list&lt;br /&gt;
		});&lt;br /&gt;
		self.params.form.append( { type:&amp;#039;submit&amp;#039; } );&lt;br /&gt;
&lt;br /&gt;
		var result = self.params.form.render();&lt;br /&gt;
		self.params.Window.setContent( result );&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	wikipedia_api.params = { form:form, Window:Window };&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
	var root = document.createElement( &amp;#039;div&amp;#039; );&lt;br /&gt;
	Morebits.status.init( root );&lt;br /&gt;
	Window.setContent( root );&lt;br /&gt;
	Window.display();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.delimages.currentDeleteCounter = 0;&lt;br /&gt;
Twinkle.delimages.currentUnlinkCounter = 0;&lt;br /&gt;
Twinkle.delimages.currentdeletor = 0;&lt;br /&gt;
Twinkle.delimages.callback.evaluate = function twinkledeliCallbackEvaluate(event) {&lt;br /&gt;
	var images = event.target.getChecked( &amp;#039;images&amp;#039; );&lt;br /&gt;
	var reason = event.target.reason.value;&lt;br /&gt;
	var delete_image = event.target.delete_image.checked;&lt;br /&gt;
	var unlink_image = event.target.unlink_image.checked;&lt;br /&gt;
	if( ! reason ) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled( false );&lt;br /&gt;
	Morebits.status.init( event.target );&lt;br /&gt;
&lt;br /&gt;
	function toCall( work ) {&lt;br /&gt;
		if( work.length === 0 &amp;amp;&amp;amp; Twinkle.delimages.currentDeleteCounter &amp;lt;= 0 &amp;amp;&amp;amp; Twinkle.delimages.currentUnlinkCounter &amp;lt;= 0 ) {&lt;br /&gt;
			window.clearInterval( Twinkle.delimages.currentdeletor );&lt;br /&gt;
			Morebits.wiki.removeCheckpoint();&lt;br /&gt;
			return;&lt;br /&gt;
		} else if( work.length !== 0 &amp;amp;&amp;amp; Twinkle.delimages.currentDeleteCounter &amp;lt;= Twinkle.getPref(&amp;#039;batchDeleteMinCutOff&amp;#039;) &amp;amp;&amp;amp; Twinkle.delimages.currentUnlinkCounter &amp;lt;= Twinkle.getPref(&amp;#039;batchDeleteMinCutOff&amp;#039;) ) {&lt;br /&gt;
			Twinkle.delimages.unlinkCache = []; // Clear the cache&lt;br /&gt;
			var images = work.shift();&lt;br /&gt;
			Twinkle.delimages.currentDeleteCounter = images.length;&lt;br /&gt;
			Twinkle.delimages.currentUnlinkCounter = images.length;&lt;br /&gt;
			var i;&lt;br /&gt;
			for( i = 0; i &amp;lt; images.length; ++i ) {&lt;br /&gt;
				var image = images[i];&lt;br /&gt;
				var query = {&lt;br /&gt;
					&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
					&amp;#039;titles&amp;#039;: image&lt;br /&gt;
				};&lt;br /&gt;
				var wikipedia_api = new Morebits.wiki.api( &amp;#039;Checking if file &amp;#039; + image + &amp;#039; exists&amp;#039;, query, Twinkle.delimages.callbacks.main );&lt;br /&gt;
				wikipedia_api.params = { image:image, reason:reason, unlink_image:unlink_image, delete_image:delete_image };&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	var work = Morebits.array.chunk( images, Twinkle.getPref(&amp;#039;deliChunks&amp;#039;) );&lt;br /&gt;
	Morebits.wiki.addCheckpoint();&lt;br /&gt;
	Twinkle.delimages.currentdeletor = window.setInterval( toCall, 1000, work );&lt;br /&gt;
};&lt;br /&gt;
Twinkle.delimages.callbacks = {&lt;br /&gt;
	main: function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
		var $data = $(xmlDoc);&lt;br /&gt;
&lt;br /&gt;
		var normal = $data.find(&amp;#039;normalized n&amp;#039;).attr(&amp;#039;to&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		if( normal ) {&lt;br /&gt;
			self.params.image = normal;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var exists = $data.find(&amp;#039;pages page[title=&amp;quot;&amp;#039;+self.params.image.replace( /&amp;quot;/g, &amp;#039;\\&amp;quot;&amp;#039;)+&amp;#039;&amp;quot;]:not([missing])&amp;#039;).size() &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
		if( ! exists ) {&lt;br /&gt;
			self.statelem.error( &amp;quot;It seems that the page doesn&amp;#039;t exists, perhaps it has already been deleted&amp;quot; );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		if( self.params.unlink_image ) {&lt;br /&gt;
			var query = {&lt;br /&gt;
				&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
				&amp;#039;list&amp;#039;: &amp;#039;imageusage&amp;#039;,&lt;br /&gt;
				&amp;#039;iutitle&amp;#039;: self.params.image,&lt;br /&gt;
				&amp;#039;iulimit&amp;#039;: Morebits.userIsInGroup( &amp;#039;sysop&amp;#039; ) ? 5000 : 500 // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
			};&lt;br /&gt;
			var wikipedia_api = new Morebits.wiki.api( &amp;#039;Grabbing file links&amp;#039;, query, Twinkle.delimages.callbacks.unlinkImageInstancesMain );&lt;br /&gt;
			wikipedia_api.params = self.params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
		}&lt;br /&gt;
		if( self.params.delete_image ) {&lt;br /&gt;
&lt;br /&gt;
			var imagepage = new Morebits.wiki.page( self.params.image, &amp;#039;Deleting image&amp;#039;);&lt;br /&gt;
			imagepage.setEditSummary( &amp;quot;File deleted: &amp;quot; + self.params.reason + Twinkle.getPref(&amp;#039;deletionSummaryAd&amp;#039;));&lt;br /&gt;
			imagepage.deletePage();&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	unlinkImageInstancesMain: function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
		var instances = [];&lt;br /&gt;
		$(xmlDoc).find(&amp;#039;imageusage iu&amp;#039;).each(function(){&lt;br /&gt;
			instances.push($(this).attr(&amp;#039;title&amp;#039;));&lt;br /&gt;
		});&lt;br /&gt;
		if( instances.length === 0 ) {&lt;br /&gt;
			--twinklebatchdelete.currentUnlinkCounter;&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		$.each( instances, function(k,title) {&lt;br /&gt;
			page = new Morebits.wiki.page(title, &amp;quot;Unlinking instances on &amp;quot; + title);&lt;br /&gt;
			page.setFollowRedirect(true);&lt;br /&gt;
			page.setCallbackParameters({&amp;#039;image&amp;#039;: self.params.image, &amp;#039;reason&amp;#039;: self.params.reason});&lt;br /&gt;
			page.load(Twinkle.delimages.callbacks.unlinkImageInstances);&lt;br /&gt;
&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	unlinkImageInstances: function( self ) {&lt;br /&gt;
		var params = self.getCallbackParameters();&lt;br /&gt;
		var statelem = self.getStatusElement();&lt;br /&gt;
&lt;br /&gt;
		var image = params.image.replace( /^(?:Image|File):/, &amp;#039;&amp;#039; );&lt;br /&gt;
		var old_text = self.getPageText();&lt;br /&gt;
		var wikiPage = new Morebits.wikitext.page( old_text );&lt;br /&gt;
		wikiPage.commentOutImage( image , &amp;#039;Commented out because image was deleted&amp;#039; );&lt;br /&gt;
		var text = wikiPage.getText();&lt;br /&gt;
&lt;br /&gt;
		if( text === old_text ) {&lt;br /&gt;
			statelem.error( &amp;#039;failed to unlink image &amp;#039; + image +&amp;#039; from &amp;#039; + self.getPageName() );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		self.setPageText(text);&lt;br /&gt;
		self.setEditSummary(&amp;#039;Removing instance of file &amp;#039; + image + &amp;quot; that has been deleted because \&amp;quot;&amp;quot; + params.reason + &amp;quot;\&amp;quot;)&amp;quot; + &amp;quot;; &amp;quot; + Twinkle.getPref(&amp;#039;deletionSummaryAd&amp;#039;));&lt;br /&gt;
		self.setCreateOption(&amp;#039;nocreate&amp;#039;);&lt;br /&gt;
		self.save();&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ahenket</name></author>
	</entry>
</feed>