跳转到内容

Wiki维护已结束,Wiki现在已升级到1.46.0。
如果您希望恢复使用旧版本的外观设置,请在Special:Preferences#mw-prefsection-rendering-skin处选择Timeless。

MediaWiki:Gadget-blueUser.js

来自ThunionWiki

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
  • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
mw.loader.using([
  'mediawiki.api',
  'mediawiki.util',
  'mediawiki.Title'
]).then(function () {
  var blueUsers = [];
  var missingUsers = [];

  if (mw.config.get('wgUserName')) {
    blueUsers.push(mw.util.wikiUrlencode(mw.config.get('wgUserName')));
  }

  var api = new mw.Api({
    parameters: {
      action: 'query',
      list: 'users',
      formatversion: 2
    },
    userAgent: 'Gadget-blueUsers'
  });
  
  function getLinkTitle(link) {
    var title = mw.util.getParamValue('title', link.href);
    if (title) return title;

    var pathname = decodeURIComponent(link.pathname);
    var articlePath = mw.config.get('wgArticlePath');
    var prefix = articlePath.split('$1')[0];

    if (prefix && pathname.toLowerCase().startsWith(prefix.toLowerCase())) {
      return pathname.slice(prefix.length);
    }

    return '';
  }

  function getUserTitle(link) {
    var rawTitle = getLinkTitle(link);
    if (!rawTitle) return null;

    var title = mw.Title.newFromText(rawTitle);
    if (!title || title.getNamespaceId() !== 2) return null;

    return title;
  }

  mw.hook('wikipage.content').add(makeUsersBlue);
  makeUsersBlue($('a.new').not('#mw-content-text a.new').parent());

  function makeUsersBlue($content) {
    var users = [];

    var userlinks = $content.find('a.new').filter(function () {
      return getUserTitle(this) !== null;
    }).each(function () {
      var title = getUserTitle(this);
      if (!title) return;

      var username = title.getMainText();
      var encodedUsername = mw.util.wikiUrlencode(username);

      if (missingUsers.includes(encodedUsername)) return;

      if (blueUsers.includes(encodedUsername)) {
        this.classList.remove('new');
        this.classList.add('mw-newuserlink');
        return;
      }

      if (users.includes(username) || username.includes('/')) return;
      users.push(username);
    });

    if (!users.length) return;

    var apiRequests = [];

    while (users.length) {
      apiRequests.push(
        api.get({
          ususers: users.splice(0, 50)
        }).then(function (data) {
          data.query.users.forEach(function (user) {
            if (user.missing || user.invalid) {
              missingUsers.push(mw.util.wikiUrlencode(user.name));
              return;
            }
            blueUsers.push(mw.util.wikiUrlencode(user.name));
          });
        })
      );
    }

    Promise.all(apiRequests).then(function () {
      userlinks.each(function () {
        var title = getUserTitle(this);
        if (!title) return;

        var username = title.getMainText();
        var encodedUsername = mw.util.wikiUrlencode(username);

        if (!blueUsers.includes(encodedUsername)) return;

        this.classList.remove('new');
        this.classList.add('mw-newuserlink');
      });
    });
  }
});