Diferencia entre revisiones de «MediaWiki:Common.js»

Bth0 (discusión | contribs.)
Sin resumen de edición
Sin resumen de edición
 
(No se muestran 19 ediciones intermedias de 3 usuarios)
Línea 1: Línea 1:
( function() {
( function() {
'use strict';
'use strict';
 
/**
/**
  * Instead of cluttering up the global scope with
  * Instead of cluttering up the global scope with
Línea 13: Línea 13:
  */
  */
window.mcw = {};
window.mcw = {};
 
 
/* Legacy support */
/* Legacy support */
mcw.baseURL = '/';
mcw.baseURL = '/';
mcw.wikiURL = '/';
mcw.wikiURL = '/';
 
 
/* Variables for interface text used throughout the script, for ease of translating */
/* Variables for interface text used throughout the script, for ease of translating */
mcw.i18n = {
mcw.i18n = {
// Collapsible tables and page loader
// Collapsible tables and page loader
hideText: 'hide',
hideText: 'ocultar',
showText: 'show',
showText: 'mostrar',
// Page loader
// Page loader
loadErrorTitle: 'An error occurred loading the content',
loadErrorTitle: 'An error occurred loading the content',
// File upload
// File upload
defaultLicense: 'License'
defaultLicense: 'License'
};
};
 
/* Add extra buttons to the classic toolbar */
/* Add extra buttons to the classic toolbar */
if ( mw.user.options.get( 'showtoolbar' ) && !mw.user.options.get( 'usebetatoolbar' ) ) {
if ( mw.user.options.get( 'showtoolbar' ) && !mw.user.options.get( 'usebetatoolbar' ) ) {
importScript( 'MediaWiki:Toolbar.js' );
importScript( 'MediaWiki:Toolbar.js' );
}
}
 
 
/* Wait for DOMContentLoaded */
/* Wait for DOMContentLoaded */
$( function() {
$( function() {
 
/**
/**
  * Collapsible tables
  * Collapsible tables
Línea 56: Línea 56:
return false;
return false;
}
}
var buttonText = ' <span class="collapsible-button">[<span class="jslink">' + mcw.i18n.hideText + '</span>]</span> ';
var buttonText = ' <span class="collapsible-button">[<span class="jslink">' + mcw.i18n.hideText + '</span>]</span> ';
$content.each( function() {
$content.each( function() {
var $table = $( this ), $header, $collapseButton, firstWidth, secondWidth;
var $table = $( this ), $header, $collapseButton, firstWidth, secondWidth;
// This table is already collapsible
// This table is already collapsible
if ( $table.data( 'collapsible' ) ) {
if ( $table.data( 'collapsible' ) ) {
return true;
return true;
}
}
// Use the collapse-button if specified otherwise the first header cell of the first row
// Use the collapse-button if specified otherwise the first header cell of the first row
$header = $table.find( 'tr:first .collapse-button' );
$header = $table.find( 'tr:first .collapse-button' );
Línea 72: Línea 72:
$header = $table.find( 'tr:first > th:first' );
$header = $table.find( 'tr:first > th:first' );
}
}
// No header or the table body is empty
// No header or the table body is empty
if ( !$header.length || !$table.find( 'tr:not(tr:first)' ).text().replace( /\n/g, '' ).length ) {
if ( !$header.length || !$table.find( 'tr:not(tr:first)' ).text().replace( /\n/g, '' ).length ) {
return true;
return true;
}
}
// For the button to float properly, it has to be /before/ the cell text
// For the button to float properly, it has to be /before/ the cell text
if ( $table.hasClass( 'collapse-button-none' ) ) {
if ( $table.hasClass( 'collapse-button-none' ) ) {
Línea 84: Línea 84:
$header.prepend( buttonText );
$header.prepend( buttonText );
}
}
// Find max button size, and set its min-width to it
// Find max button size, and set its min-width to it
$collapseButton = $table.find( '.collapsible-button' );
$collapseButton = $table.find( '.collapsible-button' );
Línea 90: Línea 90:
$collapseButton.find( '> .jslink' ).text( mcw.i18n.showText );
$collapseButton.find( '> .jslink' ).text( mcw.i18n.showText );
secondWidth = $collapseButton.width();
secondWidth = $collapseButton.width();
if ( firstWidth != secondWidth ) {
if ( firstWidth != secondWidth ) {
if ( firstWidth < secondWidth ) {
if ( firstWidth < secondWidth ) {
Línea 98: Línea 98:
}
}
}
}
// Set the text back to hide if it's not collapsed to begin with
// Set the text back to hide if it's not collapsed to begin with
if ( !$table.hasClass( 'collapsed' ) ) {
if ( !$table.hasClass( 'collapsed' ) ) {
$collapseButton.find( '> .jslink' ).text( mcw.i18n.hideText );
$collapseButton.find( '> .jslink' ).text( mcw.i18n.hideText );
}
}
$table.data( 'collapsible', true );
$table.data( 'collapsible', true );
} );
} );
};
};
 
$( '#mw-content-text' ).on( 'click', 'table.collapsible .collapsible-button .jslink', function( e ) {
$( '#mw-content-text' ).on( 'click', 'table.collapsible .collapsible-button .jslink', function( e ) {
var $table = $( this ).closest( 'table.collapsible' );
var $table = $( this ).closest( 'table.collapsible' );
// Stop table sorting activating when clicking the link
// Stop table sorting activating when clicking the link
e.stopPropagation();
e.stopPropagation();
if ( $table.hasClass( 'collapsed' ) ) {
if ( $table.hasClass( 'collapsed' ) ) {
$table.removeClass( 'collapsed' ).addClass( 'expanded' );
$table.removeClass( 'collapsed' ).addClass( 'expanded' );
Línea 123: Línea 123:
} );
} );
mcw.makeCollapsible();
mcw.makeCollapsible();
 
 
/**  
/**  
  * Fix edit summary prompt for undo
  * Fix edit summary prompt for undo
Línea 136: Línea 136:
document.getElementsByName( 'wpAutoSummary' )[0].value='1';
document.getElementsByName( 'wpAutoSummary' )[0].value='1';
}
}
 
/**
/**
  * Element animator
  * Element animator
Línea 158: Línea 158:
};
};
mcw.animation();
mcw.animation();
 
 
/**
/**
  * Pause grid GUI templates (e.g. [[Template:Grid/Crafting Table]]) on mouseover
  * Pause grid GUI templates (e.g. [[Template:Grid/Crafting Table]]) on mouseover
Línea 174: Línea 174:
}
}
}, '.grid-generic, .grid-Crafting_Table, .grid-Furnace, .grid-Brewing_Stand' );
}, '.grid-generic, .grid-Crafting_Table, .grid-Furnace, .grid-Brewing_Stand' );
 
 
/**
/**
  * Add fake last-child class in navboxes for IE8
  * Add fake last-child class in navboxes for IE8
Línea 182: Línea 182:
$( '.navbox-list li:last' ).addClass( 'last-child' );
$( '.navbox-list li:last' ).addClass( 'last-child' );
}
}
 
 
/**
/**
  * Page loader
  * Page loader
Línea 196: Línea 196:
// regardless of if something is clicked
// regardless of if something is clicked
mw.loader.load( 'jquery.spinner' );
mw.loader.load( 'jquery.spinner' );
var $buttonText = $( '<span/>' )
var $buttonText = $( '<span/>' )
.addClass( 'load-page-button' )
.addClass( 'load-page-button' )
Línea 207: Línea 207:
$loadPage.find( '.mw-headline:first' ).each( function() {
$loadPage.find( '.mw-headline:first' ).each( function() {
var $button, firstWidth, secondWidth;
var $button, firstWidth, secondWidth;
// Add the button
// Add the button
$( this ).append( $buttonText.clone() );
$( this ).append( $buttonText.clone() );
// Find max button size, and set its min-width to it
// Find max button size, and set its min-width to it
$button = $( this ).find( '> .load-page-button' );
$button = $( this ).find( '> .load-page-button' );
Línea 216: Línea 216:
$button.find( '> .jslink' ).text( mcw.i18n.showText );
$button.find( '> .jslink' ).text( mcw.i18n.showText );
secondWidth = $button.width();
secondWidth = $button.width();
if ( firstWidth != secondWidth ) {
if ( firstWidth != secondWidth ) {
if ( firstWidth < secondWidth ) {
if ( firstWidth < secondWidth ) {
Línea 226: Línea 226:
} );
} );
}
}
 
$( '#mw-content-text' ).on( 'click', '.load-page-button > .jslink', function() {
$( '#mw-content-text' ).on( 'click', '.load-page-button > .jslink', function() {
var $this = $( this ),
var $this = $( this ),
Línea 232: Línea 232:
$body = $this.closest( '.load-page' ),
$body = $this.closest( '.load-page' ),
$content = $body.find( '.load-page-content' );
$content = $body.find( '.load-page-content' );
if ( !$body.data( 'loaded' ) ) {
if ( !$body.data( 'loaded' ) ) {
var oldButton = $button.html();
var oldButton = $button.html();
Línea 239: Línea 239:
$button.html( $.createSpinner() );
$button.html( $.createSpinner() );
} );
} );
new mw.Api().get( {
new mw.Api().get( {
action: 'parse',
action: 'parse',
Línea 247: Línea 247:
} ).done( function( data ) {
} ).done( function( data ) {
$content.html( data.parse.text['*'] ).show();
$content.html( data.parse.text['*'] ).show();
$button.html( oldButton ).find( '> .jslink' ).text( mcw.i18n.hideText );
$button.html( oldButton ).find( '> .jslink' ).text( mcw.i18n.hideText );
$body.data( 'loaded', true );
$body.data( 'loaded', true );
// Add Ajax compatible functions here
// Add Ajax compatible functions here
// TODO: Use mw.hook once we get MW1.22
// TODO: Use mw.hook once we get MW1.22
Línea 263: Línea 263:
} ).fail( function( _, error ) {
} ).fail( function( _, error ) {
$button.html( oldButton );
$button.html( oldButton );
var errorText = '';
var errorText = '';
if ( error.textStatus ) {
if ( error.textStatus ) {
Línea 270: Línea 270:
errorText = error.error.info;
errorText = error.error.info;
}
}
mw.notify( errorText, { title: mcw.i18n.loadErrorTitle, autoHide: false } );
mw.notify( errorText, { title: mcw.i18n.loadErrorTitle, autoHide: false } );
} );
} );
Línea 281: Línea 281:
}
}
} );
} );
 
/**
/**
  * Make simple search suggestions box separately styled
  * Make simple search suggestions box separately styled
Línea 288: Línea 288:
$( '.suggestions:first' ).addClass( 'searchbar' );
$( '.suggestions:first' ).addClass( 'searchbar' );
} );
} );
 
 
/**
/**
  * Collapsible details for [[Template:History2]]
  * Collapsible details for [[Template:History2]]
Línea 297: Línea 297:
/*if ( $( '.history2' ).find( 'pre' ).length ) {
/*if ( $( '.history2' ).find( 'pre' ).length ) {
var histExpandText = 'View snapshot history', histCollapseText = 'Hide snapshot history';
var histExpandText = 'View snapshot history', histCollapseText = 'Hide snapshot history';
 
$( '.history2 th:first' ).append( '<span class="toggleHistDetails">[<span class="jslink">' + histExpandText + '</span>]</span>' );
$( '.history2 th:first' ).append( '<span class="toggleHistDetails">[<span class="jslink">' + histExpandText + '</span>]</span>' );
 
var histLink = $( '.toggleHistDetails .jslink' );
var histLink = $( '.toggleHistDetails .jslink' );
histLink.click( function() {
histLink.click( function() {
Línea 310: Línea 310:
return true;
return true;
}
}
var header = $( this ), row = header, text = header.find( '> td' ).html() + '</td></tr>',
var header = $( this ), row = header, text = header.find( '> td' ).html() + '</td></tr>',
rowspan = header.find( '> th' ).prop( 'rowspan' );
rowspan = header.find( '> th' ).prop( 'rowspan' );
row.addClass( 'overview' );
row.addClass( 'overview' );
if ( rowspan > 1 ) {
if ( rowspan > 1 ) {
Línea 322: Línea 322:
}
}
row.addClass( 'overview' );
row.addClass( 'overview' );
text += '\n<tr><td>' + row.find( '> td' ).html() + '</td></tr>';
text += '\n<tr><td>' + row.find( '> td' ).html() + '</td></tr>';
}
}
}
}
var versions = text.split( '<pre>' ), data = [];
var versions = text.split( '<pre>' ), data = [];
rowspan = 0;
rowspan = 0;
$.each( versions, function() {
$.each( versions, function() {
var parts = this.split( '</' + 'pre>' ), version = parts[0].replace( /\n/g, '' ), text = parts[1];
var parts = this.split( '</' + 'pre>' ), version = parts[0].replace( /\n/g, '' ), text = parts[1];
if ( !version || !text ) {
if ( !version || !text ) {
return true;
return true;
}
}
text = text.replace( /<tr>/g, '<tr class="details">' );
text = text.replace( /<tr>/g, '<tr class="details">' );
if ( text.slice( text.lastIndexOf( '</tr>' ) ).indexOf( '<td>' ) > -1 ) {
if ( text.slice( text.lastIndexOf( '</tr>' ) ).indexOf( '<td>' ) > -1 ) {
text = text.slice( 0, text.lastIndexOf( '</tr>' ) );
text = text.slice( 0, text.lastIndexOf( '</tr>' ) );
}
}
if ( text.slice( text.lastIndexOf( '<td>' ) ).indexOf( '</td>' ) < 0 ) {
if ( text.slice( text.lastIndexOf( '<td>' ) ).indexOf( '</td>' ) < 0 ) {
text += '</td></tr>';
text += '</td></tr>';
}
}
if ( version.match( /\d\dw\d\d\w/ ) ) {
if ( version.match( /\d\dw\d\d\w/ ) ) {
version = '<a title="Version history/Development versions" href="/' + 'Version_history/Development_versions#' + version + '">' + version + '</a>';
version = '<a title="Version history/Development versions" href="/' + 'Version_history/Development_versions#' + version + '">' + version + '</a>';
Línea 351: Línea 351:
version = '<a title="Version history" href="/' + 'Version_history#' + version + '">' + version + '</a>';
version = '<a title="Version history" href="/' + 'Version_history#' + version + '">' + version + '</a>';
}
}
var rows;
var rows;
if ( text.match( /<td>/g ) ) {
if ( text.match( /<td>/g ) ) {
Línea 361: Línea 361:
data.push( '<th rowspan="' + rows + '">' + version + '</th><td>' + text );
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">' );
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() {
$( '<table>' + html + '</table>' ).find( 'td > ol' ).each( function() {
Línea 367: Línea 367:
html = html.split( '<ol>' + text + '</ol>' ).join( '<ul>' + text + '</ul>' );
html = html.split( '<ol>' + text + '</ol>' ).join( '<ul>' + text + '</ul>' );
} );
} );
row.after( html );
row.after( html );
} );
} );
$( '.history2 .overview' ).hide();
$( '.history2 .overview' ).hide();
}
}
if ( histLink.text() === histExpandText) {
if ( histLink.text() === histExpandText) {
histLink.text( histCollapseText );
histLink.text( histCollapseText );
Línea 381: Línea 381:
} );
} );
}*/
}*/
 
/**
/**
  * Issue tracker loader
  * Issue tracker loader
Línea 388: Línea 388:
var page = $( '#issue-list' ).data( 'name' ) || mw.config.get( 'wgPageName' ),
var page = $( '#issue-list' ).data( 'name' ) || mw.config.get( 'wgPageName' ),
amount = $( '#issue-list' ).data( 'num' ) || 20;
amount = $( '#issue-list' ).data( 'num' ) || 20;
if ( $.isArray( page ) ) {
if ( $.isArray( page ) ) {
page = page.join( '" OR summary ~ "' );
page = page.join( '" OR summary ~ "' );
}
}
var jql = encodeURIComponent( 'project in (MC, MCPE) AND resolution = Unresolved AND ( summary ~ "' + page + '" )' );
var jql = encodeURIComponent( 'project in (MC, MCPE) AND resolution = Unresolved AND ( summary ~ "' + page + '" )' );
$.ajax(  
$.ajax(  
'https://mojang.atlassian.net/rest/api/latest/search?maxResults=' + amount + '&fields=summary&jql=' + jql
'https://mojang.atlassian.net/rest/api/latest/search?maxResults=' + amount + '&fields=summary&jql=' + jql
Línea 403: Línea 403:
return false;
return false;
}
}
 
var compIssues = [], pocketIssues = [];
var compIssues = [], pocketIssues = [];
$.each( search.issues, function() {
$.each( search.issues, function() {
Línea 412: Línea 412:
}
}
} );
} );
var html = '';
var html = '';
if ( compIssues.length ) {
if ( compIssues.length ) {
Línea 420: Línea 420:
html += '\n<p><b>Pocket Edition:</b></p><ul>' + pocketIssues.join( '\n' ) + '</ul>';
html += '\n<p><b>Pocket Edition:</b></p><ul>' + pocketIssues.join( '\n' ) + '</ul>';
}
}
if ( search.total > amount ) {
if ( search.total > amount ) {
var extra = search.total - amount;
var extra = search.total - amount;
html += '\n<p><a href="https://mojang.atlassian.net/issues/?jql=' + jql + '">View ' + extra + ' more result';
html += '\n<p><a href="https://mojang.atlassian.net/issues/?jql=' + jql + '">View ' + extra + ' more result';
if ( extra > 1 ) {
if ( extra > 1 ) {
html += 's';
html += 's';
}
}
html += '</a></p>';
html += '</a></p>';
}
}
 
$( '#issue-list' ).html( html );
$( '#issue-list' ).html( html );
} );
} );
}
}
*/
*/
 
 
/**
/**
  * Set unlicensed as the default license on file pages
  * Set unlicensed as the default license on file pages
Línea 447: Línea 447:
$( '#wpLicense' ).val( mcw.i18n.defaultLicense );
$( '#wpLicense' ).val( mcw.i18n.defaultLicense );
}
}
mw.loader.using( 'mediawiki.legacy.upload', function() {
mw.loader.using( 'mediawiki.legacy.upload', function() {
var change = setInterval( function() {
var change = setInterval( function() {
Línea 457: Línea 457:
} );
} );
}
}
 
 
/**
/**
  * Creates minecraft style tooltips
  * Creates minecraft style tooltips
Línea 469: Línea 469:
create: function() {
create: function() {
var tooltip;
var tooltip;
$( '#mw-content-text' ).on( {
$( '#mw-content-text' ).on( {
'mouseenter.minetip': function( e ) {
'mouseenter.minetip': function( e ) {
Línea 475: Línea 475:
title = $elem.data( 'minetip-title' ),
title = $elem.data( 'minetip-title' ),
description = $elem.data( 'minetip-text' );
description = $elem.data( 'minetip-text' );
// No title or title only contains formatting codes
// No title or title only contains formatting codes
if ( title === undefined || title && title.replace( /&([0-9a-fl-o])|\s+/g, '' ) === '' ) {
if ( title === undefined || title && title.replace( /&([0-9a-fl-o])|\s+/g, '' ) === '' ) {
Línea 485: Línea 485:
title += attrTitle;
title += attrTitle;
}
}
if ( title ) {
if ( title ) {
// Set the retrieved title as data for future use
// Set the retrieved title as data for future use
Línea 493: Línea 493:
}
}
}
}
$elem.add( '*', $elem ).filter( '[title]' ).removeAttr( 'title' );
$elem.add( '*', $elem ).filter( '[title]' ).removeAttr( 'title' );
if ( title === 0 ) {
if ( title === 0 ) {
return;
return;
}
}
var text = '<span class="title">' + title + '&f</span>';
var text = '<span class="title">' + title + '&f</span>';
if ( description ) {
if ( description ) {
Línea 506: Línea 506:
'&f</span>';
'&f</span>';
}
}
if ( !$( '#minetip-tooltip' ).length ) {
if ( !$( '#minetip-tooltip' ).length ) {
$( 'body' ).append( '<div id="minetip-tooltip"/>' );
$( 'body' ).append( '<div id="minetip-tooltip"/>' );
}
}
tooltip = $( '#minetip-tooltip' );
tooltip = $( '#minetip-tooltip' );
// Add classes for minecraft formatting codes
// Add classes for minecraft formatting codes
while ( text.match( /&[0-9a-el-o]/ ) ) {
while ( text.match( /&[0-9a-el-o]/ ) ) {
Línea 518: Línea 518:
// Remove reset formatting
// Remove reset formatting
text = text.replace( /&f/g, '' );
text = text.replace( /&f/g, '' );
tooltip.html( text );
tooltip.html( text );
// Trigger a mouse movement to position the tooltip
// Trigger a mouse movement to position the tooltip
$elem.trigger( 'mousemove', e );
$elem.trigger( 'mousemove', e );
Línea 529: Línea 529:
return;
return;
}
}
// Get event data from remote trigger
// Get event data from remote trigger
e = trigger || e;
e = trigger || e;
var top = e.clientY - 34,
var top = e.clientY - 34,
left = e.clientX + 14,
left = e.clientX + 14,
width = tooltip.outerWidth( true ),
width = tooltip.outerWidth( true ),
height = tooltip.outerHeight( true ),
height = tooltip.outerHeight( true ),
$win = $( window ),
$win = $( window ),
winWidth = $win.width(),
winWidth = $win.width(),
winHeight = $win.height();
winHeight = $win.height();
// If going off the right of the screen, go to the left of the cursor
// If going off the right of the screen, go to the left of the cursor
if ( left + width > winWidth ) {
if ( left + width > winWidth ) {
left -= width + 36;
left -= width + 36;
}
}
// If now going off to the left of the screen, resort to going below the cursor
// If now going off to the left of the screen, resort to going below the cursor
if ( left < 0 ) {
if ( left < 0 ) {
left = 0;
left = 0;
top += 82;
top += 82;
// Go above the cursor if too low
// Go above the cursor if too low
if ( top + height > winHeight ) {
if ( top + height > winHeight ) {
Línea 563: Línea 563:
top = winHeight - height;
top = winHeight - height;
}
}
// Apply the positions
// Apply the positions
tooltip.css( {
tooltip.css( {
Línea 574: Línea 574:
return;
return;
}
}
tooltip.remove();
tooltip.remove();
}
}
Línea 590: Línea 590:
description = $( this ).data( 'minetip-text' ),
description = $( this ).data( 'minetip-text' ),
existingTitle = $( this ).attr( 'title' ) || $( this ).find( '> a:first' ).attr( 'title' );
existingTitle = $( this ).attr( 'title' ) || $( this ).find( '> a:first' ).attr( 'title' );
if ( title || title === 0 || $( this ).attr( 'title' ) ) {
if ( title || title === 0 || $( this ).attr( 'title' ) ) {
// Remove titles within so they don't interfere
// Remove titles within so they don't interfere
$( this ).find( '[title]' ).removeAttr( 'title' );
$( this ).find( '[title]' ).removeAttr( 'title' );
}
}
if ( title === 0 ) {
if ( title === 0 ) {
$( this ).removeAttr( 'title' );
$( this ).removeAttr( 'title' );
Línea 604: Línea 604:
$( this ).data( 'minetip-title', existingTitle );
$( this ).data( 'minetip-title', existingTitle );
}
}
var text = title || existingTitle;
var text = title || existingTitle;
if ( description ) {
if ( description ) {
text += '\n' + description;
text += '\n' + description;
}
}
// Remove formatting
// Remove formatting
text = text.replace( /&([0-9a-fl-o])/g, '' )
text = text.replace( /&([0-9a-fl-o])/g, '' )
Línea 615: Línea 615:
.replace( /\//g, '\n' )
.replace( /\//g, '\n' )
.replace( /&#47;/g, '/' );
.replace( /&#47;/g, '/' );
$( this ).attr( 'title', text );
$( this ).attr( 'title', text );
} ).off( '.minetip' );
} ).off( '.minetip' );
}
}
};
};
 
if ( mcw.useNativeMinetip ) {
if ( mcw.useNativeMinetip ) {
mcw.minetip.native();
mcw.minetip.native();
Línea 626: Línea 626:
mcw.minetip.create();
mcw.minetip.create();
}
}
 
 
} );
} );
} )();
} )();