MediaWiki:Gadget-Util.js
外观
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
/**
* SPDX-License-Identifier: GPL-3.0-or-later
* _addText: '{{Gadget Header|license=GPL-3.0-or-later}}'
*
* @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/Util}
* @author 安忆 <i@anyi.in>
* @license GPL-3.0-or-later {@link https://www.qiuwenbaike.cn/wiki/H:GPL-3.0}
*/
/**
* Copyright (C) 安忆
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
* +------------------------------------------------------------+
* | === WARNING: GLOBAL GADGET FILE === |
* +------------------------------------------------------------+
* | All changes should be made in the repository, |
* | otherwise they will be lost. |
* +------------------------------------------------------------+
* | Changes to this page may affect many users. |
* | Please discuss changes by opening an issue before editing. |
* +------------------------------------------------------------+
*/
/* <nowiki> */
(() => {
"use strict";
// dist/Util/Util.js
function asyncGeneratorStep(n, t, e, r, o, a, c) {
try {
var i = n[a](c), u = i.value;
} catch (n2) {
return void e(n2);
}
i.done ? t(u) : Promise.resolve(u).then(r, o);
}
function _asyncToGenerator(n) {
return function() {
var t = this, e = arguments;
return new Promise(function(r, o) {
var a = n.apply(t, e);
function _next(n2) {
asyncGeneratorStep(a, r, o, _next, _throw, "next", n2);
}
function _throw(n2) {
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n2);
}
_next(void 0);
});
};
}
function _createForOfIteratorHelper(r, e) {
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
if (!t) {
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
t && (r = t);
var n = 0, F = function() {
};
return { s: F, n: function() {
return n >= r.length ? { done: true } : { done: false, value: r[n++] };
}, e: function(r2) {
throw r2;
}, f: F };
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var o, a = true, u = false;
return { s: function() {
t = t.call(r);
}, n: function() {
var r2 = t.next();
return a = r2.done, r2;
}, e: function(r2) {
u = true, o = r2;
}, f: function() {
try {
a || null == t.return || t.return();
} finally {
if (u) throw o;
}
} };
}
function _unsupportedIterableToArray(r, a) {
if (r) {
if ("string" == typeof r) return _arrayLikeToArray(r, a);
var t = {}.toString.call(r).slice(8, -1);
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
}
}
function _arrayLikeToArray(r, a) {
(null == a || a > r.length) && (a = r.length);
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
return n;
}
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all) __defProp(target, name, {
get: all[name],
enumerable: true
});
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
var _iterator = _createForOfIteratorHelper(__getOwnPropNames(from)), _step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done; ) {
let key = _step.value;
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", {
value: true
}), mod);
//! src/Util/Util.ts
var Util_exports = {};
__export(Util_exports, {
MwUri: () => MwUri,
addEventListenerWithRemover: () => addEventListenerWithRemover,
changeOpacityWhenMouseEnterOrLeave: () => changeOpacityWhenMouseEnterOrLeave,
checkA11yConfirmKey: () => checkA11yConfirmKey,
checkDependencies: () => checkDependencies,
delay: () => delay,
findVariants: () => findVariants,
generateArray: () => generateArray,
generateSvgDataUrl: () => generateSvgDataUrl,
getBody: () => getBody,
getWpSummaryContent: () => getWpSummaryContent,
getWpTextbox1Content: () => getWpTextbox1Content,
initMwApi: () => initMwApi,
isValidKey: () => isValidKey,
oouiConfirmWithStyle: () => oouiConfirmWithStyle,
queryGlobalUserGroups: () => queryGlobalUserGroups,
queryUserGroups: () => queryUserGroups,
scrollTop: () => scrollTop,
setWpSummaryContent: () => setWpSummaryContent,
setWpTextbox1Content: () => setWpTextbox1Content,
uniqueArray: () => uniqueArray,
userIsInGroup: () => userIsInGroup
});
module.exports = __toCommonJS(Util_exports);
//! src/Util/modules/addEventListenerWithRemover.ts
var addEventListenerWithRemover = ({
target,
type,
listener,
options = {}
}) => {
target.addEventListener(type, listener, options);
return {
remove: () => {
target.removeEventListener(type, listener, options);
}
};
};
//! src/Util/modules/changeOpacityWhenMouseEnterOrLeave.ts
var changeOpacityWhenMouseEnterOrLeave = (event, opacity = 0.7) => {
event.currentTarget.style.opacity = event.type === "mouseenter" ? "1" : opacity.toString();
};
//! src/Util/modules/checkA11yConfirmKey.ts
var checkA11yConfirmKey = (event) => {
if (["click", "keydown"].includes(event.type)) {
if (event.type === "keydown") {
return ["Enter", " "].includes(event.key);
}
return true;
}
return false;
};
//! src/Util/modules/generateArray.ts
function generateArray(...args) {
return args.flatMap((arg) => {
if (Array.isArray(arg)) {
return arg;
}
if (arg instanceof NodeList) {
return [...arg];
}
return [arg];
});
}
//! src/Util/modules/initMwApi.ts
function initMwApi(userAgent, apiUri) {
const apiOptions = {
ajax: {
headers: {
"Api-User-Agent": userAgent ? "Qiuwen/1.1 (".concat(userAgent, ")") : "Qiuwen/1.1"
}
}
};
if (apiUri) {
return new mw.ForeignApi(apiUri, apiOptions);
}
return new mw.Api(apiOptions);
}
//! src/Util/modules/uniqueArray.ts
var uniqueArray = function uniqueArray2(args) {
/**!
* SPDX-License-Identifier: CC-BY-SA-4.0
*
* @source {@link https://stackoverflow.com/questions/9229645/remove-duplicate-values-from-js-array/922982}
* @license CC-BY-SA-4.0
*/
const result = [];
var _iterator2 = _createForOfIteratorHelper(args), _step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done; ) {
const item = _step2.value;
if (!result.includes(item)) {
result[result.length] = item;
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
return result;
};
//! src/Util/modules/checkDependencies.ts
function checkDependencies(_x, _x2) {
return _checkDependencies.apply(this, arguments);
}
//! src/Util/modules/delay.ts
function _checkDependencies() {
_checkDependencies = _asyncToGenerator(function* (gadgetNames, option) {
const api = initMwApi("Util-CheckDependencies");
const gadgets = uniqueArray(generateArray(gadgetNames));
option || (option = 1);
var _iterator3 = _createForOfIteratorHelper(gadgets), _step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done; ) {
const gadget = _step3.value;
if (option === "0" && mw.user.options.get("gadget-".concat(gadget)) || option === "1" && !mw.user.options.get("gadget-".concat(gadget))) {
yield api.postWithEditToken({
action: "options",
change: "gadget-".concat(gadget, "=").concat(option)
});
yield mw.loader.using("ext.gadget.".concat(gadget));
}
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
});
return _checkDependencies.apply(this, arguments);
}
var delay = (ms) => {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
};
//! src/Util/modules/findVariants.ts
function findVariants(_x3) {
return _findVariants.apply(this, arguments);
}
//! src/Util/modules/generateSvgDataUrl.ts
function _findVariants() {
_findVariants = _asyncToGenerator(function* (text) {
const api = initMwApi("Util-FindVariants");
const VARIANTS = ["zh-hans", "zh-hant", "zh-cn", "zh-hk", "zh-mo", "zh-sg", "zh-my", "zh-tw"];
const allVariants = [];
const params = {
action: "parse",
contentmodel: "wikitext",
format: "json",
formatversion: "2",
prop: ["displaytitle"],
title: "temp",
text
};
for (var _i2 = 0, _VARIANTS = VARIANTS; _i2 < _VARIANTS.length; _i2++) {
var _response$query;
const variant = _VARIANTS[_i2];
params.uselang = variant;
params.variant = variant;
const response = yield api.post(params);
const displaytitle = response === null || response === void 0 || (_response$query = response["query"]) === null || _response$query === void 0 ? void 0 : _response$query.displaytitle;
const variantElement = document.createElement("variant");
variantElement.innerHTML = displaytitle;
if (variantElement.textContent) {
allVariants[allVariants.length] = variantElement.textContent;
}
}
return uniqueArray(allVariants);
});
return _findVariants.apply(this, arguments);
}
var generateSvgDataUrl = (svg) => {
/**!
* SPDX-License-Identifier: MIT
*
* @source svg-to-data-uri.js {@link https://github.com/heyallan/svg-to-data-uri/}
* @author Allan Moreno
* @license MIT {@link https://github.com/heyallan/svg-to-data-uri/blob/master/LICENSE}
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
svg = svg.trim();
svg = svg.slice(svg.indexOf("<svg"));
if (!svg.startsWith("<svg") || !svg.endsWith("svg>")) {
return "";
}
if (!svg.includes("http://www.w3.org/2000/svg")) {
svg = svg.replace(/<svg/g, "<svg xmlns='http://www.w3.org/2000/svg'");
}
svg = svg.replace(/<!--.{1,}-->/g, "");
svg = svg.replace(/version=["'](.{0,}?)["'](?=[\s>])/g, "");
svg = svg.replace(/"'(.{1,})'"/g, "'$1'");
svg = svg.replace(/"/g, "'");
svg = svg.replace(/>\s{1,}</g, "><");
svg = svg.replace(/\s{2,}/g, " ");
svg = svg.trim();
if (!svg.startsWith("<svg") || !svg.endsWith("svg>")) {
return "";
}
svg = svg.replace(/&/g, "&");
svg = svg.replace(/[%#<>?[\\\]^`{|}]/g, encodeURIComponent);
svg = "data:image/svg+xml,".concat(svg);
return svg;
};
//! src/Util/modules/getBody.ts
var getBody = () => {
return $.ready.then(() => {
const $body = $("body");
return $body;
});
};
//! src/Util/modules/isValidKey.ts
var isValidKey = (object, key) => {
return key in object;
};
//! src/Util/modules/mwUri.ts
var MwUri = class extends URL {
extend(object) {
for (var _i = 0, _Object$entries = Object.entries(object); _i < _Object$entries.length; _i++) {
const [key, value] = _Object$entries[_i];
this.searchParams.set(key, value);
}
return this;
}
getRelativePath() {
return this.pathname + this.search + this.hash;
}
};
//! src/Util/modules/oouiConfirmWithStyle.tsx
var import_ext_gadget = __toESM(require("ext.gadget.JSX"), 1);
var oouiConfirmWithStyle = (message) => OO.ui.confirm($(/* @__PURE__ */ import_ext_gadget.default.createElement("div", {
className: "oo-ui-window-foot",
style: {
border: ".1rem solid #0645ad",
display: "flex",
justifyContent: "space-evenly"
}
}, /* @__PURE__ */ import_ext_gadget.default.createElement("span", {
style: {
fontSize: "1.2rem",
fontWeight: "500",
lineHeight: "1.8",
padding: ".4em 0"
}
}, message)))).then((isConfirm) => isConfirm);
//! src/Util/modules/queryGlobalUserGroups.ts
function queryGlobalUserGroups(_x4) {
return _queryGlobalUserGroups.apply(this, arguments);
}
//! src/Util/modules/queryUserGroups.ts
function _queryGlobalUserGroups() {
_queryGlobalUserGroups = _asyncToGenerator(function* (guiuser) {
const api = initMwApi("Util-QueryGlobalUserGroups");
const CACHE_KEY_PREFIX = "ext.gadget.Util_queryGlobalUserGroups-";
let groups = [];
if (mw.storage.getObject(CACHE_KEY_PREFIX + guiuser)) {
groups = mw.storage.getObject(CACHE_KEY_PREFIX + guiuser);
groups = groups.filter((element) => {
return element !== "*";
});
} else {
const params = {
action: "query",
format: "json",
formatversion: "2",
meta: "globaluserinfo",
guiuser,
guiprop: "groups",
smaxage: 600,
maxage: 600
};
const response = yield api.get(params);
const query = response["query"];
if (query !== null && query !== void 0 && query.globaluserinfo) {
var _query$globaluserinfo, _query$globaluserinfo2;
groups = (_query$globaluserinfo = (_query$globaluserinfo2 = query.globaluserinfo) === null || _query$globaluserinfo2 === void 0 ? void 0 : _query$globaluserinfo2.groups) !== null && _query$globaluserinfo !== void 0 ? _query$globaluserinfo : [];
groups = groups.filter((element) => {
return element !== "*";
});
mw.storage.setObject(CACHE_KEY_PREFIX + guiuser, groups, 60 * 60);
}
}
return {
query: {
globaluserinfo: {
name: guiuser,
groups
}
}
};
});
return _queryGlobalUserGroups.apply(this, arguments);
}
function queryUserGroups(_x5) {
return _queryUserGroups.apply(this, arguments);
}
//! src/Util/modules/scrollTop.ts
function _queryUserGroups() {
_queryUserGroups = _asyncToGenerator(function* (users) {
var _query$users;
const api = initMwApi("Util-QueryUserGroups");
const CACHE_KEY_PREFIX = "ext.gadget.Util_queryUserGroups-";
const cachedQueryUsers = [];
var _iterator4 = _createForOfIteratorHelper(users), _step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done; ) {
const user = _step4.value;
if (mw.storage.getObject(CACHE_KEY_PREFIX + user)) {
let groups = mw.storage.getObject(CACHE_KEY_PREFIX + user);
groups = groups.filter((element) => {
return element !== "*";
});
cachedQueryUsers[cachedQueryUsers.length] = {
name: user,
groups
};
}
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
const ususers = users.filter((v) => {
return !mw.storage.getObject(CACHE_KEY_PREFIX + v);
});
const params = {
ususers,
action: "query",
format: "json",
formatversion: "2",
list: "users",
usprop: "groups",
smaxage: 600,
maxage: 600
};
const response = yield api.get(params);
const query = response["query"];
const queryUsers = [...(_query$users = query === null || query === void 0 ? void 0 : query.users) !== null && _query$users !== void 0 ? _query$users : [], ...cachedQueryUsers];
for (var _i3 = 0, _queryUsers = queryUsers; _i3 < _queryUsers.length; _i3++) {
const user = _queryUsers[_i3];
if (user !== null && user !== void 0 && user.groups && user !== null && user !== void 0 && user.name) {
let {
groups
} = user;
groups = groups.filter((element) => {
return element !== "*";
});
mw.storage.setObject(CACHE_KEY_PREFIX + user.name, groups, 60 * 60);
}
}
return {
query: {
users: queryUsers
}
};
});
return _queryUserGroups.apply(this, arguments);
}
var scrollTop = (targetHeight, effectsOptionsOrDuration = {}) => {
const options = typeof effectsOptionsOrDuration === "number" || typeof effectsOptionsOrDuration === "string" ? {
duration: effectsOptionsOrDuration,
easing: "linear"
} : {
duration: "slow",
easing: "linear",
...effectsOptionsOrDuration
};
$(document).find("html, body").animate({
scrollTop: targetHeight
}, options);
};
//! src/Util/modules/userIsInGroup.ts
var userIsInGroup = (groups) => {
const {
wgUserGroups,
wgGlobalGroups
} = mw.config.get();
return [...wgUserGroups || [], ...wgGlobalGroups || []].some((element) => {
return generateArray(groups).includes(element);
});
};
//! src/Util/modules/wpSummaryContent.ts
var getWpSummaryContent = ({
$editForm
}) => {
var _$editForm$find$val, _$editForm$find;
return (_$editForm$find$val = (_$editForm$find = $editForm.find("#wpSummary")) === null || _$editForm$find === void 0 ? void 0 : _$editForm$find.val()) !== null && _$editForm$find$val !== void 0 ? _$editForm$find$val : "";
};
var setWpSummaryContent = ({
$editForm,
content
}) => {
$editForm.find("#wpSummary").val(content);
};
//! src/Util/modules/wpTextbox1Content.ts
var getWpTextbox1Content = ({
$editForm
}) => {
var _$editForm$find$textS;
return (_$editForm$find$textS = $editForm.find("#wpTextbox1").textSelection("getContents")) !== null && _$editForm$find$textS !== void 0 ? _$editForm$find$textS : "";
};
var setWpTextbox1Content = ({
$editForm,
content
}) => {
$editForm.find("#wpTextbox1").textSelection("setContents", content);
};
})();
/* </nowiki> */