Utente:Tino/TradottoDa.js

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

Questa pagina definisce alcuni parametri di aspetto e comportamento generale di tutte le pagine. Per personalizzarli vedi Aiuto:Stile utente.


Nota: dopo aver salvato è necessario pulire la cache del proprio browser per vedere i cambiamenti (per le pagine globali è comunque necessario attendere qualche minuto). Per Mozilla / Firefox / Safari: fare clic su Ricarica tenendo premuto il tasto delle maiuscole, oppure premere Ctrl-F5 o Ctrl-R (Command-R su Mac); per Chrome: premere Ctrl-Shift-R (Command-Shift-R su un Mac); per Konqueror: premere il pulsante Ricarica o il tasto F5; per Opera può essere necessario svuotare completamente la cache dal menù Strumenti → Preferenze; per Internet Explorer: mantenere premuto il tasto Ctrl mentre si preme il pulsante Aggiorna o premere Ctrl-F5.

/*
 * Compila il template {{tradotto da}} ricavando automaticamente
 * i dati da wikidata e dalla wiki di origine. Per l'uso, inserire il testo
 * {{tradotto da|ll
 * e premere lo shortcut. La lingua viene ricavata dagli ultimi due caratteri
 * (ll nell'esempio) che precedono il cursore.
 * 
 * Shortcut: Ctrl + y
 * 
 * @author [[Utente:Tino]]
 */

/* <nowiki> */

(function (mw, $) {
    'use strict';
    
    // configuration vars
    var keyCode = 89; // y key
    var alt     = false;
    var shift   = false;
    var meta    = false;
    var ctrl    = true;
    var ns      = 1;
    
    var inputArea = $('#wpTextbox1');
    
    // flag for default browser behaviour on the shortcut
    var keystrokeDefault = true;
    
    /*
     * \brief Check whether the script should perform its action for the 
     *        trigger event.
     * @param e Triggering event.
     */
    function triggerCondition(e) {
        return e.altKey   == alt     &&
               e.shiftKey == shift   &&
               e.metaKey  == meta    && 
               e.ctrlKey  == ctrl    &&
               e.keyCode === keyCode &&
               mw.config.get('wgNamespaceNumber') === ns;
    }
    
    /*
     * \brief Query the other Wikipedia to get revision info, then add the text
     *        to complete the template.
     * @param lang  Language of the foreign wiki.
     * @param title Title of the voice in the foreign wiki.
     */
    function queryOtherWikipedia(lang, title) {
        $.ajax({
            url: '//' + lang + '.wikipedia.org/w/api.php',
            data: {
                'format': 'json',
                'action': 'query',
                'titles': title,
                'prop': 'revisions'
            },
            dataType: 'jsonp',
            success: function(voiceData) {
                
                // regex to extract the date from a timestamp
                var dateRegex = /([0-9]{4})-([0-9]{2})-([0-9]{2}).*/;
                
                var monthNames = [
                    'gennaio',   'febbraio', 'marzo',    'aprile',
                    'maggio',    'giugno',   'luglio',   'agosto',
                    'settembre', 'ottobre',  'novembre', 'dicembre'
                ];                                    
                
                // text for the compiled template
                var text = '{{tradotto da|' + lang + '|';
                
                var index;
                for (index in voiceData.query.pages) {
                    var page = voiceData.query.pages[index];
                    
                    // extract date fields
                    var match = dateRegex.exec(page.revisions[0].timestamp);
                    
                    // add voice title
                    text += page.title + '|';
                    // add date as: day monthname year
                    text +=   match[3] + ' ' 
                            + monthNames[match[2] - 1] + ' '
                            + match[1] + '|';
                    // add revid
                    text += page.revisions[0].revid;
                    // close template
                    text += '}}'
                    
                    // insert template completion
                    inputArea.textSelection('encapsulateSelection', {
                        peri: text,
                        replace: true
                    });
                }
            }   
        });
    }
    
    /*
     * \brief Query wikidata to get the title in the other language, then
     *        the source wiki to get voice's last revision data.
     * @param lang Language for the source of the translation.
     */
    function queryWikidata(lang) {
        $.ajax({
            url: '//www.wikidata.org/w/api.php',
            data: {
                'format': 'json',
                'action': 'wbgetentities',
                'sites': mw.config.get('wgDBname'),
                'titles': mw.config.get('wgTitle'),
                'props': 'sitelinks',
                'languages': lang
            },
            dataType: 'jsonp',
            success: function(data) {
                
                if (!data.success)
                    return;
                
                var wiki = lang + 'wiki';
                
                var index;
                for (index in data.entities) {
                    
                    // the voice may not exist in the specified language 
                    if (!data.entities[index].sitelinks[wiki])
                        return;
                    
                    var title = data.entities[index].sitelinks[wiki].title;
                    
                    queryOtherWikipedia(lang, title);
                }
            }
        });
    }
    
    $(function() {
        inputArea.keydown(function(e) {
            // check condition to perform the action
            if (!triggerCondition(e))
                return;
                
            // suppress browser's default response on shortcut keystroke
            keystrokeDefault = false;
        
            var prevText, cursor, beginning, langMatch;
        
            // get cursor position and select "{{tradotto da|ll" on keypress
            cursor = inputArea.textSelection('getCaretPosition');
            prevText = inputArea.val().substring(0, cursor);
            beginning = prevText.toLowerCase().lastIndexOf('{{tradotto da');
            prevText = prevText.substring(beginning);
            inputArea.textSelection('setSelection', 
                                    {start: beginning, end: cursor});
            
            // get language from the input in the textarea (last 2 chars)
            langMatch = prevText.match(/^{{tradotto da\|([a-z]{2})$/);
            
            if (!langMatch || !langMatch[1])
                return;
            
            queryWikidata(langMatch[1]);
            
        });
        
        // prevent default browser action, when needed only
        inputArea.keypress(function(e) {
            if (triggerCondition(e))
                return keystrokeDefault;
        });
    });
}(mediaWiki, jQuery));

/* </nowiki> */