User:Bosco-bot/common.js
From Test Wiki
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/**
* Protection helper (zh-Hans / zh-Hant)
* - Default language zh-Hans
* - Always ask for expiry (default indefinite)
* - Split edit/move protection levels
* - Namespace restrictions
* - Direct protect URL construction
* - Reason optional for all codes except O4/O5 (mandatory)
*/
mw.loader.using(['mediawiki.util'], function () {
var ns = mw.config.get('wgNamespaceNumber');
if (ns === -1 || ns === -2) return;
// Language detection (default zh-Hans)
var rawLang = mw.config.get('wgContentLanguage') || 'zh-hans';
var lang = (['zh', 'zh-hans', 'zh-cn', 'zh-my', 'zh-sg'].includes(rawLang)) ? 'zh-hans' : 'zh-hant';
// Reasons dictionary (Simplified Chinese)
var reasonsHans = {
G1: "遭到过度破坏的页面",
G2: "拥有过多垃圾信息的页面",
G3: "拥有负面的编辑战的页面",
G4: "高流量页面",
G5: "当时有争议和谣言风靡的页面",
G6: "备受争议的页面",
G7: "同一时间或不同时间针对性被破坏的页面",
G8: "动画中的宝可梦被公布可能会进化",
R2: "译名备受争议但并无错误的重定向",
R3: "需要保护的重定向",
R4: "刻意双重重定向或者指向不存在页面的重定向",
F1: "有必要保护的文件",
F2: "刻意拥有重复文件",
F3: "备受争议的文件",
O1: "用户请求保护自己的用户页或子页面",
O2: "神奇宝贝百科站务或方针方面的页面",
O3: "刻意使用的空的类别(没有条目也没有子类别)",
O4: "其他需要保护的页面",
O5: "解除保护的页面"
};
// Reasons dictionary (Traditional Chinese)
var reasonsHant = {
G1: "遭到過度破壞的頁面",
G2: "擁有過多垃圾資訊的頁面",
G3: "擁有負面的編輯戰的頁面",
G4: "高流量頁面",
G5: "當時有爭議和謠言風靡的頁面",
G6: "備受爭議的頁面",
G7: "同一時間或不同時間針對性被破壞的頁面",
G8: "動畫中的寶可夢被公布可能會進化",
R2: "譯名備受爭議但並無錯誤的重定向",
R3: "需要保護的重定向",
R4: "刻意雙重重定向或者指向不存在頁面的重定向",
F1: "有必要保護的檔案",
F2: "刻意擁有重複檔案",
F3: "備受爭議的檔案",
O1: "用戶請求保護自己的用戶頁或子頁面",
O2: "神奇寶貝百科站務或方針方面的頁面",
O3: "刻意使用的空的類別(沒有條目也沒有子類別)",
O4: "其他需要保護的頁面",
O5: "解除保護的頁面"
};
var reasonsAll = (lang === 'zh-hans') ? reasonsHans : reasonsHant;
// Filter reasons by namespace
function getValidReasons() {
var valid = {};
Object.keys(reasonsAll).forEach(function (code) {
if (['F1','F2','F3'].includes(code) && ns !== 6) return;
if (code === 'O1' && !(ns === 2 || ns === 3)) return;
if (code === 'O2' && !(ns === 4 || ns === 5)) return;
if (code === 'O3' && ns !== 14) return;
valid[code] = reasonsAll[code];
});
return valid;
}
var linkText = (lang === 'zh-hans') ? '保护/解除保护' : '保護/解除保護';
var tooltip = linkText;
var editPrompt = (lang === 'zh-hans')
? "请输入编辑保护级别 (autoconfirmed/sysop/admin/none):"
: "請輸入編輯保護級別 (autoconfirmed/sysop/admin/none):";
var movePrompt = (lang === 'zh-hans')
? "请输入移动保护级别 (autoconfirmed/sysop/admin/none):"
: "請輸入移動保護級別 (autoconfirmed/sysop/admin/none):";
var expiryPrompt = (lang === 'zh-hans') ? "请输入保护期限 (默认 indefinite):" : "請輸入保護期限 (默認 indefinite):";
var reasonTip = (lang === 'zh-hans') ? "提示:請提供額外理由(可選,O4/O5 必須提供理由)" : "提示:請提供額外理由(可選,O4/O5 必須提供理由)";
var link = mw.util.addPortletLink('p-cactions', '#', linkText, 'ca-protectpage', tooltip);
$(link).on('click', function (e) {
e.preventDefault();
var editChoice = prompt(editPrompt);
var moveChoice = prompt(movePrompt);
function normalizeLevel(input) {
if (!input) return "";
var val = input.trim().toLowerCase();
if (val === "autoconfirmed") return "autoconfirmed";
if (val === "sysop" || val === "admin") return "sysop";
if (val === "none") return "";
return "";
}
var editLevel = normalizeLevel(editChoice);
var moveLevel = normalizeLevel(moveChoice);
var protections = [];
if (editLevel) protections.push("mwProtect-level-edit=" + editLevel);
if (moveLevel) protections.push("mwProtect-level-move=" + moveLevel);
var expiry = prompt(expiryPrompt) || "indefinite";
var pageName = mw.config.get('wgPageName');
var baseUrl = mw.util.getUrl(pageName);
var finalReason = "";
var validReasons = getValidReasons();
if (protections.length > 0) {
var codePrompt = (lang === 'zh-hans' ? "请输入保护代碼:\n" : "請輸入保護代碼:\n") +
Object.keys(validReasons).map(function (k) {
return k + ":" + validReasons[k];
}).join("\n") + "\n" + reasonTip;
var code = prompt(codePrompt);
var reason = prompt((lang === 'zh-hans') ? "请输入理由:" : "請輸入理由:") || "";
if (!code || !validReasons[code]) {
// Unknown code → force O4, must have reason
if (!reason) {
alert((lang === 'zh-hans') ? "O4 必须提供理由。" : "O4 必須提供理由。");
return;
}
finalReason = "O4:" + reasonsAll.O4 + ";" + reason;
} else if (code === "O4" && !reason) {
alert((lang === 'zh-hans') ? "O4 必须提供理由。" : "O4 必須提供理由。");
return;
} else {
finalReason = code + ":" + validReasons[code] + (reason ? ";" + reason : "");
}
} else {
// Unprotect → O5, must have reason
var reason = prompt((lang === 'zh-hans') ? "请输入解除保护理由:" : "請輸入解除保護理由:") || "";
if (!reason) {
alert((lang === 'zh-hans') ? "O5 必须提供理由。" : "O5 必須提供理由。");
return;
}
finalReason = "O5:" + reasonsAll.O5 + ";" + reason;
}
var finalUrl = baseUrl + "?action=protect" +
(protections.length ? "&" + protections.join("&") : "") +
"&mwProtect-reason=" + encodeURIComponent(finalReason) +
"&mwProtect-expiry=" + encodeURIComponent(expiry);
// Directly navigate, no confirmation
window.location.href = finalUrl;
});
});