「MediaWiki:Common.js」の版間の差分

提供:百科事典.com
ナビゲーションに移動 検索に移動
(メインページに「最近の更新(7件)」をタイトル+差分リンク付きで表示するための完全版コード003)
編集の要約なし
1行目: 1行目:
/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */
/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */
/* ============================================================
/* ============================================================
   メインページに「最近の更新(7件)」を表示するスクリプト
   メインページに「最近の更新(7件)」を表示するスクリプト
5行目: 8行目:
   - localStorage による5分キャッシュ
   - localStorage による5分キャッシュ
   - API の maxage/smaxage による HTTP キャッシュ
   - API の maxage/smaxage による HTTP キャッシュ
   - MediaWiki 1.39.3 で動作確認済み
   - MediaWiki 1.39.3 で動作確認済み(ES5対応版)
   ============================================================ */
   ============================================================ */


11行目: 14行目:


     // ▼ メインページ名の判定(あなたの wiki は「メインページ」)
     // ▼ メインページ名の判定(あなたの wiki は「メインページ」)
     const page = mw.config.get('wgPageName');
     var page = mw.config.get('wgPageName');
     if (page !== 'メインページ' && page !== 'Main_Page') {
     if (page !== 'メインページ' && page !== 'Main_Page') {
         return; // メインページ以外では実行しない
         return; // メインページ以外では実行しない
17行目: 20行目:


     // ▼ localStorage 用のキー
     // ▼ localStorage 用のキー
     const key = 'recentchanges-cache';
     var key = 'recentchanges-cache';
     const keyTime = key + '-time';
     var keyTime = key + '-time';


     // ▼ キャッシュの有効期限(ミリ秒)→ 5分
     // ▼ キャッシュの有効期限(ミリ秒)→ 5分
     const ttl = 5 * 60 * 1000;
     var ttl = 5 * 60 * 1000;
     const now = Date.now();
     var now = Date.now();


     // ▼ localStorage にキャッシュがあれば利用
     // ▼ localStorage にキャッシュがあれば利用
     const cached = localStorage.getItem(key);
     var cached = localStorage.getItem(key);
     const cachedTime = localStorage.getItem(keyTime);
     var cachedTime = localStorage.getItem(keyTime);


     if (cached && cachedTime && now - cachedTime < ttl) {
     if (cached && cachedTime && now - cachedTime < ttl) {
47行目: 50行目:
     }, function (data) {
     }, function (data) {


         let html = '<ul>';
         var html = '<ul>';


         data.query.recentchanges.forEach(rc => {
         data.query.recentchanges.forEach(function (rc) {


             // ▼ old_revid が null(新規作成)の場合は差分リンクを作らない
             // ▼ old_revid が null(新規作成)の場合は差分リンクを作らない
             let diffLink = '';
             var diffLink = '';
             if (rc.old_revid && rc.revid) {
             if (rc.old_revid && rc.revid) {
                 const diffUrl = mw.util.getUrl(rc.title, {
                 var diffUrl = mw.util.getUrl(rc.title, {
                     diff: rc.revid,
                     diff: rc.revid,
                     oldid: rc.old_revid
                     oldid: rc.old_revid
                 });
                 });
                 diffLink = `<a href="${diffUrl}">差分</a>`;
                 diffLink = '<a href="' + diffUrl + '">差分</a>';
             } else {
             } else {
                 diffLink = '(新規)';
                 diffLink = '(新規)';
             }
             }


             // ▼ リスト項目の HTML
             // ▼ リスト項目の HTML(ES5 文字列連結)
             html += `
             html +=
                 <li>
                 '<li>' +
                     <a href="/wiki/${rc.title}">${rc.title}</a>
                     '<a href="/wiki/' + rc.title + '">' + rc.title + '</a>' +
                     &nbsp;
                     '&nbsp;' +
                     ${diffLink}
                     diffLink +
                     &nbsp;
                     '&nbsp;' +
                     (${rc.timestamp})
                     '(' + rc.timestamp + ')' +
                 </li>
                 '</li>';
            `;
         });
         });



2026年2月20日 (金) 12:56時点における版

/* ここにあるすべてのJavaScriptは、すべてのページ読み込みですべての利用者に対して読み込まれます */



/* ============================================================
   メインページに「最近の更新(7件)」を表示するスクリプト
   - タイトル+差分リンク付き
   - localStorage による5分キャッシュ
   - API の maxage/smaxage による HTTP キャッシュ
   - MediaWiki 1.39.3 で動作確認済み(ES5対応版)
   ============================================================ */

$(function () {

    // ▼ メインページ名の判定(あなたの wiki は「メインページ」)
    var page = mw.config.get('wgPageName');
    if (page !== 'メインページ' && page !== 'Main_Page') {
        return; // メインページ以外では実行しない
    }

    // ▼ localStorage 用のキー
    var key = 'recentchanges-cache';
    var keyTime = key + '-time';

    // ▼ キャッシュの有効期限(ミリ秒)→ 5分
    var ttl = 5 * 60 * 1000;
    var now = Date.now();

    // ▼ localStorage にキャッシュがあれば利用
    var cached = localStorage.getItem(key);
    var cachedTime = localStorage.getItem(keyTime);

    if (cached && cachedTime && now - cachedTime < ttl) {
        $('#recentchanges-container').html(cached);
        return; // API を叩かず終了
    }

    // ▼ MediaWiki API を呼び出して最近の更新を取得
    $.getJSON(mw.util.wikiScript('api'), {
        action: 'query',
        list: 'recentchanges',
        rclimit: 7,                     // 取得件数
        rcprop: 'title|timestamp|ids',  // タイトル・時刻・差分ID
        rcshow: '!bot',                 // Bot 編集を除外(不要なら削除)
        format: 'json',

        // ▼ HTTP キャッシュ(ブラウザ・CDN)
        maxage: 300,   // ブラウザキャッシュ 5分
        smaxage: 300   // CDNキャッシュ 5分
    }, function (data) {

        var html = '<ul>';

        data.query.recentchanges.forEach(function (rc) {

            // ▼ old_revid が null(新規作成)の場合は差分リンクを作らない
            var diffLink = '';
            if (rc.old_revid && rc.revid) {
                var diffUrl = mw.util.getUrl(rc.title, {
                    diff: rc.revid,
                    oldid: rc.old_revid
                });
                diffLink = '<a href="' + diffUrl + '">差分</a>';
            } else {
                diffLink = '(新規)';
            }

            // ▼ リスト項目の HTML(ES5 文字列連結)
            html +=
                '<li>' +
                    '<a href="/wiki/' + rc.title + '">' + rc.title + '</a>' +
                    '&nbsp;' +
                    diffLink +
                    '&nbsp;' +
                    '(' + rc.timestamp + ')' +
                '</li>';
        });

        html += '</ul>';

        // ▼ localStorage にキャッシュ保存
        localStorage.setItem(key, html);
        localStorage.setItem(keyTime, now);

        // ▼ メインページに表示
        $('#recentchanges-container').html(html);
    });
});