User:Irukaza/common.js
跳到导航
跳到搜索
注意:这类代码页面在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- 按住
CTRL+SHIFT+DEL 或 ⌘-Shift-R
来清除缓存! - 或尝试在地址栏的地址最后添加代码
?_=1
来访问最新页面。 - 你还可以在设置中勾选小工具在页面右上角添加清除缓存按钮!
// <pre>
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
// await mw.loader.using(["ext.gadget.libBottomRightCorner", "oojs-ui", "oojs-ui-widgets", "oojs-ui.styles.indicators", "oojs-ui.styles.icons-alerts", "mediawiki.util", "ext.gadget.site-lib"]);
$(function () {
/**
* @typedef {{ data: string, label: string }} option
*/
/**
* @typedef {{ option: option, subTypes: option[] }} type
*/
/**
* @type {{ [key: string ]: type }}
*/
var types = {
placeholder: {
option: { data: "placeholder", label: wgULS("请选择一项主要问题", "請選擇一項主要問題") },
subTypes: []
},
违法违禁: {
option: { data: "违法违禁", label: wgULS("违法违禁", "違法違禁") },
subTypes: []
},
色情低俗: {
option: { data: "色情低俗", label: "色情低俗" },
subTypes: [
{ data: "低俗信息", label: wgULS("低俗信息", "低俗資訊") },
{ data: "色情图文", label: wgULS("色情图文", "色情圖文") },
{ data: "侵害未成年", label: "侵害未成年" },
{ data: "色情视频", label: wgULS("色情视频", "色情影片", null, null, "色情視像") },
]
},
不实信息: {
option: { data: "不实信息", label: wgULS("不实信息", "不實資訊") },
subTypes: [
{ data: "不符合事实", label: wgULS("不符合事实", "不符合事實") },
{ data: "有争议事实", label: wgULS("有争议事实", "有爭議事實") },
]
},
血腥暴力: {
option: { data: "血腥暴力", label: "血腥暴力" },
subTypes: [
{ data: "暴恐血腥", label: "暴恐血腥" },
{ data: "虐杀动物", label: wgULS("虐杀动物", "虐殺動物") },
]
},
人身攻击: {
option: { data: "人身攻击", label: wgULS("人身攻击", "人身攻擊") },
subTypes: []
},
赌博诈骗: {
option: { data: "赌博诈骗", label: wgULS("赌博诈骗", "賭博詐騙") },
subTypes: []
},
"抄袭/侵权": {
option: { data: "抄袭/侵权", label: wgULS("抄袭/侵权", "抄襲/侵權") },
subTypes: []
},
其他反馈: {
option: { data: "其他反馈", label: wgULS("其他反馈", "其他反饋") },
subTypes: []
}
};
var wgNamespaceNumber = mw.config.get("wgNamespaceNumber");
var wgPageName = mw.config.get("wgPageName");
var wgArticleId = mw.config.get("wgArticleId") || -1;
var wgCurRevisionId = mw.config.get("wgCurRevisionId") || -1;
var wgRevisionId = mw.config.get("wgRevisionId") || -1;
if (wgNamespaceNumber < 0 || wgArticleId === 0) {
return;
}
var $body = $(document.body);
var sizes = ["small", "medium", "large", "larger"];
var getSize = function (size) { return sizes.includes(size) ? size : "small"; };
var oojsUIAlert = function (text, size) { return OO.ui.alert($("<p>").html(text), { title: wgULS("萌娘百科页面反馈功能", "萌娘百科頁面反饋功能"), size: getSize(size) }); };
var oojsUIConfirm = function (text, size) { return OO.ui.confirm($("<p>").html(text), { title: wgULS("萌娘百科页面反馈功能", "萌娘百科頁面反饋功能"), size: getSize(size) }); };
insertToBottomRightCorner(wgULS("页面反馈", "頁面反饋")).css({
order: 0
}).on("click", function () { return __awaiter(void 0, void 0, void 0, function () {
var _a, _b, $wrapper, fieldset, emailInput, reasonTextarea, primaryTypeSelector, secondaryTypeSelector, secondaryTypeSelectorField, submit, cancel, buttonsField, progressBar;
return __generator(this, function (_c) {
switch (_c.label) {
case 0:
_a = wgNamespaceNumber > 0;
if (!_a) return [3 /*break*/, 2];
return [4 /*yield*/, oojsUIConfirm("".concat(wgULS("本页面<b>并非条目页面</b>,并不直接介绍事物,而仅为萌娘百科", "本頁面<b>並非條目頁面</b>,並不直接介紹事物,而僅為萌娘百科")).concat(wgULS("用户", "使用者", null, null, "用戶")).concat(wgULS("为方便编辑、交流沟通等使用。<br>您确定您仍要反馈本页面吗?", "為方便編輯、交流溝通等使用。<br>您確定您仍要反饋本頁面嗎?")))];
case 1:
_a = !(_c.sent());
_c.label = 2;
case 2:
if (_a) {
return [2 /*return*/];
}
_b = wgCurRevisionId !== wgRevisionId;
if (!_b) return [3 /*break*/, 4];
return [4 /*yield*/, oojsUIConfirm("".concat(wgULS("本页面<b>并非最新版本</b>,其内容可能已被修改,您可以点击", "本頁面<b>並非最新版本</b>,其內容可能已被修改,您可以點選"), "<a href=\"/").concat(wgPageName, "\">").concat(wgULS("此链接查看最新版本</a>以免误反馈。<br>您确定您仍要反馈此版本吗?", "此連結檢視最新版本</a>以免誤反饋。<br>您確定您仍要反饋此版本嗎?")))];
case 3:
_b = !(_c.sent());
_c.label = 4;
case 4:
if (_b) {
return [2 /*return*/];
}
$wrapper = $("<div/>", {
css: {
position: "fixed",
top: 0,
left: 0,
height: "100%",
width: "100%",
color: "black",
display: "flex",
"align-items": "center",
"justify-content": "center",
"background-color": "rgba(255, 255, 255, 0.73)",
"z-index": 99
},
id: "report-root"
});
fieldset = new OO.ui.FieldsetLayout({
label: wgULS("页面反馈", "頁面反饋")
});
emailInput = new OO.ui.TextInputWidget({
required: true,
indicator: "required",
validate: mw.util.validateEmail,
autocomplete: false
});
reasonTextarea = new OO.ui.MultilineTextInputWidget({
autosize: true,
indicator: "required",
label: wgULS("至少需要5个字节", "至少需要5個位元組"),
required: true,
validate: /.{5,}/,
autocomplete: false
});
reasonTextarea.$element.find(".oo-ui-labelElement-label").css("pointer-events", "none");
primaryTypeSelector = new OO.ui.DropdownInputWidget({
options: Object.values(types).map(function (_a) {
var option = _a.option;
return option;
})
});
secondaryTypeSelector = new OO.ui.DropdownInputWidget({
options: []
});
secondaryTypeSelectorField = new OO.ui.FieldLayout(secondaryTypeSelector, {
align: "top"
});
secondaryTypeSelectorField.$element.hide();
primaryTypeSelector.on("change", function (value) {
var subTypes = types[value].subTypes;
if (subTypes.length > 0) {
secondaryTypeSelectorField.$element.slideDown("fast");
secondaryTypeSelector.setOptions(__spreadArray(__spreadArray([
{ data: "placeholder", label: wgULS("请选择一项细节问题", "請選擇一項細節問題") }
], subTypes, true), [
{ data: "其他", label: "其他" },
], false));
}
else {
secondaryTypeSelectorField.$element.slideUp("fast");
secondaryTypeSelector.setOptions([{ data: "none", label: "none" }]);
secondaryTypeSelector.setValue("none");
}
});
submit = new OO.ui.ButtonWidget({
label: wgULS("确认", "確認"),
flags: ["primary", "progressive"]
});
cancel = new OO.ui.ButtonWidget({
label: "取消",
flags: "destructive"
});
buttonsField = new OO.ui.FieldLayout(new OO.ui.Widget({
content: [
new OO.ui.HorizontalLayout({
items: [submit, cancel]
}),
]
}));
progressBar = new OO.ui.ProgressBarWidget({
progress: false
});
progressBar.$element.hide().css("margin-top", "1em");
fieldset.addItems([
new OO.ui.FieldLayout(primaryTypeSelector, {
label: wgULS("您认为本页面存在哪项问题?(如有多项请选择最突出的一项,其他项请在理由一栏说明)", "您認為本頁面存在哪項問題?(如有多項請選擇最突出的一項,其他項請在理由一欄說明)"),
align: "top"
}),
secondaryTypeSelectorField,
new OO.ui.FieldLayout(reasonTextarea, {
label: "您的理由",
align: "top"
}),
new OO.ui.FieldLayout(emailInput, {
label: wgULS("您的电子邮箱地址", "您的電子郵箱地址"),
align: "top"
}),
buttonsField, progressBar,
]);
$wrapper.append(fieldset.$element.css({
width: "50%",
"max-width": "50em",
border: "thin solid black",
padding: "2em",
"border-radius": "10px",
"background-color": "#fff"
}));
$body.append($wrapper);
$(cancel.$element).on("click", function () {
if (!cancel.isDisabled()) {
$wrapper.remove();
}
});
$(submit.$element).on("click", function () { return __awaiter(void 0, void 0, void 0, function () {
var primaryType, secondaryType, email, e_1, reason, e_2, details, body_1, _a, _b, _c, e_3;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
primaryType = primaryTypeSelector.getValue();
if (!(primaryType === "placeholder")) return [3 /*break*/, 2];
return [4 /*yield*/, oojsUIAlert(wgULS("您尚未选择主要问题,请重新选择!", "您尚未選擇主要問題,請重新選擇!"))];
case 1: return [2 /*return*/, _d.sent()];
case 2:
secondaryType = secondaryTypeSelector.getValue();
if (!(secondaryType === "placeholder")) return [3 /*break*/, 4];
return [4 /*yield*/, oojsUIAlert(wgULS("您尚未选择细节问题,请重新选择!", "您尚未選擇細節問題,請重新選擇!"))];
case 3: return [2 /*return*/, _d.sent()];
case 4:
email = emailInput.getValue();
_d.label = 5;
case 5:
_d.trys.push([5, 7, , 9]);
return [4 /*yield*/, emailInput.getValidity()];
case 6:
_d.sent();
return [3 /*break*/, 9];
case 7:
e_1 = _d.sent();
console.error("Report [emailValidation]", e_1);
return [4 /*yield*/, oojsUIAlert(wgULS("您输入的电子邮件地址有误,请检查!", "您輸入的電子郵件地址有誤,請檢查!"))];
case 8: return [2 /*return*/, _d.sent()];
case 9:
reason = $("<span>").text(reasonTextarea.getValue()).html();
_d.label = 10;
case 10:
_d.trys.push([10, 12, , 14]);
return [4 /*yield*/, reasonTextarea.getValidity()];
case 11:
_d.sent();
return [3 /*break*/, 14];
case 12:
e_2 = _d.sent();
console.error("Report [reasonValidation]", e_2);
return [4 /*yield*/, oojsUIAlert(wgULS("您输入的理由不足5字节,请检查!", "您輸入的理由不足5位元組,請檢查!"))];
case 13: return [2 /*return*/, _d.sent()];
case 14:
details = [
"".concat(wgULS("反馈页面", "反饋頁面"), "\uFF1A").concat(wgPageName),
"\u4E3B\u8981".concat(wgULS("问题", "問題"), "\uFF1A").concat(primaryType),
];
if (secondaryType !== "none") {
details.push("\u6B21\u8981".concat(wgULS("问题", "問題"), "\uFF1A").concat(secondaryType));
}
details.push("".concat(wgULS("电子邮件", "電子郵件"), "\uFF1A").concat(email), "\u60A8\u7684\u7406\u7531\uFF1A".concat(reason));
return [4 /*yield*/, oojsUIConfirm("".concat(wgULS("请您确认您将要提交的信息", "請您確認您將要提交的資訊"), "\uFF1A<ul><li>").concat(details.join("</li><li>"), "</li></ul>"), "large")];
case 15:
if (!_d.sent()) return [3 /*break*/, 22];
buttonsField.$element.slideUp("fast");
progressBar.$element.slideDown("fast");
body_1 = new URLSearchParams();
Object.entries({
ReportTitle: primaryType,
ReportSubTitle: secondaryType === "none" ? "" : secondaryType,
ReportURL: window.location.href,
ReportOrigin: "moegirlWebZh",
ReportUserName: mw.config.get("wgUserName") || "visitor",
ReportUserID: mw.config.get("wgUserId") || "visitor",
ReportComment: "\u7528\u6237\u53CD\u9988\u5185\u5BB9\uFF1A".concat(reason, "\n-------------\n\u9875\u9762\u4FE1\u606F\uFF1A\n* wgNamespaceNumber: ").concat(wgNamespaceNumber, "\n* wgPageName: ").concat(wgPageName, "\n* wgArticleId: ").concat(wgArticleId, "\n* wgCurRevisionId: ").concat(wgCurRevisionId, "\n* wgRevisionId: ").concat(wgRevisionId),
ReportContact: email
}).forEach(function (_a) {
var k = _a[0], v = _a[1];
return body_1.append(k, v);
});
_d.label = 16;
case 16:
_d.trys.push([16, 20, , 22]);
_b = (_a = console).info;
_c = ["Report [upload]"];
return [4 /*yield*/, fetch("https://api.moegirl.org.cn/report", {
body: body_1.toString(),
method: "POST",
mode: "cors",
credentials: "include"
})];
case 17: return [4 /*yield*/, (_d.sent()).json()];
case 18:
_b.apply(_a, _c.concat([_d.sent()]));
return [4 /*yield*/, oojsUIAlert(wgULS("上传成功!", "上傳成功!"))];
case 19:
_d.sent();
location.reload();
return [3 /*break*/, 22];
case 20:
e_3 = _d.sent();
console.error("Report [upload]", e_3);
return [4 /*yield*/, oojsUIAlert(wgULS("上传失败,请重试!", "上傳失敗,請重試!"))];
case 21:
_d.sent();
buttonsField.$element.slideDown("fast");
progressBar.$element.slideUp("fast");
return [3 /*break*/, 22];
case 22: return [2 /*return*/];
}
});
}); });
return [2 /*return*/];
}
});
}); });
});
// </pre>