User:Irukaza/common.js:修订间差异

H萌娘,万物皆可H的百科全书!
跳到导航 跳到搜索
imported>=海豚=
无编辑摘要
imported>=海豚=
无编辑摘要
(未显示同一用户的7个中间版本)
第1行: 第1行:
/**
* 侧边栏隐藏工具
* 本工具参考自维百的同功能小工具——https://zh.wikipedia.org/wiki/MediaWiki:Gadget-CollapsibleSidebar.js
* 但[[User:AnnAngela]]做了一点改进
* 此处代码已转化为可通过mw检测的格式,源码可在 https://zh.moegirl.org.cn/User:AnnAngela/js/sidebarHidden.js 找到
*/
/* eslint-disable prefer-arrow-callback */
/* eslint-disable prefer-template */
/* eslint-disable comma-dangle */
/* eslint-disable no-var */
/* global $, mw, localforage*/
"use strict";
"use strict";
$(function () {
$(() => (async () => {
    if (mw.config.get("skin") !== "vector" || mw.config.get("wgCanonicalSpecialPageName") === "Blankpage" || getComputedStyle(document.body).direction !== "ltr") {
    await mw.loader.using(["mw.Api", "mediawiki.Uri"]);
      return;
   const groupsKey = ["bureaucrat", "checkuser", "suppress", "sysop", "patroller", "bot", "goodeditor"].reverse();
   }
   const groupsStr = {
   mw.loader.using(["ext.gadget.localforage"]).then(function () {
     bureaucrat: " ",
      var test = localforage.createInstance({
      checkuser: "查",
       name: "AnnTools",
     suppress: "监",
       storeName: "IndexedDB-test",
     sysop: " ",
       driver: [localforage.INDEXEDDB]
      patroller: " ",
     });
     bot: " ",
     return new Promise(function (res) {
     goodeditor: "优",
       var random = Math.random().toString().substring(2);
   };
        var fired = false;
   let cache;
       test.setItem("test", random).then(function () {
   try {
         return test.getItem("test");
     cache = JSON.parse(localStorage.getItem("AnnTools-usergroup"));
        }).then(function (result) {
     if (!$.isPlainObject(cache)
          if (!fired) {
        || typeof cache.timestamp !== "number" || cache.timestamp < new Date().getTime() - 30 * 60 * 1000
            fired = true;
       || !$.isPlainObject(cache.groups)) {
           res(result === random);
       throw new Error();
     } else {
        for (const i of groupsKey) {
          if (!Array.isArray(cache.groups[i])) {
            throw new Error();
          }
          }
       }
     }
   } catch {
     const api = new mw.Api();
     const result = {};
     const eol = Symbol();
     let aufrom = undefined;
     while (aufrom !== eol) {
       const _result = await api.post({
         action: "query",
         list: "allusers",
         augroup: groupsKey.join("|"),
         aulimit: "max",
         auprop: "groups",
         aufrom,
        });
        });
        setTimeout(function () {
        if (_result.continue) {
          if (!fired) {
          aufrom = _result.continue.aufrom;
           fired = true;
       } else {
           res(false);
          aufrom = eol;
          }
        }
        }, 137);
       _result.query.allusers.forEach(({
     });
         name,
   }).then(function (indexedDBCanRun) {
         groups,
     var store = localforage.createInstance({
        }) => {
       name: "AnnTools",
          groups.forEach((group) => {
       storeName: "SidebarHidden",
            if (groupsKey.includes(group)) {
        driver: indexedDBCanRun ? [localforage.INDEXEDDB] : [localforage.LOCALSTORAGE]
             result[group] = result[group] || [];
     });
             if (!result[group].includes(name)) {
     store.getItem("hidden").then(function (_hidden) {
               result[group].push(name);
       var hidden = _hidden;
             }
       var saving = false;
           }
       var generateImageObject = function (svg) {
          });
          return URL.createObjectURL(new Blob([svg], {
            type: "image/svg+xml"
         }));
       };
       var logoPic = "https://www.hmoegirl.com/images/4/4d/H%E8%90%8C%E5%A8%98logo.png";
       var arrowRightSvg = generateImageObject('<svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" enable-background="new 0 0 48 48"><polygon fill="#2196F3" points="17.1,5 14,8.1 29.9,24 14,39.9 17.1,43 36,24"/></svg>');
       var arrowLeftSvg = generateImageObject('<svg version="1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" enable-background="new 0 0 48 48"><polygon fill="#2196F3" points="30.9,43 34,39.9 18.1,24 34,8.1 30.9,5 12,24"/></svg>');
       var $body = $(document.body);
       var $mwNavigation = $("#mw-navigation");
       var $mwWikiLogo = $(".mw-wiki-logo");
       var $logoLink = $mwWikiLogo.clone(false);
       var $logo = $("<img>").attr({
         id: "sidebarHidden-logo",
          src: logoPic
        });
        });
        var $arrow = $("<img>").attr({
     }
         id: "sidebarHidden-arrow",
     cache = {
         src: arrowLeftSvg
        timestamp: new Date().getTime(),
       });
       groups: result,
       $logoLink.empty().removeAttr("class").attr("id", "sidebarHidden-logo-link").append($logo);
     };
        var hide = function () {
   }
         if (saving) {
   localStorage.setItem("AnnTools-usergroup", JSON.stringify(cache));
           return;
   const hook = () => {
         }
     $("a.mw-userlink:not(.markrights)").each((_, ele) => {
          hidden = true;
       ele.classList.add("markrights");
         saving = true;
       const uri = new mw.Uri(ele.href);
         $body.addClass("sidebarHidden");
        let username;
          $arrow.attr("src", arrowRightSvg);
       const path = decodeURI(uri.path);
          store.setItem("hidden", hidden).then(function () {
       if (/^\/User:[^/=%]+/.test(path)) {
           saving = false;
         username = path.match(/^\/User:([^/=%]+)/)[1].replace(/_/g, " ");
       } else if (/^用户:[^/=%]+/.test(uri.query.title)) {
          username = uri.query.title.match(/^User:([^/=%]+)/)[1].replace(/_/g, " ");
       }
       if (username) {
          const self = $(ele);
          groupsKey.forEach((group) => {
           if (cache.groups[group].includes(username)) {
             self.after(`<sup class="markrights-${group}">${groupsStr[group]}<sup>`);
           }
          });
          });
       };
       var show = function () {
         if (saving) {
           return;
         }
         saving = true;
         hidden = false;
         $body.removeClass("sidebarHidden");
         $arrow.attr("src", arrowLeftSvg);
         store.setItem("hidden", hidden).then(function () {
           saving = false;
         });
       };
       $mwNavigation.append($arrow).append($logoLink);
       if (hidden) {
         hide();
        }
        }
       $arrow.on("click", function () {
         (hidden ? show : hide)();
       });
      });
      });
    });
     for (const group of Object.keys(groupsStr)) {
});
       $(`.markrights-${group}`).nextUntil(':not([class*="markrights-"])').filter(`.markrights-${group}`).remove();
     }
   };
   hook();
   mw.hook("wikipage.content").add(hook);
    $(window).on("load", hook);
   $("body").append("<style>.markrights-bureaucrat{color:black}.markrights-checkuser{color:purple}.markrights-suppress{color:purple}.markrights-sysop{color:mediumvioletred}.markrights-patroller{color:sienna}.markrights-bot{color:blue}.markrights-goodeditor{color:green}sup[class^=markrights-]+sup[class^=markrights-]{margin-left:2px}</style>");
})());

2021年3月23日 (二) 21:32的版本

"use strict";
$(() => (async () => {
    await mw.loader.using(["mw.Api", "mediawiki.Uri"]);
    const groupsKey = ["bureaucrat", "checkuser", "suppress", "sysop", "patroller", "bot", "goodeditor"].reverse();
    const groupsStr = {
        bureaucrat: "行",
        checkuser: "查",
        suppress: "监",
        sysop: "管",
        patroller: "巡",
        bot: "机",
        goodeditor: "优",
    };
    let cache;
    try {
        cache = JSON.parse(localStorage.getItem("AnnTools-usergroup"));
        if (!$.isPlainObject(cache)
            || typeof cache.timestamp !== "number" || cache.timestamp < new Date().getTime() - 30 * 60 * 1000
            || !$.isPlainObject(cache.groups)) {
            throw new Error();
        } else {
            for (const i of groupsKey) {
                if (!Array.isArray(cache.groups[i])) {
                    throw new Error();
                }
            }
        }
    } catch {
        const api = new mw.Api();
        const result = {};
        const eol = Symbol();
        let aufrom = undefined;
        while (aufrom !== eol) {
            const _result = await api.post({
                action: "query",
                list: "allusers",
                augroup: groupsKey.join("|"),
                aulimit: "max",
                auprop: "groups",
                aufrom,
            });
            if (_result.continue) {
                aufrom = _result.continue.aufrom;
            } else {
                aufrom = eol;
            }
            _result.query.allusers.forEach(({
                name,
                groups,
            }) => {
                groups.forEach((group) => {
                    if (groupsKey.includes(group)) {
                        result[group] = result[group] || [];
                        if (!result[group].includes(name)) {
                            result[group].push(name);
                        }
                    }
                });
            });
        }
        cache = {
            timestamp: new Date().getTime(),
            groups: result,
        };
    }
    localStorage.setItem("AnnTools-usergroup", JSON.stringify(cache));
    const hook = () => {
        $("a.mw-userlink:not(.markrights)").each((_, ele) => {
            ele.classList.add("markrights");
            const uri = new mw.Uri(ele.href);
            let username;
            const path = decodeURI(uri.path);
            if (/^\/User:[^/=%]+/.test(path)) {
                username = path.match(/^\/User:([^/=%]+)/)[1].replace(/_/g, " ");
            } else if (/^用户:[^/=%]+/.test(uri.query.title)) {
                username = uri.query.title.match(/^User:([^/=%]+)/)[1].replace(/_/g, " ");
            }
            if (username) {
                const self = $(ele);
                groupsKey.forEach((group) => {
                    if (cache.groups[group].includes(username)) {
                        self.after(`<sup class="markrights-${group}">${groupsStr[group]}<sup>`);
                    }
                });
            }
        });
        for (const group of Object.keys(groupsStr)) {
            $(`.markrights-${group}`).nextUntil(':not([class*="markrights-"])').filter(`.markrights-${group}`).remove();
        }
    };
    hook();
    mw.hook("wikipage.content").add(hook);
    $(window).on("load", hook);
    $("body").append("<style>.markrights-bureaucrat{color:black}.markrights-checkuser{color:purple}.markrights-suppress{color:purple}.markrights-sysop{color:mediumvioletred}.markrights-patroller{color:sienna}.markrights-bot{color:blue}.markrights-goodeditor{color:green}sup[class^=markrights-]+sup[class^=markrights-]{margin-left:2px}</style>");
})());