MediaWiki:Common.js: различия между версиями

imported>Gevron
м Возвращаю кнопку кэша обратно, но заставляю содержащее её меню отображаться во всех случаях, когда это может иметь смысл
мНет описания правки
 
(не показано 11 промежуточных версий этого же участника)
Строка 57: Строка 57:
}());
}());


// Добавляет ссылку для редактирования нулевого раздела (введения; преамбулы)
    var wgNamespaceNumber = mw.config.get( 'wgNamespaceNumber' );
    var wgPageName = mw.config.get( 'wgPageName' );
    if (wgNamespaceNumber > -1){
        var edittopHTML = '<span class="mw-editsection">' +
        '<span class="mw-editsection-bracket" style="margin-right: 0.25em;color: #555555;">[</span>' +
        '<a href="/index.php?title=' + wgPageName + '&amp;action=edit&amp;section=0" title="Править «введение» этой страницы">править введение</a>' +
        '<span class="mw-editsection-bracket" style="margin-left: 0.25em;color: #555555;">]</span>' +
        '</span>';
        $('#firstHeading').append(edittopHTML);
    }
// Только при редактировании, вне режима визуального редактора
    if ( mw.config.get( 'wgAction' ) == 'edit' || mw.config.get( 'wgAction' ) == 'submit' ) {
        // Устаревшая, но всё ещё действующая панель редактирования исходного кода
        mw.loader.load( 'https://wiki.ss220.space/index.php/Участник:Gevron/legacyToolbar.js?action=raw&ctype=text/javascript' );
    }
// Честно стащено с бывшей официальной Minecraft Wiki
// Добавляет кнопку для очистки кэша
if ( !$( '#ca-purge' ).length ) {
    $( '#p-cactions' ).find( 'ul' ).append(
        $( '<li>' ).attr( { 'id': 'ca-purge', 'class': 'mw-list-item' } ).append(
            $( '<a>' ).attr( { 'href': mw.util.getUrl( null, { action: 'purge' } ), 'title': 'Очистить серверный кэш страницы' } ).append(
                $( '<span>' ).text( 'Очистить кэш' )
            )
        )
    );
}
// Если кнопка «Ещё» у нас скрыта, отображаем её, но не на спецстраницах.
// Если кнопка «Ещё» у нас скрыта, отображаем её, но не на спецстраницах.
if ($( '#p-cactions' ).hasClass( 'emptyPortlet' ) & !$( '#p-views' ).hasClass( 'emptyPortlet' )){
if ($( '#p-cactions' ).hasClass( 'emptyPortlet' ) & !$( '#p-views' ).hasClass( 'emptyPortlet' )){
$( '#p-cactions' ).removeClass( 'emptyPortlet' )
$( '#p-cactions' ).removeClass( 'emptyPortlet' )
}
}
// Меняем обычную ссылку очистки кэша на API-запрос, чтобы избежать окна подтверждения
mw.loader.using( 'mediawiki.api' ).then( function() {
    $( '#ca-purge a' ).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();
    } );
} );


// from Minecraft Wiki
// from Minecraft Wiki
Строка 156: Строка 110:
// Create button starting with hide text
// Create button starting with hide text
// Will be changed to the show text while calculating the maximum button size
// Will be changed to the show text while calculating the maximum button size
var $buttonTemplate = $( '<span>' ).addClass( 'mw-editsection-like load-page-button' )
var $buttonTemplate = $( '<span>' ).addClass( 'load-page-button' )
.append( '[ ', $( '<span>' ).addClass( 'jslink' ).text( i18n.hideText ), ' ]' );
.append($( '<span>' ).addClass( 'jslink' ).text( i18n.hideText ));
var extractList = function( $contentContainer, listClass ) {
var extractList = function( $contentContainer, listClass ) {
Строка 195: Строка 149:
// Move the edit button to the right spot
// Move the edit button to the right spot
$contentContainer.find( '.mw-editsection, .mw-editsection-like' ).insertAfter( $button );
$contentContainer.find( '.mw-editsection' ).insertAfter( $button );
// Find max button width, and set its min-width to it
// Find max button width, and set its min-width to it
Строка 255: Строка 209:
// $spinner will be false if the content somehow loaded before the module did
// $spinner will be false if the content somehow loaded before the module did
if ( $spinner ) {
if ( $spinner ) {
$spinner = $.createSpinner().addClass( 'mw-editsection-like' )
$spinner = $.createSpinner()
.css( 'min-width', $button.css( 'min-width' ) );
.css( 'min-width', $button.css( 'min-width' ) );
$button.hide().after( $spinner );
$button.hide().after( $spinner );

Текущая версия от 16:41, 25 ноября 2024

/* Variables for interface text used throughout the script, for ease of translating */
var i18n = {
    // Collapsible elements and page loader
    hideText: 'скрыть',
    showText: 'показать',
    
    // Page loader
    loadErrorTitle: 'Возникла ошибка при загрузке содержимого'
};

/**
 * Instead of cluttering up the global scope with
 * variables, they should instead be set as a
 * property of this global variable
 *
 * E.g: Instead of
 *   myVar = 'blah';
 * use
 *   mcw.myVar = 'blah';
 */
var mcw = window.mcw = {};

/* Keep track of delegated events on dynamic content */
mcw.events = {};

$(function () {

    const elemsSwitch = Array.from(document.querySelectorAll(".kaskadavionics .switchtab"));

    for (var ii = 0; ii < elemsSwitch.length; ii++) {

        elemsSwitch[ii].onclick = function () {

            const tabId = this.getAttribute("data-tab");

            var elemens = Array.from(document.querySelectorAll(".kaskadavionics .switchtab"));

            for (var iii = 0; iii < elemens.length; iii++) {

                elemens[iii].classList.remove("current");

            }
            elemens = Array.from(document.querySelectorAll(".kaskadavionics .tabcontent"));
            for (var jj = 0; jj < elemens.length; jj++) {

                elemens[jj].classList.remove("current");

            }
            this.classList.add("current");
            document.querySelector("[data-tab='"+tabId+"']").classList.add("current");
            document.querySelector("#p"+tabId).classList.add("current");

        };

    }

}());

// Если кнопка «Ещё» у нас скрыта, отображаем её, но не на спецстраницах.
if ($( '#p-cactions' ).hasClass( 'emptyPortlet' ) & !$( '#p-views' ).hasClass( 'emptyPortlet' )){
	$( '#p-cactions' ).removeClass( 'emptyPortlet' )
}

// from Minecraft Wiki
/* Добавляет кнопку «Вверх» слева */
function scrollTop(){
    $(window).scroll(function(e) {
	    if($(window).scrollTop()>0) {
	    	$("#scroll-top").fadeIn(300);
	    } else{ 
	    	$("#scroll-top").fadeOut(300);
	    }
    });
}

/* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */
mw.hook( 'wikipage.content' ).add( function( $wikipageContent ) {

$(function(){
	$("footer#footer").append($("<span></span>")
		.attr({
			"id": "scroll-top",
			"title": "Наверх"
		})
	);
	$("#scroll-top").click(function(e) {
		$('body,html').animate({scrollTop:0},300);
		});
	scrollTop();
});

/**
 * Page loader
 *
 * Allows a page to be downloaded and displayed on demand.
 * Use with Template:LoadPage and Template:LoadBox
 */

( function() {
	var $loadPage = $wikipageContent.find( '.load-page' );
	if ( !$loadPage.length ) {
		return;
	}
	
	// We need the spinner to show loading is happening, but we don't want
	// to have a delay while the module downloads, so we'll load this now,
	// regardless of if something is clicked
	mw.loader.load( 'jquery.spinner' );
	
	// Create button starting with hide text
	// Will be changed to the show text while calculating the maximum button size
	var $buttonTemplate = $( '<span>' ).addClass( 'load-page-button' )
		.append($( '<span>' ).addClass( 'jslink' ).text( i18n.hideText ));
	
	var extractList = function( $contentContainer, listClass ) {
		var $content = $contentContainer.find( '.mw-parser-output > ul > li > ul' ).children( ':not(.nbttree-inherited)' );
		if ( listClass ) {
			$content.addClass( listClass );
		}
		
		return $content;
	};
	
	$loadPage.each( function() {
		var $body = $( this );
		var page = $body.data( 'page' );
		if ( !page ) {
			return;
		}
		
		var template = $body.data( 'template' );
		var treeview = $body.data( 'treeview' );
		var treeviewClass = $body.data( 'treeviewclass' );
		var $heading;
		var $contentContainer;
		var $content;
		var $button = $buttonTemplate.clone();
		var $buttonLink = $button.find( '.jslink' );
		if ( treeview ) {
			$heading = $body;
			$contentContainer = $( '<div>' );
		} else {
			$heading = $body.children().first();
			$contentContainer = $body.find( '.load-page-content' );
		}
		
		// Add the button
		$heading.append( $button );
		
		// Move the edit button to the right spot
		$contentContainer.find( '.mw-editsection' ).insertAfter( $button );
		
		// Find max button width, and set its min-width to it
		var hideWidth = $button.width();
		$buttonLink.text( i18n.showText );
		var showWidth = $button.width();
		
		if ( hideWidth !== showWidth ) {
			$button.css( 'min-width', hideWidth > showWidth ? hideWidth : showWidth );
		}
		
		$buttonLink.click( function() {
			if ( $body.hasClass( 'pageloader-contentloaded' ) ) {
				if ( $buttonLink.text() === i18n.showText ) {
					if ( treeview ) {
						$content.insertAfter( $body );
					} else {
						$contentContainer.show();
					}
					$buttonLink.text( i18n.hideText );
				} else {
					if ( treeview ) {
						$content.detach();
					} else {
						$contentContainer.hide();
					}
					$buttonLink.text( i18n.showText );
				}
				return;
			}
			
			// See if this was loaded elsewhere before making a request
			var gotContent;
			$( '.pageloader-contentloaded' ).each( function() {
				var $fLoader = $( this );
				if ( $fLoader.data( 'page' ) === page && $fLoader.data( 'pageloader-content' ) ) {
					$contentContainer.html( $fLoader.data( 'pageloader-content' ) ).removeClass( 'noscript' );
					mw.hook( 'wikipage.content' ).fire( $contentContainer );
					
					if ( treeview ) {
						$body.find( '.noscript' ).remove();
						$content = extractList( $contentContainer, treeviewClass );
						$content.insertAfter( $body );
					}
					
					$buttonLink.text( i18n.hideText );
					$body.addClass( 'pageloader-contentloaded' );
					gotContent = true;
					return false;
				}
			} );
			if ( gotContent ) {
				return;
			}
			
			// Just in-case the spinner module is still not ready yet
			var $spinner = $();
			mw.loader.using( 'jquery.spinner', function() {
				// $spinner will be false if the content somehow loaded before the module did
				if ( $spinner ) {
					$spinner = $.createSpinner()
						.css( 'min-width', $button.css( 'min-width' ) );
					$button.hide().after( $spinner );
				}
			} );
			
			var requestData = {
				action: 'parse',
				prop: 'text'
			};
			if ( template ) {
				requestData.page = page;
			} else {
				requestData.title = mw.config.get( 'wgPageName' );
				requestData.text = '{' + '{:' + page + '}}';
			}
			new mw.Api().get( requestData ).done( function( data ) {
				var html = data.parse.text['*'];
				$contentContainer.html( html ).removeClass( 'noscript' );
				
				// Resolve self-links
				if ( template ) {
					var curPage = '/' + mw.config.get( 'wgPageName' );
					$contentContainer.find( 'a' ).each( function() {
						var $link = $( this );
						if ( $link.attr( 'href' ) === curPage ) {
							$link.replaceWith( $( '<strong>' ).addClass( 'selflink' ).append( $link.contents() ) );
						}
					} );
					html = $contentContainer.html();
				}
				
				$body.data( 'pageloader-content', html );
				
				// Fire content hook on the new content, running all this stuff again and more :)
				mw.hook( 'wikipage.content' ).fire( $contentContainer );
				
				if ( treeview ) {
					$body.find( '.noscript' ).remove();
					$content = extractList( $contentContainer, treeviewClass );
					$content.insertAfter( $body );
				}
				
				$spinner.remove();
				$spinner = false;
				$buttonLink.text( i18n.hideText );
				$button.show();
				$body.addClass( 'pageloader-contentloaded' );
			} ).fail( function( _, error ) {
				$spinner.remove();
				$spinner = false;
				$button.show();
				
				var errorText = '';
				if ( error.textStatus ) {
					errorText = error.textStatus;
				} else if ( error.error ) {
					errorText = error.error.info;
				}
				
				mw.notify( errorText, { title: i18n.loadErrorTitle, autoHide: false } );
			} );
		} );
	} );
}() );

} );
/* End wiki content hook */