<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hant-TW">
	<id>https://tnfshwiki.tfcis.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklefluff.js</id>
	<title>MediaWiki:Gadget-twinklefluff.js - 修訂歷史</title>
	<link rel="self" type="application/atom+xml" href="https://tnfshwiki.tfcis.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-twinklefluff.js"/>
	<link rel="alternate" type="text/html" href="https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-twinklefluff.js&amp;action=history"/>
	<updated>2026-04-08T18:21:36Z</updated>
	<subtitle>本 Wiki 上此頁面的修訂歷史</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-twinklefluff.js&amp;diff=4371&amp;oldid=prev</id>
		<title>Xiplus-bot：​繁簡轉換</title>
		<link rel="alternate" type="text/html" href="https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-twinklefluff.js&amp;diff=4371&amp;oldid=prev"/>
		<updated>2016-04-10T07:26:59Z</updated>

		<summary type="html">&lt;p&gt;繁簡轉換&lt;/p&gt;
&lt;a href=&quot;https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-twinklefluff.js&amp;amp;diff=4371&amp;amp;oldid=3911&quot;&gt;顯示變更&lt;/a&gt;</summary>
		<author><name>Xiplus-bot</name></author>
	</entry>
	<entry>
		<id>https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-twinklefluff.js&amp;diff=3911&amp;oldid=prev</id>
		<title>Xiplus：​已匯入 1 筆修訂：Twinkle</title>
		<link rel="alternate" type="text/html" href="https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-twinklefluff.js&amp;diff=3911&amp;oldid=prev"/>
		<updated>2016-03-25T06:03:18Z</updated>

		<summary type="html">&lt;p&gt;已匯入 1 筆修訂：Twinkle&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;zh-Hant-TW&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上個修訂&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;於 2016年3月25日 (五) 14:03 的修訂&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key tnfshwiki-tnfshwiki_:diff:wikidiff2:1.12:old-3910:rev-3911:1.13.0 --&gt;
&lt;/table&gt;</summary>
		<author><name>Xiplus</name></author>
	</entry>
	<entry>
		<id>https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-twinklefluff.js&amp;diff=3910&amp;oldid=prev</id>
		<title>zhwiki&gt;Jimmy Xu：​v2.0-1033-g265ec81-dirty</title>
		<link rel="alternate" type="text/html" href="https://tnfshwiki.tfcis.org/index.php?title=MediaWiki:Gadget-twinklefluff.js&amp;diff=3910&amp;oldid=prev"/>
		<updated>2015-06-30T10:53:14Z</updated>

		<summary type="html">&lt;p&gt;v2.0-1033-g265ec81-dirty&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;
// vim: set noet sts=0 sw=8:&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;
 *** twinklefluff.js: Revert/rollback module&lt;br /&gt;
 ****************************************&lt;br /&gt;
 * Mode of invocation:     Links on history, contributions, and diff pages&lt;br /&gt;
 * Active on:              Diff pages, history pages, contributions pages&lt;br /&gt;
 * Config directives in:   TwinkleConfig&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 Twinklefluff revert and antivandalism utility&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
Twinkle.fluff = {&lt;br /&gt;
	auto: function() {&lt;br /&gt;
		if( parseInt( Morebits.queryString.get(&amp;#039;oldid&amp;#039;), 10) !== mw.config.get(&amp;#039;wgCurRevisionId&amp;#039;) ) {&lt;br /&gt;
			// not latest revision&lt;br /&gt;
			alert(&amp;quot;无法回退，页面在此期间已被修改。&amp;quot;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var vandal = $(&amp;quot;#mw-diff-ntitle2&amp;quot;).find(&amp;quot;a.mw-userlink&amp;quot;).text();&lt;br /&gt;
&lt;br /&gt;
		Twinkle.fluff.revert( Morebits.queryString.get( &amp;#039;twinklerevert&amp;#039; ), vandal, true );&lt;br /&gt;
	},&lt;br /&gt;
	normal: function() {&lt;br /&gt;
&lt;br /&gt;
		var spanTag = function( color, content ) {&lt;br /&gt;
			var span = document.createElement( &amp;#039;span&amp;#039; );&lt;br /&gt;
			span.style.color = color;&lt;br /&gt;
			span.appendChild( document.createTextNode( content ) );&lt;br /&gt;
			return span;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		if( mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) === -1 &amp;amp;&amp;amp; mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;quot;Contributions&amp;quot; ) {&lt;br /&gt;
			//Get the username these contributions are for&lt;br /&gt;
			var logLink = $(&amp;#039;#contentSub&amp;#039;).find(&amp;#039;a[title^=&amp;quot;Special:日志&amp;quot;]&amp;#039;).last();&lt;br /&gt;
			if (logLink.length&amp;gt;0) //#215 -- there is no log link on Special:Contributions with no user&lt;br /&gt;
			{&lt;br /&gt;
				var username = decodeURIComponent(/wiki\/Special:%E6%97%A5%E5%BF%97\/(.+)$/.exec(logLink.attr(&amp;quot;href&amp;quot;).replace(/_/g, &amp;quot;%20&amp;quot;))[1]);&lt;br /&gt;
				if( Twinkle.getPref(&amp;#039;showRollbackLinks&amp;#039;).indexOf(&amp;#039;contribs&amp;#039;) !== -1 ||&lt;br /&gt;
					( mw.config.get(&amp;#039;wgUserName&amp;#039;) !== username &amp;amp;&amp;amp; Twinkle.getPref(&amp;#039;showRollbackLinks&amp;#039;).indexOf(&amp;#039;others&amp;#039;) !== -1 ) ||&lt;br /&gt;
					( mw.config.get(&amp;#039;wgUserName&amp;#039;) === username &amp;amp;&amp;amp; Twinkle.getPref(&amp;#039;showRollbackLinks&amp;#039;).indexOf(&amp;#039;mine&amp;#039;) !== -1 ) ) {&lt;br /&gt;
					var list = $(&amp;quot;#mw-content-text&amp;quot;).find(&amp;quot;ul li:has(span.mw-uctop)&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
					var revNode = document.createElement(&amp;#039;strong&amp;#039;);&lt;br /&gt;
					var revLink = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
					revLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;[&amp;#039; ) );&lt;br /&gt;
					revLink.appendChild( spanTag( &amp;#039;SteelBlue&amp;#039;, &amp;#039;回退&amp;#039; ) );&lt;br /&gt;
					revLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;]&amp;#039; ) );&lt;br /&gt;
					revNode.appendChild(revLink);&lt;br /&gt;
&lt;br /&gt;
					var revVandNode = document.createElement(&amp;#039;strong&amp;#039;);&lt;br /&gt;
					var revVandLink = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
					revVandLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;[&amp;#039; ) );&lt;br /&gt;
					revVandLink.appendChild( spanTag( &amp;#039;Red&amp;#039;, &amp;#039;破坏&amp;#039; ) );&lt;br /&gt;
					revVandLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;]&amp;#039; ) );&lt;br /&gt;
					revVandNode.appendChild(revVandLink);&lt;br /&gt;
&lt;br /&gt;
					list.each(function(key, current) {&lt;br /&gt;
						var href = $(current).children(&amp;quot;a:eq(1)&amp;quot;).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
						current.appendChild( document.createTextNode(&amp;#039; &amp;#039;) );&lt;br /&gt;
						var tmpNode = revNode.cloneNode( true );&lt;br /&gt;
						tmpNode.firstChild.setAttribute( &amp;#039;href&amp;#039;, href + &amp;#039;&amp;amp;&amp;#039; + Morebits.queryString.create( { &amp;#039;twinklerevert&amp;#039;: &amp;#039;norm&amp;#039; } ) );&lt;br /&gt;
						current.appendChild( tmpNode );&lt;br /&gt;
						current.appendChild( document.createTextNode(&amp;#039; &amp;#039;) );&lt;br /&gt;
						tmpNode = revVandNode.cloneNode( true );&lt;br /&gt;
						tmpNode.firstChild.setAttribute( &amp;#039;href&amp;#039;, href + &amp;#039;&amp;amp;&amp;#039; + Morebits.queryString.create( { &amp;#039;twinklerevert&amp;#039;: &amp;#039;vand&amp;#039; } ) );&lt;br /&gt;
						current.appendChild( tmpNode );&lt;br /&gt;
					});&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
&lt;br /&gt;
			if( mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;) === &amp;quot;Undelete&amp;quot; ) {&lt;br /&gt;
				//You can&amp;#039;t rollback deleted pages!&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var firstRev = $(&amp;quot;div.firstrevisionheader&amp;quot;).length;&lt;br /&gt;
			if( firstRev ) {&lt;br /&gt;
				// we have first revision here, nothing to do.&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var otitle, ntitle;&lt;br /&gt;
			try {&lt;br /&gt;
				var otitle1 = document.getElementById(&amp;#039;mw-diff-otitle1&amp;#039;);&lt;br /&gt;
				var ntitle1 = document.getElementById(&amp;#039;mw-diff-ntitle1&amp;#039;);&lt;br /&gt;
				if (!otitle1 || !ntitle1) {&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				otitle = otitle1.parentNode;&lt;br /&gt;
				ntitle = ntitle1.parentNode;&lt;br /&gt;
			} catch( e ) {&lt;br /&gt;
				// no old, nor new title, nothing to do really, return;&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var old_rev_url = $(&amp;quot;#mw-diff-otitle1&amp;quot;).find(&amp;quot;strong a&amp;quot;).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Lets first add a [edit this revision] link&lt;br /&gt;
			var query = new Morebits.queryString( old_rev_url.split( &amp;#039;?&amp;#039;, 2 )[1] );&lt;br /&gt;
&lt;br /&gt;
			var oldrev = query.get(&amp;#039;oldid&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			var revertToRevision = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
			revertToRevision.setAttribute( &amp;#039;id&amp;#039;, &amp;#039;tw-revert-to-orevision&amp;#039; );&lt;br /&gt;
			revertToRevision.style.fontWeight = &amp;#039;bold&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
			var revertToRevisionLink = revertToRevision.appendChild( document.createElement(&amp;#039;a&amp;#039;) );&lt;br /&gt;
			revertToRevisionLink.href = &amp;quot;#&amp;quot;;&lt;br /&gt;
			$(revertToRevisionLink).click(function(){&lt;br /&gt;
				Twinkle.fluff.revertToRevision(oldrev);&lt;br /&gt;
			});&lt;br /&gt;
			revertToRevisionLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;[&amp;#039; ) );&lt;br /&gt;
			revertToRevisionLink.appendChild( spanTag( &amp;#039;SaddleBrown&amp;#039;, &amp;#039;恢复此版本&amp;#039; ) );&lt;br /&gt;
			revertToRevisionLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;]&amp;#039; ) );&lt;br /&gt;
&lt;br /&gt;
			otitle.insertBefore( revertToRevision, otitle.firstChild );&lt;br /&gt;
&lt;br /&gt;
			if( document.getElementById(&amp;#039;differences-nextlink&amp;#039;) ) {&lt;br /&gt;
				// Not latest revision&lt;br /&gt;
				var new_rev_url = $(&amp;quot;#mw-diff-ntitle1&amp;quot;).find(&amp;quot;strong a&amp;quot;).attr(&amp;quot;href&amp;quot;);&lt;br /&gt;
				query = new Morebits.queryString( new_rev_url.split( &amp;#039;?&amp;#039;, 2 )[1] );&lt;br /&gt;
				var newrev = query.get(&amp;#039;oldid&amp;#039;);&lt;br /&gt;
				revertToRevision = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
				revertToRevision.setAttribute( &amp;#039;id&amp;#039;, &amp;#039;tw-revert-to-nrevision&amp;#039; );&lt;br /&gt;
				revertToRevision.style.fontWeight = &amp;#039;bold&amp;#039;;&lt;br /&gt;
				revertToRevisionLink = revertToRevision.appendChild( document.createElement(&amp;#039;a&amp;#039;) );&lt;br /&gt;
				revertToRevisionLink.href = &amp;quot;#&amp;quot;;&lt;br /&gt;
				$(revertToRevisionLink).click(function(){&lt;br /&gt;
					Twinkle.fluff.revertToRevision(newrev);&lt;br /&gt;
				});&lt;br /&gt;
				revertToRevisionLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;[&amp;#039; ) );&lt;br /&gt;
				revertToRevisionLink.appendChild( spanTag( &amp;#039;SaddleBrown&amp;#039;, &amp;#039;恢复此版本&amp;#039; ) );&lt;br /&gt;
				revertToRevisionLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;]&amp;#039; ) );&lt;br /&gt;
				ntitle.insertBefore( revertToRevision, ntitle.firstChild );&lt;br /&gt;
&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if( Twinkle.getPref(&amp;#039;showRollbackLinks&amp;#039;).indexOf(&amp;#039;diff&amp;#039;) !== -1 ) {&lt;br /&gt;
				var vandal = $(&amp;quot;#mw-diff-ntitle2&amp;quot;).find(&amp;quot;a&amp;quot;).first().text();&lt;br /&gt;
&lt;br /&gt;
				var revertNode = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
				revertNode.setAttribute( &amp;#039;id&amp;#039;, &amp;#039;tw-revert&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
				var agfNode = document.createElement(&amp;#039;strong&amp;#039;);&lt;br /&gt;
				var vandNode = document.createElement(&amp;#039;strong&amp;#039;);&lt;br /&gt;
				var normNode = document.createElement(&amp;#039;strong&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
				var agfLink = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
				var vandLink = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
				var normLink = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
				agfLink.href = &amp;quot;#&amp;quot;;&lt;br /&gt;
				vandLink.href = &amp;quot;#&amp;quot;;&lt;br /&gt;
				normLink.href = &amp;quot;#&amp;quot;;&lt;br /&gt;
				$(agfLink).click(function(){&lt;br /&gt;
					Twinkle.fluff.revert(&amp;#039;agf&amp;#039;, vandal);&lt;br /&gt;
				});&lt;br /&gt;
				$(vandLink).click(function(){&lt;br /&gt;
					Twinkle.fluff.revert(&amp;#039;vand&amp;#039;, vandal);&lt;br /&gt;
				});&lt;br /&gt;
				$(normLink).click(function(){&lt;br /&gt;
					Twinkle.fluff.revert(&amp;#039;norm&amp;#039;, vandal);&lt;br /&gt;
				});&lt;br /&gt;
&lt;br /&gt;
				agfLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;[&amp;#039; ) );&lt;br /&gt;
				agfLink.appendChild( spanTag( &amp;#039;DarkOliveGreen&amp;#039;, &amp;#039;回退（AGF）&amp;#039; ) );&lt;br /&gt;
				agfLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;]&amp;#039; ) );&lt;br /&gt;
&lt;br /&gt;
				vandLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;[&amp;#039; ) );&lt;br /&gt;
				vandLink.appendChild( spanTag( &amp;#039;Red&amp;#039;, &amp;#039;回退（破坏）&amp;#039; ) );&lt;br /&gt;
				vandLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;]&amp;#039; ) );&lt;br /&gt;
&lt;br /&gt;
				normLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;[&amp;#039; ) );&lt;br /&gt;
				normLink.appendChild( spanTag( &amp;#039;SteelBlue&amp;#039;, &amp;#039;回退&amp;#039; ) );&lt;br /&gt;
				normLink.appendChild( spanTag( &amp;#039;Black&amp;#039;, &amp;#039;]&amp;#039; ) );&lt;br /&gt;
&lt;br /&gt;
				agfNode.appendChild(agfLink);&lt;br /&gt;
				vandNode.appendChild(vandLink);&lt;br /&gt;
				normNode.appendChild(normLink);&lt;br /&gt;
&lt;br /&gt;
				revertNode.appendChild( agfNode );&lt;br /&gt;
				revertNode.appendChild( document.createTextNode(&amp;#039; || &amp;#039;) );&lt;br /&gt;
				revertNode.appendChild( normNode );&lt;br /&gt;
				revertNode.appendChild( document.createTextNode(&amp;#039; || &amp;#039;) );&lt;br /&gt;
				revertNode.appendChild( vandNode );&lt;br /&gt;
&lt;br /&gt;
				ntitle.insertBefore( revertNode, ntitle.firstChild );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.fluff.revert = function revertPage( type, vandal, autoRevert, rev, page ) {&lt;br /&gt;
	if (mw.util.isIPv6Address(vandal)) {&lt;br /&gt;
		vandal = Morebits.sanitizeIPv6(vandal);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var pagename = page || mw.config.get(&amp;#039;wgPageName&amp;#039;);&lt;br /&gt;
	var revid = rev || mw.config.get(&amp;#039;wgCurRevisionId&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	Morebits.status.init( document.getElementById(&amp;#039;mw-content-text&amp;#039;) );&lt;br /&gt;
	$( &amp;#039;#catlinks&amp;#039; ).remove();&lt;br /&gt;
&lt;br /&gt;
	var params = {&lt;br /&gt;
		type: type,&lt;br /&gt;
		user: vandal,&lt;br /&gt;
		pagename: pagename,&lt;br /&gt;
		revid: revid,&lt;br /&gt;
		autoRevert: !!autoRevert&lt;br /&gt;
	};&lt;br /&gt;
	var query = {&lt;br /&gt;
		&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
		&amp;#039;prop&amp;#039;: [&amp;#039;info&amp;#039;, &amp;#039;revisions&amp;#039;],&lt;br /&gt;
		&amp;#039;titles&amp;#039;: pagename,&lt;br /&gt;
		&amp;#039;rvlimit&amp;#039;: 50, // max possible&lt;br /&gt;
		&amp;#039;rvprop&amp;#039;: [ &amp;#039;ids&amp;#039;, &amp;#039;timestamp&amp;#039;, &amp;#039;user&amp;#039;, &amp;#039;comment&amp;#039; ],&lt;br /&gt;
		&amp;#039;intoken&amp;#039;: &amp;#039;edit&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api( &amp;#039;抓取较早修订版本信息&amp;#039;, query, Twinkle.fluff.callbacks.main );&lt;br /&gt;
	wikipedia_api.params = params;&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.fluff.revertToRevision = function revertToRevision( oldrev ) {&lt;br /&gt;
&lt;br /&gt;
	Morebits.status.init( document.getElementById(&amp;#039;mw-content-text&amp;#039;) );&lt;br /&gt;
&lt;br /&gt;
	var query = {&lt;br /&gt;
		&amp;#039;action&amp;#039;: &amp;#039;query&amp;#039;,&lt;br /&gt;
		&amp;#039;prop&amp;#039;: [&amp;#039;info&amp;#039;,  &amp;#039;revisions&amp;#039;],&lt;br /&gt;
		&amp;#039;titles&amp;#039;: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
		&amp;#039;rvlimit&amp;#039;: 1,&lt;br /&gt;
		&amp;#039;rvstartid&amp;#039;: oldrev,&lt;br /&gt;
		&amp;#039;rvprop&amp;#039;: [ &amp;#039;ids&amp;#039;, &amp;#039;timestamp&amp;#039;, &amp;#039;user&amp;#039;, &amp;#039;comment&amp;#039; ],&lt;br /&gt;
		&amp;#039;intoken&amp;#039;: &amp;#039;edit&amp;#039;,&lt;br /&gt;
		&amp;#039;format&amp;#039;: &amp;#039;xml&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
	var wikipedia_api = new Morebits.wiki.api( &amp;#039;抓取较早修订版本信息&amp;#039;, query, Twinkle.fluff.callbacks.toRevision.main );&lt;br /&gt;
	wikipedia_api.params = { rev: oldrev };&lt;br /&gt;
	wikipedia_api.post();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.fluff.userIpLink = function( user ) {&lt;br /&gt;
	return (Morebits.isIPAddress(user) ? &amp;quot;[[Special:Contributions/&amp;quot; : &amp;quot;[[User:&amp;quot; ) + user + &amp;quot;|&amp;quot; + user + &amp;quot;]]&amp;quot;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.fluff.callbacks = {&lt;br /&gt;
	toRevision: {&lt;br /&gt;
		main: function( self ) {&lt;br /&gt;
			var xmlDoc = self.responseXML;&lt;br /&gt;
&lt;br /&gt;
			var lastrevid = parseInt( $(xmlDoc).find(&amp;#039;page&amp;#039;).attr(&amp;#039;lastrevid&amp;#039;), 10);&lt;br /&gt;
			var touched = $(xmlDoc).find(&amp;#039;page&amp;#039;).attr(&amp;#039;touched&amp;#039;);&lt;br /&gt;
			var starttimestamp = $(xmlDoc).find(&amp;#039;page&amp;#039;).attr(&amp;#039;starttimestamp&amp;#039;);&lt;br /&gt;
			var edittoken = $(xmlDoc).find(&amp;#039;page&amp;#039;).attr(&amp;#039;edittoken&amp;#039;);&lt;br /&gt;
			var revertToRevID = $(xmlDoc).find(&amp;#039;rev&amp;#039;).attr(&amp;#039;revid&amp;#039;);&lt;br /&gt;
			var revertToUser = $(xmlDoc).find(&amp;#039;rev&amp;#039;).attr(&amp;#039;user&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			if (revertToRevID !== self.params.rev) {&lt;br /&gt;
				self.statitem.error( &amp;#039;抓取到的修订版本与请求的修订版本不符，取消。&amp;#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			var optional_summary = prompt( &amp;quot;请输入回退理由：                                &amp;quot;, &amp;quot;&amp;quot; );  // padded out to widen prompt in Firefox&lt;br /&gt;
			if (optional_summary === null)&lt;br /&gt;
			{&lt;br /&gt;
				self.statelem.error( &amp;#039;由用户取消。&amp;#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			var summary = Twinkle.fluff.formatSummary(&amp;quot;回退到由$USER做出的修订版本&amp;quot; + revertToRevID, revertToUser, optional_summary);&lt;br /&gt;
&lt;br /&gt;
			var query = {&lt;br /&gt;
				&amp;#039;action&amp;#039;: &amp;#039;edit&amp;#039;,&lt;br /&gt;
				&amp;#039;title&amp;#039;: mw.config.get(&amp;#039;wgPageName&amp;#039;),&lt;br /&gt;
				&amp;#039;summary&amp;#039;: summary,&lt;br /&gt;
				&amp;#039;token&amp;#039;: edittoken,&lt;br /&gt;
				&amp;#039;undo&amp;#039;: lastrevid,&lt;br /&gt;
				&amp;#039;undoafter&amp;#039;: revertToRevID,&lt;br /&gt;
				&amp;#039;basetimestamp&amp;#039;: touched,&lt;br /&gt;
				&amp;#039;starttimestamp&amp;#039;: starttimestamp,&lt;br /&gt;
				&amp;#039;watchlist&amp;#039;: Twinkle.getPref(&amp;#039;watchRevertedPages&amp;#039;).indexOf( self.params.type ) !== -1 ? &amp;#039;watch&amp;#039; : undefined,&lt;br /&gt;
				&amp;#039;minor&amp;#039;: Twinkle.getPref(&amp;#039;markRevertedPagesAsMinor&amp;#039;).indexOf( self.params.type ) !== -1  ? true : undefined&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			Morebits.wiki.actionCompleted.redirect = mw.config.get(&amp;#039;wgPageName&amp;#039;);&lt;br /&gt;
			Morebits.wiki.actionCompleted.notice = &amp;quot;修订版本完成&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
			var wikipedia_api = new Morebits.wiki.api( &amp;#039;保存回退内容&amp;#039;, query, Twinkle.fluff.callbacks.complete, self.statelem);&lt;br /&gt;
			wikipedia_api.params = self.params;&lt;br /&gt;
			wikipedia_api.post();&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	main: function( self ) {&lt;br /&gt;
		var xmlDoc = self.responseXML;&lt;br /&gt;
&lt;br /&gt;
		var lastrevid = parseInt( $(xmlDoc).find(&amp;#039;page&amp;#039;).attr(&amp;#039;lastrevid&amp;#039;), 10);&lt;br /&gt;
		var touched = $(xmlDoc).find(&amp;#039;page&amp;#039;).attr(&amp;#039;touched&amp;#039;);&lt;br /&gt;
		var starttimestamp = $(xmlDoc).find(&amp;#039;page&amp;#039;).attr(&amp;#039;starttimestamp&amp;#039;);&lt;br /&gt;
		var edittoken = $(xmlDoc).find(&amp;#039;page&amp;#039;).attr(&amp;#039;edittoken&amp;#039;);&lt;br /&gt;
		var lastuser = $(xmlDoc).find(&amp;#039;rev&amp;#039;).attr(&amp;#039;user&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		var revs = $(xmlDoc).find(&amp;#039;rev&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		if( revs.length &amp;lt; 1 ) {&lt;br /&gt;
			self.statelem.error( &amp;#039;没有其它修订版本，无法回退&amp;#039; );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		var top = revs[0];&lt;br /&gt;
		if( lastrevid &amp;lt; self.params.revid ) {&lt;br /&gt;
			Morebits.status.error( &amp;#039;错误&amp;#039;, [ &amp;#039;从服务器取得的最新修订版本ID &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, lastrevid ), &amp;#039; 小于目前所显示的修订版本ID。这可能意味着当前修订版本已被删除、服务器延迟、或抓取到了坏掉的信息。取消。&amp;#039; ] );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		var index = 1;&lt;br /&gt;
		if( self.params.revid !== lastrevid  ) {&lt;br /&gt;
			Morebits.status.warn( &amp;#039;警告&amp;#039;, [ &amp;#039;最新修订版本 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, lastrevid ), &amp;#039; 与我们的修订版本 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.revid ), &amp;#039;不等&amp;#039; ] );&lt;br /&gt;
			if( lastuser === self.params.user ) {&lt;br /&gt;
				switch( self.params.type ) {&lt;br /&gt;
				case &amp;#039;vand&amp;#039;:&lt;br /&gt;
					Morebits.status.info( &amp;#039;信息&amp;#039;, [ &amp;#039;最新修订版本由 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.user ) , &amp;#039; 做出，因我们假定破坏，继续回退操作。&amp;#039; ]);&lt;br /&gt;
					break;&lt;br /&gt;
				case &amp;#039;agf&amp;#039;:&lt;br /&gt;
					Morebits.status.warn( &amp;#039;警告&amp;#039;, [ &amp;#039;最新修订版本由 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.user ) , &amp;#039; 做出，因我们假定善意，取消回退操作，因为问题可能已被修复。&amp;#039; ]);&lt;br /&gt;
					return;&lt;br /&gt;
				default:&lt;br /&gt;
					Morebits.status.warn( &amp;#039;提示&amp;#039;, [ &amp;#039;最新修订版本由 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.user ) , &amp;#039; 做出，但我们还是不回退了。&amp;#039; ] );&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			else if(self.params.type === &amp;#039;vand&amp;#039; &amp;amp;&amp;amp;&lt;br /&gt;
					Twinkle.fluff.whiteList.indexOf( top.getAttribute( &amp;#039;user&amp;#039; ) ) !== -1 &amp;amp;&amp;amp; revs.length &amp;gt; 1 &amp;amp;&amp;amp;&lt;br /&gt;
					revs[1].getAttribute( &amp;#039;pageId&amp;#039; ) === self.params.revid) {&lt;br /&gt;
				Morebits.status.info( &amp;#039;信息&amp;#039;, [ &amp;#039;最新修订版本由 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, lastuser ), &amp;#039;，一个可信的机器人做出，之前的版本被认为是破坏，继续回退操作。&amp;#039; ] );&lt;br /&gt;
				index = 2;&lt;br /&gt;
			} else {&lt;br /&gt;
				Morebits.status.error( &amp;#039;错误&amp;#039;, [ &amp;#039;最新修订版本由 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, lastuser ), &amp;#039; 做出，所以这个修订版本可能已经被回退了，取消回退操作。&amp;#039;] );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( Twinkle.fluff.whiteList.indexOf( self.params.user ) !== -1  ) {&lt;br /&gt;
			switch( self.params.type ) {&lt;br /&gt;
			case &amp;#039;vand&amp;#039;:&lt;br /&gt;
				Morebits.status.info( &amp;#039;信息&amp;#039;, [ &amp;#039;将对 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.user ), &amp;#039; 执行破坏回退，这是一个可信的机器人，我们假定您要回退前一个修订版本。&amp;#039; ] );&lt;br /&gt;
				index = 2;&lt;br /&gt;
				self.params.user = revs[1].getAttribute( &amp;#039;user&amp;#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;agf&amp;#039;:&lt;br /&gt;
				Morebits.status.warn( &amp;#039;提示&amp;#039;, [ &amp;#039;将对 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.user ), &amp;#039; 执行善意回退，这是一个可信的机器人，取消回退操作。&amp;#039; ] );&lt;br /&gt;
				return;&lt;br /&gt;
			case &amp;#039;norm&amp;#039;:&lt;br /&gt;
				/* falls through */&lt;br /&gt;
			default:&lt;br /&gt;
				var cont = confirm( &amp;#039;选择了常规回退，但最新修改是由一个可信的机器人（&amp;#039; + self.params.user + &amp;#039;）做出的。您是否想回退前一个修订版本？&amp;#039; );&lt;br /&gt;
				if( cont ) {&lt;br /&gt;
					Morebits.status.info( &amp;#039;信息&amp;#039;, [ &amp;#039;将对 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.user ), &amp;#039; 执行常规回退，这是一个可信的机器人，基于确认，我们将回退前一个修订版本。&amp;#039; ] );&lt;br /&gt;
					index = 2;&lt;br /&gt;
					self.params.user = revs[1].getAttribute( &amp;#039;user&amp;#039; );&lt;br /&gt;
				} else {&lt;br /&gt;
					Morebits.status.warn( &amp;#039;提示&amp;#039;, [ &amp;#039;将对 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.user ), &amp;#039; 执行常规回退，这是一个可信的机器人，基于确认，我们仍将回退这个修订版本。&amp;#039; ] );&lt;br /&gt;
				}&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		var found = false;&lt;br /&gt;
		var count = 0;&lt;br /&gt;
&lt;br /&gt;
		for( var i = index; i &amp;lt; revs.length; ++i ) {&lt;br /&gt;
			++count;&lt;br /&gt;
			if( revs[i].getAttribute( &amp;#039;user&amp;#039; ) !== self.params.user ) {&lt;br /&gt;
				found = i;&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( ! found ) {&lt;br /&gt;
			self.statelem.error( [ &amp;#039;未找到之前的修订版本，可能 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.user ), &amp;#039; 是唯一贡献者，或这个用户连续做出了超过 &amp;#039; + Twinkle.getPref(&amp;#039;revertMaxRevisions&amp;#039;) + &amp;#039; 次编辑。&amp;#039; ] );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if( ! count ) {&lt;br /&gt;
			Morebits.status.error( &amp;#039;错误&amp;#039;, &amp;quot;我们将要回退0个修订版本，这没有意义，所以取消回退操作。可能是因为这个修订版本已经被回退，但修订版本ID仍是一样的。&amp;quot; );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var good_revision = revs[ found ];&lt;br /&gt;
		var userHasAlreadyConfirmedAction = false;&lt;br /&gt;
		if (self.params.type !== &amp;#039;vand&amp;#039; &amp;amp;&amp;amp; count &amp;gt; 1) {&lt;br /&gt;
			if ( !confirm( self.params.user + &amp;#039; 连续做出了 &amp;#039; + count + &amp;#039; 次编辑，是否要回退所有这些？&amp;#039;) ) {&lt;br /&gt;
				Morebits.status.info( &amp;#039;提示&amp;#039;, &amp;#039;用户取消操作&amp;#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			userHasAlreadyConfirmedAction = true;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		self.params.count = count;&lt;br /&gt;
&lt;br /&gt;
		self.params.goodid = good_revision.getAttribute( &amp;#039;revid&amp;#039; );&lt;br /&gt;
		self.params.gooduser = good_revision.getAttribute( &amp;#039;user&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
		self.statelem.status( [ Morebits.htmlNode( &amp;#039;strong&amp;#039;, count ), &amp;#039; 个修订版本之前由 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.gooduser ), &amp;#039; 做出的修订版本 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.goodid ) ] );&lt;br /&gt;
&lt;br /&gt;
		var summary, extra_summary;&lt;br /&gt;
		switch( self.params.type ) {&lt;br /&gt;
		case &amp;#039;agf&amp;#039;:&lt;br /&gt;
			extra_summary = prompt( &amp;quot;可选的编辑摘要：                              &amp;quot;, &amp;quot;&amp;quot; );  // padded out to widen prompt in Firefox&lt;br /&gt;
			if (extra_summary === null)&lt;br /&gt;
			{&lt;br /&gt;
				self.statelem.error( &amp;#039;用户取消操作。&amp;#039; );&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			userHasAlreadyConfirmedAction = true;&lt;br /&gt;
&lt;br /&gt;
			summary = Twinkle.fluff.formatSummary(&amp;quot;回退$USER做出的出于[[WP:AGF|善意]]的编辑&amp;quot;, self.params.user, extra_summary);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case &amp;#039;vand&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
			summary = &amp;quot;回退[[Special:Contributions/&amp;quot; +&lt;br /&gt;
				self.params.user + &amp;quot;|&amp;quot; + self.params.user + &amp;quot;]] ([[User talk:&amp;quot; + self.params.user + &amp;quot;|讨论]])&amp;quot; +&lt;br /&gt;
				&amp;quot;做出的 &amp;quot; + self.params.count + &amp;quot; 次编辑，到由&amp;quot; +&lt;br /&gt;
				self.params.gooduser + &amp;quot;做出的前一个修订版本 &amp;quot;  + Twinkle.getPref(&amp;#039;summaryAd&amp;#039;);&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		case &amp;#039;norm&amp;#039;:&lt;br /&gt;
			/* falls through */&lt;br /&gt;
		default:&lt;br /&gt;
			if( Twinkle.getPref(&amp;#039;offerReasonOnNormalRevert&amp;#039;) ) {&lt;br /&gt;
				extra_summary = prompt( &amp;quot;可选的编辑摘要：                              &amp;quot;, &amp;quot;&amp;quot; );  // padded out to widen prompt in Firefox&lt;br /&gt;
				if (extra_summary === null)&lt;br /&gt;
				{&lt;br /&gt;
					self.statelem.error( &amp;#039;用户取消操作。&amp;#039; );&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
				userHasAlreadyConfirmedAction = true;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			summary = Twinkle.fluff.formatSummary(&amp;quot;回退$USER做出的&amp;quot; + self.params.count + &amp;quot;次编辑&amp;quot;, self.params.user, extra_summary);&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (Twinkle.getPref(&amp;#039;confirmOnFluff&amp;#039;) &amp;amp;&amp;amp; !userHasAlreadyConfirmedAction &amp;amp;&amp;amp; !confirm(&amp;quot;回退页面：您确定吗？&amp;quot;)) {&lt;br /&gt;
			self.statelem.error( &amp;#039;用户取消操作。&amp;#039; );&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		var query;&lt;br /&gt;
		if( (!self.params.autoRevert || Twinkle.getPref(&amp;#039;openTalkPageOnAutoRevert&amp;#039;)) &amp;amp;&amp;amp;&lt;br /&gt;
				Twinkle.getPref(&amp;#039;openTalkPage&amp;#039;).indexOf( self.params.type ) !== -1 &amp;amp;&amp;amp;&lt;br /&gt;
				mw.config.get(&amp;#039;wgUserName&amp;#039;) !== self.params.user ) {&lt;br /&gt;
			Morebits.status.info( &amp;#039;信息&amp;#039;, [ &amp;#039;打开用户 &amp;#039;, Morebits.htmlNode( &amp;#039;strong&amp;#039;, self.params.user ), &amp;#039; 的对话页&amp;#039; ] );&lt;br /&gt;
&lt;br /&gt;
			query = {&lt;br /&gt;
				&amp;#039;title&amp;#039;: &amp;#039;User talk:&amp;#039; + self.params.user,&lt;br /&gt;
				&amp;#039;action&amp;#039;: &amp;#039;edit&amp;#039;,&lt;br /&gt;
				&amp;#039;preview&amp;#039;: &amp;#039;yes&amp;#039;,&lt;br /&gt;
				&amp;#039;vanarticle&amp;#039;: self.params.pagename.replace(/_/g, &amp;#039; &amp;#039;),&lt;br /&gt;
				&amp;#039;vanarticlerevid&amp;#039;: self.params.revid,&lt;br /&gt;
				&amp;#039;vanarticlegoodrevid&amp;#039;: self.params.goodid,&lt;br /&gt;
				&amp;#039;type&amp;#039;: self.params.type,&lt;br /&gt;
				&amp;#039;count&amp;#039;: self.params.count&lt;br /&gt;
			};&lt;br /&gt;
&lt;br /&gt;
			switch( Twinkle.getPref(&amp;#039;userTalkPageMode&amp;#039;) ) {&lt;br /&gt;
			case &amp;#039;tab&amp;#039;:&lt;br /&gt;
				window.open( mw.util.wikiScript(&amp;#039;index&amp;#039;) + &amp;#039;?&amp;#039; + Morebits.queryString.create( query ), &amp;#039;_blank&amp;#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;blank&amp;#039;:&lt;br /&gt;
				window.open( mw.util.wikiScript(&amp;#039;index&amp;#039;) + &amp;#039;?&amp;#039; + Morebits.queryString.create( query ), &amp;#039;_blank&amp;#039;,&lt;br /&gt;
					&amp;#039;location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800&amp;#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			case &amp;#039;window&amp;#039;:&lt;br /&gt;
				/* falls through */&lt;br /&gt;
			default:&lt;br /&gt;
				window.open( mw.util.wikiScript(&amp;#039;index&amp;#039;) + &amp;#039;?&amp;#039; + Morebits.queryString.create( query ),&lt;br /&gt;
					( window.name === &amp;#039;twinklewarnwindow&amp;#039; ? &amp;#039;_blank&amp;#039; : &amp;#039;twinklewarnwindow&amp;#039; ),&lt;br /&gt;
					&amp;#039;location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800&amp;#039; );&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		query = {&lt;br /&gt;
			&amp;#039;action&amp;#039;: &amp;#039;edit&amp;#039;,&lt;br /&gt;
			&amp;#039;title&amp;#039;: self.params.pagename,&lt;br /&gt;
			&amp;#039;summary&amp;#039;: summary,&lt;br /&gt;
			&amp;#039;token&amp;#039;: edittoken,&lt;br /&gt;
			&amp;#039;undo&amp;#039;: lastrevid,&lt;br /&gt;
			&amp;#039;undoafter&amp;#039;: self.params.goodid,&lt;br /&gt;
			&amp;#039;basetimestamp&amp;#039;: touched,&lt;br /&gt;
			&amp;#039;starttimestamp&amp;#039;: starttimestamp,&lt;br /&gt;
			&amp;#039;watchlist&amp;#039; :  Twinkle.getPref(&amp;#039;watchRevertedPages&amp;#039;).indexOf( self.params.type ) !== -1 ? &amp;#039;watch&amp;#039; : undefined,&lt;br /&gt;
			&amp;#039;minor&amp;#039;: Twinkle.getPref(&amp;#039;markRevertedPagesAsMinor&amp;#039;).indexOf( self.params.type ) !== -1 ? true : undefined&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		Morebits.wiki.actionCompleted.redirect = self.params.pagename;&lt;br /&gt;
		Morebits.wiki.actionCompleted.notice = &amp;quot;回退完成&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		var wikipedia_api = new Morebits.wiki.api( &amp;#039;保存回退内容&amp;#039;, query, Twinkle.fluff.callbacks.complete, self.statelem);&lt;br /&gt;
		wikipedia_api.params = self.params;&lt;br /&gt;
		wikipedia_api.post();&lt;br /&gt;
&lt;br /&gt;
	},&lt;br /&gt;
	complete: function (apiobj) {&lt;br /&gt;
		var $edit = $(apiobj.getXML()).find(&amp;#039;edit&amp;#039;);&lt;br /&gt;
		var blacklist = $edit.attr(&amp;#039;spamblacklist&amp;#039;);&lt;br /&gt;
		if (blacklist) {&lt;br /&gt;
			var code = document.createElement(&amp;#039;code&amp;#039;);&lt;br /&gt;
			code.style.fontFamily = &amp;quot;monospace&amp;quot;;&lt;br /&gt;
			code.appendChild(document.createTextNode(blacklist));&lt;br /&gt;
			apiobj.statelem.error([&amp;#039;不能回退，因URL&amp;#039;, code, &amp;#039;在垃圾黑名单中。&amp;#039;]);&lt;br /&gt;
		} else if ($edit.attr(&amp;#039;nochange&amp;#039;) === &amp;#039;&amp;#039;) {&lt;br /&gt;
			apiobj.statelem.warn(&amp;quot;要回退到的版本与当前版本相同，没什么要做的&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
			apiobj.statelem.info(&amp;quot;完成&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// builtInString should contain the string &amp;quot;$USER&amp;quot;, which will be replaced&lt;br /&gt;
// by an appropriate user link&lt;br /&gt;
Twinkle.fluff.formatSummary = function(builtInString, userName, userString) {&lt;br /&gt;
	var result = builtInString;&lt;br /&gt;
&lt;br /&gt;
	// append user&amp;#039;s custom reason with requisite punctuation&lt;br /&gt;
	if (userString) {&lt;br /&gt;
		result += &amp;#039;：&amp;#039; + Morebits.string.toUpperCaseFirstChar(userString);&lt;br /&gt;
		if (userString.search(/[。？！]$/) === -1) {&lt;br /&gt;
			result += &amp;#039;。&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		result += &amp;#039;。&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	result += Twinkle.getPref(&amp;#039;summaryAd&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
	// find number of UTF-8 bytes the resulting string takes up, and possibly add&lt;br /&gt;
	// a contributions or contributions+talk link if it doesn&amp;#039;t push the edit summary&lt;br /&gt;
	// over the 255-byte limit&lt;br /&gt;
	var resultLen = unescape(encodeURIComponent(result.replace(&amp;quot;$USER&amp;quot;, &amp;quot;&amp;quot;))).length;&lt;br /&gt;
	var contribsLink = &amp;quot;[[Special:Contributions/&amp;quot; + userName + &amp;quot;|&amp;quot; + userName + &amp;quot;]]&amp;quot;;&lt;br /&gt;
	var contribsLen = unescape(encodeURIComponent(contribsLink)).length;&lt;br /&gt;
	if (resultLen + contribsLen &amp;lt;= 255) {&lt;br /&gt;
		var talkLink = &amp;quot; ([[User talk:&amp;quot; + userName + &amp;quot;|讨论]])&amp;quot;;&lt;br /&gt;
		if (resultLen + contribsLen + unescape(encodeURIComponent(talkLink)).length &amp;lt;= 255) {&lt;br /&gt;
			result = result.replace(&amp;quot;$USER&amp;quot;, contribsLink + talkLink);&lt;br /&gt;
		} else {&lt;br /&gt;
			result = result.replace(&amp;quot;$USER&amp;quot;, contribsLink);&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		result = result.replace(&amp;quot;$USER&amp;quot;, userName);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Twinkle.fluff.init = function twinklefluffinit() {&lt;br /&gt;
	if (Twinkle.userAuthorized)&lt;br /&gt;
	{&lt;br /&gt;
		// A list of usernames, usually only bots, that vandalism revert is jumped over; that is,&lt;br /&gt;
		// if vandalism revert was chosen on such username, then its target is on the revision before.&lt;br /&gt;
		// This is for handling quick bots that makes edits seconds after the original edit is made.&lt;br /&gt;
		// This only affects vandalism rollback; for good faith rollback, it will stop, indicating a bot&lt;br /&gt;
		// has no faith, and for normal rollback, it will rollback that edit.&lt;br /&gt;
		Twinkle.fluff.whiteList = [/*&lt;br /&gt;
			&amp;#039;AnomieBOT&amp;#039;,&lt;br /&gt;
			&amp;#039;SineBot&amp;#039;&lt;br /&gt;
		*/];&lt;br /&gt;
&lt;br /&gt;
		if ( Morebits.queryString.exists( &amp;#039;twinklerevert&amp;#039; ) ) {&lt;br /&gt;
			Twinkle.fluff.auto();&lt;br /&gt;
		} else {&lt;br /&gt;
			Twinkle.fluff.normal();&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>zhwiki&gt;Jimmy Xu</name></author>
	</entry>
</feed>