MediaWiki:Gadget-LinkComplete.js

Versione del 8 lug 2014 alle 15:23 di Rotpunkt (discussione | contributi) (fix case primo carattere)

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.

/**
 * Gadget-LinkComplete.js
 * Funzione di autocompletamento dei wikilink, si attiva con Tab o Ctrl+Spazio.
 * Riscritto da zero a partire da:
 * http://it.wikipedia.org/w/index.php?title=MediaWiki:Gadget-LinkComplete.js&oldid=51953861
 * che a sua volta lo importava da:
 * http://en.wikipedia.org/wiki/User:Zocky/LinkComplete.js
 *
 * @author [[Utente:Rotpunkt]]
 */
/*global document: false, mediaWiki: false, jQuery: false */

(function (mw, $) {
    'use strict';

    // Classe per la funzione di autocompletamento
    function AutoComplete(pos, text, el) {
        var position = pos,
            initialText = text,
            element = el,
            pages = null,
            currPage = 0,
            currContinue = null,
            prevContinue = null,
            currText = text;

        // Ritorna la lista delle pagine che iniziano con prefix (in JSON)
        function getPages(prefix, pcontinue, pageHandler) {
            $.ajax({
                url: mw.util.wikiScript('api'),
                data: {
                    action: 'query',
                    list: 'allpages',
                    apprefix: prefix,
                    apcontinue: pcontinue,
                    aplimit: '50',
                    apfilterredir: 'nonredirects',
                    format: 'json'
                },
                async: false,
                dataType: 'json'
            })
                .done(function (data) {
                    if (data.query && data.query.allpages.length > 0) {
                        pageHandler(data.query.allpages, data['query-continue'] ?
                                data['query-continue'].allpages.apcontinue : null);
                    }
                });
        }

        // Inserisce il nome della pagina nell'area di modifica
        function dump() {
            // preserva il case del primo carattere
            if (initialText.length > 0) {
                pages[currPage].title = initialText.charAt(0) + pages[currPage].title.substring(1);
            }
            $(element).textSelection('encapsulateSelection',
                { pre: pages[currPage].title, selectionStart: position,
                      selectionEnd: position + currText.length, replace: true });
            currText = pages[currPage].title;
            // aggiorna currPage
            if (currPage >= pages.length - 1) {
                if (currContinue) {
                    pages = null;
                } else if (prevContinue) {
                    prevContinue = null;
                    pages = null;
                } else {
                    currPage = 0;
                }
            } else {
                currPage += 1;
            }
        }

        AutoComplete.prototype.getCurrText = function () {
            return currText;
        };

        AutoComplete.prototype.complete = function () {
            // eventualmente ottiene la lista di pagine
            if (!pages) {
                getPages(initialText, currContinue, function (retPages, pcontinue) {
                    pages = retPages;
                    prevContinue = currContinue;
                    currContinue = pcontinue;
                    currPage = 0;
                });
            }
            if (pages) {
                dump();
            }
        };
    }

    $(document).ready(function () {
        // previene con Firefox l'azione di default del tasto Tab 
        var tabDefault = true, ac;

        $('#wpTextbox1, #wpUploadDescription').keydown(function (event) {
            var pos, text;
            if ((!event.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey && event.keyCode === 9) ||
                    (!event.altKey && !event.shiftKey && event.ctrlKey && !event.metaKey && event.keyCode === 32)) {
                tabDefault = true;
                pos = $(event.target).textSelection('getCaretPosition');
                text = $(event.target).val().replace(/\r\n/g, '\n').substring(0, pos);
                pos = text.lastIndexOf('[[') + 2;
                text = text.substring(pos);
                if (pos >= 2 && !/[\[\]\{\}\r\n\|]/.test(text)) {
                    tabDefault = false;
                    event.preventDefault();
                    if (!ac || text !== ac.getCurrText()) {
                        ac = new AutoComplete(pos, text, event.target);
                    }
                    ac.complete();
                }
            }
        });
        $('#wpTextbox1, #wpUploadDescription').keypress(function (event) {
            if (!event.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey && event.keyCode === 9) {
                return tabDefault;
            }
        });
    });
}(mediaWiki, jQuery));