Usuario:Pinguipedista/Taller/MediaWiki:Gadget-interlanguage-size.js

De Wikipedia, la enciclopedia libre

Nota: Después de guardar, debes refrescar la caché de tu navegador para ver los cambios. Internet Explorer: mantén presionada Ctrl mientras pulsas Actualizar. Firefox: mientras presionas Mayús pulsas el botón Actualizar, (o presiona Ctrl-Shift-R). Los usuarios de Google Chrome y Safari pueden simplemente pulsar el botón Recargar. Para más detalles e instrucciones acerca de otros exploradores, véase Ayuda:Cómo limpiar la caché.

/*
 * mediawiki-gadget-interlanguage-size
 *
 */
//<nowiki>
// TODO: show message warnings on every fail
/* global mediaWiki, jQuery*/
(function(mw, $){
  if ( window.gadgetInterlanguageSize === undefined )
  {
   var gadget = function () { gadget.init.apply( gadget, arguments); };
   window.gadgetInterlanguageSize = gadget;

   gadget.i18n = {
    'en': {
     'interlanguage-size-infotip': 'Compare sizes',
    },
    'es': {
     'interlanguage-size-infotip': 'Comparar tamaños',
    },
   };
   var language = mw.config.get('wgContentLanguage');
   if ( $.inArray( language, Object.keys(gadget.i18n) ) < 0 )
   {
    language = 'en'; // by default
   }

   var skin = {}; // to store skin related strings

   // just the internal classes used, easy to modify
   skin['interlanguage-size-button'] = 'interlanguage-size-button';
   skin['interlanguage-size-detail'] = 'interlanguage-size-detail';

   // target interface
   skin['p-lang-visible-interlanguage-targets'] = '' +
    '#p-lang .interlanguage-link[style=""] .interlanguage-link-target, ' +
    '#p-lang .interlanguage-link:not("[style]") .interlanguage-link-target';

   /* mw-gadget-interlanguage-size styles: */
   /* eslint-disable no-useless-concat */ // yes, I know, I put special comments between literals
   skin['interlanguage-size-style'] = `` +
   /* <@snippet from='mw://mediawiki.special.changeslist'> */`
.mw-plusminus-pos,
.mw-plusminus-neg,
.mw-plusminus-null {
 unicode-bidi:-moz-isolate;
 unicode-bidi:isolate
}
.mw-plusminus-pos {
 color:#006400;
}
.mw-plusminus-neg {
 color:#8b0000;
}
.mw-plusminus-null {
 color:#a2a9b1;
}` /* </@snippet> */ +
   /* <@snippet edited from='mw://mediawiki.interface.helpers.styles'> */`
.` + skin['interlanguage-size-detail'] + `.mw-diff-bytes:before {
 content:' ('
}
.` + skin['interlanguage-size-detail'] + `.mw-diff-bytes:after {
 content:')'
}` /* </@snippet> */ +
   /* <@snippet edited from='mw://ext.uls.interlanguage'> */`
.` + skin['interlanguage-size-button'] + ` {
 background: transparent no-repeat center top;`
   /* <@image license="CC-BY-4.0" src="https://commons.wikimedia.org/wiki/File:Font_Awesome_5_solid_ruler-combined.svg" author="Font Awesome Free 5.2.0 by @fontawesome - https://fontawesome.com" /> */ + `
 background-image: url("//upload.wikimedia.org/wikipedia/commons/thumb/1/13/Font_Awesome_5_solid_ruler-combined.svg/14px-Font_Awesome_5_solid_ruler-combined.svg.png");
 border: 0;
 min-width: 16px;
 min-height: 16px;
 float: right;
 cursor: pointer;
}
#p-lang .` + skin['interlanguage-size-button'] + `::-moz-focus-inner {
 border:0
}
#p-lang .` + skin['interlanguage-size-button'] + `:focus {
 outline: 1px solid #36c;
}
.skin-vector #p-lang .` + skin['interlanguage-size-button'] + ` {
 margin-top: 8px;
}` /* </@snippet> */ + `
.` + skin['interlanguage-size-button'] + ` {
 opacity: .6;
}
#p-lang .` + skin['interlanguage-size-button'] + `:hover {
 opacity: .8;
}
.` + skin['interlanguage-size-detail'] + ` {
 font-size: 95%;
}`;
   /* eslint-enable no-useless-concat */

   var apiGetSize = function ( title, urlApi )
   {
    var ver = 2;
    var api = urlApi ? new mw.ForeignApi(urlApi) : new mw.Api();
    return api.get ({
      action: 'query',
      prop: 'revisions',
      rvslots: '*',
      rvprop: 'size',
      titles: title,
      format: 'json',
      formatversion: ver
    })
    .then ( function (data, jqXHR) {
      if ( data && data.query && data.query.pages )
      {
       if ( ver === 2 )
       {
        data = data.query.pages[0];
       }
       else
       {
        data = data.query.pages[ Object.keys(data.query.pages)[0] ];
       }
       if ( data && data.revisions && data.revisions[0] && typeof(data.revisions[0].size) === 'number' )
       {
        return $.Deferred().resolve( data.revisions[0].size, jqXHR );
       }
      }
      return $.Deferred().reject();
    });
   };

   gadget.init = function ()
   {
    if ( $( skin['p-lang-visible-interlanguage-targets'] ).length > 0 )
    {
     mw.loader.addStyleTag( skin['interlanguage-size-style'] );
     $( '#p-lang' )
     .prepend(
      $( '<button/>' )
      .addClass( skin['interlanguage-size-button'] )
      .attr( 'title', this.i18n[language]['interlanguage-size-infotip'] )
      .on( 'click', this.exec )
     );
    }
   };
   gadget.exec = function ()
   {
    if ( $( '.' + skin['interlanguage-size-button'] ).length > 0 )
    {
     apiGetSize( mw.config.get('wgPageName') )
     .then( function (size) {
       $( '.' + skin['interlanguage-size-button'] ).remove();
       var local_size = size;
       if ( local_size )
       {
        $( skin['p-lang-visible-interlanguage-targets'] )
        .each( function (i, e) {
          var that = e;
          var lang = e.href.split('//')[1].split('.')[0] || null;
          var path = new RegExp('^' + mw.util.escapeRegExp( mw.config.get('wgArticlePath').replace('$1', '') ), '');
          var name = decodeURIComponent( e.pathname.replace(path, '') ).replace( /_/g, ' ' );
          if ( lang )
          {
           var servername = mw.config.get('wgServerName');
           var projecturl = '';
           if ( servername.split('.').length === 3 ) // lang.project.org
           {
            projecturl = servername.split('.').slice(1).join('.');
            apiGetSize( name, 'https://' + lang + '.' + projecturl + mw.util.wikiScript('api') )
            .then( function (size) {
              var inter_size = size;
              if ( inter_size )
              {
               var dif = (inter_size - local_size);
               var tag = Math.abs(dif) > 9999 ? '<strong/>' : '<span/>';
               var key = (dif > 0 ? 'mw-plusminus-pos' : (dif < 0 ? 'mw-plusminus-neg' : 'mw-plusminus-null'));
               var num = (dif > 0 ? '+' : (dif < 0 ? '−' : '')) + mw.language.convertNumber( Math.abs(dif) );
               $(tag)
               .addClass( [ skin['interlanguage-size-detail'], key, 'mw-diff-bytes' ] )
               .html(num)
               .insertAfter(that);
              }
            });
           }
          }
        });
       }
     });
    }
   };

   if( $.inArray( mw.config.get('wgNamespaceNumber'), mw.config.get('wgContentNamespaces') ) >= 0 &&
       mw.config.get('wgAction') === 'view' ) {
    $.when( mw.loader.using( [ 'mediawiki.util', 'mediawiki.api', 'mediawiki.ForeignApi' ] ), $.ready ).then( gadget );
   }
  }
})(mediaWiki, jQuery);
//</nowiki>