사용자:하늘/moveCategory.js

< 사용자:하늘
하늘 (토론 | 기여)님의 2022년 9월 3일 (토) 22:56 판

참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.

  • 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
  • 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
  • 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
  • 오페라: Ctrl-F5를 입력.
/** 분류 이름 */
var currentCategoryTitle = mw.config.get('wgTitle');
/** '분류:'를 포함한 분류의 이름(분류 문서 이름) */
var currentCategoryPageName = mw.config.get('wgPageName');

function MoveCategoryDialog(config) {
	MoveCategoryDialog.super.call(this, config);
}
OO.inheritClass(MoveCategoryDialog, OO.ui.ProcessDialog);
MoveCategoryDialog.static.name = '분류 이동';
MoveCategoryDialog.static.title = '분류 이동';
MoveCategoryDialog.static.actions = [
	{ action: 'moveCategoryEvent', label: '이동', flags: 'primary' },
	{ label: '취소', flags: 'safe' }
];

/**
 * 새 분류 이름을 입력 받을 곳
 * @type {object}
 */
var textInput = new OO.ui.TextInputWidget({ placeholder: '새 분류 이름 입력' });
textInput.on('enter', moveCategoryEvent);
function moveCategoryEvent() {
	moveCategory(textInput.getValue());
}

MoveCategoryDialog.prototype.initialize = function () {
	MoveCategoryDialog.super.prototype.initialize.apply(this, arguments);
	this.content = new OO.ui.PanelLayout({ padded: true, expanded: false });
	this.content.$element.append('<p>현재 분류의 이름: '+ currentCategoryTitle +'</p>')
	this.content.$element.append('<p>이 분류가 달린 각 문서의 분류를 다른 이름으로 변경합니다. 분류 문서는 수동으로 옮겨주세요.</p>')

	this.content.$element.append(textInput.$element);
	this.$body.append(this.content.$element);
};
MoveCategoryDialog.prototype.getActionProcess = function (action) {
	var dialog = this;
	if (action) {
		return new OO.ui.Process(function () {
			dialog.close({ action: action });
		});
	}
	return MoveCategoryDialog.super.prototype.getActionProcess.call(this, action);
};

var windowManager = new OO.ui.WindowManager();
$(document.body).append(windowManager.$element);

var dialog = new MoveCategoryDialog();
windowManager.addWindows([dialog]);
windowManager.openWindow(dialog);

/**
 * 분류가 달린 문서의 분류를 변경하는 함수
 * @param {string} toCategoryName 분류 이름
 */
function moveCategory(toCategoryName) {
	new mw.Api().get({
		action: 'query',
		list: 'categorymembers',
		cmtitle: currentCategoryPageName,
		cmlimit: 125,
		format: 'json',
	}).then(function (json) {
		json.query.categorymembers.forEach(function (data) {
			var lowerCase = currentCategoryTitle.charAt(0).toLowerCase() + currentCategoryTitle.slice(1);
			var pattern =
				new RegExp("\[\[[ ]*분류[ ]*:[ ]*" + currentCategoryTitle + "(.*)[ ]*\]\]|\[\[[ ]*분류[ ]*:[ ]*" + lowerCase + "(.*)[ ]*\]\]", "g");

			new mw.Api().edit(
				data.title,
				function (revision) {
					return {
						text: revision.content.replaceAll(pattern, "[[분류:" + toCategoryName + "$1]]"),
						summary: "분류:" + currentCategoryTitle + " -> 분류:" + toCategoryName
					};
				}).then(function (data) {
					console.log(data);
				}).fail(function (data) {
					alert(data);
				});
		});
	});
}