ผู้ใช้:Bebiezaza/dev/iScript/modules/revert.js
หมายเหตุ: หลังเผยแพร่ คุณอาจต้องล้างแคชเว็บเบราว์เซอร์ของคุณเพื่อดูการเปลี่ยนแปลง
- ไฟร์ฟอกซ์ / ซาฟารี: กด Shift ค้างขณะคลิก Reload หรือกด Ctrl-F5 หรือ Ctrl-R (⌘-R บนแมค)
- กูเกิล โครม: กด Ctrl-Shift-R (⌘-Shift-R บนแมค)
- อินเทอร์เน็ตเอกซ์พลอเรอร์ และ Edge: กด Ctrl ค้างขณะคลิก Refresh หรือกด Ctrl-F5
- โอเปร่า: กด Ctrl-F5
// ========================================================
// สคริปต์จัดให้: revert module
//
// Copyright (C) 2006-2021, Jutiphan Mongkolsuthree
// 2021, Bebiezaza
// Certain functions are copyrighted by their
// respective copyright holders
//
// Created: 25/02/2007
// Rewritten: 28/10/2021
// Replaced: original twinklefluff
//
// Additional Credits Information:
// ==============================================================
// Original code taken from Wikipedia:WikiProject User scripts/Scripts/Twinkle
// [[User:AzaToth/twinklefluff.js]]
// ========================================================
/* <pre><nowiki> */
var revertWhitelist = ['BotKung', 'TBot', 'JBot', 'NongBot', 'Chobot', 'Escarbot', 'Idioma-bot', 'Nullzerobot', 'Robbot', 'RoboDick', 'SieBot', 'Thijs!bot', 'TuvicBot', 'VolkovBot', 'YurikBot', 'Zwobot', 'InternetArchiveBot'];
function getRevertInfo(revID) {
var info;
$.ajax({
url: mw.util.wikiScript('api'),
dataType: 'json',
async: false,
data: {
format: 'json',
action: 'query',
prop: 'revisions',
indexpageids: true,
revids: revID,
rvprop: 'ids|user|content',
rvslots: 'main'
},
success: function(data) {
var id = data.query.pageids[0];
if (id == -1) {
info = "";
} else {
info = {
title: data.query.pages[id].title,
revid: data.query.pages[id].revisions[0].revid,
user: data.query.pages[id].revisions[0].user,
content: data.query.pages[id].revisions[0].slots.main['*']
};
}
}
});
return info;
}
function getRollbackInfo(pageName) {
var info = [];
$.ajax({
url: mw.util.wikiScript('api'),
dataType: 'json',
async: false,
data: {
format: 'json',
action: 'query',
prop: 'revisions',
indexpageids: true,
titles: pageName,
rvprop: 'ids|user',
rvlimit: 50
},
success: function(data) {
var id = data.query.pageids[0];
if (id == -1) {
info = "";
} else {
for (var i in data.query.pages[id].revisions) {
var parser = {
revid: data.query.pages[id].revisions[i].revid,
user: data.query.pages[id].revisions[i].user
}
info.push(parser);
}
}
}
});
return info;
}
function revertToRevision(diffVersion) {
if (diffVersion = "old") var link = document.querySelector("#mw-diff-otitle1 a").href;
else if (diffVersion = "new") var link = document.querySelector("#mw-diff-ntitle1 a").href;
else return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาดที่ไม่คาดคิด ยกเลิกการย้อน<br>กรุณาตรวจสอบและลองใหม่อีกครั้ง</span>'));
var reason = prompt("กรุณาระบุสาเหตุที่ต้องการย้อนการแก้ไข (เว้นว่างหากไม่ระบุ): ", ""); // padded out to widen prompt in Firefox
if (reason === null) return mw.notify($('<span class="revert_status_warn">ยกเลิกการย้อนแล้ว<br>ยกเลิกโดยผู้ใช้</span>'));
mw.notify($('<span class="revert_status_status">กำลังดึงข้อมูลรุ่นก่อนหน้านี้</span>'));
var revID = link.slice(link.lastIndexOf("oldid") + 6);
var revertInfo = getRevertInfo(revID);
if (mw.config.get('wgPageName') !== revertInfo.title.replace(/ /ig, "_")) return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาด รุ่นที่ดึงข้อมูลมาไม่เป็นของหน้าที่กำลังย้อน ยกเลิกการย้อน</span>'));
else if (revID != revertInfo.revid) return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาด รุ่นที่ดึงข้อมูลมา ไม่ตรงกับรุ่นที่ต้องการ ยกเลิกการย้อน</span>'));
var userInfo = "[[Special:Contributions/" + revertInfo.user + "|" + revertInfo.user + "]] ([[User talk:" + revertInfo.user + "|พูดคุย]])";
var summary = "ย้อนกลับไปรุ่นที่ " + revID + " โดย " + userInfo + " " + iScriptConfig.Tagline;
if (reason) summary += ": " + reason;
// push source
mw.notify($('<span class="revert_status_status">ดึงข้อมูลรุ่นก่อนหน้านี้สำเร็จ<br>กำลังบันทึกไปที่หน้า "' + revertInfo.title + '" กรุณารอสักครู่...</span>'));
iScriptAPI.editPage(revertInfo.title, revertInfo.content, summary, false, false);
}
function rollback(type) {
var pageName = mw.config.get('wgPageName');
var revID = mw.config.get('wgCurRevisionId');
mw.notify($('<span class="revert_status_status">กำลังดึงข้อมูลรุ่นก่อนหน้านี้</span>'));
var rollbackInfo = getRollbackInfo(pageName);
if (revID != rollbackInfo[0].revid) return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาด รุ่นที่ดึงข้อมูลมา ไม่ตรงกับรุ่นที่ต้องการ ยกเลิกการย้อน</span>'));
if (revertWhitelist.indexOf(rollbackInfo[0].user) !== -1) {
if (type == "agf") return mw.notify($('<span class="revert_status_warn">คุณได้เลือกย้อนเจตนาดีของ <span style="font-weight: bold;">' + rollbackInfo[0].user + '</span> ซึ่งเป็นบอตที่ได้รับการอนุมัติและมีเจตนาดีโดยเสมอ หากพบว่าการแก้ไขบอตไม่ถูกต้อง และต้องการย้อนกลับ ให้เลือกการย้อนปกติแทน</span>'));
else if (type == "norm") {
var rollbackBot = confirm('การแก้ไขล่าสุดเป็นของ ' + rollbackInfo[0].user + ' ซึ่งเป็นบอตที่ได้รับการอนุมัติ คุณต้องการย้อนการแก้ไขของผู้ใช้ก่อนหน้านี้ (OK) หรือการแก้ไขของบอต (Cancel)');
if (rollbackBot) {
rollbackInfo.shift();
mw.notify($('<span class="revert_status_confirm">ตามที่คุณยืนยัน เราจะทำการย้อนการแก้ไขไปรุ่นก่อนการแก้ไขของ <span style="font-weight: bold;">' + rollbackInfo[0].user + '</span></span>'));
} else mw.notify($('<span class="revert_status_warn">คุณได้ยืนยันย้อนการแก้ไขของ <span style="font-weight: bold;">' + rollbackInfo[0].user + '</span> ซึ่งเป็นบอตที่ได้รับการอนุมัติ แต่คุณยืนยันจึงดำเนินการต่อ</span>'));
} else if (type == "vand") {
mw.notify($('<span class="revert_status_confirm">คุณได้เลือกให้ย้อนการก่อกวนของ <span style="font-weight: bold;">' + rollbackInfo[0].user + '</span> ซึ่งเป็นบอตที่ได้รับการอนุมัติ โดยเราเชื่อว่าคุณต้องการย้อนกลับการแก้ไขของผู้ใช้ก่อนหน้านี้แทน</span>'));
rollbackInfo.shift();
}
}
var offender = rollbackInfo[0].user;
var revertToInfo;
var revisionCount = -1;
for (var i in rollbackInfo) {
revisionCount++;
if (rollbackInfo[i].user != offender) {
revertToInfo = {
revid: rollbackInfo[i].revid,
user: rollbackInfo[i].user
};
break;
}
}
if (!revertToInfo) return mw.notify($('<span class="revert_status_warn">ขออภัย ไม่พบเจอรุ่นที่จะย้อนกลับ หยุดดำเนินการ อาจเป็นเพราะว่า ' + rollbackInfo[0].user + ' เป็นผู้แก้ไขหน้านี้แต่เพียงผู้เดียว หรือได้แก้ไขติดต่อกันมากกว่า 50 ครั้ง</span>'));
// from here, we use modified revert code
var revertInfo = getRevertInfo(revertToInfo.revid);
if (mw.config.get('wgPageName') !== revertInfo.title.replace(/ /ig, "_")) return mw.notify($('<span class="revert_status_warn">พบข้อผิดพลาด รุ่นที่ดึงข้อมูลมาไม่เป็นของหน้าที่กำลังย้อน ยกเลิกการย้อน</span>'));
var offenderInfo = "[[Special:Contributions/" + offender + "|" + offender + "]] ([[User talk:" + offender + "|พูดคุย]])";
var summary;
if (type == "agf") {
summary = "ย้อนการแก้ไข[[WP:AGF|เจตนาดี]]ของ " + offenderInfo + " " + iScriptConfig.Tagline;
} else if (type == "norm") {
summary = "ย้อน " + revisionCount + " การแก้ไขของ " + offenderInfo + " ไปยังการแก้ไขของ " + revertToInfo.user + " " + iScriptConfig.Tagline;
} else if (type == "vand") {
summary = "ย้อน[[WP:VAND|การก่อกวน]] " + revisionCount + " ครั้งของ " + offenderInfo + " ไปยังรุ่นโดย " + revertToInfo.user + " " + iScriptConfig.Tagline;
}
if (type == "agf" || type == "norm") {
var reason = prompt("กรุณาระบุสาเหตุที่ต้องการย้อนการแก้ไข (เว้นว่างหากไม่ระบุ): ", ""); // padded out to widen prompt in Firefox
if (reason === null) return mw.notify($('<span class="revert_status_warn">ยกเลิกการย้อนแล้ว<br>ยกเลิกโดยผู้ใช้</span>'));
}
if (reason) summary += ": " + reason;
// push source
mw.notify($('<span class="revert_status_status">ดึงข้อมูลรุ่นก่อนหน้านี้สำเร็จ<br>กำลังบันทึกไปที่หน้า "' + revertInfo.title + '" กรุณารอสักครู่...</span>'));
iScriptAPI.editPage(revertInfo.title, revertInfo.content, summary, false, false);
}
function makeTwinkleLink(color, text) {
var before = createElement('span', "[", {
'style': "color: black;"
});
var main = createElement('span', text, {
'style': "color: " + color + ";"
});
var after = createElement('span', "]", {
'style': "color: black;"
});
var link = createElement('a', [before, main, after], {
'href': "#",
'style': "font-weight: bold;"
});
return link;
}
function twinkleStarter() {
if (!document.getElementById('mw-diff-otitle1') || !document.getElementById('mw-diff-ntitle1')) return;
var diffOld = document.getElementById('mw-diff-otitle1').parentNode;
var diffNew = document.getElementById('mw-diff-ntitle1').parentNode;
var revertToOld = createElement('div', makeTwinkleLink("SaddleBrown", "ย้อนกลับมาเป็นรุ่นนี้"), { 'id': "iS-tw-revert-orevision" });
diffOld.insertBefore(revertToOld, diffOld.firstChild);
if (document.getElementById('differences-nextlink')) {
var revertToNew = createElement('div', makeTwinkleLink("SaddleBrown", "ย้อนกลับมาเป็นรุ่นนี้"), { 'id': "iS-tw-revert-nrevision" });
diffNew.insertBefore(revertToNew, diffNew.firstChild);
} else {
var rollbackAGF = createElement('span', makeTwinkleLink("DarkOliveGreen", "ย้อนเจตนาดี"), { 'id': "iS-tw-rollback-agf" });
var rollbackNorm = createElement('span', makeTwinkleLink("SteelBlue", "ย้อน"), { 'id': "iS-tw-rollback-normal" });
var rollbackVand = createElement('span', makeTwinkleLink("Red", "ย้อนก่อกวน"), { 'id': "iS-tw-rollback-vand" });
var rollbackButton = createElement('div', [rollbackAGF, " || ", rollbackNorm, " || ", rollbackVand], { 'id': "iS-tw-revert" });
diffNew.insertBefore(rollbackButton, diffNew.firstChild);
}
$(revertToOld).click(function() {
revertToRevision("old");
});
$(revertToNew).click(function() {
revertToRevision("new");
});
$(rollbackAGF).click(function() {
rollback("agf");
});
$(rollbackNorm).click(function() {
rollback("norm");
});
$(rollbackVand).click(function() {
rollback("vand");
});
}
$(document).ready(function() {
if (mw.config.get('wgIsProbablyEditable')) {
twinkleStarter();
}
});