跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
分类索引
最近更改
随机页面
灵兰秘典
帮助
帮助
联系我们
捐助本站
关于本站
MediaWiki帮助
中医百科
搜索
搜索
外观
登录
个人工具
登录
查看“︁MediaWiki:Gadget-AdvancedSiteNotices.js”︁的源代码
系统消息
讨论
English
阅读
查看源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
查看源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
Cargo数据
外观
移至侧栏
隐藏
←
MediaWiki:Gadget-AdvancedSiteNotices.js
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
此页面为本wiki上的软件提供界面文本,并受到保护以防止滥用。如欲修改所有wiki的翻译,请访问
translatewiki.net
上的MediaWiki本地化项目。
您无权编辑此JavaScript页面,因为编辑此页面可能会影响所有访问者。
您可以查看和复制此页面的源代码。
/** * SPDX-License-Identifier: CC-BY-SA-4.0 * _addText: '{{Gadget Header|license=CC-BY-SA-4.0}}' * * @base {@link https://zh.wikipedia.org/wiki/MediaWiki:Gadget-AdvancedSiteNotices.js} * @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/AdvancedSiteNotices} * @license CC-BY-SA-4.0 {@link https://www.qiuwenbaike.cn/wiki/H:CC-BY-SA-4.0} */ /** * +------------------------------------------------------------+ * | === 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"; var __getOwnPropNames = Object.getOwnPropertyNames; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; // node_modules/.pnpm/broadcastchannel-polyfill@1.0.1/node_modules/broadcastchannel-polyfill/index.js var require_broadcastchannel_polyfill = __commonJS({ "node_modules/.pnpm/broadcastchannel-polyfill@1.0.1/node_modules/broadcastchannel-polyfill/index.js"() { (function(global) { var channels = []; function BroadcastChannel2(channel) { var $this = this; channel = String(channel); var id = "$BroadcastChannel$" + channel + "$"; channels[id] = channels[id] || []; channels[id].push(this); this._name = channel; this._id = id; this._closed = false; this._mc = new MessageChannel(); this._mc.port1.start(); this._mc.port2.start(); global.addEventListener("storage", function(e) { if (e.storageArea !== global.localStorage) return; if (e.newValue == null || e.newValue === "") return; if (e.key.substring(0, id.length) !== id) return; var data = JSON.parse(e.newValue); $this._mc.port2.postMessage(data); }); } BroadcastChannel2.prototype = { // BroadcastChannel API get name() { return this._name; }, postMessage: function(message) { var $this = this; if (this._closed) { var e = new Error(); e.name = "InvalidStateError"; throw e; } var value = JSON.stringify(message); var key = this._id + String(Date.now()) + "$" + String(Math.random()); global.localStorage.setItem(key, value); setTimeout(function() { global.localStorage.removeItem(key); }, 500); channels[this._id].forEach(function(bc) { if (bc === $this) return; bc._mc.port2.postMessage(JSON.parse(value)); }); }, close: function() { if (this._closed) return; this._closed = true; this._mc.port1.close(); this._mc.port2.close(); var index = channels[this._id].indexOf(this); channels[this._id].splice(index, 1); }, // EventTarget API get onmessage() { return this._mc.port1.onmessage; }, set onmessage(value) { this._mc.port1.onmessage = value; }, addEventListener: function() { return this._mc.port1.addEventListener.apply(this._mc.port1, arguments); }, removeEventListener: function() { return this._mc.port1.removeEventListener.apply(this._mc.port1, arguments); }, dispatchEvent: function() { return this._mc.port1.dispatchEvent.apply(this._mc.port1, arguments); } }; global.BroadcastChannel = global.BroadcastChannel || BroadcastChannel2; })(self); } }); // dist/AdvancedSiteNotices/AdvancedSiteNotices.js require_broadcastchannel_polyfill(); 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 __getOwnPropNames2 = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { var _iterator = _createForOfIteratorHelper(__getOwnPropNames2(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 )); //! src/AdvancedSiteNotices/options.json var ajaxPageTitle = "Template:AdvancedSiteNotices/ajax"; var mountPointSelector = "#siteNotice"; var storageKey = "ext.gadget.AdvancedSiteNotices_dismissASN"; var cacheKey = "ext.gadget.AdvancedSiteNotices_cache"; var version = "4.0"; //! src/AdvancedSiteNotices/AdvancedSiteNotices.ts var import_ext_gadget7 = require("ext.gadget.Util"); //! src/AdvancedSiteNotices/modules/api.ts var import_ext_gadget = require("ext.gadget.Util"); var api = (0, import_ext_gadget.initMwApi)("AdvancedSiteNotices/".concat(version)); //! src/AdvancedSiteNotices/modules/util/queryApi.ts var { wgUserLanguage } = mw.config.get(); var parameters = { action: "parse", format: "json", formatversion: "2", prop: "text", page: ajaxPageTitle, uselang: wgUserLanguage, variant: wgUserLanguage, smaxage: 600, maxage: 600 }; var queryApi = /* @__PURE__ */ (function() { var _ref = _asyncToGenerator(function* () { try { let response; if (mw.storage.getObject(cacheKey)) { response = mw.storage.getObject(cacheKey); } else { response = yield api.get(parameters); mw.storage.setObject(cacheKey, response, 60 * 10); } return response; } catch (error) { console.error("[AdvancedSiteNotices] Ajax error:", error); return {}; } }); return function queryApi2() { return _ref.apply(this, arguments); }; })(); //! src/AdvancedSiteNotices/modules/loadRemoteNotices.tsx var import_ext_gadget2 = __toESM(require("ext.gadget.JSX"), 1); var loadRemoteNotices = /* @__PURE__ */ (function() { var _ref2 = _asyncToGenerator(function* () { const response = yield queryApi(); const responseParse = response["parse"]; if (!(responseParse !== null && responseParse !== void 0 && responseParse.text)) { return {}; } const remoteNotice = (/* @__PURE__ */ import_ext_gadget2.default.createElement("div", { innerHTML: responseParse.text })).querySelector("ul.sitents"); if (!remoteNotice) { return {}; } const $remoteNotices = $(remoteNotice); const $notices2 = $remoteNotices.find("li"); const remoteNoticesVersion = $remoteNotices.data("asn-version").toString(); return { $notices: $notices2, version: remoteNoticesVersion }; }); return function loadRemoteNotices2() { return _ref2.apply(this, arguments); }; })(); //! src/AdvancedSiteNotices/modules/constant.ts var CLASS_NAME = "gadget-advanced_site_notices"; var CLASS_NAME_DISMISS = "".concat(CLASS_NAME, "__dismiss"); var CLASS_NAME_NOTICE = "".concat(CLASS_NAME, "__notice"); var CLASS_NAME_NOTICE_CONTENT = "".concat(CLASS_NAME_NOTICE, "__content"); var CLASS_NAME_TITLE = "".concat(CLASS_NAME, "__title"); //! src/AdvancedSiteNotices/modules/showNotice.tsx var import_ext_gadget5 = __toESM(require("ext.gadget.JSX"), 1); //! src/AdvancedSiteNotices/modules/util/generateArea.tsx var import_ext_gadget4 = __toESM(require("ext.gadget.JSX"), 1); //! src/AdvancedSiteNotices/modules/i18n.ts var import_ext_gadget3 = require("ext.gadget.i18n"); var getI18nMessages = () => { return { Dismiss: (0, import_ext_gadget3.localize)({ en: "Turn off this notice", ja: "ASNをオフにする", "zh-hans": "关闭公告", "zh-hant": "關閉公告" }), DismissNotice: (0, import_ext_gadget3.localize)({ en: "You have chosen to turn off Advanced Site Notices for the next 30 days. <br>If the site-wide announcement is not updated within the next 30 days, it will no longer be displayed; however, if the site-wide announcement is updated, it will be displayed again.", ja: "今後30日間、ASNをオフにすることを選択しました。<br>サイト全体の通知が今後30日以内に更新されない場合、表示されなくなります。ただし、サイト全体の通知が更新される場合は、再び表示されます。", "zh-hans": "您已选择在接下来30日内关闭“高级站点通告”。<br>若接下来30日内全站公告未有更新,则不再显示;但是,若全站公告内容更新,则将重新显示。", "zh-hant": "您已選擇在接下來30日內關閉「高級站點通告」。<br>若接下來30日內全站公告未有更新,則不再顯示;但是,若全站公告內容更新,則將重新顯示。" }), Title: (0, import_ext_gadget3.localize)({ en: "Announcement", ja: "通知", zh: "公告" }) }; }; var i18nMessages = getI18nMessages(); var getMessage = (key) => { return i18nMessages[key] || key; }; //! src/AdvancedSiteNotices/modules/util/generateArea.tsx var generateArea = () => { const area = /* @__PURE__ */ import_ext_gadget4.default.createElement("div", { className: [CLASS_NAME, "noprint"] }, /* @__PURE__ */ import_ext_gadget4.default.createElement("div", { className: CLASS_NAME_TITLE }, getMessage("Title")), /* @__PURE__ */ import_ext_gadget4.default.createElement("div", { className: CLASS_NAME_NOTICE }, /* @__PURE__ */ import_ext_gadget4.default.createElement("div", { className: [CLASS_NAME_NOTICE_CONTENT, "center"] })), /* @__PURE__ */ import_ext_gadget4.default.createElement("div", { className: CLASS_NAME_DISMISS }, /* @__PURE__ */ import_ext_gadget4.default.createElement("a", { role: "button", "aria-label": getMessage("Dismiss") }))); return $(area); }; //! src/AdvancedSiteNotices/modules/util/matchCriteria.ts var { wgUserGroups, wgGlobalGroups, wgUserLanguage: wgUserLanguage2 } = mw.config.get(); var in_group = (group) => { return !!(wgUserGroups !== null && wgUserGroups !== void 0 && wgUserGroups.includes(group) || wgGlobalGroups !== null && wgGlobalGroups !== void 0 && wgGlobalGroups.includes(group)); }; var only_for = (userLanguage) => { return userLanguage === wgUserLanguage2; }; var matchCriteria = ($notice) => { var _$notice$data; const cache = $notice.data("asn-cache"); if (cache !== void 0) { return cache; } const testCriteria = (criteria) => { try { return window.eval(criteria); } catch { return false; } }; let result = false; const criteriaData = ((_$notice$data = $notice.data("asn-criteria")) !== null && _$notice$data !== void 0 ? _$notice$data : "").trim(); if (criteriaData) { try { result = testCriteria(decodeURIComponent(criteriaData.replace(/\+/g, "%20"))); } catch { result = true; } } else if ($notice.attr("class")) { let criteria; if ($notice.hasClass("only_sysop")) { criteria || (criteria = in_group("sysop")); } if ($notice.hasClass("only_logged")) { criteria || (criteria = in_group("user")); } if ($notice.hasClass("only_anon")) { criteria || (criteria = !in_group("user")); } if ($notice.hasClass("only_zh_cn")) { criteria || (criteria = only_for("zh-cn")); } if ($notice.hasClass("only_zh_sg")) { criteria || (criteria = only_for("zh-sg")); } if ($notice.hasClass("only_zh_my")) { criteria || (criteria = only_for("zh-my")); } if ($notice.hasClass("only_zh_hk")) { criteria || (criteria = only_for("zh-hk")); } if ($notice.hasClass("only_zh_mo")) { criteria || (criteria = only_for("zh-mo")); } if ($notice.hasClass("only_zh_tw")) { criteria || (criteria = only_for("zh-tw")); } if (criteria === void 0) { criteria = true; } result = criteria; } else { result = true; } $notice.data("asn-cache", result); return result; }; //! src/AdvancedSiteNotices/modules/showNotice.tsx var import_ext_gadget6 = require("ext.gadget.Tippy"); var broadcastChannel = new BroadcastChannel(storageKey); var currentVersion = "0"; var localVersion = mw.storage.get(storageKey); var timer; var $area = generateArea(); var $currentNotice = $area.find(".".concat(CLASS_NAME_NOTICE_CONTENT)); var $dismiss = $area.find(".".concat(CLASS_NAME_DISMISS)).find("a"); var closeNotices = () => { broadcastChannel.postMessage("close"); broadcastChannel.close(); clearTimeout(timer); $area.remove(); mw.storage.set(storageKey, currentVersion, 60 * 60 * 24 * 30); }; broadcastChannel.addEventListener("message", closeNotices); $dismiss.on("click", () => { closeNotices(); void mw.notify($(/* @__PURE__ */ import_ext_gadget5.default.createElement("span", { innerHTML: getMessage("DismissNotice") })), { tag: "AdvancedSiteNotices" }); }); (0, import_ext_gadget6.tippy)($dismiss.get(0), { arrow: true, content: $dismiss.attr("aria-label"), placement: "bottom" }); var $notices; var noticeStyles = []; var showNotices = ($mountPoint, index, remoteNotices) => { var _remoteNotices$versio; currentVersion = (_remoteNotices$versio = remoteNotices === null || remoteNotices === void 0 ? void 0 : remoteNotices.version) !== null && _remoteNotices$versio !== void 0 ? _remoteNotices$versio : currentVersion; if (currentVersion === localVersion) { return; } if (remoteNotices !== null && remoteNotices !== void 0 && remoteNotices.$notices) { ({ $notices } = remoteNotices); } const noticesLength = $notices.length; const nextNoticeIndex = (index + 1) % noticesLength; let $notice = $(); let i = 0; while (i++ < noticesLength) { $notice = $notices.eq(index); if (!matchCriteria($notice)) { showNotices($mountPoint, nextNoticeIndex); return; } index = index++ % noticesLength; } if (typeof $notice.data("asn-html") === "string") { $notice.data("asn-html-raw", decodeURIComponent($notice.data("asn-html").replace(/\+/g, "%20"))); $notice.data("asn-html", null); } if (typeof $notice.data("asn-style") === "string") { $notice.data("asn-style-id", noticeStyles.length); const style = mw.loader.addStyleTag(decodeURIComponent($notice.data("asn-style").replace(/\+/g, "%20"))); style.disabled = true; noticeStyles[noticeStyles.length] = style; $notice.data("asn-style", null); } const noticeHtml = $notice.data("asn-html-raw") || $notice.html(); const noticeStyleId = $notice.data("asn-style-id"); const currentNoticeHtml = $currentNotice.html(); if (currentNoticeHtml && currentNoticeHtml !== noticeHtml) { $currentNotice.stop().fadeOut(() => { for (var _i = 0, _noticeStyles = noticeStyles; _i < _noticeStyles.length; _i++) { const style = _noticeStyles[_i]; style.disabled = true; } const noticeStyle = noticeStyles[noticeStyleId]; if (noticeStyle) { noticeStyle.disabled = false; } $currentNotice.html(noticeHtml); try { $currentNotice.fadeIn(); } catch { } }); } else if (!currentNoticeHtml) { $mountPoint.append($area); const noticeStyle = noticeStyles[noticeStyleId]; if (noticeStyle) { noticeStyle.disabled = false; } $currentNotice.html(noticeHtml).fadeIn(); } timer = setTimeout(() => { showNotices($mountPoint, nextNoticeIndex); }, 7 * 1e3); }; //! src/AdvancedSiteNotices/AdvancedSiteNotices.ts (function() { var _advancedSiteNotices = _asyncToGenerator(function* () { var _remoteNotices$$notic; const $body = yield (0, import_ext_gadget7.getBody)(); const $mountPoint = $body.find(mountPointSelector); if (!$mountPoint.length) { return; } const remoteNotices = yield loadRemoteNotices(); if (!((_remoteNotices$$notic = remoteNotices.$notices) !== null && _remoteNotices$$notic !== void 0 && _remoteNotices$$notic.length)) { return; } const randomIndex = Math.floor(Math.random() * remoteNotices.$notices.length); showNotices($mountPoint, randomIndex, remoteNotices); }); function advancedSiteNotices() { return _advancedSiteNotices.apply(this, arguments); } return advancedSiteNotices; })()(); })(); /* </nowiki> */
该页面使用的模板:
Template:Gadget Header
(
查看源代码
)
返回
MediaWiki:Gadget-AdvancedSiteNotices.js
。