Diferencia entre revisiones de «MediaWiki:Common.js»
Línea 1: | Línea 1: | ||
− | + | /* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada página. */ | |
− | + | //<source lang="JavaScript"> | |
− | + | ||
− | /** | + | /** Extra toolbar options ****************************************************** |
− | + | * | |
− | * | + | * Description: Adds extra buttons to the editing toolbar. |
− | + | * | |
− | * | + | * To disable this script, add <code>mwCustomEditButtons = |
− | |||
− | * | ||
− | * | ||
− | |||
*/ | */ | ||
− | + | ||
− | + | if (mwCustomEditButtons) { | |
− | + | mwCustomEditButtons.push({ | |
− | / | + | "imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c8/Button_redirect.png", |
− | + | "speedTip": "Redirect", | |
− | + | "tagOpen": "#REDIRECT [[", | |
− | + | "tagClose": "]]", | |
− | + | "sampleText": "Target page name" | |
− | / | + | }); |
− | + | ||
− | + | mwCustomEditButtons.push({ | |
− | + | "imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c9/Button_strike.png", | |
− | + | "speedTip": "Strike", | |
− | + | "tagOpen": "<s>", | |
− | + | "tagClose": "</s>", | |
− | + | "sampleText": "Strike-through text" | |
− | + | }); | |
− | + | ||
− | + | mwCustomEditButtons.push({ | |
− | }; | + | "imageFile": "http://upload.wikimedia.org/wikipedia/en/1/13/Button_enter.png", |
− | + | "speedTip": "Line break", | |
− | / | + | "tagOpen": "<br />", |
− | + | "tagClose": "", | |
− | + | "sampleText": "" | |
+ | }); | ||
+ | |||
+ | mwCustomEditButtons.push({ | ||
+ | "imageFile": "http://upload.wikimedia.org/wikipedia/en/8/80/Button_upper_letter.png", | ||
+ | "speedTip": "Superscript", | ||
+ | "tagOpen": "<sup>", | ||
+ | "tagClose": "</sup>", | ||
+ | "sampleText": "Superscript text" | ||
+ | }); | ||
+ | |||
+ | mwCustomEditButtons.push({ | ||
+ | "imageFile": "http://upload.wikimedia.org/wikipedia/en/7/70/Button_lower_letter.png", | ||
+ | "speedTip": "Subscript", | ||
+ | "tagOpen": "<sub>", | ||
+ | "tagClose": "</sub>", | ||
+ | "sampleText": "Subscript text" | ||
+ | }); | ||
+ | |||
+ | mwCustomEditButtons.push({ | ||
+ | "imageFile": "http://upload.wikimedia.org/wikipedia/en/5/58/Button_small.png", | ||
+ | "speedTip": "Small", | ||
+ | "tagOpen": "<small>", | ||
+ | "tagClose": "</small>", | ||
+ | "sampleText": "Small Text" | ||
+ | }); | ||
+ | |||
+ | mwCustomEditButtons.push({ | ||
+ | "imageFile": "http://upload.wikimedia.org/wikipedia/en/3/34/Button_hide_comment.png", | ||
+ | "speedTip": "Insert hidden Comment", | ||
+ | "tagOpen": "<!-- ", | ||
+ | "tagClose": " -->", | ||
+ | "sampleText": "Comment" | ||
+ | }); | ||
+ | |||
+ | mwCustomEditButtons.push({ | ||
+ | "imageFile": "http://upload.wikimedia.org/wikipedia/en/1/12/Button_gallery.png", | ||
+ | "speedTip": "Insert a picture gallery", | ||
+ | "tagOpen": "\n<gallery>\n", | ||
+ | "tagClose": "\n</gallery>", | ||
+ | "sampleText": "Image:Example.jpg|Caption1\nImage:Example.jpg|Caption2" | ||
+ | }); | ||
+ | |||
+ | mwCustomEditButtons.push({ | ||
+ | "imageFile": "http://upload.wikimedia.org/wikipedia/en/f/fd/Button_blockquote.png", | ||
+ | "speedTip": "Insert block of quoted text", | ||
+ | "tagOpen": "<blockquote>\n", | ||
+ | "tagClose": "\n</blockquote>", | ||
+ | "sampleText": "Block quote" | ||
+ | }); | ||
+ | |||
+ | mwCustomEditButtons.push({ | ||
+ | "imageFile": "http://upload.wikimedia.org/wikipedia/en/6/60/Button_insert_table.png", | ||
+ | "speedTip": "Insert a table", | ||
+ | "tagOpen": '{| class="wikitable"\n|', | ||
+ | "tagClose": "\n|}", | ||
+ | "sampleText": "-\n! header 1\n! header 2\n! header 3\n|-\n| row 1, cell 1\n| row 1, cell 2\n| row 1, cell 3\n|-\n| row 2, cell 1\n| row 2, cell 2\n| row 2, cell 3" | ||
+ | }); | ||
+ | |||
+ | mwCustomEditButtons.push({ | ||
+ | "imageFile": "http://upload.wikimedia.org/wikipedia/commons/7/79/Button_reflink.png", | ||
+ | "speedTip": "Insert a reference", | ||
+ | "tagOpen": "<ref>", | ||
+ | "tagClose": "</ref>", | ||
+ | "sampleText": "Insert footnote text here" | ||
+ | }); | ||
} | } | ||
− | + | ||
− | + | ||
− | / | + | //fix edit summary prompt for undo |
− | + | //this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the | |
+ | //edit summary unchanged | ||
+ | //this was added by [[User:Deskana]], code by [[User:Tra]] | ||
+ | //see bug 8912 | ||
+ | addOnloadHook(function () { | ||
+ | if (document.location.search.indexOf("undo=") != -1 | ||
+ | && document.getElementsByName('wpAutoSummary')[0]) { | ||
+ | document.getElementsByName('wpAutoSummary')[0].value='1'; | ||
+ | } | ||
+ | }) | ||
/** | /** | ||
− | * | + | * Element animator (used in [[Template:Grid]]) |
* | * | ||
− | * | + | * Will cycle the active class on any child elements within an element with the animated class. |
*/ | */ | ||
− | + | if ( $( '.animated' ).length ) { | |
− | + | setInterval( function() { | |
− | + | $( '.animated' ).each( function() { | |
− | + | var current = $( this ).find( '.active' ).removeClass( 'active' ), next = current.next(); | |
− | + | if ( !current.next().length ) { | |
− | + | next = $( this ).children().eq( 0 ); | |
− | + | } | |
− | + | next.addClass( 'active' ); | |
− | + | } ); | |
− | + | }, 2000 ); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
/** | /** | ||
− | + | * Pause grid templates with lots of cells in them (e.g. [[Template:Grid/Crafting Table]]) on mouseover | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | * Pause grid | ||
* | * | ||
* This is so people have a chance to look at each image on the cell | * This is so people have a chance to look at each image on the cell | ||
* and click on pages they want to view. | * and click on pages they want to view. | ||
*/ | */ | ||
− | $( | + | function pauseGrid( grid ) { |
− | + | $( grid ).hover( function() { | |
− | + | $( this ).find( '.grid .animated' ).removeClass( 'animated' ).addClass( 'paused' ); | |
− | + | }, function() { | |
− | + | $( this ).find( '.grid .paused' ).removeClass( 'paused' ).addClass( 'animated' ); | |
− | + | } ); | |
− | + | } | |
− | } | + | pauseGrid( '.grid-Crafting_Table' ); |
− | + | pauseGrid( '.grid-Furnace' ); | |
+ | pauseGrid( '.grid-Brewing_Stand' ); | ||
/** | /** | ||
Línea 180: | Línea 150: | ||
*/ | */ | ||
if ( $.client.profile().name === 'msie' && $.client.profile().versionBase === '8' ) { | if ( $.client.profile().name === 'msie' && $.client.profile().versionBase === '8' ) { | ||
− | + | $( '.navbox-list li:last' ).addClass( 'last-child' ); | |
} | } | ||
− | |||
/** | /** | ||
Línea 190: | Línea 159: | ||
* Use with [[Template:LoadPage]] | * Use with [[Template:LoadPage]] | ||
*/ | */ | ||
− | var | + | var baseURL = '/', loadText = 'Load content', showText = 'Expand content', hideText = 'Collapse content'; |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | $( | + | $( '.load-page' ).find( '.mw-headline:first' ).append( '<span class="load-page-button" style="margin-left:10px;font-weight:normal">[<span class="jslink">' + loadText + '</span>]</span>' ); |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | /* | + | $( '.load-page-button > .jslink' ).live( 'click', function() { |
− | + | var $this = $( this ), $body = $this.closest( '.load-page' ), $content = $body.find( '.load-page-content' ); | |
− | + | ||
− | mw.loader.using( ' | + | if ( $body.hasClass( 'loading' ) ) { |
− | + | return; | |
+ | } | ||
+ | if ( $this.text() === loadText ) { | ||
+ | $body.addClass( 'loading' ); | ||
+ | $( 'body' ).css( 'cursor', 'wait' ); | ||
+ | $.ajax( { | ||
+ | url: baseURL + 'api.php?format=json&action=parse&prop=text&redirects=1&page=' + mw.util.wikiUrlencode( $body.data( 'page' ) ), | ||
+ | dataType: 'json', | ||
+ | timeout: 20000 | ||
+ | } ).done( function( data ) { | ||
+ | if ( data.error ) { | ||
+ | if ( $( '#error-dialog' ).length ) { | ||
+ | return; | ||
+ | } | ||
+ | mw.loader.using( 'jquery.ui.dialog', function() { | ||
+ | $body.removeClass( 'loading' ); | ||
+ | $( 'body' ).css( 'cursor', 'auto' ); | ||
+ | |||
+ | $( '#netbar' ).after( '<div id="error-dialog" />' ); | ||
+ | $( '#error-dialog' ).html( '<p><strong>Error:</strong> ' + data.error.info + '</p>' ).dialog( { | ||
+ | title: 'Hey! Listen!', | ||
+ | resizable: false, | ||
+ | width: 400, | ||
+ | modal: true, | ||
+ | buttons: { | ||
+ | 'Retry': function() { | ||
+ | $this.click(); | ||
+ | $( this ).dialog( 'destroy' ); | ||
+ | $( '#error-dialog' ).remove(); | ||
+ | }, | ||
+ | Cancel: function() { | ||
+ | $( this ).dialog( 'destroy' ); | ||
+ | $( '#error-dialog' ).remove(); | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | } ); | ||
+ | } ); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | $content.html( data.parse.text['*'] ); | ||
+ | $this.text( hideText ); | ||
+ | $body.removeClass( 'loading' ); | ||
+ | $( 'body' ).css( 'cursor', 'auto' ); | ||
+ | } ).fail( function( error ) { | ||
+ | if ( $( '#error-dialog' ).length ) { | ||
+ | return; | ||
+ | } | ||
+ | mw.loader.using( 'jquery.ui.dialog', function() { | ||
+ | $body.removeClass( 'loading' ); | ||
+ | $( 'body' ).css( 'cursor', 'auto' ); | ||
+ | |||
+ | $( '#netbar' ).after( '<div id="error-dialog" />' ); | ||
+ | if ( !error.responseText ){ | ||
+ | $( '#error-dialog' ).html( '<p><strong>Error:</strong> No response from the server</p>' ); | ||
+ | } else { | ||
+ | $( '#error-dialog' ).html( '<p><strong>Error:</strong> ' + error.responseText + '</p>' ); | ||
+ | } | ||
+ | $( '#error-dialog' ).dialog( { | ||
+ | title: 'Hey! Listen!', | ||
+ | resizable: false, | ||
+ | width: 400, | ||
+ | modal: true, | ||
+ | buttons: { | ||
+ | 'Retry': function() { | ||
+ | $this.click(); | ||
+ | $( this ).dialog( 'destroy' ); | ||
+ | $( '#error-dialog' ).remove(); | ||
+ | }, | ||
+ | Cancel: function() { | ||
+ | $( this ).dialog( 'destroy' ); | ||
+ | $( '#error-dialog' ).remove(); | ||
+ | return; | ||
+ | } | ||
+ | } | ||
+ | } ); | ||
+ | } ); | ||
+ | } ); | ||
+ | } else if ( $this.text() === showText ) { | ||
+ | $content.show(); | ||
+ | $this.text( hideText ); | ||
+ | } else { | ||
+ | $content.hide(); | ||
+ | $this.text( showText ); | ||
+ | } | ||
} ); | } ); | ||
/** | /** | ||
− | * | + | * Frame parser (for [[Template:Grid]]) |
− | * | + | * |
− | * | + | * Requests the urls for all the animated grids on a page in 2 |
+ | * API requests (due to a bug, 1 API request when it is fixed) | ||
+ | * and appends them to the correct location. | ||
*/ | */ | ||
− | /*if ( $( '. | + | var baseURL = '/', wikiURL = '/wiki/', $grids = $( '.grid' ), titles = [], titleCount = 0, section = 0; |
− | + | if ( $grids.length ) { | |
+ | $grids.each( function() { | ||
+ | var imgs = $( this ).data( 'imgs' ), mod = $( this ).data( 'mod' ); | ||
+ | if ( !imgs ) { | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | imgs = imgs.split( ';' ); | ||
+ | imgs.shift(); | ||
+ | $.each( imgs, function() { | ||
+ | if ( !this.trim() ) { | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | if ( titleCount === 50 ) { | ||
+ | titleCount = 0; | ||
+ | section++; | ||
+ | } | ||
+ | if ( !titles[section] ) { | ||
+ | titles[section] = ''; | ||
+ | } | ||
+ | |||
+ | if ( this.indexOf( ':' ) > -1 ) { | ||
+ | this.replace( /([^:]*):?([^,]*)/, function( $, mod, name ) { | ||
+ | if ( mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { | ||
+ | if ( titles[section].indexOf( 'File:Grid ' + name.trim() + '.png' ) < 0 ) { | ||
+ | titles[section] += 'File:Grid ' + name.trim() + '.png|'; | ||
+ | titleCount++; | ||
+ | } | ||
+ | } else { | ||
+ | if ( titles[section].indexOf( 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png' ) < 0 ) { | ||
+ | titles[section] += 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png|'; | ||
+ | titleCount++; | ||
+ | } | ||
+ | } | ||
+ | } ); | ||
+ | } else { | ||
+ | this.replace( /([^,]*)/, function( $, name ) { | ||
+ | if ( !mod || mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { | ||
+ | if ( titles[section].indexOf( 'File:Grid ' + name.trim() + '.png' ) < 0 ) { | ||
+ | titles[section] += 'File:Grid ' + name.trim() + '.png|'; | ||
+ | titleCount++; | ||
+ | } | ||
+ | } else { | ||
+ | if ( titles[section].indexOf( 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png' ) < 0 ) { | ||
+ | titles[section] += 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png|'; | ||
+ | titleCount++; | ||
+ | } | ||
+ | } | ||
+ | } ); | ||
+ | } | ||
+ | } ); | ||
+ | } ); | ||
+ | |||
+ | /* Thanks to bug 23750 (https://bugzilla.wikimedia.org/show_bug.cgi?id=23750) | ||
+ | * &redirects doesn't work properly with prop=imageinfo. Some of the images | ||
+ | * will return without any imageinfo, even though they are valid. | ||
+ | * So the redirects have to be resolved in a separate request... | ||
+ | */ | ||
+ | if ( titles ) { | ||
+ | var promise = [], redirects = {}, urls = {}; | ||
+ | $.each( titles, function( index ) { | ||
+ | var titleSection = this.slice( 0, -1 ); | ||
+ | promise.push( | ||
+ | $.ajax( { | ||
+ | type: 'POST', | ||
+ | url: baseURL + 'api.php?action=query&format=json&redirects', | ||
+ | data: { titles: titleSection }, | ||
+ | timeout: 20000 | ||
+ | } ).done( function( data ) { | ||
+ | if ( data.query.redirects ) { | ||
+ | $.each( data.query.redirects, function() { | ||
+ | redirects[this.to] = this.from; | ||
+ | titles[index] = titles[index].replace( this.from, this.to ); | ||
+ | } ); | ||
+ | } | ||
+ | } ).fail( function( error ) { | ||
+ | console.error( error ); | ||
+ | } ) | ||
+ | ); | ||
+ | } ); | ||
+ | $.when.apply( $, promise ).then( function() { | ||
+ | promise.length = 0; | ||
+ | $.each( titles, function() { | ||
+ | var titles = this.slice( 0, -1 ); | ||
+ | promise.push( | ||
+ | $.ajax( { | ||
+ | type: 'POST', | ||
+ | url: baseURL + 'api.php?action=query&format=json&prop=imageinfo&iiprop=url&iiurlwidth=32&iiurlheight=32', | ||
+ | data: { titles: titles }, | ||
+ | timeout: 20000 | ||
+ | } ).done( function( data ) { | ||
+ | $.each( data.query.pages, function( index ) { | ||
+ | if ( index < 0 ) { | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | if ( redirects.hasOwnProperty( this.title ) ) { | ||
+ | urls[redirects[this.title].replace( /File:Grid (.*).png/, '$1' )] = this.imageinfo[0].thumburl; | ||
+ | } else { | ||
+ | urls[this.title.replace( /File:Grid (.*).png/, '$1' )] = this.imageinfo[0].thumburl; | ||
+ | } | ||
+ | } ); | ||
+ | } ).fail( function( error ) { | ||
+ | console.error( error ); | ||
+ | } ) | ||
+ | ); | ||
+ | } ); | ||
+ | |||
+ | $.when.apply( $, promise ).then( function() { | ||
+ | $grids.each( function() { | ||
+ | var $grid = $( this ), imgs = $grid.data( 'imgs' ), mod = $( this ).data( 'mod' ), html = ''; | ||
+ | if ( !imgs ) { | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | imgs = imgs.split( ';' ); | ||
+ | imgs.shift(); | ||
+ | $.each( imgs, function() { | ||
+ | if ( !this.trim() ) { | ||
+ | html += gridFormat(); | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | if ( this.indexOf( ':' ) > -1 ) { | ||
+ | this.replace( /([^:]*):?([^,]*),?(\d*)/, function( $, mod, name, num ) { | ||
+ | if ( mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { | ||
+ | html += gridFormat( name.trim(), name.trim(), urls[name.trim()], num ); | ||
+ | } else { | ||
+ | var img = name.trim() + ' (' + mod.trim() + ')'; | ||
+ | html += gridFormat( img, 'Mods/' + mod.trim() + '/' + name.trim(), urls[img], num ); | ||
+ | } | ||
+ | } ); | ||
+ | } else { | ||
+ | this.replace( /([^,]*),?(\d*)/, function( $, name, num ) { | ||
+ | if ( !mod || mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { | ||
+ | html += gridFormat( name.trim(), name.trim(), urls[name.trim()], num ); | ||
+ | } else { | ||
+ | var img = name.trim() + ' (' + mod.trim() + ')'; | ||
+ | html += gridFormat( img, 'Mods/' + mod.trim() + '/' + name.trim(), urls[img], num ); | ||
+ | } | ||
+ | } ); | ||
+ | } | ||
+ | } ); | ||
+ | |||
+ | $grid.find( '> .border > span > .animated' ).append( html ); | ||
+ | } ); | ||
+ | } ); | ||
+ | } ); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function gridFormat( name, link, url, num ) { | ||
+ | var html = '<span class="image">'; | ||
+ | |||
+ | if ( name ) { | ||
+ | if ( url ) { | ||
+ | html += '<a title="' + link + '" href="' + wikiURL + link.replace( / /g, '_' ) + '"><img width="32" height="32" src="' + url + '" alt="' + name + '"></a>'; | ||
+ | if ( num ) { | ||
+ | html += '<span class="number"><a title="' + link + '" href="' + wikiURL + link.replace( / /g, '_' ) + '">' + num + '</a></span>'; | ||
+ | } | ||
+ | } else { | ||
+ | html += '<a class="new" title="File:Grid ' + name + '.png" href="' + baseURL + 'index.php?title=Special:Upload&wpDestFile=Grid_' + name.replace( / /g, '_' ) + '.png"></a>'; | ||
+ | } | ||
+ | } else { | ||
+ | html += ' '; | ||
+ | } | ||
+ | |||
+ | return html += '</span>'; | ||
+ | } | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | /** | + | /** Edittools javascript loader ************************************************ |
− | * | + | * |
+ | * Description: Pulls in [[MediaWiki:Edittools.js]]. Includes a cache-bypassing | ||
+ | * version number in the URL in order to allow any changes to the edittools to | ||
+ | * be rapidly deployed to users. | ||
+ | * | ||
+ | * Note that, by default, this function does nothing unless the element with | ||
+ | * the ID "editpage-specialchars" (which contains the old edittools code in | ||
+ | * [[MediaWiki:Edittools]], and will be retained as a placeholder in the new | ||
+ | * implementation) has a class named "edittools-version-NNN", where NNN is a | ||
+ | * number. If the class name has "test" before the number, the code will only | ||
+ | * run for users who have set "window.testJsEdittools = true" in their user JS. | ||
+ | * The "test" should be retained in the class name until the new edittools | ||
+ | * implementation is ready and fully tested, and until at least 30 days have | ||
+ | * passed since this loader stub was added (which will be in 27 June 2008). | ||
+ | * | ||
+ | * For compatibility with Alex Smotrov's original implementation, on which this | ||
+ | * code is loosely based (see [[mw:User talk:Alex Smotrov/edittools.js]]), this | ||
+ | * loader can also be disabled by setting "window.noDefaultEdittools = true". | ||
+ | * | ||
+ | * Maintainers: [[User:Ilmari Karonen]] | ||
*/ | */ | ||
− | / | + | |
− | + | //Prevent the static edittools from flashing before the compact edittools below is loaded. | |
− | + | appendCSS('div.edittools-text { display:none; }'); | |
− | + | ||
− | + | addOnloadHook(function () { | |
− | + | // needs to be deferred until the DOM has fully loaded | |
− | + | var placeholder = document.getElementById("editpage-specialchars"); | |
− | + | if (!placeholder || window.noDefaultEdittools) { | |
− | + | //Show the static edittools again for users with "window.noDefaultEdittools=true". | |
− | + | appendCSS('div.edittools-text { display:block; }'); | |
− | + | return; | |
− | + | } | |
− | + | var match = /(?:^| )edittools-version-(\d+)(?: |$)/.exec(placeholder.className); | |
− | + | ||
− | + | // set window.testJsEdittools = true to enable testing before full deployment | |
− | + | if (!match && window.testJsEdittools) | |
− | + | match = /(?:^| )edittools-version-(test\d+)(?: |$)/.exec(placeholder.className); | |
− | + | ||
+ | if (!match) return; | ||
+ | var url = wgScript + '?title=MediaWiki:Edittools.js&action=raw&ctype=text/javascript&nocache=' + match[1]; | ||
+ | importScriptURI(url); | ||
+ | }); | ||
+ | |||
+ | |||
+ | // Turn on spellchecking in the edit summary field, for Firefox. | ||
+ | // Temporary until [[bugzilla:21604]] is deployed | ||
+ | addOnloadHook( function() { | ||
+ | var wpSummary = document.getElementById( "wpSummary" ); | ||
+ | if ( wpSummary && typeof wpSummary.spellcheck != undefined ) | ||
+ | wpSummary.spellcheck = true; | ||
+ | } ); | ||
− | + | / Collapsible tables / | |
− | + | if ( wgIsArticle || window.location.href.indexOf( 'action=submit' ) > -1 ) | |
− | + | { | |
− | + | var script = document.createElement( 'script' ); | |
− | + | script.src = '/index.php?title=MediaWiki:CollapsibleTables.js&action=raw&ctype=text/javascript'; | |
− | + | script.type = 'text/javascript'; | |
− | + | document.getElementsByTagName( 'head' )[0].appendChild( script ); | |
− | + | ||
− | + | hookEvent( 'load', function() | |
− | + | { | |
− | + | new CollapsibleTables(); | |
− | + | } ); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | |||
− | |||
/** | /** | ||
− | * | + | * Frame parser (for [[Template:Grid]]) |
− | * | + | * |
− | * | + | * Requests the urls for all the animated grids on a page in 2 |
+ | * API requests (due to a bug, 1 API request when it is fixed) | ||
+ | * and appends them to the correct location. | ||
*/ | */ | ||
− | if ( | + | var baseURL = '/', wikiURL = '/wiki/', $grids = $( '.grid' ), titles = [], titleCount = 0, section = 0; |
− | + | if ( $grids.length ) { | |
− | + | $grids.each( function() { | |
− | + | var imgs = $( this ).data( 'imgs' ), mod = $( this ).data( 'mod' ); | |
− | + | if ( !imgs ) { | |
− | + | return true; | |
− | + | } | |
− | + | ||
− | + | imgs = imgs.split( ';' ); | |
− | + | imgs.shift(); | |
− | + | $.each( imgs, function() { | |
− | + | if ( !this.trim() ) { | |
− | + | return true; | |
+ | } | ||
+ | |||
+ | if ( titleCount === 50 ) { | ||
+ | titleCount = 0; | ||
+ | section++; | ||
+ | } | ||
+ | if ( !titles[section] ) { | ||
+ | titles[section] = ''; | ||
+ | } | ||
+ | |||
+ | if ( this.indexOf( ':' ) > -1 ) { | ||
+ | this.replace( /([^:]*):?([^,]*)/, function( $, mod, name ) { | ||
+ | if ( mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { | ||
+ | if ( titles[section].indexOf( 'File:Grid ' + name.trim() + '.png' ) < 0 ) { | ||
+ | titles[section] += 'File:Grid ' + name.trim() + '.png|'; | ||
+ | titleCount++; | ||
+ | } | ||
+ | } else { | ||
+ | if ( titles[section].indexOf( 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png' ) < 0 ) { | ||
+ | titles[section] += 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png|'; | ||
+ | titleCount++; | ||
+ | } | ||
+ | } | ||
+ | } ); | ||
+ | } else { | ||
+ | this.replace( /([^,]*)/, function( $, name ) { | ||
+ | if ( !mod || mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { | ||
+ | if ( titles[section].indexOf( 'File:Grid ' + name.trim() + '.png' ) < 0 ) { | ||
+ | titles[section] += 'File:Grid ' + name.trim() + '.png|'; | ||
+ | titleCount++; | ||
+ | } | ||
+ | } else { | ||
+ | if ( titles[section].indexOf( 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png' ) < 0 ) { | ||
+ | titles[section] += 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png|'; | ||
+ | titleCount++; | ||
+ | } | ||
+ | } | ||
+ | } ); | ||
+ | } | ||
+ | } ); | ||
+ | } ); | ||
+ | |||
+ | /* Thanks to bug 23750 (https://bugzilla.wikimedia.org/show_bug.cgi?id=23750) | ||
+ | * &redirects doesn't work properly with prop=imageinfo. Some of the images | ||
+ | * will return without any imageinfo, even though they are valid. | ||
+ | * So the redirects have to be resolved in a separate request... | ||
+ | */ | ||
+ | if ( titles ) { | ||
+ | var promise = [], redirects = {}, urls = {}; | ||
+ | $.each( titles, function( index ) { | ||
+ | var titleSection = this.slice( 0, -1 ); | ||
+ | promise.push( | ||
+ | $.ajax( { | ||
+ | type: 'POST', | ||
+ | url: baseURL + 'api.php?action=query&format=json&redirects', | ||
+ | data: { titles: titleSection }, | ||
+ | timeout: 20000 | ||
+ | } ).done( function( data ) { | ||
+ | if ( data.query.redirects ) { | ||
+ | $.each( data.query.redirects, function() { | ||
+ | redirects[this.to] = this.from; | ||
+ | titles[index] = titles[index].replace( this.from, this.to ); | ||
+ | } ); | ||
+ | } | ||
+ | } ).fail( function( error ) { | ||
+ | console.error( error ); | ||
+ | } ) | ||
+ | ); | ||
+ | } ); | ||
+ | $.when.apply( $, promise ).then( function() { | ||
+ | promise.length = 0; | ||
+ | $.each( titles, function() { | ||
+ | var titles = this.slice( 0, -1 ); | ||
+ | promise.push( | ||
+ | $.ajax( { | ||
+ | type: 'POST', | ||
+ | url: baseURL + 'api.php?action=query&format=json&prop=imageinfo&iiprop=url&iiurlwidth=32&iiurlheight=32', | ||
+ | data: { titles: titles }, | ||
+ | timeout: 20000 | ||
+ | } ).done( function( data ) { | ||
+ | $.each( data.query.pages, function( index ) { | ||
+ | if ( index < 0 ) { | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | if ( redirects.hasOwnProperty( this.title ) ) { | ||
+ | urls[redirects[this.title].replace( /File:Grid (.*).png/, '$1' )] = this.imageinfo[0].thumburl; | ||
+ | } else { | ||
+ | urls[this.title.replace( /File:Grid (.*).png/, '$1' )] = this.imageinfo[0].thumburl; | ||
+ | } | ||
+ | } ); | ||
+ | } ).fail( function( error ) { | ||
+ | console.error( error ); | ||
+ | } ) | ||
+ | ); | ||
+ | } ); | ||
+ | |||
+ | $.when.apply( $, promise ).then( function() { | ||
+ | $grids.each( function() { | ||
+ | var $grid = $( this ), imgs = $grid.data( 'imgs' ), mod = $( this ).data( 'mod' ), html = ''; | ||
+ | if ( !imgs ) { | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | imgs = imgs.split( ';' ); | ||
+ | imgs.shift(); | ||
+ | $.each( imgs, function() { | ||
+ | if ( !this.trim() ) { | ||
+ | html += gridFormat(); | ||
+ | return true; | ||
+ | } | ||
+ | |||
+ | if ( this.indexOf( ':' ) > -1 ) { | ||
+ | this.replace( /([^:]*):?([^,]*),?(\d*)/, function( $, mod, name, num ) { | ||
+ | if ( mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { | ||
+ | html += gridFormat( name.trim(), name.trim(), urls[name.trim()], num ); | ||
+ | } else { | ||
+ | var img = name.trim() + ' (' + mod.trim() + ')'; | ||
+ | html += gridFormat( img, 'Mods/' + mod.trim() + '/' + name.trim(), urls[img], num ); | ||
+ | } | ||
+ | } ); | ||
+ | } else { | ||
+ | this.replace( /([^,]*),?(\d*)/, function( $, name, num ) { | ||
+ | if ( !mod || mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { | ||
+ | html += gridFormat( name.trim(), name.trim(), urls[name.trim()], num ); | ||
+ | } else { | ||
+ | var img = name.trim() + ' (' + mod.trim() + ')'; | ||
+ | html += gridFormat( img, 'Mods/' + mod.trim() + '/' + name.trim(), urls[img], num ); | ||
+ | } | ||
+ | } ); | ||
+ | } | ||
+ | } ); | ||
+ | |||
+ | $grid.find( '> .border > span > .animated' ).append( html ); | ||
+ | } ); | ||
+ | } ); | ||
+ | } ); | ||
+ | } | ||
} | } | ||
− | + | function gridFormat( name, link, url, num ) { | |
− | + | var html = '<span class="image">'; | |
− | + | ||
− | + | if ( name ) { | |
− | + | if ( url ) { | |
− | + | html += '<a title="' + link + '" href="' + wikiURL + link.replace( / /g, '_' ) + '"><img width="32" height="32" src="' + url + '" alt="' + name + '"></a>'; | |
− | + | if ( num ) { | |
− | + | html += '<span class="number"><a title="' + link + '" href="' + wikiURL + link.replace( / /g, '_' ) + '">' + num + '</a></span>'; | |
− | + | } | |
− | + | } else { | |
− | + | html += '<a class="new" title="File:Grid ' + name + '.png" href="' + baseURL + 'index.php?title=Special:Upload&wpDestFile=Grid_' + name.replace( / /g, '_' ) + '.png"></a>'; | |
− | + | } | |
− | + | } else { | |
− | + | html += ' '; | |
− | + | } | |
− | + | ||
− | + | return html += '</span>'; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
− | |||
− | |||
− | |||
− |
Revisión del 20:42 18 abr 2014
/* Cualquier código JavaScript escrito aquí se cargará para todos los usuarios en cada página. */ //<source lang="JavaScript"> /** Extra toolbar options ****************************************************** * * Description: Adds extra buttons to the editing toolbar. * * To disable this script, add <code>mwCustomEditButtons = */ if (mwCustomEditButtons) { mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c8/Button_redirect.png", "speedTip": "Redirect", "tagOpen": "#REDIRECT [[", "tagClose": "]]", "sampleText": "Target page name" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c9/Button_strike.png", "speedTip": "Strike", "tagOpen": "<s>", "tagClose": "</s>", "sampleText": "Strike-through text" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/1/13/Button_enter.png", "speedTip": "Line break", "tagOpen": "<br />", "tagClose": "", "sampleText": "" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/8/80/Button_upper_letter.png", "speedTip": "Superscript", "tagOpen": "<sup>", "tagClose": "</sup>", "sampleText": "Superscript text" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/7/70/Button_lower_letter.png", "speedTip": "Subscript", "tagOpen": "<sub>", "tagClose": "</sub>", "sampleText": "Subscript text" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/5/58/Button_small.png", "speedTip": "Small", "tagOpen": "<small>", "tagClose": "</small>", "sampleText": "Small Text" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/3/34/Button_hide_comment.png", "speedTip": "Insert hidden Comment", "tagOpen": "<!-- ", "tagClose": " -->", "sampleText": "Comment" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/1/12/Button_gallery.png", "speedTip": "Insert a picture gallery", "tagOpen": "\n<gallery>\n", "tagClose": "\n</gallery>", "sampleText": "Image:Example.jpg|Caption1\nImage:Example.jpg|Caption2" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/f/fd/Button_blockquote.png", "speedTip": "Insert block of quoted text", "tagOpen": "<blockquote>\n", "tagClose": "\n</blockquote>", "sampleText": "Block quote" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/en/6/60/Button_insert_table.png", "speedTip": "Insert a table", "tagOpen": '{| class="wikitable"\n|', "tagClose": "\n|}", "sampleText": "-\n! header 1\n! header 2\n! header 3\n|-\n| row 1, cell 1\n| row 1, cell 2\n| row 1, cell 3\n|-\n| row 2, cell 1\n| row 2, cell 2\n| row 2, cell 3" }); mwCustomEditButtons.push({ "imageFile": "http://upload.wikimedia.org/wikipedia/commons/7/79/Button_reflink.png", "speedTip": "Insert a reference", "tagOpen": "<ref>", "tagClose": "</ref>", "sampleText": "Insert footnote text here" }); } //fix edit summary prompt for undo //this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the //edit summary unchanged //this was added by [[User:Deskana]], code by [[User:Tra]] //see bug 8912 addOnloadHook(function () { if (document.location.search.indexOf("undo=") != -1 && document.getElementsByName('wpAutoSummary')[0]) { document.getElementsByName('wpAutoSummary')[0].value='1'; } }) /** * Element animator (used in [[Template:Grid]]) * * Will cycle the active class on any child elements within an element with the animated class. */ if ( $( '.animated' ).length ) { setInterval( function() { $( '.animated' ).each( function() { var current = $( this ).find( '.active' ).removeClass( 'active' ), next = current.next(); if ( !current.next().length ) { next = $( this ).children().eq( 0 ); } next.addClass( 'active' ); } ); }, 2000 ); } /** * Pause grid templates with lots of cells in them (e.g. [[Template:Grid/Crafting Table]]) on mouseover * * This is so people have a chance to look at each image on the cell * and click on pages they want to view. */ function pauseGrid( grid ) { $( grid ).hover( function() { $( this ).find( '.grid .animated' ).removeClass( 'animated' ).addClass( 'paused' ); }, function() { $( this ).find( '.grid .paused' ).removeClass( 'paused' ).addClass( 'animated' ); } ); } pauseGrid( '.grid-Crafting_Table' ); pauseGrid( '.grid-Furnace' ); pauseGrid( '.grid-Brewing_Stand' ); /** * Add fake last-child class in navboxes for IE8 */ if ( $.client.profile().name === 'msie' && $.client.profile().versionBase === '8' ) { $( '.navbox-list li:last' ).addClass( 'last-child' ); } /** * Page loader * * Allows a page to be downloaded and shown within another page. * Use with [[Template:LoadPage]] */ var baseURL = '/', loadText = 'Load content', showText = 'Expand content', hideText = 'Collapse content'; $( '.load-page' ).find( '.mw-headline:first' ).append( '<span class="load-page-button" style="margin-left:10px;font-weight:normal">[<span class="jslink">' + loadText + '</span>]</span>' ); $( '.load-page-button > .jslink' ).live( 'click', function() { var $this = $( this ), $body = $this.closest( '.load-page' ), $content = $body.find( '.load-page-content' ); if ( $body.hasClass( 'loading' ) ) { return; } if ( $this.text() === loadText ) { $body.addClass( 'loading' ); $( 'body' ).css( 'cursor', 'wait' ); $.ajax( { url: baseURL + 'api.php?format=json&action=parse&prop=text&redirects=1&page=' + mw.util.wikiUrlencode( $body.data( 'page' ) ), dataType: 'json', timeout: 20000 } ).done( function( data ) { if ( data.error ) { if ( $( '#error-dialog' ).length ) { return; } mw.loader.using( 'jquery.ui.dialog', function() { $body.removeClass( 'loading' ); $( 'body' ).css( 'cursor', 'auto' ); $( '#netbar' ).after( '<div id="error-dialog" />' ); $( '#error-dialog' ).html( '<p><strong>Error:</strong> ' + data.error.info + '</p>' ).dialog( { title: 'Hey! Listen!', resizable: false, width: 400, modal: true, buttons: { 'Retry': function() { $this.click(); $( this ).dialog( 'destroy' ); $( '#error-dialog' ).remove(); }, Cancel: function() { $( this ).dialog( 'destroy' ); $( '#error-dialog' ).remove(); return; } } } ); } ); return; } $content.html( data.parse.text['*'] ); $this.text( hideText ); $body.removeClass( 'loading' ); $( 'body' ).css( 'cursor', 'auto' ); } ).fail( function( error ) { if ( $( '#error-dialog' ).length ) { return; } mw.loader.using( 'jquery.ui.dialog', function() { $body.removeClass( 'loading' ); $( 'body' ).css( 'cursor', 'auto' ); $( '#netbar' ).after( '<div id="error-dialog" />' ); if ( !error.responseText ){ $( '#error-dialog' ).html( '<p><strong>Error:</strong> No response from the server</p>' ); } else { $( '#error-dialog' ).html( '<p><strong>Error:</strong> ' + error.responseText + '</p>' ); } $( '#error-dialog' ).dialog( { title: 'Hey! Listen!', resizable: false, width: 400, modal: true, buttons: { 'Retry': function() { $this.click(); $( this ).dialog( 'destroy' ); $( '#error-dialog' ).remove(); }, Cancel: function() { $( this ).dialog( 'destroy' ); $( '#error-dialog' ).remove(); return; } } } ); } ); } ); } else if ( $this.text() === showText ) { $content.show(); $this.text( hideText ); } else { $content.hide(); $this.text( showText ); } } ); /** * Frame parser (for [[Template:Grid]]) * * Requests the urls for all the animated grids on a page in 2 * API requests (due to a bug, 1 API request when it is fixed) * and appends them to the correct location. */ var baseURL = '/', wikiURL = '/wiki/', $grids = $( '.grid' ), titles = [], titleCount = 0, section = 0; if ( $grids.length ) { $grids.each( function() { var imgs = $( this ).data( 'imgs' ), mod = $( this ).data( 'mod' ); if ( !imgs ) { return true; } imgs = imgs.split( ';' ); imgs.shift(); $.each( imgs, function() { if ( !this.trim() ) { return true; } if ( titleCount === 50 ) { titleCount = 0; section++; } if ( !titles[section] ) { titles[section] = ''; } if ( this.indexOf( ':' ) > -1 ) { this.replace( /([^:]*):?([^,]*)/, function( $, mod, name ) { if ( mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { if ( titles[section].indexOf( 'File:Grid ' + name.trim() + '.png' ) < 0 ) { titles[section] += 'File:Grid ' + name.trim() + '.png|'; titleCount++; } } else { if ( titles[section].indexOf( 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png' ) < 0 ) { titles[section] += 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png|'; titleCount++; } } } ); } else { this.replace( /([^,]*)/, function( $, name ) { if ( !mod || mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { if ( titles[section].indexOf( 'File:Grid ' + name.trim() + '.png' ) < 0 ) { titles[section] += 'File:Grid ' + name.trim() + '.png|'; titleCount++; } } else { if ( titles[section].indexOf( 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png' ) < 0 ) { titles[section] += 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png|'; titleCount++; } } } ); } } ); } ); /* Thanks to bug 23750 (https://bugzilla.wikimedia.org/show_bug.cgi?id=23750) * &redirects doesn't work properly with prop=imageinfo. Some of the images * will return without any imageinfo, even though they are valid. * So the redirects have to be resolved in a separate request... */ if ( titles ) { var promise = [], redirects = {}, urls = {}; $.each( titles, function( index ) { var titleSection = this.slice( 0, -1 ); promise.push( $.ajax( { type: 'POST', url: baseURL + 'api.php?action=query&format=json&redirects', data: { titles: titleSection }, timeout: 20000 } ).done( function( data ) { if ( data.query.redirects ) { $.each( data.query.redirects, function() { redirects[this.to] = this.from; titles[index] = titles[index].replace( this.from, this.to ); } ); } } ).fail( function( error ) { console.error( error ); } ) ); } ); $.when.apply( $, promise ).then( function() { promise.length = 0; $.each( titles, function() { var titles = this.slice( 0, -1 ); promise.push( $.ajax( { type: 'POST', url: baseURL + 'api.php?action=query&format=json&prop=imageinfo&iiprop=url&iiurlwidth=32&iiurlheight=32', data: { titles: titles }, timeout: 20000 } ).done( function( data ) { $.each( data.query.pages, function( index ) { if ( index < 0 ) { return true; } if ( redirects.hasOwnProperty( this.title ) ) { urls[redirects[this.title].replace( /File:Grid (.*).png/, '$1' )] = this.imageinfo[0].thumburl; } else { urls[this.title.replace( /File:Grid (.*).png/, '$1' )] = this.imageinfo[0].thumburl; } } ); } ).fail( function( error ) { console.error( error ); } ) ); } ); $.when.apply( $, promise ).then( function() { $grids.each( function() { var $grid = $( this ), imgs = $grid.data( 'imgs' ), mod = $( this ).data( 'mod' ), html = ''; if ( !imgs ) { return true; } imgs = imgs.split( ';' ); imgs.shift(); $.each( imgs, function() { if ( !this.trim() ) { html += gridFormat(); return true; } if ( this.indexOf( ':' ) > -1 ) { this.replace( /([^:]*):?([^,]*),?(\d*)/, function( $, mod, name, num ) { if ( mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { html += gridFormat( name.trim(), name.trim(), urls[name.trim()], num ); } else { var img = name.trim() + ' (' + mod.trim() + ')'; html += gridFormat( img, 'Mods/' + mod.trim() + '/' + name.trim(), urls[img], num ); } } ); } else { this.replace( /([^,]*),?(\d*)/, function( $, name, num ) { if ( !mod || mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { html += gridFormat( name.trim(), name.trim(), urls[name.trim()], num ); } else { var img = name.trim() + ' (' + mod.trim() + ')'; html += gridFormat( img, 'Mods/' + mod.trim() + '/' + name.trim(), urls[img], num ); } } ); } } ); $grid.find( '> .border > span > .animated' ).append( html ); } ); } ); } ); } } function gridFormat( name, link, url, num ) { var html = '<span class="image">'; if ( name ) { if ( url ) { html += '<a title="' + link + '" href="' + wikiURL + link.replace( / /g, '_' ) + '"><img width="32" height="32" src="' + url + '" alt="' + name + '"></a>'; if ( num ) { html += '<span class="number"><a title="' + link + '" href="' + wikiURL + link.replace( / /g, '_' ) + '">' + num + '</a></span>'; } } else { html += '<a class="new" title="File:Grid ' + name + '.png" href="' + baseURL + 'index.php?title=Special:Upload&wpDestFile=Grid_' + name.replace( / /g, '_' ) + '.png"></a>'; } } else { html += ' '; } return html += '</span>'; } /** Edittools javascript loader ************************************************ * * Description: Pulls in [[MediaWiki:Edittools.js]]. Includes a cache-bypassing * version number in the URL in order to allow any changes to the edittools to * be rapidly deployed to users. * * Note that, by default, this function does nothing unless the element with * the ID "editpage-specialchars" (which contains the old edittools code in * [[MediaWiki:Edittools]], and will be retained as a placeholder in the new * implementation) has a class named "edittools-version-NNN", where NNN is a * number. If the class name has "test" before the number, the code will only * run for users who have set "window.testJsEdittools = true" in their user JS. * The "test" should be retained in the class name until the new edittools * implementation is ready and fully tested, and until at least 30 days have * passed since this loader stub was added (which will be in 27 June 2008). * * For compatibility with Alex Smotrov's original implementation, on which this * code is loosely based (see [[mw:User talk:Alex Smotrov/edittools.js]]), this * loader can also be disabled by setting "window.noDefaultEdittools = true". * * Maintainers: [[User:Ilmari Karonen]] */ //Prevent the static edittools from flashing before the compact edittools below is loaded. appendCSS('div.edittools-text { display:none; }'); addOnloadHook(function () { // needs to be deferred until the DOM has fully loaded var placeholder = document.getElementById("editpage-specialchars"); if (!placeholder || window.noDefaultEdittools) { //Show the static edittools again for users with "window.noDefaultEdittools=true". appendCSS('div.edittools-text { display:block; }'); return; } var match = /(?:^| )edittools-version-(\d+)(?: |$)/.exec(placeholder.className); // set window.testJsEdittools = true to enable testing before full deployment if (!match && window.testJsEdittools) match = /(?:^| )edittools-version-(test\d+)(?: |$)/.exec(placeholder.className); if (!match) return; var url = wgScript + '?title=MediaWiki:Edittools.js&action=raw&ctype=text/javascript&nocache=' + match[1]; importScriptURI(url); }); // Turn on spellchecking in the edit summary field, for Firefox. // Temporary until [[bugzilla:21604]] is deployed addOnloadHook( function() { var wpSummary = document.getElementById( "wpSummary" ); if ( wpSummary && typeof wpSummary.spellcheck != undefined ) wpSummary.spellcheck = true; } ); / Collapsible tables / if ( wgIsArticle || window.location.href.indexOf( 'action=submit' ) > -1 ) { var script = document.createElement( 'script' ); script.src = '/index.php?title=MediaWiki:CollapsibleTables.js&action=raw&ctype=text/javascript'; script.type = 'text/javascript'; document.getElementsByTagName( 'head' )[0].appendChild( script ); hookEvent( 'load', function() { new CollapsibleTables(); } ); } /** * Frame parser (for [[Template:Grid]]) * * Requests the urls for all the animated grids on a page in 2 * API requests (due to a bug, 1 API request when it is fixed) * and appends them to the correct location. */ var baseURL = '/', wikiURL = '/wiki/', $grids = $( '.grid' ), titles = [], titleCount = 0, section = 0; if ( $grids.length ) { $grids.each( function() { var imgs = $( this ).data( 'imgs' ), mod = $( this ).data( 'mod' ); if ( !imgs ) { return true; } imgs = imgs.split( ';' ); imgs.shift(); $.each( imgs, function() { if ( !this.trim() ) { return true; } if ( titleCount === 50 ) { titleCount = 0; section++; } if ( !titles[section] ) { titles[section] = ''; } if ( this.indexOf( ':' ) > -1 ) { this.replace( /([^:]*):?([^,]*)/, function( $, mod, name ) { if ( mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { if ( titles[section].indexOf( 'File:Grid ' + name.trim() + '.png' ) < 0 ) { titles[section] += 'File:Grid ' + name.trim() + '.png|'; titleCount++; } } else { if ( titles[section].indexOf( 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png' ) < 0 ) { titles[section] += 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png|'; titleCount++; } } } ); } else { this.replace( /([^,]*)/, function( $, name ) { if ( !mod || mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { if ( titles[section].indexOf( 'File:Grid ' + name.trim() + '.png' ) < 0 ) { titles[section] += 'File:Grid ' + name.trim() + '.png|'; titleCount++; } } else { if ( titles[section].indexOf( 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png' ) < 0 ) { titles[section] += 'File:Grid ' + name.trim() + ' (' + mod.trim() + ').png|'; titleCount++; } } } ); } } ); } ); /* Thanks to bug 23750 (https://bugzilla.wikimedia.org/show_bug.cgi?id=23750) * &redirects doesn't work properly with prop=imageinfo. Some of the images * will return without any imageinfo, even though they are valid. * So the redirects have to be resolved in a separate request... */ if ( titles ) { var promise = [], redirects = {}, urls = {}; $.each( titles, function( index ) { var titleSection = this.slice( 0, -1 ); promise.push( $.ajax( { type: 'POST', url: baseURL + 'api.php?action=query&format=json&redirects', data: { titles: titleSection }, timeout: 20000 } ).done( function( data ) { if ( data.query.redirects ) { $.each( data.query.redirects, function() { redirects[this.to] = this.from; titles[index] = titles[index].replace( this.from, this.to ); } ); } } ).fail( function( error ) { console.error( error ); } ) ); } ); $.when.apply( $, promise ).then( function() { promise.length = 0; $.each( titles, function() { var titles = this.slice( 0, -1 ); promise.push( $.ajax( { type: 'POST', url: baseURL + 'api.php?action=query&format=json&prop=imageinfo&iiprop=url&iiurlwidth=32&iiurlheight=32', data: { titles: titles }, timeout: 20000 } ).done( function( data ) { $.each( data.query.pages, function( index ) { if ( index < 0 ) { return true; } if ( redirects.hasOwnProperty( this.title ) ) { urls[redirects[this.title].replace( /File:Grid (.*).png/, '$1' )] = this.imageinfo[0].thumburl; } else { urls[this.title.replace( /File:Grid (.*).png/, '$1' )] = this.imageinfo[0].thumburl; } } ); } ).fail( function( error ) { console.error( error ); } ) ); } ); $.when.apply( $, promise ).then( function() { $grids.each( function() { var $grid = $( this ), imgs = $grid.data( 'imgs' ), mod = $( this ).data( 'mod' ), html = ''; if ( !imgs ) { return true; } imgs = imgs.split( ';' ); imgs.shift(); $.each( imgs, function() { if ( !this.trim() ) { html += gridFormat(); return true; } if ( this.indexOf( ':' ) > -1 ) { this.replace( /([^:]*):?([^,]*),?(\d*)/, function( $, mod, name, num ) { if ( mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { html += gridFormat( name.trim(), name.trim(), urls[name.trim()], num ); } else { var img = name.trim() + ' (' + mod.trim() + ')'; html += gridFormat( img, 'Mods/' + mod.trim() + '/' + name.trim(), urls[img], num ); } } ); } else { this.replace( /([^,]*),?(\d*)/, function( $, name, num ) { if ( !mod || mod.trim().toLowerCase() === 'v' || mod.trim().toLowerCase() === 'vanilla' ) { html += gridFormat( name.trim(), name.trim(), urls[name.trim()], num ); } else { var img = name.trim() + ' (' + mod.trim() + ')'; html += gridFormat( img, 'Mods/' + mod.trim() + '/' + name.trim(), urls[img], num ); } } ); } } ); $grid.find( '> .border > span > .animated' ).append( html ); } ); } ); } ); } } function gridFormat( name, link, url, num ) { var html = '<span class="image">'; if ( name ) { if ( url ) { html += '<a title="' + link + '" href="' + wikiURL + link.replace( / /g, '_' ) + '"><img width="32" height="32" src="' + url + '" alt="' + name + '"></a>'; if ( num ) { html += '<span class="number"><a title="' + link + '" href="' + wikiURL + link.replace( / /g, '_' ) + '">' + num + '</a></span>'; } } else { html += '<a class="new" title="File:Grid ' + name + '.png" href="' + baseURL + 'index.php?title=Special:Upload&wpDestFile=Grid_' + name.replace( / /g, '_' ) + '.png"></a>'; } } else { html += ' '; } return html += '</span>'; }