MediaWiki:Gadget-twinkledeprod.js
Twinkle
Tiện ích Twinkle được phát triển trên GitHub. Phiên bản dành cho Wikipedia tiếng Việt cũng được biên dịch và bảo quản trên GitHub. Xin các bảo quản viên vui lòng thực hiện các thay đổi trong cành vi trên GitHub và sao chép vào đây thay vì sửa đổi tiện ích này trực tiếp. |
// <nowiki>
(function($) {
/*
****************************************
*** twinkledeprod.js: Batch deletion of expired PRODs (chỉ dành cho điều phối viên & bảo quản viên)
****************************************
* Mode of invocation: Tab ("Deprod")
* Active on: Categories whose name contains "proposed_deletion"
*/
Twinkle.deprod = function() {
if (
!Morebits.userIsSysop ||
mw.config.get('wgNamespaceNumber') !== 14 ||
!(/proposed_deletion/i).test(mw.config.get('wgPageName'))
) {
return;
}
Twinkle.addPortletLink(Twinkle.deprod.callback, 'Xóa theo đề nghị', 'tw-deprod', 'Xóa các trang được đề nghị xóa trong [[Thể loại:Chờ xóa]]');
};
var concerns = {};
Twinkle.deprod.callback = function() {
var Window = new Morebits.simpleWindow(800, 400);
Window.setTitle('Đề nghị xóa');
Window.setScriptName('Twinkle');
Window.addFooterLink('Đề xuất xóa', 'WP:PROD');
Window.addFooterLink('Trợ giúp Twinkle', 'WP:TW/DOC#đề_nghị_xóa');
var form = new Morebits.quickForm(callback_commit);
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 query = {
'action': 'query',
'generator': 'categorymembers',
'gcmtitle': mw.config.get('wgPageName'),
'gcmlimit': Twinkle.getPref('batchMax'),
'gcmnamespace': '0|6|108|2', // mostly to ignore categories
'prop': [ 'info', 'revisions' ],
'rvprop': [ 'content' ],
'inprop': [ 'protection' ]
};
var statelem = new Morebits.status('Đang lấy danh sách các trang');
var wikipedia_api = new Morebits.wiki.api('đang tải...', query, function(apiobj) {
var $doc = $(apiobj.responseXML);
var $pages = $doc.find('page[ns!="6"]'); // all non-files
var list = [];
var re = /\{\{Proposed deletion/;
$pages.each(function() {
var $page = $(this);
var title = $page.attr('title');
var content = $page.find('revisions rev').text();
var $editprot = $page.find('pr[type="edit"][level="sysop"]');
var isProtected = $editprot.length > 0;
var metadata = [];
var res = re.exec(content);
if (res) {
var parsed = Morebits.wikitext.template.parse(content, res.index);
concerns[title] = parsed.parameters.concern || '';
metadata.push(concerns[title]);
}
if (isProtected) {
metadata.push('khóa bảo vệ hoàn toàn' +
($editprot.attr('expiry') === 'infinity' ? ' vô thời hạn' : ', hết hạn ' + $editprot.attr('expiry')));
}
list.push({
label: metadata.length ? '(' + metadata.join('; ') + ')' : '',
value: title,
checked: concerns[title] !== '',
style: isProtected ? 'color:red' : ''
});
});
apiobj.params.form.append({ type: 'header', label: 'Các trang chuẩn bị xóa' });
apiobj.params.form.append({
type: 'button',
label: 'Chọn tất cả',
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', true);
}
});
apiobj.params.form.append({
type: 'button',
label: 'Bỏ chọn tất cả',
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'pages')).prop('checked', false);
}
});
apiobj.params.form.append({
'type': 'checkbox',
'name': 'pages',
'list': list
});
apiobj.params.form.append({
'type': 'submit'
});
var rendered = apiobj.params.form.render();
apiobj.params.Window.setContent(rendered);
Morebits.quickForm.getElements(rendered, 'pages').forEach(function(checkbox) {
var $checkbox = $(checkbox);
var link = Morebits.htmlNode('a', $checkbox.val());
link.setAttribute('class', 'deprod-page-link');
link.setAttribute('href', mw.util.getUrl($checkbox.val()));
link.setAttribute('target', '_blank');
$checkbox.next().prepend([link, ' ']);
});
}, statelem);
wikipedia_api.params = { form: form, Window: Window };
wikipedia_api.post();
};
var callback_commit = function(event) {
var pages = Morebits.quickForm.getInputData(event.target).pages;
Morebits.status.init(event.target);
var batchOperation = new Morebits.batchOperation('Đang xóa các trang');
batchOperation.setOption('chunkSize', Twinkle.getPref('batchChunks'));
batchOperation.setOption('preserveIndividualStatusLines', true);
batchOperation.setPageList(pages);
batchOperation.run(function(pageName) {
var params = { page: pageName, reason: concerns[page] };
var query = {
'action': 'query',
'titles': pageName,
'prop': 'redirects',
'rdlimit': 'max' // 500 is max for normal users, 5000 for bots and sysops
};
var wikipedia_api = new Morebits.wiki.api('Đang lấy các đổi hướng', query, callback_deleteRedirects);
wikipedia_api.params = params;
wikipedia_api.post();
query = {
'action': 'query',
'titles': 'Talk:' + pageName
};
wikipedia_api = new Morebits.wiki.api('Đang kiểm tra xem ' + pageName + ' có một trang thảo luận', query,
callback_deleteTalk);
wikipedia_api.params = params;
wikipedia_api.post();
var page = new Morebits.wiki.page(pageName, 'Đang xóa bài viết ' + pageName);
page.setEditSummary('Đã hết hạn [[WP:PROD|PROD]], liên quan: ' + concerns[pageName]);
page.setChangeTags(Twinkle.changeTags);
page.suppressProtectWarning();
page.deletePage(batchOperation.workerSuccess, batchOperation.workerFailure);
});
},
callback_deleteTalk = function(apiobj) {
var $doc = $(apiobj.responseXML);
var exists = $doc.find('page:not([missing])').length > 0;
if (!exists) {
// no talk page; forget about it
return;
}
var page = new Morebits.wiki.page('Talk:' + apiobj.params.page, 'Xóa trang thảo luận của bài viết ' + apiobj.params.page);
page.setEditSummary('[[WP:CSD#G8|G8]]: [[Help:Trang thảo luận|Trang thảo luận]] của trang đã xóa "' + apiobj.params.page + '"');
page.setChangeTags(Twinkle.changeTags);
page.deletePage();
},
callback_deleteRedirects = function(apiobj) {
var $doc = $(apiobj.responseXML);
$doc.find('redirects rd').each(function() {
var title = $(this).attr('title');
var page = new Morebits.wiki.page(title, 'Đang xóa trang đổi hướng ' + title);
page.setEditSummary('[[WP:CSD#G8|G8]]: Chuyển hướng đến trang đã xóa "' + apiobj.params.page + '"');
page.setChangeTags(Twinkle.changeTags);
page.deletePage();
});
};
Twinkle.addInitCallback(Twinkle.deprod, 'deprod');
})(jQuery);
// </nowiki>