MediaWiki:Common.js

提供: 小樽のじかん事典
2026年1月8日 (木) 08:54時点における管理人 (トーク | 投稿記録)による版

注意: 保存後、変更を確認するにはブラウザーのキャッシュを消去する必要がある場合があります。

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Microsoft Edge: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください。
/**
 * MediaWiki 1.44.3 アカウント作成画面 無限ループ防止版
 * 既に書き換え済みの場合は処理をスキップするように修正しました。
 */
(function() {
    var enforce = function() {
        if (mw.config.get('wgCanonicalSpecialPageName') !== 'CreateAccount') return;

        // 1. メールアドレスの書き換え
        var labels = document.getElementsByTagName('label');
        for (var i = 0; i < labels.length; i++) {
            var label = labels[i];
            // 「(省略可能)」が含まれている場合のみ書き換える(無限ループ防止)
            if (label.getAttribute('for') === 'wpEmail' || label.innerHTML.indexOf('メールアドレス') !== -1) {
                if (label.innerHTML.indexOf('(省略可能)') !== -1) {
                    label.innerHTML = 'メールアドレス';
                }
            }
            // 本名の書き換え
            if (label.getAttribute('for') === 'wpRealName' || label.innerHTML.indexOf('HN') !== -1) {
                if (label.innerHTML.indexOf('(省略可能)') !== -1) {
                    label.innerHTML = 'HN(省略可能)';
                }
            }
        }

        // 2. 必須属性の付与
        var emailInput = document.getElementById('wpEmail');
        if (emailInput && !emailInput.required) {
            emailInput.required = true;
            emailInput.setAttribute('required', 'required');
        }
    };

    if (mw.config.get('wgCanonicalSpecialPageName') === 'CreateAccount') {
        // 初回実行
        enforce();

        // 監視対象を限定し、無限ループを回避
        var observer = new MutationObserver(function(mutations) {
            for (var i = 0; i < mutations.length; i++) {
                if (mutations[i].addedNodes.length > 0) {
                    enforce();
                    break;
                }
            }
        });

        var target = document.getElementById('mw-content-text');
        if (target) {
            observer.observe(target, {childList: true, subtree: true});
        }
    }
})();

(function () {
  window.RLQ = window.RLQ || [];
  window.RLQ.push(function () {
    var TEXT_SORT = '日付順に並べ替え';
    var TEXT_AUTO = 'コメントの自動更新を有効化';

    function trim(s) {
      return (s || '').replace(/^\s+|\s+$/g, '');
    }

    function dispatchChange(input) {
      try {
        if (document.createEvent) {
          var ev = document.createEvent('HTMLEvents');
          ev.initEvent('change', true, false);
          input.dispatchEvent(ev);
        }
      } catch (e) {}
    }

    function hideByText(text) {
      var scope = document.getElementById('mw-data-after-content') || document.body;
      if (!scope) return;

      var nodes = scope.querySelectorAll('label, a, span, div, li, p');
      for (var i = 0; i < nodes.length; i++) {
        var el = nodes[i];
        var t = trim(el.textContent);
        if (!t) continue;
        if (t.indexOf(text) === -1) continue;

        // ラベルがチェックボックスを指していればOFF化
        var forId = el.getAttribute ? el.getAttribute('for') : null;
        if (forId) {
          var input = document.getElementById(forId);
          if (input && input.type === 'checkbox' && input.checked) {
            input.checked = false;
            dispatchChange(input);
          }
        }

        // 近い親要素を隠す(closest を使わない)
        var box = el;
        for (var step = 0; step < 6; step++) {
          if (!box || !box.parentNode) break;
          var cls = String(box.className || '');
          if (cls.indexOf('oo-ui') !== -1 || cls.indexOf('mw-ui') !== -1 || cls.indexOf('comments') !== -1) {
            break;
          }
          box = box.parentNode;
        }
        (box || el).style.display = 'none';
      }
    }

    function apply() {
      hideByText(TEXT_SORT);
      hideByText(TEXT_AUTO);
    }

    function boot() {
      apply();

      var watchRoot = document.getElementById('mw-data-after-content') || document.body;
      if (watchRoot && window.MutationObserver) {
        var obs = new MutationObserver(function () {
          apply();
        });
        obs.observe(watchRoot, { childList: true, subtree: true });
      } else {
        setInterval(apply, 1000);
      }
    }

    // comments-body が出るまで少し待つ
    var tries = 0;
    var timer = setInterval(function () {
      tries++;
      if (document.getElementById('comments-body') || document.querySelector('.comments')) {
        clearInterval(timer);
        boot();
        return;
      }
      if (tries > 40) {
        clearInterval(timer);
      }
    }, 250);
  });
})();