<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.endmyopia.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinkledeprod.js</id>
	<title>MediaWiki:Gadget-twinkledeprod.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.endmyopia.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinkledeprod.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinkledeprod.js&amp;action=history"/>
	<updated>2026-05-06T20:07:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinkledeprod.js&amp;diff=8593&amp;oldid=prev</id>
		<title>NottNott: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinkledeprod.js&amp;diff=8593&amp;oldid=prev"/>
		<updated>2020-06-12T10:46:06Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:46, 12 June 2020&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key jakeendmy_mw1720-mwnr_:diff::1.12:old-8592:rev-8593 --&gt;
&lt;/table&gt;</summary>
		<author><name>NottNott</name></author>
	</entry>
	<entry>
		<id>https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinkledeprod.js&amp;diff=8592&amp;oldid=prev</id>
		<title>en&gt;Amorymeltzer: Repo at 712686d: Morebits.userIsSysop, use everywhere instead of Morebits.userIsInGroup</title>
		<link rel="alternate" type="text/html" href="https://wiki.endmyopia.org/index.php?title=MediaWiki:Gadget-twinkledeprod.js&amp;diff=8592&amp;oldid=prev"/>
		<updated>2020-03-04T17:39:55Z</updated>

		<summary type="html">&lt;p&gt;Repo at 712686d: Morebits.userIsSysop, use everywhere instead of Morebits.userIsInGroup&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&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;
*** twinkledeprod.js: Batch deletion of expired PRODs (sysops only)&lt;br /&gt;
****************************************&lt;br /&gt;
* Mode of invocation:     Tab (&amp;quot;Deprod&amp;quot;)&lt;br /&gt;
* Active on:              Categories whose name contains &amp;quot;proposed_deletion&amp;quot;&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
Twinkle.deprod = function() {&lt;br /&gt;
	if (&lt;br /&gt;
		!Morebits.userIsSysop ||&lt;br /&gt;
		mw.config.get('wgNamespaceNumber') !== 14 ||&lt;br /&gt;
		!(/proposed_deletion/i).test(mw.config.get('wgPageName'))&lt;br /&gt;
	) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Twinkle.addPortletLink(Twinkle.deprod.callback, 'Deprod', 'tw-deprod', 'Delete prod pages found in this category');&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var concerns = {};&lt;br /&gt;
&lt;br /&gt;
Twinkle.deprod.callback = function() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow(800, 400);&lt;br /&gt;
	Window.setTitle('PROD cleaning');&lt;br /&gt;
	Window.setScriptName('Twinkle');&lt;br /&gt;
	Window.addFooterLink('Proposed deletion', 'WP:PROD');&lt;br /&gt;
	Window.addFooterLink('Twinkle help', 'WP:TW/DOC#deprod');&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm(callback_commit);&lt;br /&gt;
&lt;br /&gt;
	var statusdiv = document.createElement('div');&lt;br /&gt;
	statusdiv.style.padding = '15px';  // just so it doesn't look broken&lt;br /&gt;
	Window.setContent(statusdiv);&lt;br /&gt;
	Morebits.status.init(statusdiv);&lt;br /&gt;
	Window.display();&lt;br /&gt;
&lt;br /&gt;
	var query = {&lt;br /&gt;
		'action': 'query',&lt;br /&gt;
		'generator': 'categorymembers',&lt;br /&gt;
		'gcmtitle': mw.config.get('wgPageName'),&lt;br /&gt;
		'gcmlimit': 'max', // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
		'gcmnamespace': '0|6|108|2', // mostly to ignore categories&lt;br /&gt;
		'prop': [ 'info', 'revisions' ],&lt;br /&gt;
		'rvprop': [ 'content' ],&lt;br /&gt;
		'inprop': [ 'protection' ]&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	var statelem = new Morebits.status('Grabbing list of pages');&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api('loading...', query, function(apiobj) {&lt;br /&gt;
		var $doc = $(apiobj.responseXML);&lt;br /&gt;
		var $pages = $doc.find('page[ns!=&amp;quot;6&amp;quot;]');  // all non-files&lt;br /&gt;
		var list = [];&lt;br /&gt;
		var re = /\{\{Proposed deletion/;&lt;br /&gt;
		$pages.each(function() {&lt;br /&gt;
			var $page = $(this);&lt;br /&gt;
			var title = $page.attr('title');&lt;br /&gt;
			var content = $page.find('revisions rev').text();&lt;br /&gt;
			var $editprot = $page.find('pr[type=&amp;quot;edit&amp;quot;][level=&amp;quot;sysop&amp;quot;]');&lt;br /&gt;
			var isProtected = $editprot.length &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
			var metadata = [];&lt;br /&gt;
			var res = re.exec(content);&lt;br /&gt;
			if (res) {&lt;br /&gt;
				var parsed = Morebits.wikitext.template.parse(content, res.index);&lt;br /&gt;
				concerns[title] = parsed.parameters.concern || '';&lt;br /&gt;
				metadata.push(concerns[title]);&lt;br /&gt;
			}&lt;br /&gt;
			if (isProtected) {&lt;br /&gt;
				metadata.push('fully protected' +&lt;br /&gt;
					($editprot.attr('expiry') === 'infinity' ? ' indefinitely' : ', expires ' + $editprot.attr('expiry')));&lt;br /&gt;
			}&lt;br /&gt;
			list.push({&lt;br /&gt;
				label: metadata.length ? '(' + metadata.join('; ') + ')' : '',&lt;br /&gt;
				value: title,&lt;br /&gt;
				checked: concerns[title] !== '',&lt;br /&gt;
				style: isProtected ? 'color:red' : ''&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({ type: 'header', label: 'Pages to delete' });&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			type: 'button',&lt;br /&gt;
			label: 'Select All',&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			type: 'button',&lt;br /&gt;
			label: 'Deselect All',&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			'type': 'checkbox',&lt;br /&gt;
			'name': 'pages',&lt;br /&gt;
			'list': list&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			'type': 'submit'&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		var rendered = apiobj.params.form.render();&lt;br /&gt;
		apiobj.params.Window.setContent(rendered);&lt;br /&gt;
		$(Morebits.quickForm.getElements(rendered, 'pages')).each(function(index, checkbox) {&lt;br /&gt;
			var $checkbox = $(checkbox);&lt;br /&gt;
			var link = Morebits.htmlNode('a', $checkbox.val());&lt;br /&gt;
			link.setAttribute('class', 'deprod-page-link');&lt;br /&gt;
			link.setAttribute('href', mw.util.getUrl($checkbox.val()));&lt;br /&gt;
			link.setAttribute('target', '_blank');&lt;br /&gt;
			$checkbox.next().prepend([link, ' ']);&lt;br /&gt;
		});&lt;br /&gt;
	}, statelem);&lt;br /&gt;
&lt;br /&gt;
	wikipedia_api.params = { form: form, Window: Window };&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var callback_commit = function(event) {&lt;br /&gt;
		var pages = event.target.getChecked('pages');&lt;br /&gt;
		Morebits.status.init(event.target);&lt;br /&gt;
&lt;br /&gt;
		var batchOperation = new Morebits.batchOperation('Deleting articles');&lt;br /&gt;
		batchOperation.setOption('chunkSize', Twinkle.getPref('proddeleteChunks'));&lt;br /&gt;
		batchOperation.setOption('preserveIndividualStatusLines', true);&lt;br /&gt;
		batchOperation.setPageList(pages);&lt;br /&gt;
		batchOperation.run(function(pageName) {&lt;br /&gt;
			var params = { page: pageName, reason: concerns[page] };&lt;br /&gt;
&lt;br /&gt;
			var query = {&lt;br /&gt;
				'action': 'query',&lt;br /&gt;
				'titles': pageName,&lt;br /&gt;
				'prop': 'redirects',&lt;br /&gt;
				'rdlimit': 'max' // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
			};&lt;br /&gt;
			var wikipedia_api = new Morebits.wiki.api('Grabbing redirects', query, callback_deleteRedirects);&lt;br /&gt;
			wikipedia_api.params = params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
&lt;br /&gt;
			query = {&lt;br /&gt;
				'action': 'query',&lt;br /&gt;
				'titles': 'Talk:' + pageName&lt;br /&gt;
			};&lt;br /&gt;
			wikipedia_api = new Morebits.wiki.api('Checking whether ' + pageName + ' has a talk page', query,&lt;br /&gt;
				callback_deleteTalk);&lt;br /&gt;
			wikipedia_api.params = params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
&lt;br /&gt;
			var page = new Morebits.wiki.page(pageName, 'Deleting article ' + pageName);&lt;br /&gt;
			page.setEditSummary('Expired [[WP:PROD|PROD]], concern was: ' + concerns[pageName] + Twinkle.getPref('deletionSummaryAd'));&lt;br /&gt;
			page.suppressProtectWarning();&lt;br /&gt;
			page.deletePage(batchOperation.workerSuccess, batchOperation.workerFailure);&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	callback_deleteTalk = function(apiobj) {&lt;br /&gt;
		var $doc = $(apiobj.responseXML);&lt;br /&gt;
		var exists = $doc.find('page:not([missing])').length &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
		if (!exists) {&lt;br /&gt;
		// no talk page; forget about it&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var page = new Morebits.wiki.page('Talk:' + apiobj.params.page, 'Deleting talk page of article ' + apiobj.params.page);&lt;br /&gt;
		page.setEditSummary('[[WP:CSD#G8|G8]]: [[Help:Talk page|Talk page]] of deleted page &amp;quot;' + apiobj.params.page + '&amp;quot;' + Twinkle.getPref('deletionSummaryAd'));&lt;br /&gt;
		page.deletePage();&lt;br /&gt;
	},&lt;br /&gt;
	callback_deleteRedirects = function(apiobj) {&lt;br /&gt;
		var $doc = $(apiobj.responseXML);&lt;br /&gt;
		$doc.find('redirects rd').each(function() {&lt;br /&gt;
			var title = $(this).attr('title');&lt;br /&gt;
			var page = new Morebits.wiki.page(title, 'Deleting redirecting page ' + title);&lt;br /&gt;
			page.setEditSummary('[[WP:CSD#G8|G8]]: Redirect to deleted page &amp;quot;' + apiobj.params.page + '&amp;quot;' + Twinkle.getPref('deletionSummaryAd'));&lt;br /&gt;
			page.deletePage();&lt;br /&gt;
		});&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>en&gt;Amorymeltzer</name></author>
	</entry>
</feed>