MediaWiki:Common.js

Da Wiki The-West IT.
Vai alla navigazione

Nota: dopo aver pubblicato, potrebbe essere necessario pulire la cache del proprio browser per vedere i cambiamenti.

  • Firefox / Safari: tieni premuto il tasto delle maiuscole Shift e fai clic su Ricarica, oppure premi Ctrl-F5 o Ctrl-R (⌘-R su Mac)
  • Google Chrome: premi Ctrl-Shift-R (⌘-Shift-R su un Mac)
  • Internet Explorer / Edge: tieni premuto il tasto Ctrl e fai clic su Aggiorna, oppure premi Ctrl-F5
  • Opera: premi Ctrl-F5.
/*******************************
/* Wiki Subpage Tooltip Script *
/*******************************/
// Author:  Shawn Bruckner
// Date:    2013-Apr-28
// License: CC-BY 3.0
// Version: beta

var wst = wst || {

    dataSubpageTitle : '/Tooltip',
    loadingTemplate: 'Template:Tooltip hover box loading',
    loadedTemplate: 'Template:Tooltip hover box',
    loadingHtml: null,
    classPrefix: 'wst-tooltip-',
    articlePath : null,
    fullScriptPath : null,
    scriptPath: null,
    dataTitlesToCheck: Array(),
    contentTitles: Array(),
    dataTitles: Array(),

    encodeAllSpecial : function( unencoded ) {
        var encoded = ""; 
        var c;
        var safeChars = /[0-9A-Za-z]/;
        for( var i = 0; i < unencoded.length; i++ ) {
            c = unencoded.charAt(i);
            if ( safeChars.test( c ) ) {
                encoded = encoded + c;
            } else {
                encoded = encoded + '_' + c.charCodeAt().toString(16) + '-';
            }
        }
        return encoded;
    },

    getTitleFromHref : function( href ) {
        var end;
        var result = null;
        if ( href.indexOf( wst.fullScriptPath ) === 0 ) {
            end = href.substring( wst.fullScriptPath.length );
            result = ( new RegExp( 'title=([^&]*)' ) ).exec( end );
        } else if ( href.indexOf( wst.scriptPath ) === 0 ) {
            end = href.substring( wst.scriptPath.length );
            result = ( new RegExp( 'title=([^&]*)' ) ).exec( end );
        } else if ( href.indexOf( wst.articlePath ) === 0 ) {
            end = href.substring( wst.articlePath.length );
            result = ( new RegExp( '([^?]*)' ) ).exec( end );
        }

        if ( result ) {
            if ( result[1].substring(0, 8) !== "Special:" ) {
                return decodeURIComponent( result[1] );
            } else {
                return null;
            }
        } else {
            return null;
        }
    },

    getTitlesAndContentLinks : function() {
        var links = $( '#mw-content-text a[href]' );
        var uniqueTitles = {};
        var title;

        for ( var i = 0; i < links.length; i++ ) {
            if( title = wst.getTitleFromHref( links[i].href ) ) {
                uniqueTitles[title] = null; // hackish way to ensure only unique titles are added
            }
        }

        for ( uniqueTitle in uniqueTitles ) { 
          wst.dataTitlesToCheck.push( uniqueTitle + wst.dataSubpageTitle ); // put unique titles into the array
        }
    },

    beginLinkSetup : function() {
        wst.articlePath = mw.config.get( 'wgServer' ) + mw.config.get( 'wgArticlePath' ).replace( /\$1/, '' );
        wst.fullScriptPath = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScript' );
        wst.scriptPath = mw.config.get( 'wgScript' );

        wst.getTitlesAndContentLinks();

        if ( wst.dataTitlesToCheck.length > 0 ) {
            $.ajax( {
                type: 'POST',
                url: mw.util.wikiScript( 'api' ),
                data: { action: 'parse', format: 'json', text: '{{:' + wst.loadingTemplate + '}}' },
                dataType: 'json',
                success: wst.midLinkSetup
            } );
        }
    },

    midLinkSetup: function( jsonData ) {
        wst.loadingHtml = jsonData.parse.text['*'];

        wst.startQueryPageExistence();        
    },

    startQueryPageExistence : function( ) {
        titleSubset = Array();
        for ( i = 0; i < 50 && wst.dataTitlesToCheck.length > 0; i++ ) {
            titleSubset.push( wst.dataTitlesToCheck.pop() );
        }
        var titles = titleSubset.join( '|' );

        $.ajax( {
             type: 'POST',
             url: mw.util.wikiScript( 'api' ),
             data: { action: 'query', format: 'json', titles: titles },
             dataType: 'json',
             success: wst.finishQueryPageExistence
        } );
    },

    finishQueryPageExistence : function( jsonData ) {
        wst.filterTitles( jsonData.query.pages );

        if ( wst.dataTitlesToCheck.length > 0 ) {
            wst.startQueryPageExistence();
        } else {
            wst.finishLinkSetup();
        }
    },

    filterTitles : function( pageData ) {
        var result, title;
        for ( index in pageData ) {
            result = pageData[index];
            if ( result.missing === undefined ) {
                title = result.title.replace( / /g, '_' );
                wst.dataTitles.push( title );
                wst.contentTitles.push( title.substring( 0, title.length - wst.dataSubpageTitle.length ) );
            }
        }
    },

    finishLinkSetup : function( ) {
        for ( var i = 0; i < wst.contentTitles.length; i++ ) {
            $( 'body' ).append( '<div id="' + wst.classPrefix + wst.encodeAllSpecial( wst.contentTitles[i] ) + 
                '" style="display: none; position: absolute; z-index: 10000;">' + 
                wst.loadingHtml.replace( /\$1/, wst.contentTitles[i].replace( /_/, " " ) ) + '</div>' );
        }

        var title, id;
        var links = $( '#mw-content-text a[href]' );
        for ( var i = 0; i < links.length; i++ ) {
            title = wst.getTitleFromHref( links[i].href );
            if ( title !== null && $.inArray( title, wst.contentTitles ) !== -1 ) {
                id = wst.classPrefix + wst.encodeAllSpecial( title );
                links.eq(i).on( 'mouseover', { id : id, title : title }, function( event ) { wst.showTooltip( event ); } );
                links.eq(i).on( 'mousemove', { id : id }, function( event ) { wst.moveTooltip( event ); } );
                links.eq(i).on( 'mouseout', { id : id }, function( event ) { wst.hideTooltip( event ); } );
            }
        }
    },

    showTooltip : function( event ) {
        tooltipBox = $( '#' + event.data.id );
        wst.positionTooltip( event.data.id, event.pageX, event.pageY );
        tooltipBox.fadeIn();

        if ( !tooltipBox.hasClass( 'loaded' ) && !tooltipBox.hasClass( 'loading' ) ) {
            tooltipBox.addClass( wst.classPrefix + 'loading' );
            wst.beginLoadTooltip( event.data.id, event.data.title );
        }
    },

    beginLoadTooltip : function( id, title ) {
        $.ajax( {
             type: 'POST',
             url: mw.util.wikiScript( 'api' ),
             data: { action: 'parse', format: 'json', title: title.replace( /_/, ' ' ),
                 text: '{{:' + title + wst.dataSubpageTitle + '|' + wst.loadedTemplate + '}}' },
             dataType: 'json',
             success: function( jsonData ) { wst.finishLoadTooltip( id, jsonData ); }
        } );
    },

    finishLoadTooltip : function( id, jsonData ) {
        tooltipBox = $( '#' + id );
        tooltipBox.addClass( 'loaded' );
        tooltipBox.removeClass( 'loading' );
        tooltipBox.html( jsonData.parse.text['*'] );
    },

    moveTooltip : function( event ) {
        wst.positionTooltip( event.data.id, event.pageX, event.pageY );
    },

    positionTooltip: function( id, pageX, pageY ) {
        var tooltip = $( '#' + id );
        var bodyOffsets = document.body.getBoundingClientRect();
        var bodyX = pageX - bodyOffsets.left;
        var bodyY = pageY - bodyOffsets.top;
        var scrollX = $( document ).scrollLeft();
        var scrollY = $( document ).scrollTop();
        var bodyWidth = $( 'body' ).width();
        var bodyHeight = $( 'body' ).height();
        var viewWidth = $( window ).width();
        var viewHeight = $( window ).height();
        var topAdjust = 6;

        if ( tooltip.width() * 1.1 > pageX - scrollX ) {
            tooltip.css( { 'left' : bodyX - scrollX + 15, 'right' : 'auto' } );
            topAdjust = 36;
        } else {
            tooltip.css( { 'right' : bodyWidth - bodyX + scrollX + 6, 'left' : 'auto' } );
        }

        if ( tooltip.height() * 1.5 > pageY - scrollY ) {
            tooltip.css( { 'top' : bodyY - scrollY + topAdjust, 'bottom' : 'auto' } );
        } else {
            tooltip.css( { 'bottom' : bodyHeight - bodyY + scrollY + 3, 'top' : 'auto' } );
        }
    },

    hideTooltip : function( event ) {
        $( '#' + event.data.id ).fadeOut();
    }

};

mw.loader.using( 'mediawiki.util' ).then( function() {
    wst.beginLinkSetup();
} );

/***********************************
/* End Wiki Subpage Tooltip Script *
/***********************************/