MediaWiki:Common.js
Revisión del 19:42 18 abr 2014 de Xstela (discusión | contribuciones)
/* 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>'; }