MediaWiki:Common.js

提供: トラwiki
2026年8月26日 (水) 15:54時点におけるAdmin (トーク | 投稿記録)による版 (軽量な最新更新読み込みスクリプトに刷新)

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

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Microsoft Edge: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください。
/**
 * MediaWiki:Common.js
 */
(function() {
  'use strict';

  function loadRecentUpdates() {
    var container = document.getElementById('tw-live-recent-updates');
    if (!container) return;

    fetch('/api.php?action=query&list=recentchanges&rcnamespace=0&rclimit=6&rcprop=title|timestamp|user&format=json')
      .then(function(res) { return res.json(); })
      .then(function(data) {
        if (!data || !data.query || !data.query.recentchanges) return;
        var rcs = data.query.recentchanges;
        if (rcs.length === 0) return;

        var html = '<ul class="tw-recent-feed">';
        for (var i = 0; i < rcs.length; i++) {
          var item = rcs[i];
          var titleEnc = encodeURIComponent(item.title);
          var dateObj = new Date(item.timestamp);
          var timeStr = formatTime(dateObj);

          html += '<li class="tw-recent-feed-item">';
          html += '  <span><a href="/index.php/' + titleEnc + '">' + escapeHtml(item.title) + '</a></span>';
          html += '  <span class="tw-recent-feed-time">' + timeStr + '</span>';
          html += '</li>';
        }
        html += '</ul>';
        container.innerHTML = html;
      })
      .catch(function(err) {
        console.warn('Recent changes load error:', err);
      });
  }

  function formatTime(d) {
    var m = (d.getMonth() + 1);
    var day = d.getDate();
    var h = ('0' + d.getHours()).slice(-2);
    var min = ('0' + d.getMinutes()).slice(-2);
    return m + '/' + day + ' ' + h + ':' + min;
  }

  function escapeHtml(s) {
    if (!s) return '';
    return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', loadRecentUpdates);
  } else {
    loadRecentUpdates();
  }
})();