<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://zybkcn.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklebatchundelete.js</id>
	<title>MediaWiki:Gadget-twinklebatchundelete.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://zybkcn.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklebatchundelete.js"/>
	<link rel="alternate" type="text/html" href="https://zybkcn.com/w/index.php?title=MediaWiki:Gadget-twinklebatchundelete.js&amp;action=history"/>
	<updated>2026-05-04T07:45:06Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://zybkcn.com/w/index.php?title=MediaWiki:Gadget-twinklebatchundelete.js&amp;diff=26434&amp;oldid=prev</id>
		<title>入我相思门：​创建页面，内容为“// &lt;nowiki&gt;   (function($) {   /*  ****************************************  *** twinklebatchundelete.js: Batch undelete module  ****************************************  * Mode of invocation:     Tab (&quot;Und-batch&quot;)  * Active on:              Existing user and project pages  */   Twinkle.batchundelete = function twinklebatchundelete() { 	if (!Morebits.userIsSysop || !mw.config.get(&#039;wgArticleId&#039;) || ( 		mw.config.get(&#039;wgNamespaceNumber&#039;) !== mw.config.get(&#039;wgName…”</title>
		<link rel="alternate" type="text/html" href="https://zybkcn.com/w/index.php?title=MediaWiki:Gadget-twinklebatchundelete.js&amp;diff=26434&amp;oldid=prev"/>
		<updated>2022-12-08T06:42:10Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“// &amp;lt;nowiki&amp;gt;   (function($) {   &lt;span class=&quot;autocomment&quot;&gt;****************************************  *** twinklebatchundelete.js: Batch undelete module  ****************************************  * Mode of invocation:     Tab (&amp;quot;Und-batch&amp;quot;)  * Active on:              Existing user and project pages：​&lt;/span&gt;   Twinkle.batchundelete = function twinklebatchundelete() { 	if (!Morebits.userIsSysop || !mw.config.get(&amp;#039;wgArticleId&amp;#039;) || ( 		mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) !== mw.config.get(&amp;#039;wgName…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&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;
 *** twinklebatchundelete.js: Batch undelete module&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;Und-batch&amp;quot;)&lt;br /&gt;
 * Active on:              Existing user and project pages&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchundelete = function twinklebatchundelete() {&lt;br /&gt;
	if (!Morebits.userIsSysop || !mw.config.get(&amp;#039;wgArticleId&amp;#039;) || (&lt;br /&gt;
		mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) !== mw.config.get(&amp;#039;wgNamespaceIds&amp;#039;).user &amp;amp;&amp;amp;&lt;br /&gt;
		mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) !== mw.config.get(&amp;#039;wgNamespaceIds&amp;#039;).project)) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Twinkle.addPortletLink(Twinkle.batchundelete.callback, wgULS(&amp;#039;批复&amp;#039;, &amp;#039;批復&amp;#039;), &amp;#039;tw-batch-undel&amp;#039;, wgULS(&amp;#039;反删除页面&amp;#039;, &amp;#039;反刪除頁面&amp;#039;));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchundelete.callback = function twinklebatchundeleteCallback() {&lt;br /&gt;
	var Window = new Morebits.simpleWindow(600, 400);&lt;br /&gt;
	Window.setScriptName(&amp;#039;Twinkle&amp;#039;);&lt;br /&gt;
	Window.setTitle(wgULS(&amp;#039;批量反删除&amp;#039;, &amp;#039;批次反刪除&amp;#039;));&lt;br /&gt;
	Window.addFooterLink(wgULS(&amp;#039;Twinkle帮助&amp;#039;, &amp;#039;Twinkle說明&amp;#039;), &amp;#039;WP:TW/DOC#batchundelete&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm(Twinkle.batchundelete.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: wgULS(&amp;#039;如果存在已删除的讨论页，也恢复&amp;#039;, &amp;#039;如果存在已刪除的討論頁，也恢復&amp;#039;),&lt;br /&gt;
				name: &amp;#039;undel_talk&amp;#039;,&lt;br /&gt;
				value: &amp;#039;undel_talk&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;input&amp;#039;,&lt;br /&gt;
		name: &amp;#039;reason&amp;#039;,&lt;br /&gt;
		label: &amp;#039;理由：&amp;#039;,&lt;br /&gt;
		size: 60&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	var statusdiv = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
	statusdiv.style.padding = &amp;#039;15px&amp;#039;;  // just so it doesn&amp;#039;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: &amp;#039;query&amp;#039;,&lt;br /&gt;
		generator: &amp;#039;links&amp;#039;,&lt;br /&gt;
		prop: &amp;#039;info&amp;#039;,&lt;br /&gt;
		inprop: &amp;#039;protection&amp;#039;,&lt;br /&gt;
		titles: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
		gpllimit: Twinkle.getPref(&amp;#039;batchMax&amp;#039;)&lt;br /&gt;
	};&lt;br /&gt;
	var statelem = new Morebits.status(wgULS(&amp;#039;抓取页面列表&amp;#039;, &amp;#039;抓取頁面列表&amp;#039;));&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api(wgULS(&amp;#039;加载中…&amp;#039;, &amp;#039;載入中…&amp;#039;), query, function(apiobj) {&lt;br /&gt;
		var xml = apiobj.responseXML;&lt;br /&gt;
		var $pages = $(xml).find(&amp;#039;page[missing]&amp;#039;);&lt;br /&gt;
		var list = [];&lt;br /&gt;
		$pages.each(function(index, page) {&lt;br /&gt;
			var $page = $(page);&lt;br /&gt;
			var title = $page.attr(&amp;#039;title&amp;#039;);&lt;br /&gt;
			var $editprot = $page.find(&amp;#039;pr[type=&amp;quot;create&amp;quot;][level=&amp;quot;sysop&amp;quot;]&amp;#039;);&lt;br /&gt;
			var isProtected = $editprot.length &amp;gt; 0;&lt;br /&gt;
&lt;br /&gt;
			list.push({&lt;br /&gt;
				label: title + (isProtected ? &amp;#039;（&amp;#039; + wgULS(&amp;#039;全保护，&amp;#039;, &amp;#039;全保護，&amp;#039;) + ($editprot.attr(&amp;#039;expiry&amp;#039;) === &amp;#039;infinity&amp;#039; ? wgULS(&amp;#039;无限期&amp;#039;, &amp;#039;無限期&amp;#039;) : new Morebits.date($editprot.attr(&amp;#039;expiry&amp;#039;)).calendar(&amp;#039;utc&amp;#039;) + &amp;#039; (UTC)&amp;#039; + wgULS(&amp;#039;过期&amp;#039;, &amp;#039;過期&amp;#039;)) + &amp;#039;）&amp;#039; : &amp;#039;&amp;#039;),&lt;br /&gt;
				value: title,&lt;br /&gt;
				checked: true,&lt;br /&gt;
				style: isProtected ? &amp;#039;color:red&amp;#039; : &amp;#039;&amp;#039;&lt;br /&gt;
			});&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({ type: &amp;#039;header&amp;#039;, label: wgULS(&amp;#039;待恢复页面&amp;#039;, &amp;#039;待恢復頁面&amp;#039;) });&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			type: &amp;#039;button&amp;#039;,&lt;br /&gt;
			label: wgULS(&amp;#039;全选&amp;#039;, &amp;#039;全選&amp;#039;),&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.quickForm.getElements(e.target.form, &amp;#039;pages&amp;#039;)).prop(&amp;#039;checked&amp;#039;, true);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			type: &amp;#039;button&amp;#039;,&lt;br /&gt;
			label: wgULS(&amp;#039;全不选&amp;#039;, &amp;#039;全不選&amp;#039;),&lt;br /&gt;
			event: function(e) {&lt;br /&gt;
				$(Morebits.quickForm.getElements(e.target.form, &amp;#039;pages&amp;#039;)).prop(&amp;#039;checked&amp;#039;, false);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({&lt;br /&gt;
			type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
			name: &amp;#039;pages&amp;#039;,&lt;br /&gt;
			shiftClickSupport: true,&lt;br /&gt;
			list: list&lt;br /&gt;
		});&lt;br /&gt;
		apiobj.params.form.append({ type: &amp;#039;submit&amp;#039; });&lt;br /&gt;
&lt;br /&gt;
		var result = apiobj.params.form.render();&lt;br /&gt;
		apiobj.params.Window.setContent(result);&lt;br /&gt;
&lt;br /&gt;
	}, statelem);&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;
Twinkle.batchundelete.callback.evaluate = function(event) {&lt;br /&gt;
	Morebits.wiki.actionCompleted.notice = wgULS(&amp;#039;反删除已完成&amp;#039;, &amp;#039;反刪除已完成&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	var numProtected = $(Morebits.quickForm.getElements(event.target, &amp;#039;pages&amp;#039;)).filter(function(index, element) {&lt;br /&gt;
		return element.checked &amp;amp;&amp;amp; element.nextElementSibling.style.color === &amp;#039;red&amp;#039;;&lt;br /&gt;
	}).length;&lt;br /&gt;
	if (numProtected &amp;gt; 0 &amp;amp;&amp;amp; !confirm(wgULS(&amp;#039;您正要反删除 &amp;#039;, &amp;#039;您正要反刪除 &amp;#039;) + numProtected + wgULS(&amp;#039; 个全保护页面，您确定吗？&amp;#039;, &amp;#039; 個全保護頁面，您確定嗎？&amp;#039;))) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var pages = event.target.getChecked(&amp;#039;pages&amp;#039;);&lt;br /&gt;
	var reason = event.target.reason.value;&lt;br /&gt;
	var undel_talk = event.target.reason.value;&lt;br /&gt;
	if (!reason) {&lt;br /&gt;
		alert(&amp;#039;您需要指定理由。&amp;#039;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled(false);&lt;br /&gt;
	Morebits.status.init(event.target);&lt;br /&gt;
&lt;br /&gt;
	if (!pages) {&lt;br /&gt;
		Morebits.status.error(wgULS(&amp;#039;错误&amp;#039;, &amp;#039;錯誤&amp;#039;), wgULS(&amp;#039;没什么要反删除的，取消操作&amp;#039;, &amp;#039;沒什麼要反刪除的，取消操作&amp;#039;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	var pageUndeleter = new Morebits.batchOperation(wgULS(&amp;#039;反删除页面&amp;#039;, &amp;#039;反刪除頁面&amp;#039;));&lt;br /&gt;
	pageUndeleter.setOption(&amp;#039;chunkSize&amp;#039;, Twinkle.getPref(&amp;#039;batchChunks&amp;#039;));&lt;br /&gt;
	pageUndeleter.setOption(&amp;#039;preserveIndividualStatusLines&amp;#039;, true);&lt;br /&gt;
	pageUndeleter.setPageList(pages);&lt;br /&gt;
	pageUndeleter.run(function(pageName) {&lt;br /&gt;
		var params = {&lt;br /&gt;
			page: pageName,&lt;br /&gt;
			undel_talk: undel_talk,&lt;br /&gt;
			reason: reason,&lt;br /&gt;
			pageUndeleter: pageUndeleter&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		var wikipedia_page = new Morebits.wiki.page(pageName, wgULS(&amp;#039;反删除页面&amp;#039;, &amp;#039;反刪除頁面&amp;#039;) + pageName);&lt;br /&gt;
		wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
		wikipedia_page.setEditSummary(reason + &amp;#039; (批量)&amp;#039;);&lt;br /&gt;
		wikipedia_page.setChangeTags(Twinkle.changeTags);&lt;br /&gt;
		wikipedia_page.suppressProtectWarning();&lt;br /&gt;
		wikipedia_page.setMaxRetries(3); // temporary increase from 2 to make batchundelete more likely to succeed [[phab:T222402]] #613&lt;br /&gt;
		wikipedia_page.undeletePage(Twinkle.batchundelete.callbacks.doExtras, pageUndeleter.workerFailure);&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchundelete.callbacks = {&lt;br /&gt;
	// this stupid parameter name is a temporary thing until I implement an overhaul&lt;br /&gt;
	// of Morebits.wiki.* callback parameters&lt;br /&gt;
	doExtras: function(thingWithParameters) {&lt;br /&gt;
		var params = thingWithParameters.parent ? thingWithParameters.parent.getCallbackParameters() :&lt;br /&gt;
			thingWithParameters.getCallbackParameters();&lt;br /&gt;
		// the initial batch operation&amp;#039;s job is to delete the page, and that has&lt;br /&gt;
		// succeeded by now&lt;br /&gt;
		params.pageUndeleter.workerSuccess(thingWithParameters);&lt;br /&gt;
&lt;br /&gt;
		var query, wikipedia_api;&lt;br /&gt;
&lt;br /&gt;
		if (params.undel_talk) {&lt;br /&gt;
			var talkpagename = new mw.Title(params.page).getTalkPage().getPrefixedText();&lt;br /&gt;
			if (talkpagename !== params.page) {&lt;br /&gt;
				query = {&lt;br /&gt;
					action: &amp;#039;query&amp;#039;,&lt;br /&gt;
					prop: &amp;#039;deletedrevisions&amp;#039;,&lt;br /&gt;
					drvprop: &amp;#039;ids&amp;#039;,&lt;br /&gt;
					drvlimit: 1,&lt;br /&gt;
					titles: talkpagename&lt;br /&gt;
				};&lt;br /&gt;
				wikipedia_api = new Morebits.wiki.api(wgULS(&amp;#039;检查讨论页的已删版本&amp;#039;, &amp;#039;檢查討論頁的已刪版本&amp;#039;), query, Twinkle.batchundelete.callbacks.undeleteTalk);&lt;br /&gt;
				wikipedia_api.params = params;&lt;br /&gt;
				wikipedia_api.params.talkPage = talkpagename;&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	undeleteTalk: function(apiobj) {&lt;br /&gt;
		var xml = apiobj.responseXML;&lt;br /&gt;
		var exists = $(xml).find(&amp;#039;page:not([missing])&amp;#039;).length &amp;gt; 0;&lt;br /&gt;
		var delrevs = $(xml).find(&amp;#039;rev&amp;#039;).attr(&amp;#039;revid&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		if (exists || !delrevs) {&lt;br /&gt;
			// page exists or has no deleted revisions; forget about it&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var page = new Morebits.wiki.page(apiobj.params.talkPage, wgULS(&amp;#039;正在反删除&amp;#039;, &amp;#039;正在反刪除&amp;#039;) + apiobj.params.page + wgULS(&amp;#039;的讨论页&amp;#039;, &amp;#039;的討論頁&amp;#039;));&lt;br /&gt;
		page.setEditSummary(wgULS(&amp;#039;反删除“&amp;#039;, &amp;#039;反刪除「&amp;#039;) + apiobj.params.page + wgULS(&amp;#039;”的[[Wikipedia:讨论页|讨论页]]&amp;#039;, &amp;#039;」的[[Wikipedia:討論頁|討論頁]]&amp;#039;));&lt;br /&gt;
		page.setChangeTags(Twinkle.changeTags);&lt;br /&gt;
		page.undeletePage();&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.addInitCallback(Twinkle.batchundelete, &amp;#039;batchundelete&amp;#039;);&lt;br /&gt;
})(jQuery);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>入我相思门</name></author>
	</entry>
</feed>