Warning.png

Поддержка Wiki прекращена, она доступна в режиме архива. Информация в ней устарела и может быть неактуальной.

Изменения

Перейти к: навигация, поиск

MediaWiki:Common.js

7656 байтов добавлено, 19:04, 18 августа 2016
Нет описания правки
( function() {
'use strict';
 
/* Variables for interface text used throughout the script, for ease of translating */
var i18n = {
// Collapsible elements and page loader
hideText: 'hide',
showText: 'show',
// Page loader
loadErrorTitle: 'An error occurred loading the content',
// File upload
defaultLicense: 'License'
};
/**
var mcw = window.mcw = {};
 
/* Variables for interface text used throughout the script, for ease of translating */
mcw.i18n = {
// Collapsible tables and page loader
hideText: 'скрыть',
showText: 'показать',
// Page loader
loadErrorTitle: 'Возникла ошибка при загрузке содержимого',
// File upload
defaultLicense: 'Лицензия'
};
/* Keep track of delegated events on dynamic content */
mcw.events = {};
/* Добавляет дополнительные кнопки в классическую панель редактирования Add extra buttons to the classic toolbar */
if ( mw.user.options.get( 'showtoolbar' ) && !mw.user.options.get( 'usebetatoolbar' ) ) {
mw.loader.loadimportScript( '/index.php?title=MediaWiki:Toolbar.js&action=raw&ctype=text/javascript' );
}
/* Добавляет кнопки вставки часто используемых описаний правки */
if (wgAction == 'edit' || wgAction == 'submit') {
mw.loader.load( '/index.php?title=MediaWiki:AddSumButton.js&action=raw&ctype=text/javascript' );
}
/* Fired whenever wiki content is added. (#mw-content-text, live preview, load page, etc.) */
mw.hook( 'wikipage.content' ).add( function( $content wikipageContent ) {
/**
* Collapsible tableselements
*
* Based on http://wwwAdd the "collapsible" class to an element and the child element with class "collapsible-content" * (or everything but the header row if a table) will be hidden when the element is collapsed.mediawiki * * * Add the class "collapsed" to the element to make it start out collapsed.org/wiki/Manual:Collapsible_tables#Common * * Add either "collapsetoggle-left" or "collapsetoggle-inline" to the element to choose the collapse * toggle alignment (defaults to right).js_script_ * * Add an ID in the format of "collapsible-<x>" to the element to make any element with the class * "collapsetoggle-custom" and a matching class in the format of "collapsible-<x>-toggle" control * the collapsing instead of the standard button.28before_1 * If the custom toggle contains an element with the "jslink" class, only that will be clickable.18.29
*/
( function() {
var $tables collapsibles = $contentwikipageContent.find( 'table.collapsible' ); if ( !$tables || !$tablescollapsibles.length ) { return false;
}
var buttonText $toggleTemplate = $( ' <span class="collapsible-button">' ).addClass( 'collapsetoggle' ).append( '[', $( '<span class="jslink">' + mcw).i18n.hideText + addClass( 'jslink' ), '</span>]</span> '; ); $tablescollapsibles.each( function() { var $table collapsible = $( this ), $header, $collapseButton, firstWidth, secondWidth; // This table is already collapsible if ( $tablecollapsible.data( 'made-collapsible' ) ) {
return true;
}
// Use the collapse-button if specified otherwise the first header cell of the first rowvar $children = $collapsible.children(); var showText = $header collapsible.data( 'expandtext' ) || i18n.showText; var hideText = $tablecollapsible.finddata( 'tr:first .collapse-buttoncollapsetext' )|| i18n.hideText; // If there is no content area, add it if ( !$headercollapsible.is( 'table' ) && !$children.filter( '.collapsible-content' ).length ) { if ( $collapsible.is( 'tr' ) ) { $header = children.addClass( 'collapsible-content' ); } else { $tablecollapsible.findwrapInner( 'tr:first <div class="collapsible-content"> th:first' ); }
}
// No header or the table body is emptyvar $toggle; var id = $collapsible.attr( 'id' ); if ( !id && id.match( /^collapsible-./ ) ) { $header.length || !toggle = $( $tablewikipageContent[0].findgetElementsByClassName( id + '-toggle'tr:not(tr:first)' ) .htmlfilter('.collapsetoggle-custom' ).trimcss('visibility', 'visible' ).length ) { return true;
}
// For Create and insert the toggle button to float properly, it has to be /before/ the cell textif there is no custom one if ( !$toggle || !$toggle.length ) { var $toggleContainer; if ( $collapsible.is( 'table' ) ) { var $rows = $children.filter( 'thead' ).children(); if ( !$rows.length ) { $rows = $children.filter( 'tbody' ).first().children(); if ( !$rows.length ) { $rows = $children.filter( 'tr' ); } } $toggleContainer = $rows.first().children().last(); } else { $toggleContainer = $children.first(); if ( $toggleContainer.hasClass( 'collapsible-content' ) ) { $toggleContainer = $collapsible; } } $toggle = $toggleTemplate.clone(); if ( $collapsible.hasClass( 'collapsetoggle-inline' ) || $collapsible.hasClass( 'collapse-button-none' ) ) { $headertoggleContainer.append( buttonText $toggle ); } else { $headertoggleContainer.prepend( buttonText $toggle ); }
}
// Find max button size, and set its min-width to it var $collapseButton toggleLink = $tabletoggle.find( '.collapsible-buttonjslink' ); firstWidth = if ( !$collapseButtontoggleLink.width(length ){ $toggleLink = $toggle; } $collapseButtontoggleLink.findattr( '> .jslinktabindex' , 0 ).text( mcw.i18n.showText ); secondWidth = $collapseButton.width(hideText );
if // Find max toggle size, and set its min-width to it var hideWidth = $toggle.width( firstWidth != secondWidth ) {; if $toggleLink.text( firstWidth < secondWidth showText ) {; var showWidth = $collapseButtontoggle.csswidth( 'min-width', secondWidth ); } else if ( hideWidth !== showWidth ) { $collapseButtontoggle.css( 'min-width', firstWidth hideWidth > showWidth ? hideWidth : showWidth ); }
}
// Set the text back to hide if it's not collapsed to begin with
if ( !$tablecollapsible.hasClass( 'collapsed' ) ) { $collapseButton.find( '> .jslink' )toggleLink.text( mcw.i18n.hideText );
}
$tabletoggleLink.dataon( 'collapsibleclick keydown', true function( e ){ // Only trigger on enter press if ( e.keyCode && e.keyCode !== 13 ) { return; } ); // This is bound directly because sortable tables donDon't play nicetoggle when clicking buttons or links inside the toggle var $tablestarget = $( e.findtarget ); if ( $target.is( 'button') || $target.is( 'a' ) ) { return; } $collapsible-button .jslinktoggleClass( 'collapsed' ); if ( $collapsible.clickhasClass( function( e 'collapsed' ) ) { var $table = $toggleLink.text( this showText ); } else { $toggleLink.closesttext( 'table.collapsible' hideText ); } // Stop table sorting activating when clicking the link e.stopPropagation(); } );
if ( $table.hasClass( 'collapsed' ) ) { $table.removeClass( 'collapsed' )collapsible.addClassdata( 'expandedmade-collapsible' , true ); $( this ).text( mcw.i18n.hideText ); } else { $table.removeClass( 'expanded' ).addClass( 'collapsed' ); $( this ).text( mcw.i18n.showText ); }
} );
}() );
*/
( function() {
var $loadPage = $contentwikipageContent.find( '.load-page' );
if ( !$loadPage.length ) {
return;
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 $buttonText buttonTemplate = $( '<span>' ).addClass( 'mw-editsection-like load-page-button' ) .append( '[', $( '<span>' ).addClass( 'jslink' ).text( mcw.i18n.hideText ), ']' );
var extractList = function( $contentContainer, listClass ) { var $content = $loadPagecontentContainer.find( '> ul > li > ul' ).mwchildren( ':not(.nbttree-headline:firstinherited)' ); if ( listClass ) { $content.addClass( listClass ); } return $content; }; $loadPage.each( function() { var $body = $( this ); var page = $body.closestdata( '.load-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 = $buttonTextbuttonTemplate.clone(),; var $buttonLink = $button.find( '.jslink' ); if ( treeview ) { $heading = $body; $contentContainer = $( '<div>' ); } else { $heading = $body.children().first(); firstWidth, secondWidth$contentContainer = $body.find( '.load-page-content' ); }
// Add the button
$buttonheading.insertAfterappend( this $button );
// Move the edit button to the right spot
$bodycontentContainer.find( '.mw-editsection, .mw-editsection-like' ).insertAfter( $button );
// Find max button width, and set its min-width to it
firstWidth var hideWidth = $button.width(); $button.children( '.jslink' )buttonLink.text( mcw.i18n.showText ); secondWidth var showWidth = $button.width();
if ( firstWidth hideWidth !== secondWidth showWidth ) { if ( firstWidth > secondWidth ) { $button.css( 'min-width', firstWidth hideWidth > showWidth ? hideWidth : showWidth ); } else { $button.css( 'min-width', secondWidth ); }
}
} );
if ( mcw.events.loadPage ) {
return;
}
$( '#mw-content-text' ).on( 'click', '.load-page-button > .jslink', function() {
var $button = $( this ).parent(),
$body = $button.closest( '.load-page' ),
$contentContainer = $body.find( '.load-page-content' );
$buttonLink.click( function() { if ( !$body.datahasClass( '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 loadedelsewhere before making a request var gotContent; $( '.pageloader-contentloaded' ) .each( function() { var oldButton $fLoader = $( this ); if ( $fLoader.data( 'page' ) = == page && $fLoader.data( 'pageloader-content' ) ) { $buttoncontentContainer.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().addClass( 'mw-editsection-like' ) .css( 'min-width', $button.htmlcss( 'min-width' ) ); $button.createSpinnerhide() .after( $spinner ); }
} );
new mw.Api().get( var requestData = {
action: 'parse',
prop: 'text', }; if ( template ) { requestData.page = page; } else { requestData.title: = mw.config.get( 'wgPageName' ),; requestData.text: = '{' + '{:' + $body.data( 'page' ) + '}}'; } new mw.Api().get( requestData ).done( function( data ) { $contentContainer.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 ) { $buttonbody.htmlfind( oldButton '.noscript' ).childrenremove( '); $content = extractList( $contentContainer, treeviewClass ); $content.insertAfter( $body ); } $spinner.jslink' remove(); $spinner = false; $buttonLink.text( mcw.i18n.hideText ); $button.show(); $body.dataaddClass( 'loadedpageloader-contentloaded', true );
} ).fail( function( _, error ) {
$spinner.remove(); $spinner = false; $button.htmlshow( oldButton );
var errorText = '';
}
mw.notify( errorText, { title: mcw.i18n.loadErrorTitle, autoHide: false } ); } ); } ); } );}() );  /** * Collapsible details for [[Template:History2]] * * Allows version history to be split up into snapshots *//*if ( $( '.history2' ).find( 'pre' ).length ) { var histExpandText = 'View snapshot history', histCollapseText = 'Hide snapshot history';  $( '.history2 th:first' ).append( '<span class="toggleHistDetails">[<span class="jslink">' + histExpandText + '</span>]</span>' );  var histLink = $( '.toggleHistDetails .jslink' ); histLink.click( function() { if ( $( '.history2 .details' ).length ) { $( '.history2 .overview' ).toggle(); $( '.history2 .details' ).toggle(); } else { $( '.history2 tr' ).each( function() { if ( !$( this ).find( 'pre' ).length || !$( this ).find( 'th' ).length ) { return true; } var header = $( this ), row = header, text = header.find( '> td' ).html() + '</td></tr>', rowspan = header.find( '> th' ).prop( 'rowspan' ); row.addClass( 'overview' ); if ( rowspan > 1 ) { for ( var i = 1; i < rowspan; i++ ) { row = row.next(); if ( !row.length ) { break; } row.addClass( 'overview' ); text += '\n<tr><td>' + row.find( '> td' ).html() + '</td></tr>'; } } var versions = text.split( '<pre>' ), data = []; rowspan = 0; $.each( versions, function() { var parts = this.split( '</' + 'pre>' ), version = parts[0].replace( /\n/g, '' ), text = parts[1]; if ( !version || !text ) { return true; } text = text.replace( /<tr>/g, '<tr class="details">' ); if ( text.slice( text.lastIndexOf( '</tr>' ) ).indexOf( '<td>' ) > -1 ) { text = text.slice( 0, text.lastIndexOf( '</tr>' ) ); } if ( text.slice( text.lastIndexOf( '<td>' ) ).indexOf( '</td>' ) < 0 ) { text += '</td></tr>'; } if ( version.match( /\d\dw\d\d\w/ ) ) { version = '<a title="Version history/Development versions" href="/' + 'Version_history/Development_versions#' + version + '">' + version + '</a>'; } else { version = '<a title="Version history" href="/' + 'Version_history#' + version + '">' + version + '</a>'; } var rows; if ( text.match( /<td>/g ) ) { rows = text.match( /<td>/g ).length + 1; } else { rows = 1; } rowspan += rows; data.push( '<th rowspan="' + rows + '">' + version + '</th><td>' + text ); } ); var html = '<tr class="details"><th rowspan="' + rowspan + '">' + header.find( '> th' ).html() + '</th>' + data.join( '<tr class="details">' ); $( '<table>' + html + '</table>' ).find( 'td > ol' ).each( function() { var text = $( this ).html(); html = html.split( '<ol>' + text + '</ol>' ).join( '<ul>' + text + '</ul>' ); } ); row.after( html );
} );
$( '.history2 .overview' ).hide(); } else if ( $( this )histLink.text() === mcw.i18n.showText histExpandText) { $contentContainer.show(); $( this )histLink.text( mcw.i18n.hideText histCollapseText );
} else {
histLink.text( histExpandText ); } } );}*/ /** * Issue tracker loader *//**if ( $( '#issue-list' ).length ) { var page = $( '#issue-list' ).data( 'name' ) || mw.config.get( 'wgPageName' ), amount = $( '#issue-list' ).data( 'num' ) || 20; if ( $contentContainer.hideisArray( page ) ) { page = page.join('" OR summary ~ "' ); } var jql = encodeURIComponent( 'project in (MC, MCPE) AND resolution = Unresolved AND ( summary ~ "' + page + '" )' ); $.ajax( 'https://mojang.atlassian.net/rest/api/latest/search?maxResults=' + amount + '&fields=summary&jql=' + jql ).done( function( search ) { if ( !search.issues.length ) { $( '#issue-list' ).text( 'No issues were found.' ); return false; }  var compIssues = [], pocketIssues = []; $.each( search.issues, function() { if ( this.key.indexOf( 'MCPE' ) < 0 ) { compIssues.push( '<li>[<a href="https://mojang.atlassian.net/browse/' + this.key + '">' + this.key + '</a>] - ' + this .fields.summary + '</li>' ); } else { pocketIssues.push( '<li>[<a href="https://mojang.atlassian.net/browse/' + this.key + '">' + this.key + '</a>] - ' + this.textfields.summary + '</li>' ); } } ); var html = ''; if ( compIssues.length ) { html = '<p><b>Computer:</b></p><ul>' + compIssues.join( '\n' ) + '</ul>'; } if ( pocketIssues.length ) { html += '\n<p><b>Pocket Edition:</b></p><ul>' + pocketIssues.join( '\n' ) + '</ul>'; } if ( mcwsearch.total > amount ) { var extra = search.total - amount; html += '\n<p><a href="https://mojang.i18natlassian.showText net/issues/?jql=' + jql + '">View ' + extra + ' more result'; if ( extra > 1 ){ html += 's'; } html += '</a></p>';
}
 
$( '#issue-list' ).html( html );
} );
mcw.events.loadPage = true;}}() );*/
} );
$( this ).find( '.paused' ).removeClass( 'paused' ).addClass( 'animated' );
}
}, '.grid-generic, .grid-Crafting_Table, .grid-Furnace, .grid-Brewing_Stand, .mcui' );
/**
* Set unlicensed as the default license on file pages * * That way the file will be categorised so someone can find a license for the file */if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Upload' ) { if ( $( '#wpLicense' ).val() === '' ) { $( '#wpLicense' ).val( i18n.defaultLicense ); } mw.loader.using( 'mediawiki.legacy.upload', function() { var change = setInterval( function() { if ( licenseSelectorCheck ) { $( '#wpLicense' ).change(); clearInterval( change ); } }, 500 ); } );}  /** * Creates minecraft style tooltips * * Replaces normal tooltips. Supports minecraft [[formatting codes]] (except k), and a description with line breaks (/). */
( function() {
var escapeChars = { '\\&': '&#38;', '<': '&#60;', '>': '&#62;' }; var escape = function( text ) { // "\" must be escaped first return text.replace( /\\\\/g, '&#92;' ) .replace( /\\&|[<>]/g, function( char ) { return escapeChars[char]; } ); }; var $tooltip = $(); var $win = $( window ), winWidth, winHeight, width, height; $( '#mw-content-text' ).on( { 'mouseenter.minetip': function( e ) { $tooltip.remove(); var $elem = $( this ), title = $elem.attr( 'data-minetip-title' ); if ( title === undefined ) { title = $elem.attr( 'title' ); if ( title !== undefined ) { title = $.trim( title.replace( /&/g, '\\&' ) ); $elem.attr( 'data-minetip-title', title ); } } // No title or title only contains formatting codes if ( title === undefined || title !== '' && title.replace( /&([0-9a-fl-or])/g, '' ) === '' ) { // Find deepest child title var childElem = $elem[0], childTitle; do { if ( childElem.hasAttribute( 'title' ) ) { childTitle = childElem.title; } childElem = childElem.firstChild; } while( childElem && childElem.nodeType === 1 ); if ( childTitle === undefined ) { return; } // Append child title as title may contain formatting codes if ( !title ) { title = ''; } title += $.trim( childTitle.replace( /&/g, '\\&' ) ); // Set the retrieved title as data for future use $elem.attr( 'data-minetip-title', title ); } if ( !$elem.data( 'minetip-ready' ) ) { // Remove title attributes so the native tooltip doesn't get in the way $elem.find( '[title]' ).addBack().removeAttr( 'title' ); $elem.data( 'minetip-ready', true ); } if ( title === '' ) { return; } var content = '<span class="minetip-title">' + escape( title ) + '&r</span>'; var description = $.trim( $elem.attr( 'data-minetip-text' ) ); if ( description ) { // Apply normal escaping plus "/" description = escape( description ).replace( /\\\//g, '&#47;' ); content += '<span class="minetip-description">' + description.replace( /\//g, '<br>' ) + '&r</span>'; } // Add classes for minecraft formatting codes while ( content.search( /&[0-9a-fl-o]/ ) > -1 ) { content = content.replace( /&([0-9a-fl-o])(.*?)(&r|$)/g, '<span class="format-$1">$2</span>&r' ); } // Remove reset formatting content = content.replace( /&r/g, '' ); $tooltip = $( '<div id="minetip-tooltip">' ); $tooltip.html( content ).appendTo( 'body' ); // Cache current window and tooltip size winWidth = $win.width(); winHeight = $win.height(); width = $tooltip.outerWidth( true ); height = $tooltip.outerHeight( true ); // Trigger a mouse movement to position the tooltip $elem.trigger( 'mousemove', e ); }, 'mousemove.minetip': function( e, trigger ) { if ( !$tooltip.length ) { $( this ).trigger( 'mouseenter' ); return; } // Get event data from remote trigger e = trigger || e; // Get mouse position and add default offsets var top = e.clientY - 34; var left = e.clientX + 14; // If going off the right of the screen, go to the left of the cursor if ( left + width > winWidth ) { left -= width + 36; } // If now going off to the left of the screen, resort to going above the cursor if ( left < 0 ) { left = 0; top -= height - 22; // Go below the cursor if too high if ( top < 0 ) { top += height + 47; } // Don't go off the top of the screen } else if ( top < 0 ) { top = 0; // Don't go off the bottom of the screen } else if ( top + height > winHeight ) { top = winHeight - height; } // Apply the positions $tooltip.css( { top: top, left: left } ); }, 'mouseleave.minetip': function() { if ( !$tooltip.length ) { return; } $tooltip.remove(); $tooltip = $(); } }, '.minetip, .grid > .item, .invslot-item' );
}() );
 
} );

Навигация