มีเดียวิกิ:Gadget-massdelete.js
หมายเหตุ: หลังเผยแพร่ คุณอาจต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง
- ไฟร์ฟอกซ์ / ซาฟารี: กด Shift ค้างขณะคลิก Reload หรือกด Ctrl-F5 หรือ Ctrl-R (⌘-R บนแมค)
- กูเกิล โครม: กด Ctrl-Shift-R (⌘-Shift-R บนแมค)
- อินเทอร์เน็ตเอกซ์พลอเรอร์ และ Edge: กด Ctrl ค้างขณะคลิก Refresh หรือกด Ctrl-F5
- โอเปร่า: กด Ctrl-F5
mw.loader.using(['mediawiki.api', 'mediawiki.Title'], function () {
"use strict";
var config = mw.config.get(['wgNamespaceNumber', 'wgTitle', 'wgUserGroups', 'skin']);
function removeBlanks(arr) {
var ret = [];
var i, len;
for (i = 0, len = arr.length; i < len; i++) {
var s = arr[i];
s = s.trim();
if (s) {
ret.push(s);
}
}
return ret;
}
function doMassDelete() {
document.getElementById("wpMassDeleteSubmit").disabled = true;
var articles = document.getElementById("wpMassDeletePages").value.split("\n");
articles = removeBlanks(articles);
if (!articles.length) {
return;
}
var
api = new mw.Api(),
wpMassDeleteReasons = document.getElementById("wpMassDeleteReasons").value,
wpMassDeleteReason = document.getElementById("wpMassDeleteReason").value,
deleted = 0,
failed = [],
error = [],
deferreds = [],
reason = wpMassDeleteReasons == "other" ?
wpMassDeleteReason :
wpMassDeleteReasons + (wpMassDeleteReason ? " (" + wpMassDeleteReason + ")" : ""),
onSuccess = function () {
deleted++;
document.getElementById("wpMassDeleteSubmit").value = "(" + deleted + ")";
};
function makeDeleteFunc(article) {
return function () {
return $.Deferred(function (deferred) {
var promise = api.postWithToken('delete', {
format: 'json',
action: 'delete',
title: article,
reason: reason
});
promise.done(onSuccess);
promise.fail(function (code, obj) {
failed.push(article);
error.push(obj.error.info);
});
promise.always(function () {
deferred.resolve();
});
});
};
}
// Make a chain of deferred objects. We chain them rather than execute them in
// parallel so that we don't make 1000 simultaneous delete requests and bring the
// site down. We use deferred objects rather than the promise objects returned
// from the API request so that the chain continues even if some articles gave
// errors.
var deferred = makeDeleteFunc(articles[0])();
for (var i = 1, len = articles.length; i < len; i++) {
deferred = deferred.then(makeDeleteFunc(articles[i]));
}
// Show the output and do cleanup once all the requests are done.
$.when(deferred).then(function () {
document.getElementById("wpMassDeleteSubmit").value = "สำเร็จ (" + deleted + ")";
if (failed.length) {
var $failedList = $('<ul>');
for(var x = 0; x < failed.length; x++) {
// Link the titles in the "failed" array
var failedTitle = mw.Title.newFromText(failed[x]);
var $failedItem = $('<li>');
if (failedTitle) {
$failedItem.append( $('<a>')
.attr('href', failedTitle.getUrl())
.text(failed[x])
);
} else {
$failedItem.text(failed[x]);
}
$failedItem.append(document.createTextNode(': ' + error[x]));
$failedList.append($failedItem);
}
$('#wpMassDeleteFailedContainer')
.append($('<br />'))
.append($('<b>')
.text('การลบล้มเหลว:')
)
.append($failedList);
}
});
}
function massdeleteform() {
var bodyContent = (config.skin == "cologneblue" ? "article" : "bodyContent");
document.getElementsByTagName("h1")[0].textContent = "ลบหน้าจำนวนมาก";
document.title = "ลบหน้าจำนวนมาก";
document.getElementById(bodyContent).innerHTML = '<h3 id="siteSub">Lifted From Wikimedia Incubator - revision of 2015-10-28</h3><br />' +
'<div>' +
'<form id="wpMassDelete" name="wpMassDelete">' +
'<p>ยินดีต้อนรับสู่แบบฟอร์มสำหรับการลบจำนวนมาก คุณสามารถใช้หน้าพิเศษนี้เพื่อลบหน้าจำนวนมากกว่าสองหน้าขึ้นไป ถ้าคุณกำลังลบหน้าจำนวนมากที่สร้างโดยผู้ใช้คนเดียว โปรดใช้ <a href="/wiki/Special:Nuke">พิเศษ:Nuke</a></p>' +
'<p>ถ้าคุณกำลังจะลบ<b>หน้ามากกว่า 10 หน้าขึ้นไป</b> โปรดระวังการฟลัด (flood) ข้อมูลในหน้า <a href="/wiki/Special:RecentChanges">พิเศษ:ปรับปรุงล่าสุด</a></p>' +
'<p>โปรดเพิ่มรายการหน้าที่คุณต้องการลบในกล่องข้อความด้านล่างอย่างละหนึ่งหน้าต่อหนึ่งบรรทัด (ไม่ต้องใส่ลิงก์มาร์กอัพ) ขอบคุณสำหรับการใช้เครื่องมือนี้</p>' +
'<div id="wpMassDeleteFailedContainer"></div>' +
'<br />' +
'หน้าที่จะลบ (หนึ่งหน้าต่อหนึ่งบรรทัด):<br />' +
'<textarea tabindex="1" accesskey="," name="wpMassDeletePages" id="wpMassDeletePages" rows="15" cols="80"></textarea>' +
'<br /><table style="background-color:transparent">' +
'<tr><td>เหตุผลทั่วไป:</td>' +
'<td><select id="wpMassDeleteReasons">' +
'<optgroup label="เหตุผลอื่น">' +
'<option value="other">เหตุผลอื่น</option>' +
'<optgroup label="เหตุผลการลบทั่วไป">' +
'<option value="รับแจ้งจากผู้เขียน">รับแจ้งจากผู้เขียน</option>' +
'<option value="ละเมิดลิขสิทธิ์">ละเมิดลิขสิทธิ์</option>' +
'<option value="ละเมิดลิขสิทธิ์ (ไม่ได้รับอนุญาตให้ใช้ลิขสิทธิ์ของผู้อื่นโดยชอบ)">ละเมิดลิขสิทธิ์ (ไม่ได้รับอนุญาตให้ใช้ลิขสิทธิ์ของผู้อื่นโดยชอบ)</option>' +
'<option value="งานแปลที่ละเมิดลิขสิทธิ์">งานแปลที่ละเมิดลิขสิทธิ์</option>' +
'<option value="ก่อกวน">ก่อกวน</option>' +
'<option value="สแปม">สแปม</option>' +
'<option value="การอภิปรายในหน้าคุยหรือชุมชน ([[WS:C]])">การอภิปรายในหน้าคุยหรือชุมชน ([[WS:C]])</option>' +
'<optgroup label="เหตุผลการลบทันที">' +
'<option value="[[WS:CSD]] ท1 - ไม่มีเนื้อหาหรือประวัติที่มีความหมาย">[[WS:CSD]] ท1 - ไม่มีเนื้อหาหรือประวัติที่มีความหมาย</option>' +
'<option value="[[WS:CSD]] ท2 - ลงเนื้อหาเดิม">[[WS:CSD]] ท2 - ลงเนื้อหาเดิม</option>' +
'<option value="[[WS:CSD]] ท3 - ผู้เขียนถูกแบน">[[WS:CSD]] ท3 - ผู้เขียนถูกแบน</option>' +
'<option value="[[WS:CSD]] ท4 - ซ้ำซ้อน">[[WS:CSD]] ท4 - ซ้ำซ้อน</option>' +
'<option value="[[WS:CSD]] ท5 - [[วิกิซอร์ซ:วิกิซอร์ซคืออะไร|นอกเหนือขอบเขต]]">[[WS:CSD]] ท5 - [[วิกิซอร์ซ:วิกิซอร์ซคืออะไร|นอกเหนือขอบเขต]]</option>' +
'<option value="[[WS:CSD]] ท6 - ละเมิดลิขสิทธิ์">[[WS:CSD]] ท6 - ละเมิดลิขสิทธิ์</option>' +
'<option value="[[WS:CSD]] ท7 - ผู้สร้างเสนอให้ลบ">[[WS:CSD]] ท7 - ผู้สร้างเสนอให้ลบ</option>' +
'<option value="[[WS:CSD]] บ1 - ย้ายโครงการแล้ว">[[WS:CSD]] บ1 - ย้ายโครงการแล้ว</option>' +
'<option value="[[WS:CSD]] บ2 - เนื้อหาที่ไม่โดดเด่น">[[WS:CSD]] บ2 - เนื้อหาที่ไม่โดดเด่น</option>' +
'<option value="[[WS:CSD]] บ3 - ไม่ระบุข้อมูล">[[WS:CSD]] บ3 - ไม่ระบุข้อมูล</option>' +
'<option value="[[WS:CSD]] บ4 - ไม่สามารถกำหนดลิขสิทธิ์ได้">[[WS:CSD]] บ4 - ไม่สามารถกำหนดลิขสิทธิ์ได้</option>' +
'<option value="[[WS:CSD]] ม1 - หมวดหมู่ว่าง">[[WS:CSD]] ม1 - หมวดหมู่ว่าง</option>' +
'<option value="[[WS:CSD]] ม2 - หมวดหมู่ที่อิงตัวบุคคล">[[WS:CSD]] ม2 - หมวดหมู่ที่อิงตัวบุคคล</option>' +
'<option value="[[WS:CSD]] อ1 - การลบทางเทคนิค">[[WS:CSD]] อ1 - การลบทางเทคนิค</option>' +
'<option value="[[WS:CSD]] อ2 - การเปลี่ยนทางที่ไม่จำเป็น">[[WS:CSD]] อ2 - การเปลี่ยนทางที่ไม่จำเป็น</option>' +
'<option value="[[WS:CSD]] อ3 - การเปลี่ยนทางข้ามเนมสเปซ">[[WS:CSD]] อ3 - การเปลี่ยนทางข้ามเนมสเปซ</option>' +
'<option value="[[WS:CSD]] อ4 - หน้าพูดคุยที่ไม่มีหน้าหลัก">[[WS:CSD]] อ4 - หน้าพูดคุยที่ไม่มีหน้าหลัก</option>' +
'<option value="[[WS:CSD]] ฟ8 - ปรับปรุง/ลบไฟล์ต้นฉบับ">[[WS:CSD]] ฟ8 - ปรับปรุง/ลบไฟล์ต้นฉบับ</option>' +
'<optgroup label="เหตุผลอื่น">' +
'<option value="หน้าที่ได้รับการแจ้งลบโดยไม่มีการคัดค้านกว่า 7 วัน">หน้าที่ได้รับการแจ้งลบโดยไม่มีการคัดค้านกว่า 7 วัน</option>' +
'<option value="หมวดหมู่ที่เปลี่ยนชื่อ รวมหรือว่าง">หมวดหมู่ที่เปลี่ยนชื่อ รวมหรือว่าง</option>' +
'<option value="หน้าโจมตี">หน้าโจมตี</option>' +
'</optgroup>' +
'</select></td></tr>' +
'<tr><td>เหตุผลอื่น/เพิ่มเติม:</td>' +
'<td><input type="text" id="wpMassDeleteReason" name="wpMassDeleteReason" size="42" maxlength="255" /></td></tr>' +
'<tr><td><input type="button" id="wpMassDeleteSubmit" name="wpMassDeleteSubmit" value="ลบ" /></td>' +
'</form>' +
'</div>';
document.getElementById("wpMassDeleteReasons").onchange = function() {
var maxlength = (document.getElementById("wpMassDeleteReasons").value == "other" ? 255 : 252-document.getElementById("wpMassDeleteReasons").value.length); //It's 252 because of the three characters (" ()") in addition to the selected summary.
document.getElementById("wpMassDeleteReason").setAttribute("maxlength", maxlength);
};
document.getElementById("wpMassDeleteSubmit").addEventListener("click", function (e) {
doMassDelete();
});
}
if (config.wgNamespaceNumber == -1 &&
config.wgTitle.toLowerCase() == "massdelete" &&
/sysop/.test(config.wgUserGroups)
) {
massdeleteform();
}
});