MediaWiki:Common.js

LocalAdmin留言 | 贡献2026年3月12日 (四) 13:09的版本 (Fix: check exclusion list on load so button reflects correct state after refresh)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

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

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
/* ── AllPages: filter excluded pages from homepage list ───────────── */
$( function () {
    var chunk = document.querySelector( '.mw-allpages-chunk' );
    if ( !chunk ) { return; }

    // Always hide the main page entry
    chunk.querySelectorAll( 'li' ).forEach( function ( li ) {
        var a = li.querySelector( 'a' );
        if ( a && ( a.title === '首页' || a.title === 'Main Page' ) ) {
            li.remove();
        }
    } );

    // Fetch server-side exclusion list and apply
    new mw.Api().get( {
        action: 'query', prop: 'revisions', rvprop: 'content',
        titles: 'MediaWiki:Allpages-exclude', format: 'json'
    } ).done( function ( data ) {
        var page = Object.values( data.query.pages )[ 0 ];
        if ( !page || page.missing !== undefined || !page.revisions ) { return; }
        var excluded = page.revisions[ 0 ][ '*' ]
            .split( '\n' ).map( function ( s ) { return s.trim(); } ).filter( Boolean );
        chunk.querySelectorAll( 'li' ).forEach( function ( li ) {
            var a = li.querySelector( 'a' );
            if ( a && excluded.indexOf( a.title ) !== -1 ) { li.remove(); }
        } );
    } );
} );

/* ── "Hide from homepage" button — visible to sysops only ─────────── */
$( function () {
    var groups = mw.config.get( 'wgUserGroups' ) || [];
    if ( groups.indexOf( 'sysop' ) === -1 ) { return; }

    var pageTitle = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
    if ( pageTitle === '首页' ) { return; }

    var btn = document.createElement( 'button' );
    btn.id = 'hp-hide-btn';
    btn.disabled = true;                       // disabled until state is known
    btn.innerHTML = '…';
    document.body.appendChild( btn );

    var api = new mw.Api();

    /* ── Read exclusion list; set initial button state ────────────── */
    function loadExclusionList( cb ) {
        api.get( {
            action: 'query', prop: 'revisions', rvprop: 'content',
            titles: 'MediaWiki:Allpages-exclude', format: 'json'
        } ).done( function ( data ) {
            var page  = Object.values( data.query.pages )[ 0 ];
            var lines = [];
            if ( page && page.revisions ) {
                lines = page.revisions[ 0 ][ '*' ]
                    .split( '\n' ).map( function ( s ) { return s.trim(); } ).filter( Boolean );
            }
            cb( lines );
        } ).fail( function () { cb( [] ); } );
    }

    function setHidden() {
        btn.innerHTML      = '✓ Hidden from homepage';
        btn.style.background = '#38a169';
        btn.disabled       = true;
    }

    function setVisible() {
        btn.innerHTML = '🚫 Hide from homepage';
        btn.style.background = '';
        btn.disabled  = false;
    }

    /* ── On load: check if already excluded ──────────────────────── */
    loadExclusionList( function ( lines ) {
        if ( lines.indexOf( pageTitle ) !== -1 ) {
            setHidden();
        } else {
            setVisible();
        }
    } );

    /* ── On click: add to exclusion list ─────────────────────────── */
    btn.addEventListener( 'click', function () {
        btn.disabled  = true;
        btn.innerHTML = 'Saving…';

        loadExclusionList( function ( lines ) {
            if ( lines.indexOf( pageTitle ) !== -1 ) {
                setHidden();
                return;
            }
            lines.push( pageTitle );
            api.postWithToken( 'csrf', {
                action: 'edit',
                title: 'MediaWiki:Allpages-exclude',
                text: lines.join( '\n' ),
                summary: 'Hide "' + pageTitle + '" from homepage list'
            } ).done( function () {
                mw.notify( '"' + pageTitle + '" hidden from homepage.', { type: 'success' } );
                setHidden();
            } ).fail( function () {
                mw.notify( 'Failed — check interface-admin rights.', { type: 'error' } );
                setVisible();
            } );
        } );
    } );
} );