본문으로 이동

사용자:John doe 120/vector1.js

위키백과, 우리 모두의 백과사전.

참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다. 구글 크롬, 파이어폭스, 마이크로소프트 엣지, 사파리: ⇧ Shift 키를 누른 채 "새로 고침" 버튼을 클릭하십시오. 더 자세한 정보를 보려면 위키백과:캐시 무시하기 항목을 참고하십시오.

(()=>{
	'use strict';

	(()=>{
		var e = document.querySelector('#t-info a');
		if (!e)return;
		var h = e.getAttribute('href');
		if (!/^\/w\/index\.php\?title=.*?&action=info$/.test(h))return;
		var xhr = new XMLHttpRequest(), xhr2;
		xhr.open("GET", h);
		xhr.responseType='document';
		xhr.onload=load1;
		xhr.send();
		function load1() {
			var r = xhr.response;
			var e1 = r.querySelector('#mw-pageinfo-firsttime a');
			if (!e1) return;
			var d = e1.textContent+'+08:00';
			addTitle('\n문서 작성 날짜                : ' + d);
			d= Date.parse(d);
			if (!d) return;
			d = Date.now() - d;
			d /= 3600e3*24*365.25;
	        if (d > 1)
				addTitle(' (' + d.toFixed(2) + 'y)');
			else if (d*12 > 1)
				addTitle(' (' + (d*12).toFixed(2) + 'm)');
			else
				addTitle(' (' + (365.25*d).toFixed(2) + 'd)');
			var e2 = r.querySelector('#mw-pageinfo-lasttime a');
			if (!e2) return;
			d = e2.textContent+'+08:00';
			addTitle('\n마지막으로 편집한 날짜: ' + d);
			
			xhr2 = new XMLHttpRequest();
			h=h.match(/^\/w\/index\.php\?title=(.*?)&action=info$/);
			if(h){
				xhr2.open("GET", '/w/api.php?action=query&format=json&prop=info&titles='+h[1]);
				xhr2.onload=load2;
				xhr2.send();
			}
			
			d=Date.parse(d);
			if(!d)return;
			d = Date.now() - d;
			d /= 3600e3*24;
			d=d/2+0.2;
			if(d>=1)return;
			var e=document.querySelector('.mw-body .firstHeading');
			if(!e)return;
			e.style.opacity=d.toFixed(3);
		}
		function load2(){
			var r=xhr2.response;
			if(!r)return;
			r=JSON.parse(r);
			r=r.query.pages;
			var k=Object.keys(r);
			if(!k.length)return;
			addTitle('\n                           touched: ' + r[k[0]].touched);
		}
		function addTitle(t){
			var e1=document.querySelectorAll('.mw-body .firstHeading, #t-info a, .mw-parser-output>h2, .mw-parser-output>h3');
			for(let e of e1)
				e.title+=t;
		}
	})();
	
	(()=>{
		var s ='<style>';
		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; width:350px; }';
		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:#fde6af; }';
		s+='.navpopup .diff-addedline .diffchange { background-color:#d8ecff; }';
		s+='</style>';
		document.head.insertAdjacentHTML('beforeend',s);
		var ws=new WeakSet();
		var mo=new MutationObserver(mr1=>{
			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.after('\n');
				let d1=t.querySelectorAll('ins.popupDiff,del.popupDiff');
				for(let d of d1)
					d.dataset.length=te.encode(d.textContent).length;
				for(let b of b1)
					b.replaceWith('⏎');
				t.style.whiteSpace='pre-wrap';
				d1=t.querySelectorAll('del.popupDiff');
				for(let d of d1)
					trim(d);
				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';
		}
		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 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} \(KST\))([^]*)$/;
			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,'')+'+09: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','/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','/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>';
				
				var n=200,s=new Set();
				var e1=t.querySelectorAll('tr>.diff-context');
				for(let e of e1){
					if(e.textContent.length<=n)continue;
					if(s.has(e.parentNode))continue;
					s.add(e.parentNode);
					trim1(e.parentNode);
				}
				function trim1(e){
					e.style.color='#7f7f7f';
					var begin=false, e1=e.previousElementSibling, e2=e.nextElementSibling;
					if(e1&&e1.querySelector('.diff-lineno') || e2&&e2.querySelector('.diff-deletedline, .diff-addedline'))
						begin=true;
					e1=e.querySelectorAll('.diff-context>div');
					for(let e of e1){
						e.parentNode.style.backgroundColor='#f9f9f97f';
						e.parentNode.style.borderColor='#e6e6e67f';
						e.dataset.text=e.textContent;
						if(begin)
							e.textContent='...'+e.textContent.substr(-n);
						else
							e.textContent=e.textContent.substr(0,n)+'...';
					}
					e.addEventListener('mouseenter',enter1);
					e.addEventListener('mouseleave',leave1);
					var tid1;
					function enter1(e){
						tid1=setTimeout(enter2,500,e);
					}
					function leave1(e){
						clearTimeout(tid1);
					}
					function enter2(e){
						e=e.target;
						e.style.color='';
						e.removeEventListener('mouseenter',enter1);
						e.removeEventListener('mouseleave',leave1);
						var e1=e.querySelectorAll('.diff-context>div');
						for(let e of e1){
							e.parentNode.style.backgroundColor='';
							e.parentNode.style.borderColor='';
							if(e.dataset.text)
								e.textContent=e.dataset.text;
						}
					}
				}
				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();
			}
		}
	})();
	(()=>{
		var e1=document.querySelectorAll('a[href^="/wiki/%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/"][title^="특수:기여/"]');
	    for(let e of e1){
	    	let a=e.getAttribute('href');
	    	if(!a)continue;
	        e.setAttribute('href',a.replace(/^\/wiki\/%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC\//,'/wiki/Special:Contributions/'));
	    }
	})();
	
})();