User:John doe 120/vector2.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。

//__NOINDEX__
(()=>{
	'use strict';

	if(document.querySelector('.api-diff2, .diff-context-fade1, .diff-context-fade2'))throw 'name collision';

	if(!window.wgULS)window.wgULS=(s,t)=>t;
	
	changeStyle();
	function changeStyle(){
		var e1=[];
		e1.push('.mw-changeslist .mw-plusminus-pos, .mw-changeslist .mw-plusminus-neg');
		e1.push('#pagehistory .mw-plusminus-pos, #pagehistory .mw-plusminus-neg');
		e1.push('.mw-contributions-list .mw-plusminus-pos, .mw-contributions-list .mw-plusminus-neg');
		e1=document.querySelectorAll(e1.join(', '));
		for(let e of e1){
			let m=e.textContent.replace(/,/g,'').match(/\d+/);
			if(!m)continue;
			m=+m[0];
			m=Math.log10(m+1)*30;
			if(m>255)m=255;
			m/=255;
			let b;
			if(e.className.includes('plusminus-pos'))
				b=lab2rgb(100*(1-m)+71.3*m,-72.5*m,70.0*m);
			else
				b=lab2rgb(100*(1-m)+67.6*m,45.0*m,44.1*m);
			e.animate({backgroundColor:['#FFF',b]},600);
			e.style.backgroundColor=b;
		}
		function lab2rgb(l,a,b){
			var y=(l+16)/116;
			var x=y+a/500,z=y-b/200;
			function f(t){
				if(t>6/29)
					return t*t*t;
				else
					return 3*(6/29)*(6/29)*(t-4/29);
			}
			x=95.047*f(x)/100;
			y=100.000*f(y)/100;
			z=108.883*f(z)/100;
			var r,g;
			r =  3.2406*x - 1.5372*y - 0.4986*z;
			g = -0.9689*x + 1.8758*y + 0.0415*z;
			b =  0.0557*x - 0.2040*y + 1.0570*z;
			function c(i){
				if(i<=0.0031308)
					return 12.92*i;
				else
					return (1+0.055)*Math.pow(i,1/2.4)-0.055;
			}
			r=c(r)*255;
			g=c(g)*255;
			b=c(b)*255;
			function f2(t){
				if(t<0)t=0;
				if(t>255)t=255;
				return Math.round(t);
			}
			r=f2(r);
			g=f2(g);
			b=f2(b);
			return 'rgb('+r+','+g+','+b+')';
		}
	}

	const checkFloatingIP=(()=>{
		var s=new Set();
		return async function(x,e){
			var h=x.getAllResponseHeaders();
			h = h.replace(/(age|content-length|date|mediawiki-api-error|server|vary|x-cache|x-request-id):.*\r\n/g,'');
			h = new TextEncoder().encode(h);
			h = await crypto.subtle.digest('SHA-256', h);
			h = Array.from(new Uint8Array(h));
			h = h.map(b => b.toString(16).padStart(2, '0')).join('');
			s.add(h);
			if(s.size>1)e.style.background='#fef793';
		}
	})();

	const Comparator={};
	(()=>{
		var a3=[],xhr3,loading;
		Comparator.init=()=>{
			document.head.insertAdjacentHTML('beforeend',`<style>
			.api-diff2 { background:#fff; padding: 0 5px 5px 0; box-shadow: 0 0 5px 5px #bbb; margin:10px 0 25px; }
			.api-diff2 td { padding:0.33em 0.5em; }
			.api-diff2 .diff-context { background-color:#f9f9f9; border-color:#e6e6e6; }
			.api-diff2 .diff-addedline, .api-diff2 .diff-deletedline, .api-diff2 .diff-context {
			 border-radius:0.33em; border-style:solid; border-width:1px 1px 1px 4px; font-size:13px; line-height:1.4; vertical-align:top; white-space:pre-wrap; min-width:80px; }
			.api-diff2 td div { overflow-wrap:break-word; word-break:break-all; }
			.api-diff2 .diff-addedline { border-color:#a3d3ff; }
			.api-diff2 .diff-deletedline { border-color:#ffe49c; }
			.api-diff2 .diffchange { text-decoration:none; }
			.api-diff2 .diff-deletedline .diffchange { background-color:#f9d106; }
			.api-diff2 .diff-addedline .diffchange { background-color:#b0d9fe; }
			</style>`);
			document.addEventListener('scroll',scroll2);
		};
		Comparator.compare=(s,r)=>{
			var u='fromrev='+r+'&torelative=prev';
			a3.push([s,u]);
		}
		Comparator.finish=scroll2;
		Comparator.reset=()=>{
			a3=[];
			if(loading){
				xhr3.abort();
				loading=false;
			}
		};
		Object.freeze(Comparator);
		function scroll2(){
			if(loading||!a3.length)return;
			var e=a3[0][0], y=e.getBoundingClientRect().y;
			if(y<0 || innerHeight*1.5<y)return;
			xhr3 = new XMLHttpRequest();
			xhr3.open('GET','/w/api.php?action=compare&format=json&'+a3[0][1]+'&prop=diff|size|title|comment');
			xhr3.addEventListener('load',load3);
			xhr3.send();
			loading=true;
		}
		function load3(e){
			loading=false;
			var r=e.target.response;
			r=JSON.parse(r);
			var t=document.createElement('table');
			t.className='api-diff2';
			if(r.compare){
				r=r.compare;
				t.innerHTML='<tbody>'+r['*']+'</tbody>';
				if(t.textContent=='\n\n'||t.textContent===''){
					t.children[0].insertAdjacentHTML('afterbegin','<tr><td>'+wgULS('(没有差异)','(無差異)')+'</td></tr>');
				}
			}else if(r.error.code=='missingcontent'){
				let e=document.createElement('td');
				e.append(r.error.info);
				t.innerHTML='<tbody><tr>'+e.outerHTML+'</tr></tbody>';
			}else throw 'error';
			a3[0][0].after(t);
			checkFloatingIP(e.target,a3[0][0]);
			optimizeHeight(t);
			removeExcessWidth(t);
			reduceContext(t);
			a3.splice(0,1);
			scroll2();
		}
		function optimizeHeight(t){
			var m=t.clientHeight,w1=t.clientWidth,w,m1=m;
			var e=t.querySelector('.diff-addedline,.diff-deletedline');
			if(!e)return;
			var n=performance.now();
			for(let i=100;i<w1;i+=10){
				if(performance.now()-n>140)break;
				e.style.width=i+'px';
				let h=t.clientHeight;
				if(h>=m)continue;
				m=h;
				w=i;
			}
			if(!w)e.style.width='';
			else{
				e.style.width=w+'px';
				//console.log(m1+' > '+m);
			}
		}
		//Special:Diff/62313157
		function removeExcessWidth(t){
			if(t.clientWidth<t.parentNode.clientWidth+200)return;
			t.insertAdjacentHTML('afterbegin','<colgroup><col style="width: 2%;"><col><col style="width: 2%;"><col></colgroup>');
			t.style.tableLayout='fixed';
			t.style.width='100%';
		}
	})();

	(()=>{
		if(!document.body.classList.contains('page-Special_最近更改') && !document.body.classList.contains('mw-special-Recentchanges'))return;
		var xhr,xhr2,r,el=new Map(),hs=new Map(),us=new Map(), e=document.querySelector('div.mw-changeslist');
		if(!e)return;
		if(window.getComputedStyle(document.querySelector('.mw-changeslist span.comment')).unicodeBidi!='isolate')throw 'error';
		Comparator.init();
		var c=2,a=document.createElement('a'),a1=document.createElement('a');
		var compare2=document.createElement('input'),compare3=document.createElement('label');
		compare2.type='checkbox';
		compare3.append(compare2,'加載差異');
		var time1=document.createElement('input'),time2=document.createElement('div');
		time1.type='text';
		var time3=e.querySelector('ul:last-of-type>li:last-child');
		time3=time3.dataset.mwTs;
		if(!/^\d{14}$/.test(time3))throw 'error';
		setTime(time3.replace(/(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/,'$1-$2-$3T$4:$5:$6Z'));
		time1.size=15;
		time2.append('開始時間:',time1);
		var ores=document.createElement('input'),ores1=document.createElement('label');
		ores.type='checkbox';
		ores1.append(ores,'按ORES值排序');
		a.textContent='第'+c+'頁';
		a.style.marginLeft='0.5em';
		a1.textContent='隨機頁';
		a1.style.marginLeft='0.5em';
		e.after(time2,compare3,ores1,a,a1);
		a.addEventListener('click',click1);
		a1.addEventListener('click',click1);
		var rclimit=document.querySelector('.rclinks>a[data-keys="limit"]>strong');
		if(rclimit)rclimit=rclimit.textContent;
		else rclimit=100;
		var logTranslation=new Map();
		(()=>{
			var s='abusefilter 滥用过滤器,block 封禁,contentmodel 内容模型更改,create 页面创建,delete 删除,gblblock 全域封禁,gblrename 全域重命名,gblrights 全域权限,globalauth 全域账户,import 导入,managetags 标签管理,massmessage 大量信息,merge 合并,move 移动,newusers 用户创建,patrol 巡查,protect 保护,renameuser 用户更名,rights 用户权限,spamblacklist 垃圾链接黑名单,tag 标签,thanks 感谢,upload 上传,usermerge 用户合并';
			var t='abusefilter 防濫用過濾器修改,block 封鎖,contentmodel 內容模型變更,create 頁面建立,delete 刪除,gblblock 全域封鎖,gblrename 全域重新命名,gblrights 全域權限,globalauth 全域帳號,import 匯入,managetags 標籤管理,massmessage 大量訊息,merge 合併,move 移動,newusers 使用者建立,patrol 巡查,protect 保護,renameuser 使用者名稱變更,rights 使用者權限,spamblacklist 垃圾連結黑名單,tag 標籤,thanks 感謝,upload 上傳,usermerge 使用者合併';
			s=s.split(',');
			t=t.split(',');
			for(let i=0;i<s.length;i++){
				let s1=s[i].split(' ');
				let t1=t[i].split(' ');
				logTranslation.set(s1[0],wgULS(s1[1],t1[1]));
			}
		})();
		//compare2.checked=true;
		//click1({target:a});
		function setTime(t){
			time3=Date.parse(t);
			if(!time3)throw 'error';
			time1.value=new Date(time3-new Date().getTimezoneOffset()*60e3).toISOString().replace('T',' ').replace(/\.\d{3}Z$/,'');
		}
		function click1(e2){
			if(xhr)return;
			var e1=Date.parse(time1.value.trim().replace(' ','T')+'Z');
			if (e1) time1.style.outline='';
			else {
				time1.style.outline='1px solid red';
				return;
			}
			e1=e1/1e3+new Date().getTimezoneOffset()*60;
			e2=e2.target;
			e.style.opacity=0.5;
			Comparator.reset();
			if(e2==a1){
				let a=new Uint16Array(1);
				crypto.getRandomValues(a);
				e1=(Date.now()/1e3-3600*24*30*a[0]/0xffff).toFixed(0);
			}
			var e3 = document.querySelector('#namespace'), ns='';
			if (e3 && e3.value!=='') ns='&rcnamespace='+e3.value;
			var an=(location.href.includes('&hideliu=1')?'&rcshow=anon':'');
			var tag1=document.querySelector('input.mw-tagfilter-input'), tag='';
			if (tag1 && tag1.value) tag='&rctag='+encodeURIComponent(tag1.value);
			xhr=new XMLHttpRequest();
			var u='/w/api.php?action=query&format=json&list=recentchanges&rcstart='+e1+'&rcdir=older&rcprop='+
			'user%7Ccomment%7Cparsedcomment%7Cflags%7Ctimestamp%7Ctitle%7Cids%7Csizes%7Cloginfo%7Coresscores%7Ctags%7Csha1&rclimit='+rclimit+'&rctype=edit%7Cnew%7Clog'+ns+an+tag;
			//console.log(u);
			xhr.open('GET',u);
			xhr.addEventListener('load',load1);
			xhr.send();
		}
		function load1(){
			r=xhr.response;
			if(!r)return;
			r=JSON.parse(r);
			console.log(r);
			r=r.query.recentchanges;
			
			if(r.length){
				xhr2=new XMLHttpRequest();
				xhr2.open('GET','/w/api.php?action=query&format=json&list=watchlist&wlallrev=1&wlstart='+r[0].timestamp+'&wlend='+r[r.length-1].timestamp+'&wllimit='+rclimit);
				xhr2.addEventListener('load',load2);
				xhr2.send();
			}else{
				xhr2={response:'{"batchcomplete":"","query":{"watchlist":[]}}'};
				load2();
			}
		}
		function load2(){
			xhr=null;
			var s=new Set(),r2=xhr2.response;
			r2=JSON.parse(r2);
			console.log(r2);
			hs.clear();
			us.clear();
			var c1=Array.from(e.childNodes);
			for(let c of c1) c.remove();
			e.style.opacity='';
			window.scrollTo(0,600);
			//if(r2.query){
			r2=r2.query.watchlist;
			for(let e of r2){
				if(s.has(e.title))continue;
				s.add(e.title);
			}
			//}
			if(r.length)setTime(r[r.length-1].timestamp);
			else e.append(wgULS('在此期间没有符合这些条件的编辑','於指定時間內沒有符合條件的變更。'));
			if(ores.checked)r.sort((a,b)=>computeOres(b)-computeOres(a));
			for(let i=0;i<r.length;i++){
				let d=new Date(r[i].timestamp);
				if(!d)continue;
				let d2=d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate());
				if(s.has(r[i].title))
					r[i].watched=true;
				append1(d2,r[i]);
			}
			a.textContent='第'+(++c)+'頁';
			changeStyle();//
		}
		function computeOres(a){
			return computeOres1(a)+computeOres2(a);
		}
		function computeOres1(a){
			var d=a?.oresscores?.damaging?.true;
			if(d===undefined)d=0;
			return d;
		}
		function computeOres2(a){
			var b=a?.oresscores?.goodfaith?.false;
			if(b===undefined)b=0;
			return b;
		}
		function pad(n){
			if(n<=9)
				return '0'+n;
			else
				return n;
		}
		function append1(d,c){
			var h,u,li;
			if(!hs.has(d)){
				h=document.createElement('h4');
				h.textContent=d;
				hs.set(d,h);
				u=document.createElement('ul');
				u.className='special';
				e.append(h,u);
				us.set(d,u);
			}else{
				u=us.get(d);
			}
			li=document.createElement('li');
			if(c.type=='edit')
				li.dataset.mwRevid=c.revid;
			li.dataset.mwTs=c.timestamp.replace(/\D/g,'');
			li.className='mw-changeslist-line';
			if(c.watched)
				li.className+=' mw-changeslist-line-watched';
			else
				li.className+=' mw-changeslist-line-not-watched';
			u.appendChild(li);
			var s=document.createElement('span');
			s.className='mw-changeslist-line-inner';
			li.appendChild(s);
			if(c.type=='edit'||c.type=='new'){
				appendEdit(s,c);
				if(compare2.checked)Comparator.compare(s,c.revid);
			}else if(c.type=='log') appendLog1(s,c);
			else throw 'error';
		}
		function appendEdit(s,c){
			s.insertAdjacentHTML('beforeend','(<a href class="mw-changeslist-diff" title>'+wgULS('差异','差異')
			+'</a> | <a href class="mw-changeslist-history" title>'+wgULS('历史','歷史')+'</a>)');
			var diff=s.querySelector('a.mw-changeslist-diff');
			if(diff){
				diff.href='/w/index.php?title='+encode(c.title)+'&curid='+c.pageid+'&diff='+c.revid+'&oldid='+c.old_revid;
				addEventListener1(diff);
				diff.addEventListener('mouseenter',fadeOut);//
				diff.title=c.title;
			}

			var hist=s.querySelector('a.mw-changeslist-history');
			if(hist){
				hist.href='/w/index.php?title='+encode(c.title)+'&curid='+c.pageid+'&action=history';
				addEventListener1(hist);
				hist.title=c.title;
			}

			addSeparator(s);

			if('new' in c)  insert(s,'<abbr class="newpage">新</abbr> ');
			if('minor' in c)insert(s,'<abbr class="minoredit">小</abbr> ');
			if('bot' in c)  insert(s,'<abbr class="botedit">'+wgULS('机','機')+'</abbr> ');

			var e4=addTitle(s,c);
			if(!c.sha1){
				let e=document.createElement('span');
				e.className='history-deleted';
				e4.before(e);
				e.append(e4);
			}

			addSeparator1(s);
			s.insertAdjacentHTML('beforeend','<span class="mw-changeslist-date"></span>');
			var date=s.querySelector('span.mw-changeslist-date');
			if(date){
				let date2=new Date(c.timestamp);
				date.textContent=pad(date2.getHours())+':'+pad(date2.getMinutes())+':'+pad(date2.getSeconds());
			}

			addSeparator(s);
			s.insertAdjacentHTML('beforeend','<span dir="ltr" class="mw-plusminus-pos" title></span>');
			var size=s.querySelector('span.mw-plusminus-pos');
			if(size){
				let size2=c.newlen-c.oldlen;
				if(size2>0)
					size2='+'+size2;
				else if(size2==0)
					size.className='mw-plusminus-null';
				else
					size.className='mw-plusminus-neg';
				size.title='更改后有'+c.newlen+'字节';
				size.textContent='('+size2+')';
			}

			addSeparator(s);

			addUser(s,c);

			var c1=addComment(s,c);
			if(!c1 && 'commenthidden' in c) insert(s,' <span class="history-deleted comment">('+wgULS('编辑摘要被移除','註釋已除')+')</span>');
			
			if(c.tags){
				let d=computeOres1(c),b=computeOres2(c);
				if(d>0.1)c.tags.push('ores-damaging-'+Math.round(d*10));
				if(b>0.1)c.tags.push('ores-badfaith-'+Math.round(b*10));
			}
			addTags(s,c);
		}
		function addUser(p,c){
			if(!('user' in c) && 'userhidden' in c){
				insert(p,'<span class="history-deleted">('+wgULS('用户名被删除','已移除使用者名稱')+')</span>');
				return;
			}
			var a=document.createElement('a'),b=document.createElement('bdi');
			a.className='mw-userlink';
			a.href='/wiki/Special:Contributions/'+encode(c.user);
			addEventListener1(a);
			b.textContent=c.user;
			a.append(b);
			p.append(a);
		}
		function addTitle(p,c){
			var s=document.createElement('span'),a=document.createElement('a'),b=document.createElement('bdi');
			s.className='mw-title';
			b.textContent=c.title;
			a.append(b);
			a.href='/wiki/'+encode(c.title);
			addEventListener1(a);
			s.append(a);
			p.append(s);
			return a;
		}

		function encode(c){
			return encodeURIComponent(c.replace(/ /g,'_')).replace(/%3A/g,':').replace(/%2F/g,'/');
		}

		function appendLog1(s,c){
			var e1=document.createElement('a');
			e1.className='mw-changeslist-links';
			if('logtype' in c){
				e1.href='/wiki/Special:%E6%97%A5%E5%BF%97/'+encode(c.logtype);
				let v=logTranslation.get(c.logtype);
				if(!v)v=c.logtype;
				e1.textContent=v;
			}
			e1.textContent+=wgULS('日志','日誌');
			s.append(e1);

			addSeparator1(s);

			var e2=document.createElement('span');
			e2.className='mw-changeslist-date';
			var d2=new Date(c.timestamp);
			e2.textContent=pad(d2.getHours())+':'+pad(d2.getMinutes())+':'+pad(d2.getSeconds());
			s.append(e2);

			addSeparator(s);

			var s1=document.createElement('span');
			s1.className='mw-changeslist-log-entry';
			s.append(s1);

			addUser(s1,c);

			if ('actionhidden' in c){
				insert(s1,' <span class="history-deleted">('+wgULS('日志详情已移除','日誌已除')+')</span>');
			}else{
				s1.append(' ',c.logaction,' ');
				addTitle(s1,c);
				s1.append(' ',JSON.stringify(c.logparams));
			}

			addComment(s1,c);
			if('commenthidden' in c) console.log(c)

			addTags(s,c);
		}
		function addSeparator(s){
			insert(s,' <span class="mw-changeslist-separator"></span> ');
		}
		function addSeparator1(s){
			insert(s,'<span class="mw-changeslist-separator--semicolon"></span> ');
		}
		function addComment(p,c){
			if(!c.comment)return;
			var s=document.createElement('span');
			s.className='comment comment--without-parentheses';
			if(!c.comment.includes('|')) s.innerHTML=c.parsedcomment;
			else s.textContent=c.comment;
			p.append(' ',s);
			return true;
		}
		function addTags(p,c){
			if(!c.tags.length)return;
			var s=document.createElement('span');
			s.className='mw-tag-markers';
			insert(s,'<a href="/wiki/Special:%E6%A0%87%E7%AD%BE" title="Special:标签">'+wgULS('标签','標籤')+'</a>:');
			for(let e of c.tags){
				let t=document.createElement('span');
				t.className='mw-tag-marker';
				t.textContent=e;
				s.append(t);
			}
			p.append(' ',s);
		}
		function insert(s,h){
			s.insertAdjacentHTML('beforeend',h);
		}
		function addEventListener1(a){
			if(getEventListeners()){
				a.hasPopup=true;
				a.addEventListener('mousedown',el.get('mousedown'));
				a.addEventListener('mouseout',el.get('mouseout'));
				a.addEventListener('mouseover',el.get('mouseover'));
			}
		}
		function getEventListeners(){
			if(!el.size){
				let n=new Map();
				n.set('onmousedown','killPopup');
				n.set('onmouseout','mouseOutWikiLink');
				n.set('onmouseover','mouseOverWikiLink');
				let e=document.querySelector('#recentchangesblock a[href="/wiki/Wikipedia:%E7%A4%BE%E5%8C%BA%E4%B8%BB%E9%A1%B5"]');
				if(!e)return;
				for(let k of n.keys()){
					if(!e[k])return;
					if(n.get(k)!=e[k].name)return;
					el.set(k.replace(/^on/,''),e[k]);
				}
				return true;
			}else
				return true;
		}
	})();

	(()=>{
		(() => {
			var p = document.querySelector('#mw-history-compare>#pagehistory');
			if (!p) return;
			var a = p.querySelectorAll('li');
			p.textContent = '';
			for (let e of a) p.append(e);
		})();
		var m=location.href.match(/^https:\/\/(zh|en)\.wikipedia\.org\/w\/index\.php\?title=([^&]*).*?&action=history$/);
		if(!m)return;
		m=m[2];
		var e=document.querySelector('form>#pagehistory>li'),c1=Comparator;
		if(!e)return;
		document.head.insertAdjacentHTML('beforeend',`<style>
		#pagehistory>li>.history-user>.mw-usertoollinks { opacity:0.5; }
		#pagehistory>li>.history-size { display:none; }
		#pagehistory>li>.updatedmarker { display:none; }
		</style>`);
		if(location.host=='zh.wikipedia.org'){
			let e1=document.querySelectorAll('.mw-changeslist-links>span>.mw-history-undo');
			for(let e of e1){
				let t=e.parentNode.parentNode.textContent;
				if(t=="撤销"||t=="撤销感谢")e.parentNode.parentNode.style.display='none';
			}
		}
		var e1=document.querySelectorAll('#pagehistory>li>.updatedmarker');
		for(let e of e1)e.parentNode.style.backgroundColor='#f1f6e1';
		(()=>{
			if(!e1.length)return;
			var e=e1[e1.length-1].parentNode;
			if(e.nextElementSibling)e=e.nextElementSibling;
			e=e.querySelector('input[name=oldid]');
			e.checked=true;
		})();
		c1.init();
		var xhr=new XMLHttpRequest();
		xhr.open('GET','/w/api.php?action=query&format=json&prop=revisions&titles='+m+'&rvlimit='+e.parentNode.childElementCount+'&rvstartid='+e.dataset.mwRevid+'&rvprop=ids%7Ctimestamp%7Cflags%7Ccomment%7Cuser%7Csha1%7Csize');
		xhr.addEventListener('load',load1);
		xhr.send();
		var m1=new Map(),m2=new Map(),m3=new Map();
		e=e.parentNode;
		e.style.opacity=0.5;
		function load1(){
			e.style.opacity='';
			var r=xhr.response;
			r=JSON.parse(r);
			console.log(r);
			r=r.query.pages;
			var k=Object.keys(r);
			r=r[k[0]].revisions;
			var c=Array.from(e.children);
			for (let i=0; i<c.length; i++) {
				if(c[i].dataset.mwRevid!=r[i].revid)throw 'error';
				let e=c[i].querySelector('span.comment');
				if(!e||!e.childElementCount)continue;
				if (!(r[i].comment&&r[i].comment.includes('|'))) continue;
				m1.set(e,e.innerHTML);
				e.textContent='('+r[i].comment+')';
				e=c[i].querySelector('.mw-diff-bytes[title]');
				if(!e)continue;
				e.addEventListener('mouseenter',me,{once:true});
			}
			for (let i=0; i<c.length; i++) {
				if(!r[i].sha1)continue;//hidden
				let e=c[i].querySelector('.mw-diff-bytes[title]');
				m2.set(e,r[i].size+' '+r[i].sha1);
				m3.set(e,e.style.backgroundColor);
				e.addEventListener('mouseenter',me1);
				e.addEventListener('mouseleave',ml1);
				e.title+='\nsha1: '+r[i].sha1;
			}
			var compare2=document.createElement('a');
			compare2.style.marginLeft='1.5em';
			compare2.append(wgULS('倒转并加载差异','倒轉並加載差異'));
			var e1=e.parentNode.querySelector('.mw-history-compareselectedversions');
			e1=e1.querySelector('div>.mw-checkbox-invert')||e1.querySelector('.historysubmit');
			e1.after(compare2);
			compare2.addEventListener('click',()=>{
				compare2.style.color='#000';
				var f=new FormData(e.parentNode), o1=f.get('oldid');
				for (let i=0; i<c.length; i++) {
					e.prepend(c[i]);
					if(r[i].revid==o1 && i>1){
						c.splice(i+1);
						break;
					}
				}
				for (let i=c.length-1; i>=0; i--) c1.compare(c[i],r[i].revid);
				c1.finish();
			},{once:true});
		}
		function me(e){
			e=e.target.parentNode.querySelector('span.comment');
			if(!e)return;
			e.innerHTML=m1.get(e);
		}
		function me1(e1){
			var s=m2.get(e1.target);
			for (let [k,v] of m2.entries()) {
				if (s==v) k.style.backgroundColor='#ccf';
			}
		}
		function ml1(e){
			for (let k of m2.keys()) k.style.backgroundColor=m3.get(k);
		}
	})();

	(()=>{
		if(location.host!='zh.wikipedia.org'||!document.body.classList.contains('mw-special-Contributions'))return;
		var e1=document.querySelectorAll('.mw-contributions-list>li'),c1=Comparator;
		if(!e1.length)return;
		c1.init();
		var compare2=document.createElement('a');
		compare2.append(wgULS('加载差异','加載差異'));
		e1[0].parentNode.before(compare2);
		compare2.addEventListener('click',()=>{
			compare2.style.color='#000';
			for (let e of e1){
				if(e.classList.contains('mw-flow-contribution'))continue;
				c1.compare(e,e.dataset.mwRevid);
			} 
			c1.finish();
		},{once:true});
	})();

	(()=>{
		if(location.host!='zh.wikipedia.org')return;
		var loopCount=10000;
		var s ='<style>', w1=((window.popupMaxWidth-101)/2).toFixed();
		s+='.navpopup .api-diff { background-color:rgba(255,255,255,0.5); }';
		s+='.navpopup .api-diff td { padding:0.33em 0.5em; }';
		s+='.navpopup .diff-context { background-color:#f9f9f9; border-color:#e6e6e6; }';
		s+='.navpopup .diff-addedline, .navpopup .diff-deletedline, .navpopup .diff-context {';
		s+=' border-radius:0.33em; border-style:solid; border-width:1px 1px 1px 4px; font-size:13px; line-height:1.4; vertical-align:top; white-space:pre-wrap; max-width:'+w1+'px; }';
		s+='.navpopup .api-diff td div { overflow-wrap:break-word; width:inherit; }';
		s+='.navpopup .diff-addedline { background-color:#fff; border-color:#a3d3ff; }';
		s+='.navpopup .diff-deletedline { border-color:#ffe49c; }';
		s+='.navpopup .diffchange { text-decoration:none; }';
		s+='.navpopup .diff-deletedline .diffchange { background-color:#f9d106; }';
		s+='.navpopup .diff-addedline .diffchange { background-color:#b0d9fe; }';
		s+='.navpopup>.popupPreview .popupNewLine:before { content:"⏎"; }';
		s+='.navpopup .api-diff .diff-marker1:before { content:"−"; }';
		s+='.navpopup .api-diff .diff-marker2:before { content:"+"; }';
		s+='.navpopup .api-diff .diff-empty1:before { content:"\\a0"; }';
		s+='</style>';
		document.head.insertAdjacentHTML('beforeend',s);
		var ws=new WeakSet();
		var mo=new MutationObserver(mr1=>{
			//if(loopCount--<0)return;
			var te=new TextEncoder();
			for(let mr of mr1){
				let t=mr.target;
				if(t.className!='popupPreview')continue;
				if(!t.querySelector('.popup_diff_dates'))continue;
				if(ws.has(t))continue;
				ws.add(t);
				move1(t.parentNode);
				let b1=t.querySelectorAll('br');
				for(let b of b1) b.replaceWith('\n');
				let d1=t.querySelectorAll('ins.popupDiff,del.popupDiff');
				for(let d of d1)
					d.dataset.length=te.encode(d.textContent).length;
				t.style.whiteSpace='pre-wrap';
				d1=t.querySelectorAll('del.popupDiff');
				for(let d of d1) trim(d);
				insertNewLine(t);
				addDate1(t);
				t.normalize();
				addDiff(t);
				//console.log(mr);
			}
		});
		mo.observe(document.body,{childList:true,subtree:true});
		function move1(e){
			var le=e.style.left;
			if(!le)return;
			le=le.match(/^(\d+)px$/);
			if(!le)return;
			le=+le[1]-2;
			if(le>=0) e.style.left=le+'px';
			var t=e.style.top;
			if(!t)return;
			t=t.match(/^(\d+)px$/);
			if(!t)return;
			t=+t[1]-2;
			if(t>=0) e.style.top=t+'px';
		}
		function trim(d){
			var i = d.nextSibling;
			if (!i || i.tagName!='INS'||i.className!='popupDiff') return;
			if(d.childElementCount||i.childElementCount)return;
			d.normalize();
			i.normalize();
			var a=trim1(d.textContent,i.textContent);
			//console.log('"'+d.textContent+'", "'+i.textContent+'"');
			//console.log('"'+a[0]+'", "'+a[1]+'", "'+a[2]+'", "'+a[3]+'"');
			//d.title+='"'+d.textContent+'", "'+i.textContent+'"';
			//d.title+='\n"'+a[0]+'", "'+a[1]+'", "'+a[2]+'", "'+a[3]+'"'
			d.dataset.text2=d.textContent;
			i.dataset.text2=i.textContent;
			d.dataset.a0=a[0];
			d.dataset.a1=a[1];
			d.dataset.a2=a[2];
			d.dataset.a3=a[3];
			d.textContent = a[0];
			i.textContent = a[1];
			if(a[2])
				d.insertAdjacentText('beforebegin',a[2]);
			if(a[3])
				i.insertAdjacentText('afterend',a[3]);
		}
		function trim1(t1,t2){
			var a1=[],a2=[],a3=[], a4=[];
			push(t1,a1);
			push(t2,a2);
			function push(t,a){
				var e,r=/[\ud800-\udbff][\udc00-\udfff]|[^]/g;
				while((e=r.exec(t))!==null)
					a.push(e[0]);
			}
			while(a1.length&&a2.length)
				if(a1[a1.length-1]==a2[a2.length-1]){
					a4.push(a1.pop());
					a2.pop();
				}else
					break;
			a4.reverse();
			a1.reverse();
			a2.reverse();
			while(a1.length&&a2.length)
				if(a1[a1.length-1]==a2[a2.length-1]){
					a3.push(a1.pop());
					a2.pop();
				}else
					break;
			a1.reverse();
			a2.reverse();
			return [a1.join(''),a2.join(''),a3.join(''),a4.join('')];
		}
		function insertNewLine(e){
			insertNewLine1(e);
			var e1=e.querySelectorAll('ins.popupDiff,del.popupDiff');
			for(let e of e1)insertNewLine1(e);
		}
		function insertNewLine1(e){
			var e1=Array.from(e.childNodes);
			for(let e of e1){
				if (e.nodeType!=Node.TEXT_NODE) continue;
				let t=e.textContent,i=t.length;
				while(true){
					i=t.lastIndexOf('\n',i-1);
					if(i<0)break;
					e.splitText(i+1);
					e.textContent=t.substr(0,i);
					let s=document.createElement('span');
					s.className='popupNewLine';
					s.textContent='\n';
					e.after(s);
					if(i===0)break;
				}
			}
		}
		function addDate1(e){
			var d1=e.querySelector('.popup_diff_dates td:last-child');
			if(!d1)return;
			d1=Date.parse(d1.textContent+'+08:00');
			if(!d1)return;
			addDate2(e,'#e60000',d1);
			var e1=e.querySelectorAll('ins.popupDiff');
			for(let e of e1)
				addDate2(e,'#e60000',d1);
		}
		function addDate2(e,c,d1){
			var e1=e.childNodes;
			var r=/(20\d+年\d+月\d+日 \([一二三四五六日]\) \d{2}:\d{2} \(UTC\))([^]*)$/;
			for(let e of e1){
				if(e.nodeType!=Node.TEXT_NODE)continue;
				let t=e.textContent;
				let m=t.match(r);
				if(!m)continue;
				e.textContent=t.replace(r,'');
				e.after(m[2]);
				let s=document.createElement('span');
				s.style.color=c;
				s.textContent=m[1];
				e.after(s);
				let d=Date.parse(m[1].replace(/[年月]/g,'-').replace(/日|\(.*?\)/g,'')+'+00:00');
				if(!d)continue;
				d=(d-d1)/1e3;
				if(d<-3600)
					s.title=(d/3600).toFixed(1)+'h';
				else if(d<-120)
					s.title=(d/60).toFixed(1)+'m';
				else
					s.title=d+'s';
				if(-65<d && d<=0)
					s.style.color='#0c0';
			}
		}
		function addDiff(e){
			e.style.fontFamily='consolas,simsun,monospace';
			e.style.lineHeight=1.2;
			var t=document.createElement('table');
			t.className='api-diff';
			e.appendChild(t);
			t.insertAdjacentHTML('beforebegin','<hr>');
			var xhr = new XMLHttpRequest();
			var a = e.querySelectorAll('.popup_diff_dates a[href*="oldid"]');
			if(a.length!=2)return;
			var r1=/oldid=(\d+)$/, r2=/oldid=\d+&direction=prev$/;
			var m1, m2, h1=a[0].href, h2=a[1].href;
			if((m1=h1.match(r1)) && (m2=h2.match(r1))){
				xhr.open('GET','https://zh.wikipedia.org/w/api.php?action=compare&format=json&fromrev='+m2[1]+'&torev='+m1[1]+'&prop=diff|size|title|comment');
			}else if((m1=h1.match(r1)) && h2.match(r2)){
				xhr.open('GET','https://zh.wikipedia.org/w/api.php?action=compare&format=json&fromrev='+m1[1]+'&torelative=prev&prop=diff|size|title|comment');
			}else
				return;
			xhr.addEventListener('load',load1);
			xhr.send();
			function load1(){
				var r=xhr.response;
				if(!r)return;
				r=JSON.parse(r);
				r=r.compare;
				if(!r)return;
				t.innerHTML='<tbody>'+r['*']+'</tbody>';
				
				reduceContext(t);
				var e1=e.querySelectorAll('ins.popupDiff,del.popupDiff');
				var c=0;
				for(let e of e1){
					if(e.tagName=='INS')
						c+= +e.dataset.length;
					else
						c-= +e.dataset.length;
				}
				var d=r.tosize-r.fromsize-c;
				var e2=t.parentNode.querySelector('b');
				if(d && !(e2&&e2.textContent=='差异已被截断'))
					t.insertAdjacentHTML('beforebegin','<b style="color:red;">差异已被截断</b><hr>');
				var s1=document.createElement('span');
				s1.style.color='#808080';
				t.parentNode.insertBefore(s1,t);
				s1.textContent='title: '+r.totitle;
				if(r.tocomment)
					s1.textContent+='\ncomment: '+r.tocomment;
				s1.textContent+='\nchange: '+(r.tosize-r.fromsize)+' '+d;
				t.insertAdjacentHTML('beforebegin','<hr>');
				e.normalize();
				e1=t.querySelectorAll('.diff-marker');
				for(let e of e1){
					if(e.textContent=='−'){
						e.textContent='';
						e.className='diff-marker1';
					}else if(e.textContent=='+'){
						e.textContent='';
						e.className='diff-marker2';
					}
				}
				e1=t.querySelectorAll('.diff-empty');
				for(let e of e1){
					if(e.textContent=='\xa0'){
						e.textContent='';
						e.className='diff-empty1';
					}
				}
			}
		}
	})();

	
	document.head.insertAdjacentHTML('beforeend',`<style>
	.diff-context-fade1>.diff-context, .diff-context-fade2>.diff-context { max-height:77px; display:inline-block; overflow:hidden; }
	.diff-context-fade1>.diff-context { background:linear-gradient(0, #f9f9f9 75%,#ddd); }
	.diff-context-fade2>.diff-context { background:linear-gradient(0, #ddd,#f9f9f9 25%); }
	</style>`);
	function reduceContext(t){
		var n=98,s=new Set();
		var e1=t.querySelectorAll('tr>.diff-context'), r1=/\d{4}年\d{1,2}月\d{1,2}日 \(.\) \d{2}:\d{2} \(UTC\)/;
		for(let e of e1){
			if(e.clientHeight<n)continue;
			let e2=e.parentNode.nextElementSibling;
			//if (r.totitle.startsWith('Wikipedia:') && e2 && e2.querySelector('.diff-addedline') && r1.test(e2.textContent)) continue;
			if(s.has(e.parentNode))continue;
			s.add(e.parentNode);
			trim1(e.parentNode);
		}
		function trim1(e){
			var begin=false, e1=e.previousElementSibling, e2=e.nextElementSibling;
			if(e1&&e1.querySelector('.diff-lineno') || e2&&e2.querySelector('.diff-deletedline, .diff-addedline')) begin=true;
			e.classList.add('diff-context-fade'+(begin?1:2));
			if(begin){
				e1=e.querySelectorAll('.diff-context>div');
				for(let e of e1) e.style.marginTop=77-e.clientHeight+'px';
			}
			e.addEventListener('click',enter2);
			/*function enter1(e){
				e=e.target;
				var i=setTimeout(enter2,500,e);
				e.addEventListener('mouseleave',()=>{
					clearTimeout(i);
				},{once:true});
			}*/
			function enter2(e){
				e=e.currentTarget;
				//e.removeEventListener('mouseenter',enter1);
				e.classList.remove('diff-context-fade1');
				e.classList.remove('diff-context-fade2');
				if(!begin)return;
				var e1=e.querySelectorAll('.diff-context>div');
				for(let e of e1) e.style.marginTop='';
			}
		}
	}
	(()=>{
		var e1=document.querySelectorAll('.mw-history-histlinks>span:last-child>a');
		for(let e of e1){
			//if(e.className)
			//	e=e.previousElementSibling;
			//if(!e)continue;
			e.parentNode.addEventListener('mouseenter',fadeOut);
		}
	})();
	function fadeOut(e){
		var tid=setTimeout(fadeOut1,window.popupDelay*1e3);
		e=e.target;
		e.addEventListener('mouseleave',fadeOut2,{once:true});
		function fadeOut1(){
			e.parentNode.parentNode.style.backgroundColor='#fdf3de';
		}
		function fadeOut2(){
			clearTimeout(tid);
		}
	}
	if(location.host=='zh.wikipedia.org') mw.loader.load('/w/load.php?modules=ext.gadget.Navigation_popups');
})();