사용자:기나ㅏㄴ/massdelete.js

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

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

//자세한 설명은 [[사용자:기나ㅏㄴ/massdelete]]을 참고하시기 바랍니다.
$.when(mw.loader.using(['mediawiki.util'], $.ready)).done( function() {
	mw.util.addPortletLink("p-tb", mw.config.get('wgArticlePath').replace('$1', "특수:MassDelete"), '대량 문서 삭제기' , "대량 문서 삭제" , "대량 문서 삭제");
});

if (mw.config.get('wgCanonicalNamespace')+':'+mw.config.get('wgTitle') === '특수:MassDelete' && mw.config.get('wgAction') == 'view');
mw.loader.using(['mediawiki.api', 'mediawiki.Title'], function () {
	"use strict";

	var config = mw.config.get(['wgNamespaceNumber', 'wgTitle', 'wgUserGroups', 'skin']);

	function removeBlanks(arr) {
		var ret = [];
		var i, len;
		for (i = 0, len = arr.length; i < len; i++) {
			var s = arr[i];
			s = s.trim();
			if (s) {
				ret.push(s);
			}
		}
		return ret;
	}

	function doMassDelete() {
		document.getElementById("wpMassDeleteSubmit").disabled = true;
		var articles = document.getElementById("wpMassDeletePages").value.split("\n");
		articles = removeBlanks(articles);
		if (!articles.length) {
			return;
		}
		var
			api = new mw.Api(),
			wpMassDeleteReasons = document.getElementById("wpMassDeleteReasons").value,
			wpMassDeleteReason = document.getElementById("wpMassDeleteReason").value,
			deleted = 0,
			failed = [],
			error = [],
			deferreds = [],
			reason = wpMassDeleteReasons == "other" ?
				wpMassDeleteReason :
				wpMassDeleteReasons + (wpMassDeleteReason ? " (" + wpMassDeleteReason + ")" : ""),
			onSuccess = function () {
				deleted++;
				document.getElementById("wpMassDeleteSubmit").value = "(" + deleted + ")";
			};

		function makeDeleteFunc(article) {
			return function () {
				return $.Deferred(function (deferred) {
					var promise = api.postWithToken('csrf', {
						format: 'json',
						action: 'delete',
						title: article,
						reason: reason + " - [[사용자:기나ㅏㄴ/massdelete|massdelete]]"
					});
					promise.done(onSuccess);
					promise.fail(function (code, obj) {
						failed.push(article);
						error.push(obj.error.info);
					});
					promise.always(function () {
						deferred.resolve();
					});
				});
			};
		}

		// Make a chain of deferred objects. We chain them rather than execute them in
		// parallel so that we don't make 1000 simultaneous delete requests and bring the
		// site down. We use deferred objects rather than the promise objects returned
		// from the API request so that the chain continues even if some articles gave
		// errors.
		var deferred = makeDeleteFunc(articles[0])();
		for (var i = 1, len = articles.length; i < len; i++) {
			deferred = deferred.then(makeDeleteFunc(articles[i]));
		}

		// Show the output and do cleanup once all the requests are done.
		$.when(deferred).then(function () {
			document.getElementById("wpMassDeleteSubmit").value = "완료 (" + deleted + ")";
			if (failed.length) {
				var $failedList = $('<ul>');
				for(var x = 0; x < failed.length; x++) {
					// Link the titles in the "failed" array
					var failedTitle = mw.Title.newFromText(failed[x]);
					var $failedItem = $('<li>');
					if (failedTitle) {
						$failedItem.append( $('<a>')
							.attr('href', failedTitle.getUrl())
							.text(failed[x])
						);
					} else {
						$failedItem.text(failed[x]);
					}
					$failedItem.append(document.createTextNode(': ' + error[x]));
					$failedList.append($failedItem);
				}
				$('#wpMassDeleteFailedContainer')
					.append($('<br />'))
					.append($('<b>')
						.text('삭제 실패:')
					)
					.append($failedList);
			}
		});
	}
	 
	function massdeleteform() {
	    var bodyContent;
		switch (mw.config.get('skin')) {
			case 'modern':
				bodyContent = 'mw_contentholder';
				break;
			case 'cologneblue':
				bodyContent = 'article';
				break;
			case 'monobook':
			case 'vector':
			default:
				bodyContent = 'bodyContent';
				break;
		}
		document.getElementsByTagName("h1")[0].textContent = "대량 문서 삭제기";
		document.title = "대량 문서 삭제기 - 위키백과, 우리 모두의 백과사전";
		document.getElementById(bodyContent).innerHTML = '<h3 id="siteSub">위키백과, 우리 모두의 백과사전</h3><br /><br />' +
			'<form id="wpMassDelete" name="wpMassDelete">' +
			'<b>도구 사용 미숙으로 인해 발생하는 문제에 대한 책임은 <i>전적으로 귀하</i>에게 있습니다.</b>' +
			'<div id="wpMassDeleteFailedContainer"></div>' +
			'<br /><br />' +
				'삭제할 문서 (한 줄에 한 문서):<br />' +
					'<textarea tabindex="1" accesskey="," name="wpMassDeletePages" id="wpMassDeletePages" rows="10" cols="80"></textarea>' +
				'<br /><br /><table style="background-color:transparent">' +
					'<tr><td>일반적인 이유:</td>' +
						'<td><select id="wpMassDeleteReasons">' +
							'<optgroup label="다른 이유">' +
								'<option value="다른 이유">다른 이유</option>' +
							'</optgroup>' +
							'<optgroup label="일반적인 삭제 기준">' +
								'<optgroup label="일반적인 이유">' +
									'<option value="[[위키백과:저작권|저작권 침해]]: 위키백과에 올리는 내용은 [[크리에이티브 커먼즈 라이선스|CC-BY-SA]] 라이선스에 따라 누구나 이용, 수정, 배포할 수 있는 [[자유 저작물]]이어야 합니다.">저작권 침해</option>' +
									'<option value="장난이나 낙서, 실수 또는 연습삼아 만들어진 문서">장난, 실수 ,연습</option>' +
									'<option value="[[위키백과:위키백과에 대한 오해#광고|광고·홍보]]성 문서: [[위키백과:중립적 시각]], [[위키백과:문서 등재 기준]], [[위키백과:이해관계의 충돌]]을 참조해 주세요">광고, 홍보</option>' +
									'<option value="[[위키백과:삭제 토론|삭제 토론]] 결과에 따름">삭제 토론 결과에 따름</option>' +
									'<option value="잘못된 방법으로 이동된 문서">잘못된 방법으로 이동된 문서</option>' +
									'<option value="스팸">스팸</option>' +
								'</optgroup>' +
								'<optgroup label="일반 문서">' +
									'<option value="[[위키백과:문서 등재 기준|문서 등재 기준]] 미달: [[위키백과:신뢰할 수 있는 출처|신뢰할 수 있는 출처]]에서 중요하게 다루어져야 합니다">등재 기준 미달</option>' +
									'<option value="[[위키백과:위키백과에 대한 오해#낱말|단어의 단순한 사전적 정의]] 이상으로 발전할 수 없는 주제: [[위키낱말사전]]을 활용해 주세요">단순한 사전적 정의</option>' +
									'<option value="원문 자료: [[위키문헌]]을 활용해 주세요">원문 자료</option>' +
									'<option value="[[위키백과:독자 연구 금지|독자 연구]] 문서: [[위키백과:확인 가능]]을 참조해 주세요">독자 연구</option>' +
									'<option value="[[위키백과:차단 정책|차단]]된 상태인 사용자가 차단을 회피/우회해서 만든 문서">차단회피로 만든 문서</option>' +
								'</optgroup>' +
								'<optgroup label="넘겨주기">' +
									'<option value="끊긴 넘겨주기">끊긴 넘겨주기</option>' +
									'<option value="사용하지 않는 넘겨주기">단순한 사전적 정의</option>' +
									'<option value="잘못된 넘겨주기">잘못된 넘겨주기</option>' +
								'</optgroup>' +
								'<optgroup label="분류">' +
									'<option value="사용하지 않는 분류">사용하지 않는 분류</option>' +
									'<option value="이동된 분류">이동된 분류</option>' +
									'<option value="중복된 분류">중복된 분류</option>' +
								'</optgroup>' +
								'<optgroup label="사용자 문서">' +
									'<option value="본인의 사용자 문서 삭제 신청">본인의 사용자 문서 삭제 신청</option>' +
								'</optgroup>' +
								'<optgroup label="파일">' +
									'<option value="불필요한 로컬의 파일 설명 문서">불필요한 로컬의 파일 설명 문서</option>' +
								'</optgroup>' +
								'<optgroup label="초안">' +
									'<option value="1년 이상 방치된 초안 문서">1년 이상 방치된 초안 문서</option>' +
								'</optgroup>' +
							'</optgroup>' +
							'<optgroup label="빠른 삭제 기준">' +
								'<optgroup label="일반">' +
									'<option value="[[백:G1|G1]]: [[백:무의미한 편집|무의미한 편집]]">G1: 무의미한 편집</option>' +
									'<option value="[[백:G2|G2]]: 테스트 문서">G2: 테스트 문서</option>' +
									'<option value="[[백:G3|G3]]: 명백한 문서 훼손과 노골적인 장난">G3: 명백한 문서 훼손과 노골적인 장난</option>' +
									'<option value="[[백:G4|G4]]: 삭제 토론을 거쳐 삭제된 문서의 재생성">G4: 삭제 토론을 거쳐 삭제된 문서의 재생성</option>' +
									'<option value="[[백:G5|G5]]: 추방, 또는 차단된 사용자가 만든 문서">G5: 추방, 또는 차단된 사용자가 만든 문서</option>' +
									'<option value="[[백:G6|G6]]: 기술적 삭제">G6: 기술적 삭제</option>' +
									'<option value="[[백:G7|G7]]: 작성자의 삭제 요청">G7: 작성자의 삭제 요청</option>' +
									'<option value="[[백:G8|G8]]: 존재하지 않거나 삭제된 문서와 연결된 문서">G8: 존재하지 않거나 삭제된 문서와 연결된 문서</option>' +
									'<option value="[[백:G9|G9]]: 공적 작업">G9: 공적 작업</option>' +
									'<option value="[[백:G10|G10]]: 대상에 대한 비난, 위협, 협박, 공격만을 목적으로 한 문서">G10: 대상에 대한 비난, 위협, 협박, 공격만을 목적으로 한 문서</option>' +
									'<option value="[[백:G11|G11]]: 명백한 광고나 홍보">G11: 명백한 광고나 홍보</option>' +
									'<option value="[[백:G12|G12]]: 명백한 저작권 침해">G12: 명백한 저작권 침해</option>' +
									'<option value="[[백:G13|G13]]: 버려진 초안">G13: 버려진 초안</option>' +
									'<option value="[[백:G14|G14]]: 불필요한 동음이의어 문서">G14: 불필요한 동음이의어 문서</option>' +
								'</optgroup>' +
								'<optgroup label="문서">' +
									'<option value="[[백:A1|A1]]: 문맥 없음">A1: 문맥 없음</option>' +
									'<option value="[[백:A2|A2]]: 한국어가 아닌 그 외 언어로 된 문서">A2: 한국어가 아닌 그 외 언어로 된 문서</option>' +
									'<option value="[[백:A3|A3]]: 내용 없음">A3: 내용 없음</option>' +
									'<option value="[[백:A10|A10]]: 기존 주제와 중복되는 최근에 만들어진 문서">A10: 기존 주제와 중복되는 최근에 만들어진 문서</option>' +
									'<option value="[[백:A11|A11]]: 명백한 발명품">A11: 명백한 발명품</option>' +
								'</optgroup>' +
								'<optgroup label="Redirects">' +
									'<option value="[[백:R2|R2]]: 이름공간 사이의 넘겨주기">R2: 이름공간 사이의 넘겨주기</option>' +
									'<option value="[[백:R3|R3]]: 타당하지 않은 오타">R3: 타당하지 않은 오타</option>' +
								'</optgroup>' +
								'<optgroup label="Images and other media">' +
									'<option value="[[백:F1|F1]]: 중복">F1: 중복</option>' +
									'<option value="[[백:F2|F2]]: 손상되었거나, 누락되었거나, 내용이 없는 그림">F2: 손상되었거나, 누락되었거나, 내용이 없는 그림</option>' +
									'<option value="[[백:F3|F3]]: 부적절한 라이선스">F3: 부적절한 라이선스</option>' +
									'<option value="[[백:F4|F4]]: 라이선스 정보 부족">F4: 라이선스 정보 부족</option>' +
									'<option value="[[백:F5|F5]]: 사용되지 않는 비자유 저작물">F5: 사용되지 않는 비자유 저작물</option>' +
									'<option value="[[백:F6|F6]]: 비자유 저작물 이용 근거 누락">F6: 비자유 저작물 이용 근거 누락</option>' +
									'<option value="[[백:F7|F7]]: 잘못된 공정 이용 주장">F7: 잘못된 공정 이용 주장</option>' +
									'<option value="[[백:F8|F8]]: [[위키미디어 공용]]과 동일한 파일이 중복">F8: 위키미디어 공용과 동일한 파일이 중복</option>' +
									'<option value="[[백:F9|F9]]: 명백한 저작권 침해">F9: 명백한 저작권 침해</option>' +
									'<option value="[[백:F10|F10]]: 쓸모없는 비 미디어 자료">F10: 쓸모없는 비 미디어 자료</option>' +
									'<option value="[[백:F11|F11]]: 사용 허락 근거 없음">F11: 사용 허락 근거 없음</option>' +
								'</optgroup>' +
								'<optgroup label="분류">' +
									'<option value="[[백:C1|C1]]: 채워지지 않은 분류">C1: 채워지지 않은 분류</option>' +
								'</optgroup>' +
								'<optgroup label="사용자 문서">' +
									'<option value="[[백:U1|U1]]: 사용자 요청">U1: 사용자 요청</option>' +
									'<option value="[[백:U2|U2]]: 존재하지 않는 사용자">U2: 존재하지 않는 사용자</option>' +
									'<option value="[[백:U3|U3]]: 비자유 갤러리">U3: 비자유 갤러리</option>' +
									'<option value="[[백:U5|U5]]: 위키백과를 웹 호스팅으로 노골적 오용">U5: 위키백과를 웹 호스팅으로 노골적 오용</option>' +
								'</optgroup>' +
								'<optgroup label="틀">' +
									'<option value="[[백:T2|T2]]: 허위 정책">T2: 허위 정책</option>' +
									'<option value="[[백:T3|T3]]: 중복과 하드코드된 인스턴스">T3: 중복과 하드코드된 인스턴스</option>' +
								'</optgroup>' +
								'<optgroup label="포털">' +
									'<option value="[[백:P1|P1]]: 일반 문서로도 빠른 삭제 대상인 주제에 관한 포털">P1: "일반 문서로도 빠른 삭제 대상"인 주제에 관한 포털</option>' +
									'<option value="[[백:P2|P2]]: 포괄하는 문서가 부족한 포털">P2: 포괄하는 문서가 부족한 포털</option>' +
								'</optgroup>' +
							'</optgroup>' +
						'</select></td></tr>' +
				'<tr><td>다른/추가적인 이유:</td>' +
					'<td><input type="text" id="wpMassDeleteReason" name="wpMassDeleteReason" maxlength="255" /></td></tr>' +
					'<tr><td><input type="button" id="wpMassDeleteSubmit" name="wpMassDeleteSubmit" value="삭제" /></td>' +
			'</form>';
		document.getElementById("wpMassDeleteReasons").onchange = function() {
			var maxlength = (document.getElementById("wpMassDeleteReasons").value == "other" ? 255 : 252-document.getElementById("wpMassDeleteReasons").value.length); //It's 252 because of the three characters (" ()") in addition to the selected summary.
			document.getElementById("wpMassDeleteReason").setAttribute("maxlength", maxlength);
		};
		document.getElementById("wpMassDeleteSubmit").addEventListener("click", function (e) {
			doMassDelete();
		});
	}
	 
	if (config.wgNamespaceNumber == -1 &&
		config.wgTitle.toLowerCase() == "massdelete" &&
		/sysop/.test(config.wgUserGroups)
	) {
		massdeleteform();
	}

});