MediaWiki:Common.js:修订间差异
外观
LocalAdmin(留言 | 贡献) Add AllPages exclusion filter + sysop hide-from-homepage button |
LocalAdmin(留言 | 贡献) 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, ' ' ); | ||
if ( pageTitle === '首页' ) { return; } | |||
if ( pageTitle === | |||
var btn = document.createElement( 'button' ); | var btn = document.createElement( 'button' ); | ||
btn.id | btn.id = 'hp-hide-btn'; | ||
btn. | btn.disabled = true; // disabled until state is known | ||
btn. | btn.innerHTML = '…'; | ||
document.body.appendChild( btn ); | document.body.appendChild( btn ); | ||
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 ) { | ||
setHidden(); | |||
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 | mw.notify( '"' + pageTitle + '" hidden from homepage.', { type: 'success' } ); | ||
setHidden(); | |||
} ).fail( function () { | } ).fail( function () { | ||
mw.notify( 'Failed — check | mw.notify( 'Failed — check interface-admin rights.', { type: 'error' } ); | ||
setVisible(); | |||
} ); | } ); | ||
} ); | } ); | ||
} ); | } ); | ||
} ); | } ); | ||
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();
} );
} );
} );
} );