跳转到内容

MediaWiki:Common.js:修订间差异

来自槌基百科
Add AllPages exclusion filter + sysop hide-from-homepage button
Fix: check exclusion list on load so button reflects correct state after refresh
 
第34行: 第34行:


     var pageTitle = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
     var pageTitle = mw.config.get( 'wgPageName' ).replace( /_/g, ' ' );
    var mainPage  = '首页';
     if ( pageTitle === '首页' ) { return; }
     if ( pageTitle === mainPage ) { return; }   // don't show on the main page itself


     var btn = document.createElement( 'button' );
     var btn = document.createElement( 'button' );
     btn.id       = 'hp-hide-btn';
     btn.id = 'hp-hide-btn';
     btn.innerHTML = '🚫 Hide from homepage';
     btn.disabled = true;                       // disabled until state is known
     btn.title    = 'Add this page to the homepage AllPages exclusion list';
     btn.innerHTML = '';
     document.body.appendChild( btn );
     document.body.appendChild( btn );


     btn.addEventListener( 'click', function () {
     var api = new mw.Api();
        btn.disabled = true;
        btn.textContent = 'Saving…';


        var api = new mw.Api();
    /* ── Read exclusion list; set initial button state ────────────── */
    function loadExclusionList( cb ) {
         api.get( {
         api.get( {
             action: 'query', prop: 'revisions', rvprop: 'content',
             action: 'query', prop: 'revisions', rvprop: 'content',
第58行: 第56行:
                     .split( '\n' ).map( function ( s ) { return s.trim(); } ).filter( Boolean );
                     .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 ) {
             if ( lines.indexOf( pageTitle ) !== -1 ) {
                 mw.notify( '"' + pageTitle + '" is already hidden from the homepage.', { type: 'info' } );
                 setHidden();
                btn.textContent = '✓ Already hidden';
                 return;
                 return;
             }
             }
第70行: 第98行:
                 summary: 'Hide "' + pageTitle + '" from homepage list'
                 summary: 'Hide "' + pageTitle + '" from homepage list'
             } ).done( function () {
             } ).done( function () {
                 mw.notify( '"' + pageTitle + '" hidden from homepage list.', { type: 'success' } );
                 mw.notify( '"' + pageTitle + '" hidden from homepage.', { type: 'success' } );
                 btn.innerHTML = '✓ Hidden';
                 setHidden();
                btn.style.background = '#38a169';
             } ).fail( function () {
             } ).fail( function () {
                 mw.notify( 'Failed — check you have interface-admin rights.', { type: 'error' } );
                 mw.notify( 'Failed — check interface-admin rights.', { type: 'error' } );
                 btn.disabled = false;
                 setVisible();
                btn.innerHTML = '🚫 Hide from homepage';
             } );
             } );
         } );
         } );
     } );
     } );
} );
} );

2026年3月12日 (四) 13:09的最新版本

/* ── 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();
            } );
        } );
    } );
} );