MediaWiki:Gadget-ViewerMode.js:修订间差异
外观
LocalAdmin(留言 | 贡献) Use confirmed-available icons: watchlist for reader, wikiText for editor |
LocalAdmin(留言 | 贡献) Add double-run guard to prevent duplicate menu items |
||
| 第8行: | 第8行: | ||
if ( mw.user.isAnon() ) { return; } | if ( mw.user.isAnon() ) { return; } | ||
var STORAGE_KEY = 'mw-viewer-mode'; | var STORAGE_KEY = 'mw-viewer-mode'; | ||
var READER_ICON = 'vector-icon mw-ui-icon-watchlist mw-ui-icon-wikimedia-watchlist'; | var READER_ICON = 'vector-icon mw-ui-icon-watchlist mw-ui-icon-wikimedia-watchlist'; | ||
var EDITOR_ICON = 'vector-icon mw-ui-icon-wikiText mw-ui-icon-wikimedia-wikiText'; | var EDITOR_ICON = 'vector-icon mw-ui-icon-wikiText mw-ui-icon-wikimedia-wikiText'; | ||
var active = localStorage.getItem( STORAGE_KEY ) === '1'; | var active = localStorage.getItem( STORAGE_KEY ) === '1'; | ||
// Apply immediately to prevent flash of edit elements | |||
if ( active ) { | if ( active ) { | ||
document.documentElement.classList.add( 'viewer-mode' ); | document.documentElement.classList.add( 'viewer-mode' ); | ||
| 第28行: | 第29行: | ||
var icon = document.querySelector( '#pt-viewer-mode .vector-icon' ); | var icon = document.querySelector( '#pt-viewer-mode .vector-icon' ); | ||
if ( !label ) { return; } | if ( !label ) { return; } | ||
label.textContent = active ? 'Editor mode' : 'Reader view'; | |||
if ( icon ) { icon.className = active ? EDITOR_ICON : READER_ICON; } | |||
} | } | ||
$( function () { | $( function () { | ||
// Guard: only run once per page load | |||
if ( document.getElementById( 'pt-viewer-mode' ) ) { return; } | |||
// Fix missing icon on "My blog" | // Fix missing icon on "My blog" | ||
var blogLink = document.querySelector( '#pt-simpleblog_myblog a' ); | var blogLink = document.querySelector( '#pt-simpleblog_myblog a' ); | ||
| 第47行: | 第46行: | ||
} | } | ||
// Add | // Add toggle to end of p-personal list | ||
// (logout | // (logout lives in its own portlet: p-user-menu-logout) | ||
var menuList = document.querySelector( '#p-personal .vector-menu-content-list' ); | var menuList = document.querySelector( '#p-personal .vector-menu-content-list' ); | ||
if ( !menuList ) { return; } | if ( !menuList ) { return; } | ||
var li = document.createElement( 'li' ); | var li = document.createElement( 'li' ); | ||
li.id = 'pt-viewer-mode'; | li.id = 'pt-viewer-mode'; | ||
li.className = 'mw-list-item'; | li.className = 'mw-list-item'; | ||
| 第63行: | 第62行: | ||
var textSpan = document.createElement( 'span' ); | var textSpan = document.createElement( 'span' ); | ||
textSpan.className = 'viewer-mode-label'; | textSpan.className = 'viewer-mode-label'; | ||
textSpan.textContent = active ? 'Editor mode' : 'Reader view'; | textSpan.textContent = active ? 'Editor mode' : 'Reader view'; | ||
2026年3月12日 (四) 10:42的版本
/**
* ViewerMode gadget — lets editors preview the site as a regular visitor.
* Also fixes the missing icon on the "My blog" menu item.
*/
( function () {
'use strict';
if ( mw.user.isAnon() ) { return; }
var STORAGE_KEY = 'mw-viewer-mode';
var READER_ICON = 'vector-icon mw-ui-icon-watchlist mw-ui-icon-wikimedia-watchlist';
var EDITOR_ICON = 'vector-icon mw-ui-icon-wikiText mw-ui-icon-wikimedia-wikiText';
var active = localStorage.getItem( STORAGE_KEY ) === '1';
// Apply immediately to prevent flash of edit elements
if ( active ) {
document.documentElement.classList.add( 'viewer-mode' );
}
function toggle() {
active = !active;
localStorage.setItem( STORAGE_KEY, active ? '1' : '0' );
document.documentElement.classList.toggle( 'viewer-mode', active );
updateButton();
}
function updateButton() {
var label = document.querySelector( '#pt-viewer-mode .viewer-mode-label' );
var icon = document.querySelector( '#pt-viewer-mode .vector-icon' );
if ( !label ) { return; }
label.textContent = active ? 'Editor mode' : 'Reader view';
if ( icon ) { icon.className = active ? EDITOR_ICON : READER_ICON; }
}
$( function () {
// Guard: only run once per page load
if ( document.getElementById( 'pt-viewer-mode' ) ) { return; }
// Fix missing icon on "My blog"
var blogLink = document.querySelector( '#pt-simpleblog_myblog a' );
if ( blogLink && !blogLink.querySelector( '.vector-icon' ) ) {
var blogIcon = document.createElement( 'span' );
blogIcon.className = 'vector-icon mw-ui-icon-article mw-ui-icon-wikimedia-article';
blogLink.insertBefore( document.createTextNode( ' ' ), blogLink.firstChild );
blogLink.insertBefore( blogIcon, blogLink.firstChild );
}
// Add toggle to end of p-personal list
// (logout lives in its own portlet: p-user-menu-logout)
var menuList = document.querySelector( '#p-personal .vector-menu-content-list' );
if ( !menuList ) { return; }
var li = document.createElement( 'li' );
li.id = 'pt-viewer-mode';
li.className = 'mw-list-item';
var a = document.createElement( 'a' );
a.href = '#';
var iconSpan = document.createElement( 'span' );
iconSpan.className = active ? EDITOR_ICON : READER_ICON;
var textSpan = document.createElement( 'span' );
textSpan.className = 'viewer-mode-label';
textSpan.textContent = active ? 'Editor mode' : 'Reader view';
a.appendChild( iconSpan );
a.appendChild( document.createTextNode( ' ' ) );
a.appendChild( textSpan );
a.addEventListener( 'click', function ( e ) {
e.preventDefault();
toggle();
} );
li.appendChild( a );
menuList.appendChild( li );
} );
}() );