MediaWiki:Gadget-twinkleunlink.js
Giao diện
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($) {
/*
****************************************
*** twinkleunlink.js: Unlink module
****************************************
* Mode of invocation: Tab ("Unlink")
* Active on: Non-special pages, except Wikipedia:Sandbox
*/
Twinkle.unlink = function twinkleunlink() {
if (mw.config.get('wgNamespaceNumber') < 0 || mw.config.get('wgPageName') === 'Wikipedia:Sandbox' ||
// Restrict to extended confirmed users (see #428)
(!Morebits.userIsInGroup('extendedconfirmed') && !Morebits.userIsSysop && !Morebits.userIsInGroup('eliminator'))) {
return;
}
Twinkle.addPortletLink(Twinkle.unlink.callback, 'Gỡ liên kết', 'tw-unlink', 'Gỡ liên kết đến trang này');
};
// the parameter is used when invoking unlink from admin speedy
Twinkle.unlink.callback = function(presetReason) {
var Window = new Morebits.simpleWindow(600, 440);
Window.setTitle('Bỏ backlink' + (mw.config.get('wgNamespaceNumber') === 6 ? ' và các liên kết tập tin' : ''));
Window.setScriptName('Twinkle');
Window.addFooterLink('Trợ giúp Twinkle', 'WP:TW/DOC#unlink');
var form = new Morebits.quickForm(Twinkle.unlink.callback.evaluate);
// prepend some basic documentation
var node1 = Morebits.htmlNode('code', '[[' + Morebits.pageNameNorm + '|văn bản liên kết]]');
var node2 = Morebits.htmlNode('code', 'văn bản liên kết');
node1.style.fontFamily = node2.style.fontFamily = 'monospace';
node1.style.fontStyle = node2.style.fontStyle = 'normal';
form.append({
type: 'div',
style: 'margin-bottom: 0.5em',
label: [
'Công cụ này cho phép bạn hủy liên kết tất cả các liên kết đến ("backlink") trỏ đến trang này' +
(mw.config.get('wgNamespaceNumber') === 6 ? ', và / hoặc ẩn tất cả các phần bao gồm của tập tin này bằng cách gói chúng trong thẻ bình luận <!-- -->' : '') +
'. Ví dụ, ',
node1,
' sẽ trở thành ',
node2,
'. Hãy sử dụng chức năng này một cách thận trọng.'
]
});
form.append({
type: 'input',
name: 'reason',
label: 'Lý do: ',
value: presetReason ? presetReason : '',
size: 60
});
var query;
if (mw.config.get('wgNamespaceNumber') === 6) { // File:
query = {
'action': 'query',
'list': [ 'backlinks', 'imageusage' ],
'bltitle': mw.config.get('wgPageName'),
'iutitle': mw.config.get('wgPageName'),
'bllimit': 'max', // 500 is max for normal users, 5000 for bots and sysops
'iulimit': 'max', // 500 is max for normal users, 5000 for bots and sysops
'blnamespace': Twinkle.getPref('unlinkNamespaces'),
'iunamespace': Twinkle.getPref('unlinkNamespaces'),
'rawcontinue': true
};
} else {
query = {
'action': 'query',
'list': 'backlinks',
'bltitle': mw.config.get('wgPageName'),
'blfilterredir': 'nonredirects',
'bllimit': 'max', // 500 is max for normal users, 5000 for bots and sysops
'blnamespace': Twinkle.getPref('unlinkNamespaces'),
'rawcontinue': true
};
}
var wikipedia_api = new Morebits.wiki.api('Đang lấy backlink', query, Twinkle.unlink.callbacks.display.backlinks);
wikipedia_api.params = { form: form, Window: Window, image: mw.config.get('wgNamespaceNumber') === 6 };
wikipedia_api.post();
var root = document.createElement('div');
root.style.padding = '15px'; // just so it doesn't look broken
Morebits.status.init(root);
wikipedia_api.statelem.status('đang tải...');
Window.setContent(root);
Window.display();
};
Twinkle.unlink.callback.evaluate = function twinkleunlinkCallbackEvaluate(event) {
var form = event.target;
var input = Morebits.quickForm.getInputData(form);
if (!input.reason) {
alert('Bạn phải nêu lý do cho việc gỡ liên kết.');
return;
}
input.backlinks = input.backlinks || [];
input.imageusage = input.imageusage || [];
var pages = Morebits.array.uniq(input.backlinks.concat(input.imageusage));
if (!pages.length) {
alert('Bạn phải chọn ít nhất một mục để gỡ liên kết.');
return;
}
Morebits.simpleWindow.setButtonsEnabled(false);
Morebits.status.init(form);
var unlinker = new Morebits.batchOperation('Đang gỡ liên kết ' + (input.backlinks.length ? 'backlink' +
(input.imageusage.length ? ' và các thể hiện sử dụng tập tin' : '') : 'các thể hiện sử dụng tập tin'));
unlinker.setOption('preserveIndividualStatusLines', true);
unlinker.setPageList(pages);
var params = { reason: input.reason, unlinker: unlinker };
unlinker.run(function(pageName) {
var wikipedia_page = new Morebits.wiki.page(pageName, 'Đang gỡ liên kết trong trang "' + pageName + '"');
wikipedia_page.setBotEdit(true); // unlink considered a floody operation
wikipedia_page.setCallbackParameters($.extend({
doBacklinks: input.backlinks.indexOf(pageName) !== -1,
doImageusage: input.imageusage.indexOf(pageName) !== -1
}, params));
wikipedia_page.load(Twinkle.unlink.callbacks.unlinkBacklinks);
});
};
Twinkle.unlink.callbacks = {
display: {
backlinks: function twinkleunlinkCallbackDisplayBacklinks(apiobj) {
var xmlDoc = apiobj.responseXML;
var havecontent = false;
var list, namespaces, i;
if (apiobj.params.image) {
var imageusage = $(xmlDoc).find('query imageusage iu');
list = [];
for (i = 0; i < imageusage.length; ++i) {
var usagetitle = imageusage[i].getAttribute('title');
list.push({ label: usagetitle, value: usagetitle, checked: true });
}
if (!list.length) {
apiobj.params.form.append({ type: 'div', label: 'Không tìm thấy thể hiện sử dụng tập tin nào.' });
} else {
apiobj.params.form.append({ type: 'header', label: 'Sử dụng tập tin' });
namespaces = [];
$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
namespaces.push(v === '0' ? '(Bài viết)' : mw.config.get('wgFormattedNamespaces')[v]);
});
apiobj.params.form.append({
type: 'div',
label: 'Các không gian tên đã chọn: ' + namespaces.join(', '),
tooltip: 'Bạn có thể thay đổi điều này ở tùy chọn Twinkle, tại [[WP:TWPREFS]]'
});
if ($(xmlDoc).find('query-continue').length) {
apiobj.params.form.append({
type: 'div',
label: mw.language.convertNumber(list.length) + ' sử dụng tập tin đầu tiên được hiển thị.'
});
}
apiobj.params.form.append({
type: 'button',
label: 'Chọn tất cả',
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'imageusage')).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, 'imageusage')).prop('checked', false);
}
});
apiobj.params.form.append({
type: 'checkbox',
name: 'imageusage',
shiftClickSupport: true,
list: list
});
havecontent = true;
}
}
var backlinks = $(xmlDoc).find('query backlinks bl');
if (backlinks.length > 0) {
list = [];
for (i = 0; i < backlinks.length; ++i) {
var title = backlinks[i].getAttribute('title');
list.push({ label: title, value: title, checked: true });
}
apiobj.params.form.append({ type: 'header', label: 'Backlink' });
namespaces = [];
$.each(Twinkle.getPref('unlinkNamespaces'), function(k, v) {
namespaces.push(v === '0' ? '(Bài viết)' : mw.config.get('wgFormattedNamespaces')[v]);
});
apiobj.params.form.append({
type: 'div',
label: 'Các không gian đã chọn: ' + namespaces.join(', '),
tooltip: 'Bạn có thể thay đổi điều này với tùy chọn Twinkle, tại [[WP:TWPREFS]]'
});
if ($(xmlDoc).find('query-continue').length) {
apiobj.params.form.append({
type: 'div',
label: mw.language.convertNumber(list.length) + ' backlink đầu tiên được hiển thị.'
});
}
apiobj.params.form.append({
type: 'button',
label: 'Chọn tất cả',
event: function(e) {
$(Morebits.quickForm.getElements(e.target.form, 'backlinks')).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, 'backlinks')).prop('checked', false);
}
});
apiobj.params.form.append({
type: 'checkbox',
name: 'backlinks',
shiftClickSupport: true,
list: list
});
havecontent = true;
} else {
apiobj.params.form.append({ type: 'div', label: 'Không tìm thấy backlink nào.' });
}
if (havecontent) {
apiobj.params.form.append({ type: 'submit' });
}
var result = apiobj.params.form.render();
apiobj.params.Window.setContent(result);
}
},
unlinkBacklinks: function twinkleunlinkCallbackUnlinkBacklinks(pageobj) {
var oldtext = pageobj.getPageText();
var params = pageobj.getCallbackParameters();
var wikiPage = new Morebits.wikitext.page(oldtext);
var summaryText = '', warningString = false;
var text;
// remove image usages
if (params.doImageusage) {
text = wikiPage.commentOutImage(mw.config.get('wgTitle'), 'Đã che mã nguồn').getText();
// did we actually make any changes?
if (text === oldtext) {
warningString = 'sử dụng tập tin';
} else {
summaryText = 'Che mã nguồn các sử dụng tập tin';
oldtext = text;
}
}
// remove backlinks
if (params.doBacklinks) {
text = wikiPage.removeLink(Morebits.pageNameNorm).getText();
// did we actually make any changes?
if (text === oldtext) {
warningString = warningString ? 'backlink hay sử dụng tập tin' : 'backlink';
} else {
summaryText = (summaryText ? summaryText + ' / ' : '') + 'Đang xóa (các) liên kết tới';
oldtext = text;
}
}
if (warningString) {
// nothing to do!
pageobj.getStatusElement().error("Không tìm thấy bất kỳ " + warningString + ' trong trang.');
params.unlinker.workerFailure(pageobj);
return;
}
pageobj.setPageText(text);
pageobj.setEditSummary(summaryText + ' "' + Morebits.pageNameNorm + '": ' + params.reason + '.');
pageobj.setChangeTags(Twinkle.changeTags);
pageobj.setCreateOption('nocreate');
pageobj.save(params.unlinker.workerSuccess, params.unlinker.workerFailure);
}
};
Twinkle.addInitCallback(Twinkle.unlink, 'unlink');
})(jQuery);
// </nowiki>