미디어위키:Gadget-twinklebatchprotect.js
참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.
- 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
- 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
- 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
- 오페라: Ctrl-F5를 입력.
//<nowiki>
(function($){
/*
****************************************
*** twinklebatchprotect.js: Batch protect module (sysops only)
****************************************
* Mode of invocation: Tab ("P-batch")
* Active on: Existing project pages and user pages; existing and
* non-existing categories; Special:접두어찾기
* Config directives in: TwinkleConfig
*/
Twinkle.batchprotect = function twinklebatchprotect() {
if( Morebits.userIsInGroup( 'sysop' ) && ((mw.config.get( 'wgArticleId' ) > 0 && (mw.config.get( 'wgNamespaceNumber' ) === 2 ||
mw.config.get( 'wgNamespaceNumber' ) === 4)) || mw.config.get( 'wgNamespaceNumber' ) === 14 ||
mw.config.get( 'wgCanonicalSpecialPageName' ) === '접두어찾기') ) {
Twinkle.addPortletLink( Twinkle.batchprotect.callback, "일괄 보호", "tw-pbatch", "이 문서에 연결된 문서들을 보호합니다" );
}
};
Twinkle.batchprotect.unlinkCache = {};
Twinkle.batchprotect.callback = function twinklebatchprotectCallback() {
var Window = new Morebits.simpleWindow( 600, 400 );
Window.setTitle( "일괄 보호" );
Window.setScriptName( "트윙클" );
//Window.addFooterLink( "보호 틀", "틀:보호 틀" );
Window.addFooterLink( "보호 정책", "위키백과:보호 정책" );
Window.addFooterLink( "트윙클 도움말", ":en:WP:TW/DOC#protect" );
var form = new Morebits.quickForm( Twinkle.batchprotect.callback.evaluate );
form.append({
type: 'checkbox',
name: 'editmodify',
event: Twinkle.protect.formevents.editmodify,
list: [
{
label: '편집 보호 수정',
value: 'editmodify',
tooltip: '기존 문서에만 적용됩니다.',
checked: true
}
]
});
var editlevel = form.append({
type: 'select',
name: 'editlevel',
label: '편집 보호:',
event: Twinkle.protect.formevents.editlevel
});
editlevel.append({
type: 'option',
label: '모든 사용자',
value: 'all'
});
editlevel.append({
type: 'option',
label: '자동 인증된 사용자',
value: 'autoconfirmed'
});
editlevel.append({
type: 'option',
label: '틀 편집기',
value: 'templateeditor'
});
editlevel.append({
type: 'option',
label: '관리자',
value: 'sysop',
selected: true
});
form.append({
type: 'select',
name: 'editexpiry',
label: '기한:',
event: function(e) {
if (e.target.value === 'custom') {
Twinkle.protect.doCustomExpiry(e.target);
}
},
list: [
{ label: '1 hour', value: '1 hour' },
{ label: '2 hours', value: '2 hours' },
{ label: '3 hours', value: '3 hours' },
{ label: '6 hours', value: '6 hours' },
{ label: '12 hours', value: '12 hours' },
{ label: '1 day', value: '1 day' },
{ label: '2 days', selected: true, value: '2 days' },
{ label: '3 days', value: '3 days' },
{ label: '4 days', value: '4 days' },
{ label: '1 week', value: '1 week' },
{ label: '2 weeks', value: '2 weeks' },
{ label: '1 month', value: '1 month' },
{ label: '2 months', value: '2 months' },
{ label: '3 months', value: '3 months' },
{ label: '1 year', value: '1 year' },
{ label: '무기한', value:'indefinite' },
{ label: '사용자 지정...', value: 'custom' }
]
});
form.append({
type: 'checkbox',
name: 'movemodify',
event: Twinkle.protect.formevents.movemodify,
list: [
{
label: '이동 보호 수정',
value: 'movemodify',
tooltip: '기존 문서에만 해당합니다.',
checked: true
}
]
});
var movelevel = form.append({
type: 'select',
name: 'movelevel',
label: '이동 보호:',
event: Twinkle.protect.formevents.movelevel
});
movelevel.append({
type: 'option',
label: '모든 사용자',
value: 'all'
});
movelevel.append({
type: 'option',
label: '자동 인증된 사용자',
value: 'autoconfirmed'
});
movelevel.append({
type: 'option',
label: '틀 편집기',
value: 'templateeditor'
});
movelevel.append({
type: 'option',
label: '관리자',
value: 'sysop',
selected: true
});
form.append({
type: 'select',
name: 'moveexpiry',
label: '기한:',
event: function(e) {
if (e.target.value === 'custom') {
Twinkle.protect.doCustomExpiry(e.target);
}
},
list: [
{ label: '1 hour', value: '1 hour' },
{ label: '2 hours', value: '2 hours' },
{ label: '3 hours', value: '3 hours' },
{ label: '6 hours', value: '6 hours' },
{ label: '12 hours', value: '12 hours' },
{ label: '1 day', value: '1 day' },
{ label: '2 days', selected: true, value: '2 days' },
{ label: '3 days', value: '3 days' },
{ label: '4 days', value: '4 days' },
{ label: '1 week', value: '1 week' },
{ label: '2 weeks', value: '2 weeks' },
{ label: '1 month', value: '1 month' },
{ label: '2 months', value: '2 months' },
{ label: '3 months', value: '3 months' },
{ label: '1 year', value: '1 year' },
{ label: '무기한', value:'indefinite' },
{ label: '사용자 지정...', value: 'custom' }
]
});
form.append({
type: 'checkbox',
name: 'createmodify',
event: function twinklebatchprotectFormCreatemodifyEvent(e) {
e.target.form.createlevel.disabled = !e.target.checked;
e.target.form.createexpiry.disabled = !e.target.checked || (e.target.form.createlevel.value === 'all');
e.target.form.createlevel.style.color = e.target.form.createexpiry.style.color = (e.target.checked ? "" : "transparent");
},
list: [
{
label: '생성 보호 수정',
value: 'createmodify',
tooltip: '존재하지 않는 문서에만 해당합니다.',
checked: true
}
]
});
var createlevel = form.append({
type: 'select',
name: 'createlevel',
label: '생성 보호:',
event: Twinkle.protect.formevents.createlevel
});
createlevel.append({
type: 'option',
label: '모든 사용자',
value: 'all'
});
createlevel.append({
type: 'option',
label: '자동 인증된 사용자',
value: 'autoconfirmed'
});
createlevel.append({
type: 'option',
label: '틀 편집기',
value: 'templateeditor'
});
createlevel.append({
type: 'option',
label: '관리자',
value: 'sysop',
selected: true
});
form.append({
type: 'select',
name: 'createexpiry',
label: '기한:',
event: function(e) {
if (e.target.value === 'custom') {
Twinkle.protect.doCustomExpiry(e.target);
}
},
list: [
{ label: '1 hour', value: '1 hour' },
{ label: '2 hours', value: '2 hours' },
{ label: '3 hours', value: '3 hours' },
{ label: '6 hours', value: '6 hours' },
{ label: '12 hours', value: '12 hours' },
{ label: '1 day', value: '1 day' },
{ label: '2 days', value: '2 days' },
{ label: '3 days', value: '3 days' },
{ label: '4 days', value: '4 days' },
{ label: '1 week', value: '1 week' },
{ label: '2 weeks', value: '2 weeks' },
{ label: '1 month', value: '1 month' },
{ label: '2 months', value: '2 months' },
{ label: '3 months', value: '3 months' },
{ label: '1 year', value: '1 year' },
{ label: '무기한', selected: true, value: 'indefinite' },
{ label: '사용자 지정...', value: 'custom' }
]
});
form.append( {
type: 'header',
label: '' // horizontal rule
} );
form.append( {
type: 'input',
name: 'reason',
label: '이유: ',
size: 60,
tooltip: '보호 기록 및 문서 역사를 위해 필요합니다.'
} );
var query;
if( mw.config.get( 'wgNamespaceNumber' ) === 14 ) { // categories
query = {
'action': 'query',
'generator': 'categorymembers',
'gcmtitle': mw.config.get( 'wgPageName' ),
'gcmlimit' : Twinkle.getPref('batchMax'), // the max for sysops
'prop': 'revisions',
'rvprop': 'size'
};
} else if( mw.config.get( 'wgCanonicalSpecialPageName' ) === '접두어찾기' ) {
query = {
'action': 'query',
'generator': 'allpages',
'gapnamespace': Morebits.queryString.exists('namespace') ? Morebits.queryString.get( 'namespace' ) : document.getElementById('namespace').value,
'gapprefix': Morebits.queryString.exists('from') ? Morebits.string.toUpperCaseFirstChar(Morebits.queryString.get( 'from' ).replace('+', ' ')) :
Morebits.string.toUpperCaseFirstChar(document.getElementById('nsfrom').value),
'gaplimit' : Twinkle.getPref('batchMax'), // the max for sysops
'prop': 'revisions',
'rvprop': 'size'
};
} else {
query = {
'action': 'query',
'gpllimit' : Twinkle.getPref('batchMax'), // the max for sysops
'generator': 'links',
'titles': mw.config.get( 'wgPageName' ),
'prop': 'revisions',
'rvprop': 'size'
};
}
var statusdiv = document.createElement("div");
statusdiv.style.padding = '15px'; // just so it doesn't look broken
Window.setContent(statusdiv);
Morebits.status.init(statusdiv);
Window.display();
var statelem = new Morebits.status("문서 목록을 가져오고 있습니다");
var wikipedia_api = new Morebits.wiki.api( '로드 중...', query, function(apiobj) {
var xml = apiobj.responseXML;
var $pages = $(xml).find('page');
var list = [];
$pages.each(function(index, page) {
var $page = $(page);
var title = $page.attr('title');
var isRedir = $page.attr('redirect') === ""; // XXX ??
var missing = $page.attr('missing') === ""; // XXX ??
var size = $page.find('rev').attr('size');
var metadata = [];
if (missing) {
metadata.push("문서가 존재하지 않습니다");
} else {
if (isRedir) {
metadata.push("redirect");
}
metadata.push(size + " 바이트");
}
list.push( { label: title + (metadata.length ? (' (' + metadata.join('; ') + ')') : '' ), value: title, checked: true });
});
form.append({ type: 'header', label: '보호할 문서' });
form.append({
type: 'button',
label: "모두 선택",
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);
}
});
form.append({
type: 'button',
label: "모두 선택 해제",
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);
}
});
form.append( {
type: 'checkbox',
name: 'pages',
list: list
} );
form.append( { type:'submit' } );
var result = form.render();
Window.setContent( result );
}, statelem );
wikipedia_api.post();
};
Twinkle.batchprotect.currentProtectCounter = 0;
Twinkle.batchprotect.currentprotector = 0;
Twinkle.batchprotect.callback.evaluate = function twinklebatchprotectCallbackEvaluate(event) {
var pages = event.target.getChecked( 'pages' );
var reason = event.target.reason.value;
var editmodify = event.target.editmodify.checked;
var editlevel = event.target.editlevel.value;
var editexpiry = event.target.editexpiry.value;
var movemodify = event.target.movemodify.checked;
var movelevel = event.target.movelevel.value;
var moveexpiry = event.target.moveexpiry.value;
var createmodify = event.target.createmodify.checked;
var createlevel = event.target.createlevel.value;
var createexpiry = event.target.createexpiry.value;
if( ! reason ) {
alert("이유를 기재해 주십시오!");
return;
}
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init( event.target );
if( !pages ) {
Morebits.status.error( 'Error', '보호할 항목이 없으므로 중단합니다' );
return;
}
var batchOperation = new Morebits.batchOperation("Applying protection settings");
batchOperation.setOption("chunkSize", Twinkle.getPref('batchProtectChunks'));
batchOperation.setOption("preserveIndividualStatusLines", true);
batchOperation.setPageList(pages);
batchOperation.run(function(pageName) {
var query = {
'action': 'query',
'titles': pageName
};
var wikipedia_api = new Morebits.wiki.api( '문서가 존재하는지 확인 중: ' + pageName, query,
Twinkle.batchprotect.callbacks.main, null, batchOperation.workerFailure );
wikipedia_api.params = {
page: pageName,
reason: reason,
editmodify: editmodify,
editlevel: editlevel,
editexpiry: editexpiry,
movemodify: movemodify,
movelevel: movelevel,
moveexpiry: moveexpiry,
createmodify: createmodify,
createlevel: createlevel,
createexpiry: createexpiry,
batchOperation: batchOperation
};
wikipedia_api.post();
});
};
Twinkle.batchprotect.callbacks = {
main: function( apiobj ) {
var xml = apiobj.responseXML;
var normal = $(xml).find('normalized n').attr('to');
if( normal ) {
apiobj.params.page = normal;
}
var exists = ($(xml).find('page').attr('missing') !== "");
var page = new Morebits.wiki.page(apiobj.params.page, "보호 중: " + apiobj.params.page);
var takenAction = false;
if (exists && apiobj.params.editmodify) {
page.setEditProtection(apiobj.params.editlevel, apiobj.params.editexpiry);
takenAction = true;
}
if (exists && apiobj.params.movemodify) {
page.setMoveProtection(apiobj.params.movelevel, apiobj.params.moveexpiry);
takenAction = true;
}
if (!exists && apiobj.params.createmodify) {
page.setCreateProtection(apiobj.params.createlevel, apiobj.params.createexpiry);
takenAction = true;
}
if (!takenAction) {
Morebits.status.warn("문서 보호 중: " + apiobj.params.page, " - " + (exists ? "존재함" : "존재하지 않음") + ". 아무 것도 하지 않고 넘어갑니다.");
apiobj.params.batchOperation.workerFailure(apiobj);
return;
}
page.setEditSummary(apiobj.params.reason);
page.protect(apiobj.params.batchOperation.workerSuccess, apiobj.params.batchOperation.workerFailure);
}
};
})(jQuery);
//</nowiki>