コンテンツにスキップ

MediaWiki:Mobile.js

提供:浜松北高語録集
2025年5月17日 (土) 14:01時点におけるRoot (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

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

  • Firefox / Safari: Shift を押しながら 再読み込み をクリックするか、Ctrl-F5 または Ctrl-R を押してください (Mac では ⌘-R)
  • Google Chrome: Ctrl-Shift-R を押してください (Mac では ⌘-Shift-R)
  • Microsoft Edge: Ctrl を押しながら 最新の情報に更新 をクリックするか、Ctrl-F5 を押してください。
/* ここにある全てのJavaScriptはモバイル版サイトの利用者に影響します */
// MediaWiki:Mobile.js または User:ご自身のユーザー名/mobile.js に記述
// MediaWiki:Mobile.js または User:ご自身のユーザー名/mobile.js に記述
mw.loader.using( ['jquery', 'mediawiki.util'], function () {
    $( function () { // このスコープは $(document).ready とほぼ同様
        'use strict';

        // デバッグメッセージをコンソールに出力するフラグ
        var enableDebugMessages = true;

        function logDebug(message, element) {
            if (enableDebugMessages && window.console && typeof window.console.log === 'function') {
                if (element) {
                    console.log('[MobileExpandSections] ' + message, element);
                } else {
                    console.log('[MobileExpandSections] ' + message);
                }
            }
        }

        logDebug('Script loaded. Attempting to expand sections.');

        function expandAllSectionsInContext( $context ) {
            logDebug('expandAllSectionsInContext called for context:', $context[0]);

            // セレクタの候補:
            // 1. MinervaNeueの標準的なセクションのヘッダー
            // 2. MediaWiki標準の折りたたみ要素のトグル
            // 3. MinervaNeueでセクション全体を囲む要素で、折りたたまれているもの
            var selectorsToClick = [
                '.collapsible-block.mw-collapsed .section-heading', // クリック対象はヘッダー
                '.mw-collapsible.mw-collapsed .mw-collapsible-toggle' // クリック対象はトグル
            ];
            var $elementsToClick = $();

            selectorsToClick.forEach(function(selector) {
                var $found = $context.find(selector);
                if ($found.length > 0) {
                    logDebug('Found ' + $found.length + ' elements to click with selector: ' + selector);
                    $elementsToClick = $elementsToClick.add($found);
                }
            });

            if ($elementsToClick.length > 0) {
                $elementsToClick.each( function ( index ) {
                    var $this = $( this );
                    logDebug('Triggering click on element ' + ( index + 1 ) + ':', $this[0]);
                    $this.trigger( 'click' ); // Minervaのイベントハンドラを発火させる

                    // 念のため、展開されたか確認 (非同期の場合もあるので確実ではない)
                    // var $parentCollapsible = $this.closest('.collapsible-block, .mw-collapsible');
                    // setTimeout(function() {
                    //     if ($parentCollapsible.hasClass('mw-collapsed')) {
                    //         logDebug('Element ' + (index + 1) + ' might still be collapsed.', $parentCollapsible[0]);
                    //     } else {
                    //         logDebug('Element ' + (index + 1) + ' seems expanded.', $parentCollapsible[0]);
                    //     }
                    // }, 150);
                });
            } else {
                logDebug('No elements found to click for expansion in this context.');

                // クリック対象が見つからない場合、mw-collapsedクラスを直接操作してみる (最終手段に近い)
                var $directlyCollapsible = $context.find('.collapsible-block.mw-collapsed, .mw-collapsible.mw-collapsed');
                if ($directlyCollapsible.length > 0) {
                    logDebug('Found ' + $directlyCollapsible.length + ' elements with .mw-collapsed. Attempting direct class manipulation.');
                    $directlyCollapsible.each(function() {
                        var $block = $(this);
                        var $header = $block.find('.section-heading, .mw-collapsible-toggle').first();

                        logDebug('Directly expanding block by removing .mw-collapsed:', $block[0]);
                        $block.removeClass('mw-collapsed');

                        if ($header.length) {
                            $header.attr('aria-expanded', 'true');
                        }
                        // Minervaの場合、コンテンツブロックの表示も制御している可能性
                        $block.find('.content_block').css('display', 'block');
                    });
                } else {
                    logDebug('No .mw-collapsed elements found for direct class manipulation either.');
                }
            }
        }

        // 初回ページ読み込み時に関数実行
        // 少し遅延させて、他のスクリプトやMinerva自身の初期化処理が終わるのを待つ
        setTimeout(function() {
            logDebug('Initial execution on document ready (after 500ms delay).');
            // ページ全体のコンテンツを対象とする
            expandAllSectionsInContext( $( document.body ) );
        }, 500); // 500ミリ秒の遅延。必要に応じて調整してください。

        // mw.hook を使用して、動的にコンテンツが更新された場合にも対応
        // (例: Live Preview, VisualEditorからの切り替え、ページネーションなど)
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
            logDebug('wikipage.content hook triggered for content:', $content[0]);
            // $content は更新されたDOM要素のjQueryオブジェクト
            // こちらも少し遅延させる
            setTimeout(function() {
                expandAllSectionsInContext( $content );
            }, 100);
        });

        // MinervaNeueがAjaxでページ遷移を行う場合、追加のフックが必要なことがあります。
        // mw.hook('minerva.pageLoaded').add(function() { ... }); のようなフックを調べてみてください。
        // (このフック名は一例であり、正確ではない可能性があります)

    } );
} );