MediaWiki:Gadget-DeluxeHistory.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é.

(function(mw, $){

 var default_config = {
  loaded: false,
  options: ['sysop', 'bot'],
  css: '',
  cache: 7,
  i18n: {
   // message strings
   strMenuText: 'Purgar historial',
   strMenuInfo: 'Purgar la caché del historial',
   strMsgError: 'DeluxeHistory: Error en la recuperación de datos de la API',
  },
 };
 window.deluxehistory = $.extend( default_config, window.deluxehistory );

 // localStorage cache strings
 var lsDateName = 'mw-deluxehistory-userlist-date';
 var lsListName = 'mw-deluxehistory-userlist-list';
 var lsDelParam = 'deluxehistory';
 var lsDelValue = 'nocache';
 var lsDelCache = '&' + lsDelParam + '=' + lsDelValue;

 // className strings
 var cnListUserLink = 'mw-listuserlink';
 var cnSelfUserLink = 'mw-selfuserlink';

 function addClassName(item, name)
 {
  item.className = (' ' + item.className + ' ').split(' ' + name + ' ').join(' ').trim() + ' ' + name;
 }

 function readCache()
 {
  var cache = {};
  if( localStorage[lsListName] )
  {
   try
   {
    cache = JSON.parse(localStorage[lsListName]);
   }
   catch(e)
   {
    cache = {};
   }
  }
  return cache;
 }
 function saveCache(data)
 {
  localStorage[lsListName] = JSON.stringify(data);
 }

 function checkUserlist()
 {
  var opts = window.deluxehistory.options;
  if( !localStorage[lsDateName] || localStorage[lsDateName] < Date.now() )
  {
   var valid_groups = [
    'abusefilter', 'accountcreator', 'autopatrolled', 'bot', 'bureaucrat', 'checkuser', 'confirmed',
    'epcampus', 'epcoordinator', 'epinstructor', 'eponline', 'extendedmover', 'filemover',
    'flood', 'flow-bot', 'founder', 'import', 'ipblock-exempt', 'massmessage-sender', 'suppress',
    'patroller', 'researcher', 'reviewer', 'rollbacker', 'sysop', 'templateeditor', 'transwiki'
    /* 'autoreviewer': obsolete type replaced by 'autopatrolled' */
    /* 'extendedconfirmed': too big // [[:en:Wikipedia:User_access_levels#Extended_confirmed_users]] (31632 users) */
    /* 'steward': only listed on [[:m:Template:StewardsList]], CORS */
   ];
   var file = [];
   opts.forEach(function(group){
    if( ~$.inArray(group, valid_groups) )
    {
     file.push(
      $.get( mw.util.wikiScript(), {title: 'Special:Listusers', group: group, limit: 10000 } ) // en:wiki reviewer (6721 users) (27-jan-2017)
       .done(function(data){
        var list = readCache();
        var nodes = new DOMParser().parseFromString(data, "text/html").getElementById('content');
        Array.prototype.forEach.call(nodes.querySelectorAll('#mw-content-text > ul > li'), function(li){
         var a = li.querySelector('a.mw-userlink');
         var user = a.querySelector('bdi');
         user = user.innerText || user.textContent;
         list[user] = list[user] || {className: ''};
         addClassName(list[user], cnListUserLink + '-' + group);
        });
        saveCache(list);
       })
     );
    }
    else
    {
     if( group == 'steward' )
     {
      /* CORS load from meta.wikimedia.org using MW API */
      mw.loader.using( 'mediawiki.ForeignApi' ).done(function(){
       var api = new mw.ForeignApi( 'https://meta.wikimedia.org/w/api.php' );
       api.get({
        action: 'query',
        prop: 'links',
        plnamespace: 2,
        pllimit: 500,
        titles: 'Template:StewardsList'
       }).done(function(data){
        var list = readCache();
        var stub = function(link)
        {
         var user = link.title.replace('User:', '');
         list[user] = list[user] || {className: ''};
         addClassName(list[user], cnListUserLink + '-' + group);
        };
        for(var page in data.query.pages)
        {
         data.query.pages[page].links.forEach(stub);
        }
        saveCache(list);
       });
      });
     }
     if( group == 'mostactive-eswiki' && mw.config.get('wgServerName') == 'es.wikipedia.org' )
     {
      file.push(
       $.get( mw.util.wikiScript(), {title: 'Wikipedia:Usuarios_activos', action: 'raw' } )
        .done(function(data){
         var list = readCache();
         data.replace(/\/([^\|]+)\|\{\{formatnum:(\d+)\}\}\]\]$/gm, function($0, $1, $2){
          var user = $1;
          if(parseInt($2) >= 70)
          {
           list[user] = list[user] || {className: ''};
           addClassName(list[user], cnListUserLink + '-' + group);
          }
          return $0;
         });
         saveCache(list);
        })
      );
     }
    }
   });
   return $.when.apply($, file)
           .done(function(d){
            localStorage[lsDateName] = Date.now() + window.deluxehistory.cache * 24 * 60 * 60 * 1000;
           })
           .fail(function(e){
            mw.notify( window.deluxehistory.i18n.strMsgError );
           });
  }
  return $.when(true);
 }

 function markHistory(ul)
 {
  checkUserlist().done(function(){
   if(ul)
   {
    var list = readCache();
    Array.prototype.forEach.call(document.querySelectorAll(ul), function(li){
     var user, a = li.querySelector('a.mw-userlink, .wikibase-edit ~ .mw-changeslist-separator + a.extiw');
     if(a)
     {
      user = a.querySelector('bdi') || a;
      user = user.innerText || user.textContent;
      if( !li.querySelector('a.mw-userlink') )
       addClassName(a, 'mw-userlink');
      if( /(\d{1,3}\.){3}\d{1,3}|([\da-f]{1,4}:){7}[\da-f]{1,4}/i.test(user) )
       addClassName(a, 'mw-anonuserlink');
      if( li.querySelector('a.mw-anonuserlink') )
       addClassName(li, 'mw-anonuserlink');
      if( list[user] && list[user].className )
      {
       addClassName(li, list[user].className);
       addClassName(a, list[user].className);
      }
      if( user == mw.config.get('wgUserName') )
      {
       addClassName(li, cnSelfUserLink);
       addClassName(a, cnSelfUserLink);
      }
      if( user )
      {
       user = user.replaceAll(' ', '_');
       addClassName(li, 'mw-userlink' + '-' + user);
       addClassName(a, 'mw-userlink' + '-' + user);
      }
     } // else ignore hidden username
    });
    window.deluxehistory.loaded = true;
   }
  });
 }

 mw.loader.using('mediawiki.util').done(function(){
  if( mw.util.getParamValue(lsDelParam) == lsDelValue )
  {
   localStorage.removeItem(lsDateName);
   localStorage.removeItem(lsListName);
   location.href = location.href.replace(lsDelCache, '');
  }
 });

 function init()
 {
  var scCSS = '.mw-userlink{background-color:#ff8;}\r\n' +
              '.mw-userlink.mw-anonuserlink{background-color:#f88;}\r\n' +
              '.mw-userlink[class*="' + cnListUserLink + '-"]{background-color:#8cf;}\r\n' +
              '.mw-userlink.' + cnListUserLink + '-sysop{background-color:#8f8;}\r\n' +
              '.mw-userlink.' + cnListUserLink + '-bot{background-color:#8ff;}\r\n' +
              window.deluxehistory.css;
  mw.util.addCSS(scCSS);
  if( mw.config.get('wgAction') == 'history' )
  {
   if( !window.deluxehistory.loaded )
   {
    mw.util.addPortletLink(
     'p-cactions',
     location.href + lsDelCache,
     window.deluxehistory.i18n.strMenuText,
     'ca-purge-deluxehistory',
     window.deluxehistory.i18n.strMenuInfo
    );
   }
  }
  exec();
 }

 function exec()
 {
  if( mw.config.get('wgAction') == 'history' )
  {
   markHistory('#pagehistory li');
  }
  else if( mw.config.get('wgCanonicalSpecialPageName') == 'Recentchanges' ||
           mw.config.get('wgCanonicalSpecialPageName') == 'Watchlist' ||
           document.querySelector('.mw-changeslist') )

  {
   markHistory('.mw-changeslist > ul.special > li');
  }
  else if( mw.config.get('wgCanonicalSpecialPageName') == 'Log' )
  {
   markHistory('.mw-logevent-loglines li');
  }
  else if( mw.config.get('wgAction') == 'view' && document.querySelector('.diff') )
  {
   markHistory('#mw-diff-otitle2, #mw-diff-ntitle2');
  }
 }

 mw.loader.using(['mediawiki.util', 'user']).done(function(){
  init();
  mw.hook('wikipage.content').add( exec );
 });

})(mediaWiki, jQuery);