Usuario:Ciencia Al Poder/extraedatosPDanual.js

De WikiDex
Ir a la navegaciónIr a la búsqueda

Nota: Después de publicar, quizás necesite actualizar la caché de su navegador para ver los cambios.

  • Firefox/Safari: Mantenga presionada la tecla Shift mientras pulsa el botón Actualizar, o presiona Ctrl+F5 o Ctrl+R (⌘+R en Mac)
  • Google Chrome: presione Ctrl+Shift+R (⌘+Shift+R en Mac)
  • Internet Explorer/Edge: mantenga presionada Ctrl mientras pulsa Actualizar, o presione Ctrl+F5
  • Opera: Presiona Ctrl+F5.
/**
 * Extrae datos anuales del Pokémon Destacado.
 * Ejecuta en páginas como [[WikiDex:Pokémon Destacado/2010]]
 * */
( function( $, mw ) {
  var
    _anyo = 0,
    _meses = [
      "Enero",
      "Febrero",
      "Marzo",
      "Abril",
      "Mayo",
      "Junio",
      "Julio",
      "Agosto",
      "Septiembre",
      "Octubre",
      "Noviembre",
      "Diciembre"
    ],
    _init = function() {
      var page = mw.config.get( 'wgPageName' ),
        api = new mw.Api(), anyo;
      anyo = /\/(\d{4})$/.exec( page )||[][1];
      _anyo = parseInt( anyo, 10 ) || ( new Date() ).getFullYear();
      api.get( {
          action: 'parse',
          format: 'json',
          page: page,
          'prop': 'parsetree'
      } ).done( _parseContent );
    },
    _parseContent = function( data ) {
      var
        datos = [],
        text = data.parse.parsetree['*'],
        parser = new DOMParser(),
        xdoc = parser.parseFromString( text, 'application/xml' ),
        h3s = xdoc.querySelectorAll( 'h[level="3"]' ),
        mes, idxmes, hsibling, finalElem, puesto;
      for ( var h3 of h3s ) {
        mes = _getHText( h3.textContent ).split( ' ' )[0];
        idxmes = _meses.indexOf( mes );
        if ( idxmes !== -1 ) {
          hsibling = h3.nextSibling;
          puesto = 1;
          while ( true ) {
            if ( !hsibling ||
              ( hsibling.nodeType == 1 && hsibling.nodeName == 'h' ) )
            {
              break;
            }
            if ( hsibling.nodeType == 1 && hsibling.nodeName == 'template' ) {
              finalElem = _parseTemplate( hsibling, idxmes + 1, puesto );
              if ( finalElem ) {
                datos.push( finalElem );
                puesto++;
              }
            }
            hsibling = hsibling.nextSibling;
          }
        }
      }
      console.log( 'Final:', datos );
    },
    _getHText = function( cont ) {
      return $.trim( cont.replace( /^=+/, '' ).replace( /=+$/, '' ) );
    },
    _parseTemplate = function( elem, mes, puesto ) {
      var finalElem, parts, nom, val;
      finalElem = { 'año': _anyo, mes: mes, puesto: puesto };
      if ( elem.querySelector( ':scope > title' ).textContent != 'Pokémon Destacado' ) {
        console.warn( 'Plantilla desconocida' )
        return;
      }
      parts = elem.querySelectorAll( ':scope > part' );
      for ( var part of parts ) {
        nom = part.querySelector( ':scope > name' ).textContent;
        val = part.querySelector( ':scope > value' ).textContent;
        finalElem[nom] = ( nom == 'semana' || nom == 'votos' ) ? parseInt( val, 10 ) : val ;
      }
      return finalElem;
    }
  ;
  
  $.when( mw.loader.using([ 'mediawiki.api' ]), $.ready ).then( _init );
} )( $, mw );