사용자:하늘/moveCategory.js: 두 판 사이의 차이

편집 요약 없음
편집 요약 없음
 
(같은 사용자의 중간 판 20개는 보이지 않습니다)
2번째 줄: 2번째 줄:
  * 분류 자동 이동 도구
  * 분류 자동 이동 도구
  * 분류 문서에서 버튼이 활성화됩니다.
  * 분류 문서에서 버튼이 활성화됩니다.
*
* 리버티 스킨에서만 작동됩니다.
  *  
  *  
  * 몇몇 의존성 스크립트가 있으니 토론으로 물어보세요.
  * 몇몇 의존성 스크립트가 있으니 토론으로 물어보세요.
10번째 줄: 8번째 줄:
  * 100개 정도 되는 문서가 있다면 다른 도구를 사용하세요.
  * 100개 정도 되는 문서가 있다면 다른 도구를 사용하세요.
  * 125개까지만 이전이 가능합니다.
  * 125개까지만 이전이 가능합니다.
  *  
  * 성능이 떨어지는 사이트에서는 사용하지 말아주세요.
  */
  */


/** XX */
var currentCategoryTitle = mw.config.get('wgTitle');
/** 분류:XX */
var currentCategoryPageName = mw.config.get('wgPageName');
mw.loader.getScript('/index.php?title=사용자:하늘/addArticleMenuItem.js&action=raw&ctype=text/javascript').then(function () {
if (mw.config.get('wgCanonicalNamespace') == 'Category') {
window.extendedDropdownItemArray.AddItem('분류를 통째로 이동합니다. !클릭 주의!', '분류 이동하기 !!클릭 주의!!',
function () {
/** 분류 이름 */
// ProcessDialog의 자식 클래스 생성
function MoveCategoryDialog(config) {
MoveCategoryDialog.super.call(this, config);
}
OO.inheritClass(MoveCategoryDialog, OO.ui.ProcessDialog);
// 정적 설정 세팅
MoveCategoryDialog.static.name = '분류 이동';
MoveCategoryDialog.static.title = '분류 이동';
MoveCategoryDialog.static.actions = [
{ action: 'move', label: '이동', flags: 'primary' },
{ label: '취소', flags: 'safe' }
];
function moveCategoryEvent() {
moveCategory(textInput.getValue());
}


if (confirm('분류를 이전할까요?')) {
/**
var toCategoryName = prompt("새 분류 이름을 입력하세요.");
* 새 분류 이름을 입력 받을 곳
var originCategoryName = mw.config.get().wgPageName;
* @type {object}
var originCategoryTitle = mw.config.get().wgTitle;
*/
var textInput = new OO.ui.TextInputWidget({ placeholder: '새 분류 이름 입력' });
textInput.on('enter', moveCategoryEvent);


//mw.loader.load('/index.php?title=사용자:하늘/page.js&action=raw&ctype=text/javascript');
/**
* 초기화
*/
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>현재 분류의 이름: <b>' + currentCategoryTitle + '</b></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 === 'move' ) {
// Create a new process to handle the action
return new OO.ui.Process( function () {
moveCategoryEvent();
dialog.close( { action: action } ); // 창닫기 -> 추후 완료 메시지 기능 추가
}, this );
}
// Fallback to parent handler
return MoveCategoryDialog.super.prototype.getActionProcess.call( this, action );
};
var windowManager = new OO.ui.WindowManager();
$(document.body).append(windowManager.$element);


new mw.Api().get({
var dialog = new MoveCategoryDialog();
  action: 'query',
windowManager.addWindows([dialog]);
  list: 'categorymembers',
windowManager.openWindow(dialog);
  cmtitle: originCategoryName,
});
  cmlimit: 125,
}
  format: 'json',
}).then(function(json) {
  json.query.categorymembers.forEach(function(data) {
  var lowerCase = originCategoryTitle.charAt(0).toLowerCase() + originCategoryTitle.slice(1);
    var pattern =
    new RegExp("\[\[[ ]*분류[ ]*:[ ]*" + originCategoryTitle + "(.*)[ ]*\]\]|\[\[[ ]*분류[ ]*:[ ]*" + lowerCase + "(.*)[ ]*\]\]", "g");
   
    new mw.Api().edit(
      data.title,
      function(revision) {
        return {
          text: revision.content.replaceAll(pattern, "[[분류:" + toCategoryName +
          "$1]]"),
          summary: "분류:" + originCategoryTitle+
          " -> 분류:" + toCategoryName
        };
      }).then(function(data) {
      console.log(data);
    }).fail(function(data) {
      alert(data);
    });
  });
});
});
/**
* 분류가 달린 문서의 분류를 변경하는 함수
* @param {string} newCategoryName 분류 이름
*/
function moveCategory(newCategoryName) {
var oldCategoryName = currentCategoryTitle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // escape for regex
var lowerCase = oldCategoryName.charAt(0).toLowerCase() + oldCategoryName.slice(1);
var pattern =
new RegExp("\[\[[ ]*분류[ ]*:[ ]*" + oldCategoryName + "(.*)[ ]*\]\]|\[\[[ ]*분류[ ]*:[ ]*" + lowerCase + "(.*)[ ]*\]\]", "g");
/**
* Mediawiki Api GET
* members of category
*/
new mw.Api().get({
action: 'query',
list: 'categorymembers',
cmtitle: currentCategoryPageName,
cmlimit: 125,
format: 'json',
}).then(function (json) {
json.query.categorymembers.forEach(function (data) {
new mw.Api().edit(
data.title,
function (revision) {
var text = revision.content.replaceAll(pattern, "\[\[분류:" + newCategoryName + "$1]]");
return { text: text, summary: "분류:" + currentCategoryTitle + " -> 분류:" + newCategoryName };
}).then(function (data) {
console.log(data);
}).fail(function (data) {
alert(data);
});
});
});
}
}

2023년 7월 9일 (일) 14:32 기준 최신판

/**
 * 분류 자동 이동 도구
 * 분류 문서에서 버튼이 활성화됩니다.
 * 
 * 몇몇 의존성 스크립트가 있으니 토론으로 물어보세요.
 * 
 * 저작자: 하늘
 * 100개 정도 되는 문서가 있다면 다른 도구를 사용하세요.
 * 125개까지만 이전이 가능합니다.
 * 성능이 떨어지는 사이트에서는 사용하지 말아주세요.
 */

/** XX */
var currentCategoryTitle = mw.config.get('wgTitle');
/** 분류:XX */
var currentCategoryPageName = mw.config.get('wgPageName');

mw.loader.getScript('/index.php?title=사용자:하늘/addArticleMenuItem.js&action=raw&ctype=text/javascript').then(function () {
	if (mw.config.get('wgCanonicalNamespace') == 'Category') {
		window.extendedDropdownItemArray.AddItem('분류를 통째로 이동합니다. !클릭 주의!', '분류 이동하기 !!클릭 주의!!',
			function () {
				/** 분류 이름 */

				// ProcessDialog의 자식 클래스 생성
				function MoveCategoryDialog(config) {
					MoveCategoryDialog.super.call(this, config);
				}
				OO.inheritClass(MoveCategoryDialog, OO.ui.ProcessDialog);
				
				// 정적 설정 세팅
				MoveCategoryDialog.static.name = '분류 이동';
				MoveCategoryDialog.static.title = '분류 이동';
				MoveCategoryDialog.static.actions = [
					{ action: 'move', label: '이동', flags: 'primary' },
					{ label: '취소', flags: 'safe' }
				];
				
				function moveCategoryEvent() {
					moveCategory(textInput.getValue());
				}

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

				/**
				 * 초기화
				 */
				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>현재 분류의 이름: <b>' + currentCategoryTitle + '</b></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 === 'move' ) {
					// Create a new process to handle the action
						return new OO.ui.Process( function () {
							moveCategoryEvent();
							dialog.close( { action: action } ); // 창닫기 -> 추후 완료 메시지 기능 추가
						}, this );
					}
					// Fallback to parent handler
					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} newCategoryName 분류 이름
 */
function moveCategory(newCategoryName) {
	var oldCategoryName = currentCategoryTitle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // escape for regex
	var lowerCase = oldCategoryName.charAt(0).toLowerCase() + oldCategoryName.slice(1);
	var pattern =
		new RegExp("\[\[[ ]*분류[ ]*:[ ]*" + oldCategoryName + "(.*)[ ]*\]\]|\[\[[ ]*분류[ ]*:[ ]*" + lowerCase + "(.*)[ ]*\]\]", "g");
	
	/**
	 * Mediawiki Api GET
	 * members of category
	 */
	new mw.Api().get({
		action: 'query',
		list: 'categorymembers',
		cmtitle: currentCategoryPageName,
		cmlimit: 125,
		format: 'json',
	}).then(function (json) {
		json.query.categorymembers.forEach(function (data) {
			new mw.Api().edit(
				data.title,
				function (revision) {
					var text = revision.content.replaceAll(pattern, "\[\[분류:" + newCategoryName + "$1]]"); 
					return { text: text, summary: "분류:" + currentCategoryTitle + " -> 분류:" + newCategoryName };
				}).then(function (data) {
					console.log(data);
				}).fail(function (data) {
					alert(data);
				});
		});
	});
}