MediaWiki:Gadget-UTCLiveClock.js

    来自真佛百科
    Tbpedia>Pppery2024年1月27日 (六) 11:33的版本 (Replace deprecated selector)
    (差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

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

    • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
    • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
    • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
    • Opera:按 Ctrl-F5。
    /**
     * Warning! Global gadget file!
     * 
     * This gadget adds a clock in the personal toolbar that shows the current time
     * in UTC (or a different timezone of your choosing), and also provides a link
     * to purge the current page.
     *
     * Revision: July 2020
     * Source: https://www.mediawiki.org/wiki/MediaWiki:Gadget-UTCLiveClock.js
     *
     * Installation:
     * 
     * 1. Copy the JS page at https://www.mediawiki.org/wiki/MediaWiki:Gadget-UTCLiveClock.js
     * to the page [[MediaWiki:Gadget-UTCLiveClock.js]] on your wiki.
     * 
     * 2. Copy the CSS page at https://www.mediawiki.org/wiki/MediaWiki:Gadget-UTCLiveClock.css
     * to the page [[MediaWiki:Gadget-UTCLiveClock.css]] on your wiki.
     * 
     * 3. Copy the CSS page at https://www.mediawiki.org/wiki/MediaWiki:Gadget-UTCLiveClock-pagestyles.css
     * to the page [[MediaWiki:Gadget-UTCLiveClock-pagestyles.css]] on your wiki.
     * 
     * 4. Add a description of the gadget to the page [[MediaWiki:Gadget-UTCLiveClock]]
     * on your wiki. You can use https://www.mediawiki.org/wiki/MediaWiki:Gadget-UTCLiveClock
     * as a template.
     * 
     * 5. Add the following code to your wiki's [[MediaWiki:Gadgets-definition]]:
     * 
     *     * UTCLiveClock[ResourceLoader|type=general|dependencies=mediawiki.util,mediawiki.api,user|peers=UTCLiveClock-pagestyles]|UTCLiveClock.js|UTCLiveClock.css
     *     * UTCLiveClock-pagestyles[hidden|skins=vector,monobook]|UTCLiveClock-pagestyles.css
     * 
     * 
     * To set the timezone used to one other than UTC, set window.LiveClockTimeZone to
     * the desired timezone. For example, adding the following to your common.js
     *      window.LiveClockTimeZone = 'America/Los_Angeles';
     * would result in the local time in Los Angeles being shown. See
     * [[:w:List of tz database time zones]] for valid options (use the TZ database name).
     * 
     * If you find a seconds counter distracting, set:
     *		window.LiveClockHideSeconds = true;
     * 
     */
    /*global mw, $ */
    mw.loader.using( ['mediawiki.util', 'mediawiki.api', 'user'] ).then( function () {
    
    function padWithZeroes( num ) {
    	// Pad a number with zeroes. The number must be an integer where
    	// 0 <= num < 100.
    	return num < 10 ? '0' + num.toString() : num.toString(); 
    }
    
    function showTime( $target ) {
    	var now = new Date();
    	
    	var timezone = window.LiveClockTimeZone || 'UTC';
    	var hideSeconds = window.LiveClockHideSeconds || false;
    
    	// Set the time.
    	var hh, mm, ss;
    	if ( timezone === "UTC" ) {
    		hh = now.getUTCHours();
    		mm = now.getUTCMinutes();
    		ss = now.getUTCSeconds();
    	} else if ( timezone === "local" ) {
    		hh = now.getHours();
    		mm = now.getMinutes();
    		ss = now.getSeconds();
    	} else {
    		var newNow;
    		try {
    			newNow = new Date(
    				now.toLocaleString(
    					"en-US",
    					{ timeZone: timezone }
    				)
    			);
    			hh = newNow.getHours();
    			mm = newNow.getMinutes();
    			ss = newNow.getSeconds();
    		} catch ( err ) {
    			console.log( "LiveClock - error creating Date object with timezone '" + timezone + "': " + err.name);
    			timezone = "UTC";
    			newNow = now;
    			hh = now.getUTCHours();
    			mm = now.getUTCMinutes();
    			ss = now.getUTCSeconds();
    		}
    	}
    	if (hideSeconds) {
    		var time = padWithZeroes( hh ) + ':' + padWithZeroes( mm );
    	} else {
    		var time = padWithZeroes( hh ) + ':' + padWithZeroes( mm ) + ':' + padWithZeroes( ss );
    	}
    	$target.text( time );
    
    	// Schedule the next time change.
    	// 
    	// We schedule the change for 100 ms _after_ the next clock tick. The delay
    	// from setTimeout is not precise, and if we aim exactly for the tick, there
    	// is a chance that the function will run slightly before it. If this
    	// happens, we will display the same time for two seconds in a row - not
    	// good. By scheduling 100 ms after the tick, we will always be about 100 ms
    	// late, but we are also very likely to display a new time every second.
    	var ms = now.getUTCMilliseconds();
    	setTimeout( function () {
    		showTime( $target );
    	}, 1100 - ms );
    }
    
    function liveClock() {
    	// Set CSS styles. We do this here instead of on the CSS page because some
    	// wikis load this page directly, without loading the accompanying CSS.
    	mw.util.addCSS( '#utcdate a { font-weight:bolder; font-size:120%; }' );
    
    	// Reset whitespace that was set in the peer CSS gadget; this prevents the
    	// effect of the p-personal menu jumping to the left when the JavaScript
    	// loads.
    	$( '.client-js > body.skin-vector #p-personal ul' ).css( 'margin-right', 'initial' );
    	$( '.client-js > body.skin-monobook #p-personal ul' ).css( 'margin-right', 'initial' );
    
    
    	// We are experimenting with different locations for this in Vector 2022 based on feedback
    	// so currently this is limited to MediaWiki.org
    	var dbName = mw.config.get( 'wgDBname' );
    	var showOutsideDropdown = dbName === 'mediawikiwiki' || dbName === 'enwiki';
    	var clockLocation = document.getElementById( 'p-vector-user-menu-overflow' ) && showOutsideDropdown ?
    		'p-vector-user-menu-overflow' : 'p-personal';
    	addLiveClockInstance( clockLocation );
    	addLiveClockInstance( 'p-personal-sticky-header' );
    }
    
    function addLiveClockInstance( clockLocation ) {
    	// Add the portlet link.
    	var node = mw.util.addPortletLink(
    		clockLocation,
    		mw.util.getUrl( null, { action: 'purge' } ),
    		'',
    		'utcdate'
    	);
    	if ( !node ) {
    		return;
    	}
    
    	// Purge the page when the clock is clicked. We have to do this through the
    	// API, as purge URLs now make people click through a confirmation screen.
    	$( node ).on( 'click', function ( e ) {
    		new mw.Api().post( { action: 'purge', titles: mw.config.get( 'wgPageName' ) } ).then( function () {
    			location.reload();
    		}, function () {
    			mw.notify( 'Purge failed', { type: 'error' } );
    		} );
    		e.preventDefault();
    	} );
    
    	// Show the clock.
    	showTime( $( node ).find( 'a' ).first() );
    }
    
    $( liveClock );
    } );