<?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-twinklebatchdelete.js</id>
	<title>MediaWiki:Gadget-twinklebatchdelete.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-twinklebatchdelete.js"/>
	<link rel="alternate" type="text/html" href="https://zybkcn.com/w/index.php?title=MediaWiki:Gadget-twinklebatchdelete.js&amp;action=history"/>
	<updated>2026-05-04T07:43:27Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://zybkcn.com/w/index.php?title=MediaWiki:Gadget-twinklebatchdelete.js&amp;diff=26433&amp;oldid=prev</id>
		<title>入我相思门：​创建页面，内容为“// &lt;nowiki&gt;   (function($) {   /*  ****************************************  *** twinklebatchdelete.js: Batch delete module (sysops only)  ****************************************  * Mode of invocation:     Tab (&quot;D-batch&quot;)  * Active on:              Existing non-articles, and Special:PrefixIndex  */  Twinkle.batchdelete = function twinklebatchdelete() { 	if ( 		Morebits.userIsSysop &amp;&amp; ( 			(mw.config.get(&#039;wgCurRevisionId&#039;) &amp;&amp; mw.config.get(&#039;wgNamespaceNumber&#039;)…”</title>
		<link rel="alternate" type="text/html" href="https://zybkcn.com/w/index.php?title=MediaWiki:Gadget-twinklebatchdelete.js&amp;diff=26433&amp;oldid=prev"/>
		<updated>2022-12-08T06:41:22Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“// &amp;lt;nowiki&amp;gt;   (function($) {   &lt;span class=&quot;autocomment&quot;&gt;****************************************  *** twinklebatchdelete.js: Batch delete module (sysops only)  ****************************************  * Mode of invocation:     Tab (&amp;quot;D-batch&amp;quot;)  * Active on:              Existing non-articles, and Special:PrefixIndex：​&lt;/span&gt;  Twinkle.batchdelete = function twinklebatchdelete() { 	if ( 		Morebits.userIsSysop &amp;amp;&amp;amp; ( 			(mw.config.get(&amp;#039;wgCurRevisionId&amp;#039;) &amp;amp;&amp;amp; mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;)…”&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;
 *** twinklebatchdelete.js: Batch delete module (sysops only)&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Tab (&amp;quot;D-batch&amp;quot;)&lt;br /&gt;
 * Active on:              Existing non-articles, and Special:PrefixIndex&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete = function twinklebatchdelete() {&lt;br /&gt;
	if (&lt;br /&gt;
		Morebits.userIsSysop &amp;amp;&amp;amp; (&lt;br /&gt;
			(mw.config.get(&amp;#039;wgCurRevisionId&amp;#039;) &amp;amp;&amp;amp; mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) &amp;gt; 0) ||&lt;br /&gt;
			mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;#039;Prefixindex&amp;#039; ||&lt;br /&gt;
			mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;#039;BrokenRedirects&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
	) {&lt;br /&gt;
		Twinkle.addPortletLink(Twinkle.batchdelete.callback, wgULS(&amp;#039;批删&amp;#039;, &amp;#039;批刪&amp;#039;), &amp;#039;tw-batch&amp;#039;, wgULS(&amp;#039;删除此分类或页面中的所有链接&amp;#039;, &amp;#039;刪除此分類或頁面中的所有連結&amp;#039;));&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.unlinkCache = {};&lt;br /&gt;
&lt;br /&gt;
// Has the subpages list been loaded?&lt;br /&gt;
var subpagesLoaded;&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.callback = function twinklebatchdeleteCallback() {&lt;br /&gt;
	subpagesLoaded = false;&lt;br /&gt;
	var Window = new Morebits.simpleWindow(600, 400);&lt;br /&gt;
	Window.setTitle(wgULS(&amp;#039;批量删除&amp;#039;, &amp;#039;批次刪除&amp;#039;));&lt;br /&gt;
	Window.setScriptName(&amp;#039;Twinkle&amp;#039;);&lt;br /&gt;
	Window.addFooterLink(wgULS(&amp;#039;Twinkle帮助&amp;#039;, &amp;#039;Twinkle說明&amp;#039;), &amp;#039;WP:TW/DOC#batchdelete&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	var form = new Morebits.quickForm(Twinkle.batchdelete.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;delete_page&amp;#039;,&lt;br /&gt;
				value: &amp;#039;delete&amp;#039;,&lt;br /&gt;
				checked: true,&lt;br /&gt;
				subgroup: {&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;delete_talk&amp;#039;,&lt;br /&gt;
							value: &amp;#039;delete_talk&amp;#039;,&lt;br /&gt;
							checked: true&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							label: wgULS(&amp;#039;删除到已删页面的重定向页&amp;#039;, &amp;#039;刪除到已刪頁面的重新導向頁面&amp;#039;),&lt;br /&gt;
							name: &amp;#039;delete_redirects&amp;#039;,&lt;br /&gt;
							value: &amp;#039;delete_redirects&amp;#039;,&lt;br /&gt;
							checked: true&lt;br /&gt;
						},&lt;br /&gt;
						{&lt;br /&gt;
							label: wgULS(&amp;#039;删除已删页面的子页面&amp;#039;, &amp;#039;刪除已刪頁面的子頁面&amp;#039;),&lt;br /&gt;
							name: &amp;#039;delete_subpages&amp;#039;,&lt;br /&gt;
							value: &amp;#039;delete_subpages&amp;#039;,&lt;br /&gt;
							checked: false,&lt;br /&gt;
							event: Twinkle.batchdelete.callback.toggleSubpages,&lt;br /&gt;
							subgroup: {&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;delete_subpage_talks&amp;#039;,&lt;br /&gt;
										value: &amp;#039;delete_subpage_talks&amp;#039;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										label: wgULS(&amp;#039;删除到已删子页面的重定向页&amp;#039;, &amp;#039;刪除到已刪子頁面的重新導向頁面&amp;#039;),&lt;br /&gt;
										name: &amp;#039;delete_subpage_redirects&amp;#039;,&lt;br /&gt;
										value: &amp;#039;delete_subpage_redirects&amp;#039;&lt;br /&gt;
									},&lt;br /&gt;
									{&lt;br /&gt;
										label: wgULS(&amp;#039;取消所有已删页面的链入（仅处理条目及Portal命名空间）&amp;#039;, &amp;#039;取消所有已刪頁面的連入（僅處理條目及Portal命名空間）&amp;#039;),&lt;br /&gt;
										name: &amp;#039;unlink_subpages&amp;#039;,&lt;br /&gt;
										value: &amp;#039;unlink_subpages&amp;#039;&lt;br /&gt;
									}&lt;br /&gt;
								]&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
					]&lt;br /&gt;
				}&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				label: wgULS(&amp;#039;取消链入（仅处理条目及Portal命名空间）&amp;#039;, &amp;#039;取消連入（僅處理條目及Portal命名空間）&amp;#039;),&lt;br /&gt;
				name: &amp;#039;unlink_page&amp;#039;,&lt;br /&gt;
				value: &amp;#039;unlink&amp;#039;,&lt;br /&gt;
				checked: false&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				label: wgULS(&amp;#039;移除文件使用（所有命名空间）&amp;#039;, &amp;#039;移除檔案使用（所有命名空間）&amp;#039;),&lt;br /&gt;
				name: &amp;#039;unlink_file&amp;#039;,&lt;br /&gt;
				value: &amp;#039;unlink_file&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;select&amp;#039;,&lt;br /&gt;
		name: &amp;#039;common_reason&amp;#039;,&lt;br /&gt;
		label: &amp;#039;常用理由：&amp;#039;,&lt;br /&gt;
		style: &amp;#039;width: 85%;&amp;#039;,&lt;br /&gt;
		list: Twinkle.batchdelete.deletereasonlist,&lt;br /&gt;
		event: Twinkle.batchdelete.callback.change_common_reason&lt;br /&gt;
	});&lt;br /&gt;
	form.append({&lt;br /&gt;
		name: &amp;#039;reason&amp;#039;,&lt;br /&gt;
		type: &amp;#039;input&amp;#039;,&lt;br /&gt;
		label: &amp;#039;理由：&amp;#039;,&lt;br /&gt;
		size: 75&lt;br /&gt;
	});&lt;br /&gt;
	var query = {&lt;br /&gt;
		action: &amp;#039;query&amp;#039;,&lt;br /&gt;
		prop: &amp;#039;revisions|info|imageinfo&amp;#039;,&lt;br /&gt;
		inprop: &amp;#039;protection&amp;#039;,&lt;br /&gt;
		rvprop: &amp;#039;size|user&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	// On categories&lt;br /&gt;
	if (mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) === 14) {&lt;br /&gt;
		query.generator = &amp;#039;categorymembers&amp;#039;;&lt;br /&gt;
		query.gcmtitle = mw.config.get(&amp;#039;wgPageName&amp;#039;);&lt;br /&gt;
		query.gcmlimit = Twinkle.getPref(&amp;#039;batchMax&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	// On Special:PrefixIndex&lt;br /&gt;
	} else if (mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;#039;Prefixindex&amp;#039;) {&lt;br /&gt;
&lt;br /&gt;
		query.generator = &amp;#039;allpages&amp;#039;;&lt;br /&gt;
		query.gaplimit = Twinkle.getPref(&amp;#039;batchMax&amp;#039;);&lt;br /&gt;
		if (mw.util.getParamValue(&amp;#039;prefix&amp;#039;)) {&lt;br /&gt;
			query.gapnamespace = mw.util.getParamValue(&amp;#039;namespace&amp;#039;);&lt;br /&gt;
			query.gapprefix = mw.util.getParamValue(&amp;#039;prefix&amp;#039;);&lt;br /&gt;
		} else {&lt;br /&gt;
			var pathSplit = decodeURIComponent(location.pathname).split(&amp;#039;/&amp;#039;);&lt;br /&gt;
			if (pathSplit.length &amp;lt; 3 || pathSplit[2] !== &amp;#039;Special:前缀索引&amp;#039;) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			var titleSplit = pathSplit[3].split(&amp;#039;:&amp;#039;);&lt;br /&gt;
			query.gapnamespace = mw.config.get(&amp;#039;wgNamespaceIds&amp;#039;)[titleSplit[0].toLowerCase()];&lt;br /&gt;
			if (titleSplit.length &amp;lt; 2 || typeof query.gapnamespace === &amp;#039;undefined&amp;#039;) {&lt;br /&gt;
				query.gapnamespace = 0;  // article namespace&lt;br /&gt;
				query.gapprefix = pathSplit.splice(3).join(&amp;#039;/&amp;#039;);&lt;br /&gt;
			} else {&lt;br /&gt;
				pathSplit = pathSplit.splice(4);&lt;br /&gt;
				pathSplit.splice(0, 0, titleSplit.splice(1).join(&amp;#039;:&amp;#039;));&lt;br /&gt;
				query.gapprefix = pathSplit.join(&amp;#039;/&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	// On Special:BrokenRedirects&lt;br /&gt;
	} else if (mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;#039;BrokenRedirects&amp;#039;) {&lt;br /&gt;
		query.generator = &amp;#039;querypage&amp;#039;;&lt;br /&gt;
		query.gqppage = &amp;#039;BrokenRedirects&amp;#039;;&lt;br /&gt;
		query.gqplimit = Twinkle.getPref(&amp;#039;batchMax&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	// On normal pages&lt;br /&gt;
	} else {&lt;br /&gt;
		query.generator = &amp;#039;links&amp;#039;;&lt;br /&gt;
		query.titles = mw.config.get(&amp;#039;wgPageName&amp;#039;);&lt;br /&gt;
		query.gpllimit = Twinkle.getPref(&amp;#039;batchMax&amp;#039;);&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;
	Twinkle.batchdelete.pages = {};&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&amp;#039;).filter(&amp;#039;:not([missing])&amp;#039;);  // :not([imagerepository=&amp;quot;shared&amp;quot;])&lt;br /&gt;
		$pages.each(function(index, page) {&lt;br /&gt;
			var $page = $(page);&lt;br /&gt;
			var ns = $page.attr(&amp;#039;ns&amp;#039;);&lt;br /&gt;
			var title = $page.attr(&amp;#039;title&amp;#039;);&lt;br /&gt;
			var isRedir = $page.attr(&amp;#039;redirect&amp;#039;) === &amp;#039;&amp;#039;;&lt;br /&gt;
			var $editprot = $page.find(&amp;#039;pr[type=&amp;quot;edit&amp;quot;][level=&amp;quot;sysop&amp;quot;]&amp;#039;);&lt;br /&gt;
			var isProtected = $editprot.length &amp;gt; 0;&lt;br /&gt;
			var size = $page.find(&amp;#039;rev&amp;#039;).attr(&amp;#039;size&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			var metadata = [];&lt;br /&gt;
			if (isRedir) {&lt;br /&gt;
				metadata.push(wgULS(&amp;#039;重定向&amp;#039;, &amp;#039;重新導向&amp;#039;));&lt;br /&gt;
			}&lt;br /&gt;
			if (isProtected) {&lt;br /&gt;
				metadata.push(wgULS(&amp;#039;全保护，&amp;#039;, &amp;#039;全保護，&amp;#039;) +&lt;br /&gt;
					($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;));&lt;br /&gt;
			}&lt;br /&gt;
			if (ns === &amp;#039;6&amp;#039;) {  // mimic what delimages used to show for files&lt;br /&gt;
				metadata.push(wgULS(&amp;#039;上传者：&amp;#039;, &amp;#039;上傳者：&amp;#039;) + $page.find(&amp;#039;ii&amp;#039;).attr(&amp;#039;user&amp;#039;));&lt;br /&gt;
				metadata.push(wgULS(&amp;#039;最后编辑：&amp;#039;, &amp;#039;最後編輯：&amp;#039;) + $page.find(&amp;#039;rev&amp;#039;).attr(&amp;#039;user&amp;#039;));&lt;br /&gt;
			} else {&lt;br /&gt;
				metadata.push(mw.language.convertNumber(size) + wgULS(&amp;#039;字节&amp;#039;, &amp;#039;位元組&amp;#039;));&lt;br /&gt;
			}&lt;br /&gt;
			Twinkle.batchdelete.pages[title] = {&lt;br /&gt;
				label: title + (metadata.length ? &amp;#039;（&amp;#039; + metadata.join(&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;
&lt;br /&gt;
		var form = apiobj.params.form;&lt;br /&gt;
		form.append({ type: &amp;#039;header&amp;#039;, label: wgULS(&amp;#039;待删除页面&amp;#039;, &amp;#039;待刪除頁面&amp;#039;) });&lt;br /&gt;
		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 dBatchSelectAll() {&lt;br /&gt;
				$(result).find(&amp;#039;input[name=pages]:not(:checked)&amp;#039;).each(function(_, e) {&lt;br /&gt;
					e.click(); // check it, and invoke click event so that subgroup can be shown&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
				// Check any unchecked subpages too&lt;br /&gt;
				$(&amp;#039;input[name=&amp;quot;pages.subpages&amp;quot;]&amp;#039;).prop(&amp;#039;checked&amp;#039;, true);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		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 dBatchDeselectAll() {&lt;br /&gt;
				$(result).find(&amp;#039;input[name=pages]:checked&amp;#039;).each(function(_, e) {&lt;br /&gt;
					e.click(); // uncheck it, and invoke click event so that subgroup can be hidden&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		form.append({&lt;br /&gt;
			type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
			name: &amp;#039;pages&amp;#039;,&lt;br /&gt;
			id: &amp;#039;tw-dbatch-pages&amp;#039;,&lt;br /&gt;
			shiftClickSupport: true,&lt;br /&gt;
			list: $.map(Twinkle.batchdelete.pages, function (e) {&lt;br /&gt;
				return e;&lt;br /&gt;
			})&lt;br /&gt;
		});&lt;br /&gt;
		form.append({ type: &amp;#039;submit&amp;#039; });&lt;br /&gt;
&lt;br /&gt;
		var result = form.render();&lt;br /&gt;
		apiobj.params.Window.setContent(result);&lt;br /&gt;
&lt;br /&gt;
		Morebits.quickForm.getElements(result, &amp;#039;pages&amp;#039;).forEach(generateArrowLinks);&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;
function generateArrowLinks (checkbox) {&lt;br /&gt;
	var link = Morebits.htmlNode(&amp;#039;a&amp;#039;, &amp;#039; &amp;gt;&amp;#039;);&lt;br /&gt;
	link.setAttribute(&amp;#039;class&amp;#039;, &amp;#039;tw-dbatch-page-link&amp;#039;);&lt;br /&gt;
	link.setAttribute(&amp;#039;href&amp;#039;, mw.util.getUrl(checkbox.value));&lt;br /&gt;
	link.setAttribute(&amp;#039;target&amp;#039;, &amp;#039;_blank&amp;#039;);&lt;br /&gt;
	checkbox.nextElementSibling.append(link);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.generateNewPageList = function(form) {&lt;br /&gt;
&lt;br /&gt;
	// Update the list of checked pages in Twinkle.batchdelete.pages object&lt;br /&gt;
	var elements = form.elements.pages;&lt;br /&gt;
	if (elements instanceof NodeList) { // if there are multiple pages&lt;br /&gt;
		for (var i = 0; i &amp;lt; elements.length; ++i) {&lt;br /&gt;
			Twinkle.batchdelete.pages[elements[i].value].checked = elements[i].checked;&lt;br /&gt;
		}&lt;br /&gt;
	} else if (elements instanceof HTMLInputElement) { // if there is just one page&lt;br /&gt;
		Twinkle.batchdelete.pages[elements.value].checked = elements.checked;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return new Morebits.quickForm.element({&lt;br /&gt;
		type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
		name: &amp;#039;pages&amp;#039;,&lt;br /&gt;
		id: &amp;#039;tw-dbatch-pages&amp;#039;,&lt;br /&gt;
		shiftClickSupport: true,&lt;br /&gt;
		list: $.map(Twinkle.batchdelete.pages, function (e) {&lt;br /&gt;
			return e;&lt;br /&gt;
		})&lt;br /&gt;
	}).render();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.deletereasonlist = [&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;请选择&amp;#039;, &amp;#039;請選擇&amp;#039;),&lt;br /&gt;
		value: &amp;#039;&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;G10: 原作者清空页面或提出删除，且实际贡献者只有一人&amp;#039;, &amp;#039;G10: 原作者清空頁面或提出刪除，且實際貢獻者只有一人&amp;#039;),&lt;br /&gt;
		value: wgULS(&amp;#039;[[Wikipedia:CSD#G10|G10]]: 原作者清空页面或提出删除，且实际贡献者只有一人&amp;#039;, &amp;#039;[[Wikipedia:CSD#G10|G10]]: 原作者清空頁面或提出刪除，且實際貢獻者只有一人&amp;#039;)&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;G15: 孤立页面，比如没有主页面的讨论页、指向空页面的重定向等&amp;#039;, &amp;#039;G15: 孤立頁面，比如沒有主頁面的討論頁、指向空頁面的重新導向等&amp;#039;),&lt;br /&gt;
		value: wgULS(&amp;#039;[[Wikipedia:CSD#G15|G15]]: 孤立页面&amp;#039;, &amp;#039;[[Wikipedia:CSD#G15|G15]]: 孤立頁面&amp;#039;)&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;F6: 没有被条目使用的非自由著作权文件&amp;#039;, &amp;#039;F6: 沒有被條目使用的非自由著作權檔案&amp;#039;),&lt;br /&gt;
		value: wgULS(&amp;#039;[[Wikipedia:CSD#F6|F6]]: 没有被条目使用的[[Wikipedia:合理使用|非自由著作权]]文件&amp;#039;, &amp;#039;[[Wikipedia:CSD#F6|F6]]: 沒有被條目使用的[[Wikipedia:合理使用|非自由著作權]]檔案&amp;#039;)&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;F7: 与维基共享资源文件重复的文件&amp;#039;, &amp;#039;F7: 與維基共享資源檔案重複的檔案&amp;#039;),&lt;br /&gt;
		value: wgULS(&amp;#039;[[Wikipedia:CSD#F7|F7]]: 与[[维基共享资源]]文件重复的文件&amp;#039;, &amp;#039;[[Wikipedia:CSD#F7|F7]]: 與[[維基共享資源]]檔案重複的檔案&amp;#039;)&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;F10: 可被替代的非自由著作权文件&amp;#039;, &amp;#039;F10: 可被替代的非自由版權檔案&amp;#039;),&lt;br /&gt;
		value: wgULS(&amp;#039;[[Wikipedia:CSD#F10|F10]]: 可被替代的非自由著作权文件&amp;#039;, &amp;#039;[[Wikipedia:CSD#F10|F10]]: 可被替代的非自由版權檔案&amp;#039;)&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;O1: 用户请求删除自己的用户页或其子页面&amp;#039;, &amp;#039;O1: 使用者請求刪除自己的使用者頁面或其子頁面&amp;#039;),&lt;br /&gt;
		value: wgULS(&amp;#039;[[Wikipedia:CSD#O1|O1]]: 用户请求删除自己的[[Help:用户页|用户页]]或其子页面。&amp;#039;, &amp;#039;[[Wikipedia:CSD#O1|O1]]: 使用者請求刪除自己的[[Help:用户页|使用者頁面]]或其子頁面。&amp;#039;)&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;O4: 空的分类（没有条目也没有子分类）&amp;#039;, &amp;#039;O4: 空的分類（沒有條目也沒有子分類）&amp;#039;),&lt;br /&gt;
		value: wgULS(&amp;#039;[[Wikipedia:CSD#O4|O4]]: 空的分类（没有条目也没有子分类）。&amp;#039;, &amp;#039;[[Wikipedia:CSD#O4|O4]]: 空的分類（沒有條目也沒有子分類）。&amp;#039;)&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;O7: 废弃草稿&amp;#039;, &amp;#039;O7: 廢棄草稿&amp;#039;),&lt;br /&gt;
		value: wgULS(&amp;#039;[[Wikipedia:CSD#O7|O7]]: 废弃草稿。&amp;#039;, &amp;#039;[[Wikipedia:CSD#O7|O7]]: 廢棄草稿。&amp;#039;)&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		label: wgULS(&amp;#039;R2: 跨命名空间的重定向&amp;#039;, &amp;#039;R2: 跨命名空間的重新導向&amp;#039;),&lt;br /&gt;
		value: wgULS(&amp;#039;[[WP:CSD#R2|R2]]: 跨[[H:NS|命名空间]]的[[WP:R|重定向]]&amp;#039;, &amp;#039;[[WP:CSD#R2|R2]]: 跨[[H:NS|命名空間]]的[[WP:R|重新導向]]&amp;#039;)&lt;br /&gt;
	}&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.callback.change_common_reason = function twinklebatchdeleteCallbackChangeCustomReason(e) {&lt;br /&gt;
	if (e.target.form.reason.value !== &amp;#039;&amp;#039;) {&lt;br /&gt;
		e.target.form.reason.value = Morebits.string.appendPunctuation(e.target.form.reason.value);&lt;br /&gt;
	}&lt;br /&gt;
	e.target.form.reason.value += e.target.value;&lt;br /&gt;
	e.target.value = &amp;#039;&amp;#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.callback.toggleSubpages = function twDbatchToggleSubpages(e) {&lt;br /&gt;
&lt;br /&gt;
	var form = e.target.form;&lt;br /&gt;
	var newPageList;&lt;br /&gt;
&lt;br /&gt;
	if (e.target.checked) {&lt;br /&gt;
&lt;br /&gt;
		form.delete_subpage_redirects.checked = form.delete_redirects.checked;&lt;br /&gt;
		form.delete_subpage_talks.checked = form.delete_talk.checked;&lt;br /&gt;
		form.unlink_subpages.checked = form.unlink_page.checked;&lt;br /&gt;
&lt;br /&gt;
		// If lists of subpages were already loaded once, they are&lt;br /&gt;
		// available without use of any API calls&lt;br /&gt;
		if (subpagesLoaded) {&lt;br /&gt;
&lt;br /&gt;
			$.each(Twinkle.batchdelete.pages, function(i, el) {&lt;br /&gt;
				// Get back the subgroup from subgroup_, where we saved it&lt;br /&gt;
				if (el.subgroup === null &amp;amp;&amp;amp; el.subgroup_) {&lt;br /&gt;
					el.subgroup = el.subgroup_;&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
&lt;br /&gt;
			newPageList = Twinkle.batchdelete.generateNewPageList(form);&lt;br /&gt;
			$(&amp;#039;#tw-dbatch-pages&amp;#039;).replaceWith(newPageList);&lt;br /&gt;
&lt;br /&gt;
			Morebits.quickForm.getElements(newPageList, &amp;#039;pages&amp;#039;).forEach(generateArrowLinks);&lt;br /&gt;
			Morebits.quickForm.getElements(newPageList, &amp;#039;pages.subpages&amp;#039;).forEach(generateArrowLinks);&lt;br /&gt;
&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Proceed with API calls to get list of subpages&lt;br /&gt;
		var loadingText = &amp;#039;&amp;lt;strong id=&amp;quot;dbatch-subpage-loading&amp;quot;&amp;gt;&amp;#039; + wgULS(&amp;#039;加载中...&amp;#039;, &amp;#039;載入中...&amp;#039;) + &amp;#039;&amp;lt;/strong&amp;gt;&amp;#039;;&lt;br /&gt;
		$(e.target).after(loadingText);&lt;br /&gt;
&lt;br /&gt;
		var pages = $(form.pages).map(function(i, el) {&lt;br /&gt;
			return el.value;&lt;br /&gt;
		}).get();&lt;br /&gt;
&lt;br /&gt;
		var subpageLister = new Morebits.batchOperation();&lt;br /&gt;
		subpageLister.setOption(&amp;#039;chunkSize&amp;#039;, Twinkle.getPref(&amp;#039;batchChunks&amp;#039;));&lt;br /&gt;
		subpageLister.setPageList(pages);&lt;br /&gt;
		subpageLister.run(function worker (pageName) {&lt;br /&gt;
			var pageTitle = mw.Title.newFromText(pageName);&lt;br /&gt;
&lt;br /&gt;
			// No need to look for subpages in main/file/mediawiki space&lt;br /&gt;
			if ([0, 6, 8].indexOf(pageTitle.namespace) &amp;gt; -1) {&lt;br /&gt;
				subpageLister.workerSuccess();&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var wikipedia_api = new Morebits.wiki.api(wgULS(&amp;#039;正在获取 &amp;#039;, &amp;#039;正在取得 &amp;#039;) + pageName + wgULS(&amp;#039; 的子页面&amp;#039;, &amp;#039; 的子頁面&amp;#039;), {&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				prop: &amp;#039;revisions|info|imageinfo&amp;#039;,&lt;br /&gt;
				generator: &amp;#039;allpages&amp;#039;,&lt;br /&gt;
				rvprop: &amp;#039;size&amp;#039;,&lt;br /&gt;
				inprop: &amp;#039;protection&amp;#039;,&lt;br /&gt;
				gapprefix: pageTitle.title + &amp;#039;/&amp;#039;,&lt;br /&gt;
				gapnamespace: pageTitle.namespace,&lt;br /&gt;
				gaplimit: &amp;#039;max&amp;#039;, // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
				pageNameFull: pageName // Not used by API, but added for access in onSuccess()&lt;br /&gt;
			}, function onSuccess(apiobj) {&lt;br /&gt;
				var xml = apiobj.responseXML;&lt;br /&gt;
				var $pages = $(xml).find(&amp;#039;page&amp;#039;);&lt;br /&gt;
				var subpageList = [];&lt;br /&gt;
				$pages.each(function(index, page) {&lt;br /&gt;
					var $page = $(page);&lt;br /&gt;
					var ns = $page.attr(&amp;#039;ns&amp;#039;);&lt;br /&gt;
					var title = $page.attr(&amp;#039;title&amp;#039;);&lt;br /&gt;
					var isRedir = $page.attr(&amp;#039;redirect&amp;#039;) === &amp;#039;&amp;#039;;&lt;br /&gt;
					var $editprot = $page.find(&amp;#039;pr[type=&amp;quot;edit&amp;quot;][level=&amp;quot;sysop&amp;quot;]&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
					var isProtected = $editprot.length &amp;gt; 0;&lt;br /&gt;
					var size = $page.find(&amp;#039;rev&amp;#039;).attr(&amp;#039;size&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
					var metadata = [];&lt;br /&gt;
					if (isRedir) {&lt;br /&gt;
						metadata.push(&amp;#039;redirect&amp;#039;);&lt;br /&gt;
					}&lt;br /&gt;
					if (isProtected) {&lt;br /&gt;
						metadata.push(wgULS(&amp;#039;全保护，&amp;#039;, &amp;#039;全保護，&amp;#039;) +&lt;br /&gt;
							($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;));&lt;br /&gt;
					}&lt;br /&gt;
					if (ns === &amp;#039;6&amp;#039;) {  // mimic what delimages used to show for files&lt;br /&gt;
						metadata.push(wgULS(&amp;#039;上传者：&amp;#039;, &amp;#039;上傳者：&amp;#039;) + $page.find(&amp;#039;ii&amp;#039;).attr(&amp;#039;user&amp;#039;));&lt;br /&gt;
						metadata.push(wgULS(&amp;#039;最后编辑：&amp;#039;, &amp;#039;最後編輯：&amp;#039;) + $page.find(&amp;#039;rev&amp;#039;).attr(&amp;#039;user&amp;#039;));&lt;br /&gt;
					} else {&lt;br /&gt;
						metadata.push(mw.language.convertNumber(size) + wgULS(&amp;#039;字节&amp;#039;, &amp;#039;位元組&amp;#039;));&lt;br /&gt;
					}&lt;br /&gt;
					subpageList.push({&lt;br /&gt;
						label: title + (metadata.length ? &amp;#039; (&amp;#039; + metadata.join(&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;
				if (subpageList.length) {&lt;br /&gt;
					var pageName = apiobj.query.pageNameFull;&lt;br /&gt;
					Twinkle.batchdelete.pages[pageName].subgroup = {&lt;br /&gt;
						type: &amp;#039;checkbox&amp;#039;,&lt;br /&gt;
						name: &amp;#039;subpages&amp;#039;,&lt;br /&gt;
						className: &amp;#039;dbatch-subpages&amp;#039;,&lt;br /&gt;
						shiftClickSupport: true,&lt;br /&gt;
						list: subpageList&lt;br /&gt;
					};&lt;br /&gt;
				}&lt;br /&gt;
				subpageLister.workerSuccess();&lt;br /&gt;
			}, null /* statusElement */, function onFailure() {&lt;br /&gt;
				subpageLister.workerFailure();&lt;br /&gt;
			});&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
&lt;br /&gt;
		}, function postFinish () {&lt;br /&gt;
			// List &amp;#039;em on the interface&lt;br /&gt;
&lt;br /&gt;
			newPageList = Twinkle.batchdelete.generateNewPageList(form);&lt;br /&gt;
			$(&amp;#039;#tw-dbatch-pages&amp;#039;).replaceWith(newPageList);&lt;br /&gt;
&lt;br /&gt;
			Morebits.quickForm.getElements(newPageList, &amp;#039;pages&amp;#039;).forEach(generateArrowLinks);&lt;br /&gt;
			Morebits.quickForm.getElements(newPageList, &amp;#039;pages.subpages&amp;#039;).forEach(generateArrowLinks);&lt;br /&gt;
&lt;br /&gt;
			subpagesLoaded = true;&lt;br /&gt;
&lt;br /&gt;
			// Remove &amp;quot;Loading... &amp;quot; text&lt;br /&gt;
			$(&amp;#039;#dbatch-subpage-loading&amp;#039;).remove();&lt;br /&gt;
&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	} else if (!e.target.checked) {&lt;br /&gt;
&lt;br /&gt;
		$.each(Twinkle.batchdelete.pages, function(i, el) {&lt;br /&gt;
			if (el.subgroup) {&lt;br /&gt;
				// Remove subgroup after saving its contents in subgroup_&lt;br /&gt;
				// so that it can be retrieved easily if user decides to&lt;br /&gt;
				// delete the subpages again&lt;br /&gt;
				el.subgroup_ = el.subgroup;&lt;br /&gt;
				el.subgroup = null;&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
		newPageList = Twinkle.batchdelete.generateNewPageList(form);&lt;br /&gt;
		$(&amp;#039;#tw-dbatch-pages&amp;#039;).replaceWith(newPageList);&lt;br /&gt;
&lt;br /&gt;
		Morebits.quickForm.getElements(newPageList, &amp;#039;pages&amp;#039;).forEach(generateArrowLinks);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.callback.evaluate = function twinklebatchdeleteCallbackEvaluate(event) {&lt;br /&gt;
	Morebits.wiki.actionCompleted.notice = wgULS(&amp;#039;批量删除已完成&amp;#039;, &amp;#039;批次刪除已完成&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	var form = event.target;&lt;br /&gt;
&lt;br /&gt;
	var numProtected = $(Morebits.quickForm.getElements(form, &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;) + mw.language.convertNumber(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 = form.getChecked(&amp;#039;pages&amp;#039;);&lt;br /&gt;
	var subpages = form.getChecked(&amp;#039;pages.subpages&amp;#039;);&lt;br /&gt;
	var reason = form.reason.value;&lt;br /&gt;
	var delete_page = form.delete_page.checked;&lt;br /&gt;
	var delete_talk, delete_redirects, delete_subpages;&lt;br /&gt;
	var delete_subpage_redirects, delete_subpage_talks, unlink_subpages;&lt;br /&gt;
	if (delete_page) {&lt;br /&gt;
		delete_talk = form.delete_talk.checked;&lt;br /&gt;
		delete_redirects = form.delete_redirects.checked;&lt;br /&gt;
		delete_subpages = form.delete_subpages.checked;&lt;br /&gt;
		if (delete_subpages) {&lt;br /&gt;
			delete_subpage_redirects = form.delete_subpage_redirects.checked;&lt;br /&gt;
			delete_subpage_talks = form.delete_subpage_talks.checked;&lt;br /&gt;
			unlink_subpages = form.unlink_subpages.checked;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	var unlink_page = form.unlink_page.checked;&lt;br /&gt;
	var unlink_file = form.unlink_file.checked;&lt;br /&gt;
	if (!reason) {&lt;br /&gt;
		alert(wgULS(&amp;#039;您需要给出一个理由&amp;#039;, &amp;#039;您需要給出一個理由&amp;#039;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	Morebits.simpleWindow.setButtonsEnabled(false);&lt;br /&gt;
	Morebits.status.init(form);&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;
	var pageDeleter = new Morebits.batchOperation(delete_page ? wgULS(&amp;#039;正在删除页面&amp;#039;, &amp;#039;正在刪除頁面&amp;#039;) : wgULS(&amp;#039;正在启动要求的任务&amp;#039;, &amp;#039;正在啟動要求的任務&amp;#039;));&lt;br /&gt;
	pageDeleter.setOption(&amp;#039;chunkSize&amp;#039;, Twinkle.getPref(&amp;#039;batchChunks&amp;#039;));&lt;br /&gt;
	// we only need the initial status lines if we&amp;#039;re deleting the pages in the pages array&lt;br /&gt;
	pageDeleter.setOption(&amp;#039;preserveIndividualStatusLines&amp;#039;, delete_page);&lt;br /&gt;
	pageDeleter.setPageList(pages);&lt;br /&gt;
	pageDeleter.run(function worker(pageName) {&lt;br /&gt;
		var params = {&lt;br /&gt;
			page: pageName,&lt;br /&gt;
			delete_page: delete_page,&lt;br /&gt;
			delete_talk: delete_talk,&lt;br /&gt;
			delete_redirects: delete_redirects,&lt;br /&gt;
			unlink_page: unlink_page,&lt;br /&gt;
			unlink_file: unlink_file &amp;amp;&amp;amp; new RegExp(&amp;#039;^&amp;#039; + Morebits.namespaceRegex(6) + &amp;#039;:&amp;#039;, &amp;#039;i&amp;#039;).test(pageName),&lt;br /&gt;
			reason: reason,&lt;br /&gt;
			pageDeleter: pageDeleter&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;
		if (delete_page) {&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.deletePage(Twinkle.batchdelete.callbacks.doExtras, pageDeleter.workerFailure);&lt;br /&gt;
		} else {&lt;br /&gt;
			Twinkle.batchdelete.callbacks.doExtras(wikipedia_page);&lt;br /&gt;
		}&lt;br /&gt;
	}, function postFinish() {&lt;br /&gt;
		if (delete_subpages) {&lt;br /&gt;
			var subpageDeleter = new Morebits.batchOperation(wgULS(&amp;#039;正在删除子页面&amp;#039;, &amp;#039;正在刪除子頁面&amp;#039;));&lt;br /&gt;
			subpageDeleter.setOption(&amp;#039;chunkSize&amp;#039;, Twinkle.getPref(&amp;#039;batchChunks&amp;#039;));&lt;br /&gt;
			subpageDeleter.setOption(&amp;#039;preserveIndividualStatusLines&amp;#039;, true);&lt;br /&gt;
			subpageDeleter.setPageList(subpages);&lt;br /&gt;
			subpageDeleter.run(function(pageName) {&lt;br /&gt;
				var params = {&lt;br /&gt;
					page: pageName,&lt;br /&gt;
					delete_page: true,&lt;br /&gt;
					delete_talk: delete_subpage_talks,&lt;br /&gt;
					delete_redirects: delete_subpage_redirects,&lt;br /&gt;
					unlink_page: unlink_subpages,&lt;br /&gt;
					unlink_file: false,&lt;br /&gt;
					reason: reason,&lt;br /&gt;
					pageDeleter: subpageDeleter&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.deletePage(Twinkle.batchdelete.callbacks.doExtras, pageDeleter.workerFailure);&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.batchdelete.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.pageDeleter.workerSuccess(thingWithParameters);&lt;br /&gt;
&lt;br /&gt;
		var query, wikipedia_api;&lt;br /&gt;
&lt;br /&gt;
		if (params.unlink_page) {&lt;br /&gt;
			Twinkle.batchdelete.unlinkCache = {};&lt;br /&gt;
			query = {&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				list: &amp;#039;backlinks&amp;#039;,&lt;br /&gt;
				blfilterredir: &amp;#039;nonredirects&amp;#039;,&lt;br /&gt;
				blnamespace: [0, 100], // main space and portal space only&lt;br /&gt;
				bltitle: params.page,&lt;br /&gt;
				bllimit: &amp;#039;max&amp;#039; // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
			};&lt;br /&gt;
			wikipedia_api = new Morebits.wiki.api(wgULS(&amp;#039;正在获取链入&amp;#039;, &amp;#039;正在取得連入&amp;#039;), query, Twinkle.batchdelete.callbacks.unlinkBacklinksMain);&lt;br /&gt;
			wikipedia_api.params = params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (params.unlink_file) {&lt;br /&gt;
			query = {&lt;br /&gt;
				action: &amp;#039;query&amp;#039;,&lt;br /&gt;
				list: &amp;#039;imageusage&amp;#039;,&lt;br /&gt;
				iutitle: params.page,&lt;br /&gt;
				iulimit: &amp;#039;max&amp;#039; // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
			};&lt;br /&gt;
			wikipedia_api = new Morebits.wiki.api(wgULS(&amp;#039;正在获取文件链入&amp;#039;, &amp;#039;正在取得檔案連入&amp;#039;), query, Twinkle.batchdelete.callbacks.unlinkImageInstancesMain);&lt;br /&gt;
			wikipedia_api.params = params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (params.delete_page) {&lt;br /&gt;
			if (params.delete_redirects) {&lt;br /&gt;
				query = {&lt;br /&gt;
					action: &amp;#039;query&amp;#039;,&lt;br /&gt;
					titles: params.page,&lt;br /&gt;
					prop: &amp;#039;redirects&amp;#039;,&lt;br /&gt;
					rdlimit: &amp;#039;max&amp;#039; // 500 is max for normal users, 5000 for bots and sysops&lt;br /&gt;
				};&lt;br /&gt;
				wikipedia_api = new Morebits.wiki.api(wgULS(&amp;#039;正在获取重定向&amp;#039;, &amp;#039;正在取得重新導向&amp;#039;), query, Twinkle.batchdelete.callbacks.deleteRedirectsMain);&lt;br /&gt;
				wikipedia_api.params = params;&lt;br /&gt;
				wikipedia_api.post();&lt;br /&gt;
			}&lt;br /&gt;
			if (params.delete_talk) {&lt;br /&gt;
				var pageTitle = mw.Title.newFromText(params.page);&lt;br /&gt;
				if (pageTitle &amp;amp;&amp;amp; pageTitle.namespace % 2 === 0 &amp;amp;&amp;amp; pageTitle.namespace !== 2) {&lt;br /&gt;
					pageTitle.namespace++;  // now pageTitle is the talk page title!&lt;br /&gt;
					query = {&lt;br /&gt;
						action: &amp;#039;query&amp;#039;,&lt;br /&gt;
						titles: pageTitle.toText()&lt;br /&gt;
					};&lt;br /&gt;
					wikipedia_api = new Morebits.wiki.api(wgULS(&amp;#039;正在检查讨论页面是否存在&amp;#039;, &amp;#039;正在檢查討論頁面是否存在&amp;#039;), query, Twinkle.batchdelete.callbacks.deleteTalk);&lt;br /&gt;
					wikipedia_api.params = params;&lt;br /&gt;
					wikipedia_api.params.talkPage = pageTitle.toText();&lt;br /&gt;
					wikipedia_api.post();&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	deleteRedirectsMain: function(apiobj) {&lt;br /&gt;
		var xml = apiobj.responseXML;&lt;br /&gt;
		var pages = $(xml).find(&amp;#039;rd&amp;#039;).map(function() {&lt;br /&gt;
			return $(this).attr(&amp;#039;title&amp;#039;);&lt;br /&gt;
		}).get();&lt;br /&gt;
		if (!pages.length) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var redirectDeleter = new Morebits.batchOperation(wgULS(&amp;#039;正在删除到 &amp;#039;, &amp;#039;正在刪除到 &amp;#039;) + apiobj.params.page + wgULS(&amp;#039; 的重定向&amp;#039;, &amp;#039; 的重新導向&amp;#039;));&lt;br /&gt;
		redirectDeleter.setOption(&amp;#039;chunkSize&amp;#039;, Twinkle.getPref(&amp;#039;batchChunks&amp;#039;));&lt;br /&gt;
		redirectDeleter.setPageList(pages);&lt;br /&gt;
		redirectDeleter.run(function(pageName) {&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.setEditSummary(&amp;#039;[[WP:CSD#G15|G15]]: &amp;#039; + wgULS(&amp;#039;指向已删页面“&amp;#039;, &amp;#039;指向已刪頁面「&amp;#039;) + apiobj.params.page + wgULS(&amp;#039;”的重定向&amp;#039;, &amp;#039;」的重新導向&amp;#039;));&lt;br /&gt;
			wikipedia_page.setChangeTags(Twinkle.changeTags);&lt;br /&gt;
			wikipedia_page.deletePage(redirectDeleter.workerSuccess, redirectDeleter.workerFailure);&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	deleteTalk: 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;
&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(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(&amp;#039;[[WP:CSD#G15|G15]]: &amp;#039; + 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.deletePage();&lt;br /&gt;
	},&lt;br /&gt;
	unlinkBacklinksMain: function(apiobj) {&lt;br /&gt;
		var xml = apiobj.responseXML;&lt;br /&gt;
		var pages = $(xml).find(&amp;#039;bl&amp;#039;).map(function() {&lt;br /&gt;
			return $(this).attr(&amp;#039;title&amp;#039;);&lt;br /&gt;
		}).get();&lt;br /&gt;
		if (!pages.length) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var unlinker = new Morebits.batchOperation(&amp;#039;正在取消到 &amp;#039; + apiobj.params.page + wgULS(&amp;#039; 的链入&amp;#039;, &amp;#039; 的連入&amp;#039;));&lt;br /&gt;
		unlinker.setOption(&amp;#039;chunkSize&amp;#039;, Twinkle.getPref(&amp;#039;batchChunks&amp;#039;));&lt;br /&gt;
		unlinker.setPageList(pages);&lt;br /&gt;
		unlinker.run(function(pageName) {&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page(pageName, &amp;#039;正在取消 &amp;#039; + pageName + wgULS(&amp;#039; 上的链入&amp;#039;, &amp;#039; 上的連入&amp;#039;));&lt;br /&gt;
			var params = $.extend({}, apiobj.params);&lt;br /&gt;
			params.title = pageName;&lt;br /&gt;
			params.unlinker = unlinker;&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.batchdelete.callbacks.unlinkBacklinks);&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	unlinkBacklinks: function(pageobj) {&lt;br /&gt;
		var params = pageobj.getCallbackParameters();&lt;br /&gt;
		if (!pageobj.exists()) {&lt;br /&gt;
			// we probably just deleted it, as a recursive backlink&lt;br /&gt;
			params.unlinker.workerSuccess(pageobj);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var text;&lt;br /&gt;
		if (params.title in Twinkle.batchdelete.unlinkCache) {&lt;br /&gt;
			text = Twinkle.batchdelete.unlinkCache[params.title];&lt;br /&gt;
		} else {&lt;br /&gt;
			text = pageobj.getPageText();&lt;br /&gt;
		}&lt;br /&gt;
		var old_text = text;&lt;br /&gt;
		var wikiPage = new Morebits.wikitext.page(text);&lt;br /&gt;
		text = wikiPage.removeLink(params.page).getText();&lt;br /&gt;
&lt;br /&gt;
		Twinkle.batchdelete.unlinkCache[params.title] = text;&lt;br /&gt;
		if (text === old_text) {&lt;br /&gt;
			// Nothing to do, return&lt;br /&gt;
			params.unlinker.workerSuccess(pageobj);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		pageobj.setEditSummary(wgULS(&amp;#039;取消到已删页面&amp;#039;, &amp;#039;取消到已刪頁面&amp;#039;) + params.page + wgULS(&amp;#039;的链入&amp;#039;, &amp;#039;的連入&amp;#039;));&lt;br /&gt;
		pageobj.setChangeTags(Twinkle.changeTags);&lt;br /&gt;
		pageobj.setPageText(text);&lt;br /&gt;
		pageobj.setCreateOption(&amp;#039;nocreate&amp;#039;);&lt;br /&gt;
		pageobj.setMaxConflictRetries(10);&lt;br /&gt;
		pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);&lt;br /&gt;
	},&lt;br /&gt;
	unlinkImageInstancesMain: function(apiobj) {&lt;br /&gt;
		var xml = apiobj.responseXML;&lt;br /&gt;
		var pages = $(xml).find(&amp;#039;iu&amp;#039;).map(function() {&lt;br /&gt;
			return $(this).attr(&amp;#039;title&amp;#039;);&lt;br /&gt;
		}).get();&lt;br /&gt;
		if (!pages.length) {&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var unlinker = new Morebits.batchOperation(&amp;#039;正在取消到 &amp;#039; + apiobj.params.page + wgULS(&amp;#039; 的链入&amp;#039;, &amp;#039; 的連入&amp;#039;));&lt;br /&gt;
		unlinker.setOption(&amp;#039;chunkSize&amp;#039;, Twinkle.getPref(&amp;#039;batchChunks&amp;#039;));&lt;br /&gt;
		unlinker.setPageList(pages);&lt;br /&gt;
		unlinker.run(function(pageName) {&lt;br /&gt;
			var wikipedia_page = new Morebits.wiki.page(pageName, &amp;#039;取消 &amp;#039; + pageName + wgULS(&amp;#039; 的文件使用&amp;#039;, &amp;#039; 的檔案使用&amp;#039;));&lt;br /&gt;
			var params = $.extend({}, apiobj.params);&lt;br /&gt;
			params.title = pageName;&lt;br /&gt;
			params.unlinker = unlinker;&lt;br /&gt;
			wikipedia_page.setCallbackParameters(params);&lt;br /&gt;
			wikipedia_page.load(Twinkle.batchdelete.callbacks.unlinkImageInstances);&lt;br /&gt;
		});&lt;br /&gt;
	},&lt;br /&gt;
	unlinkImageInstances: function(pageobj) {&lt;br /&gt;
		var params = pageobj.getCallbackParameters();&lt;br /&gt;
		if (!pageobj.exists()) {&lt;br /&gt;
			// we probably just deleted it, as a recursive backlink&lt;br /&gt;
			params.unlinker.workerSuccess(pageobj);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var image = params.page.replace(new RegExp(&amp;#039;^&amp;#039; + Morebits.namespaceRegex(6) + &amp;#039;:&amp;#039;), &amp;#039;&amp;#039;);&lt;br /&gt;
		var text;&lt;br /&gt;
		if (params.title in Twinkle.batchdelete.unlinkCache) {&lt;br /&gt;
			text = Twinkle.batchdelete.unlinkCache[params.title];&lt;br /&gt;
		} else {&lt;br /&gt;
			text = pageobj.getPageText();&lt;br /&gt;
		}&lt;br /&gt;
		var old_text = text;&lt;br /&gt;
		var wikiPage = new Morebits.wikitext.page(text);&lt;br /&gt;
		text = wikiPage.commentOutImage(image, wgULS(&amp;#039;因文件已删，故注解&amp;#039;, &amp;#039;因檔案已刪，故註解&amp;#039;)).getText();&lt;br /&gt;
&lt;br /&gt;
		Twinkle.batchdelete.unlinkCache[params.title] = text;&lt;br /&gt;
		if (text === old_text) {&lt;br /&gt;
			pageobj.getStatusElement().error(&amp;#039;在 &amp;#039; + pageobj.getPageName() + &amp;#039; 上取消 &amp;#039; + image + wgULS(&amp;#039; 的文件使用失败&amp;#039;, &amp;#039; 的檔案使用失敗&amp;#039;));&lt;br /&gt;
			params.unlinker.workerFailure(pageobj);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		pageobj.setEditSummary(wgULS(&amp;#039;取消使用已被删除文件&amp;#039;, &amp;#039;取消使用已被刪除檔案&amp;#039;) + image + wgULS(&amp;#039;，因为：&amp;#039;, &amp;#039;，因為：&amp;#039;) + params.reason);&lt;br /&gt;
		pageobj.setChangeTags(Twinkle.changeTags);&lt;br /&gt;
		pageobj.setPageText(text);&lt;br /&gt;
		pageobj.setCreateOption(&amp;#039;nocreate&amp;#039;);&lt;br /&gt;
		pageobj.setMaxConflictRetries(10);&lt;br /&gt;
		pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.addInitCallback(Twinkle.batchdelete, &amp;#039;batchdelete&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>