Järjestelmäviesti:Gadget-Interwikihaku.js

Huomautus: Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.

  • Firefox ja Safari: Napsauta Shift-näppäin pohjassa Päivitä, tai paina Ctrl-F5 tai Ctrl-R (⌘-R Macilla)
  • Google Chrome: Paina Ctrl-Shift-R (⌘-Shift-R Macilla)
  • Edge: Napsauta Ctrl-näppäin pohjassa Päivitä tai paina Ctrl-F5
(function(w){
    var USERAGENT = 'Iw-injektio/0.5';
    
    var ohjeurl = "https://fi.wiktionary.org/wiki/Ohje:Gadget-Interwikihaku";

    var fiwiki = { 
        nimi     : "Wikipedia (fi)",
        apiurl   : "https://fi.wikipedia.org/w/api.php",
        sivu_url : "https://fi.wikipedia.org/wiki/",
        tekstit  : [ "{{Wikipedia|%t}}", "[[:w:%t]]" ],
    };

    /* Wikit, joista sivua etsitään. Sivua etsitään wikisanakirjan otsikolla, 
       joten käytännössä mahdollisia ovat kai vain Wikipedia ja Wikisanakirja. */
    var wikit = {
        "Wikipedia" : { 
            nimi     : "Wikipedia (%k)",
            apiurl   : "https://%k.wikipedia.org/w/api.php",
            sivu_url : "https://%k.wikipedia.org/wiki/",
            tekstit  : [ "{{Wikipedia|%k:%t}}", "[[%k:w:%t]]", "*{{muualla-wp|%k|%t}}" ],
        }, 
        "Wiktionary" : { 
            nimi : "Wiktionary (%k)", 
            apiurl   : "https://%k.wiktionary.org/w/api.php",
            sivu_url : "https://%k.wiktionary.org/wiki/",
            tekstit  : [ "[[:%k:%t]]" ],
        },
    };

    var oletusasetukset = {
        /* Valmiiksi näytettävät kielet. */     
        "iwi.naytetyt" : { "Wikipedia"  : [ "fi" ], 
                           "Wiktionary" : [ "en", 
                                            "es", 
                                            "fr", 
                                            "sv", 
                                            "de", 
                                            "ru", 
                                            "et" ]
                         },
        /* Valmiiksi ruksitut kielet. */
        "iwi.valitut" : { "Wikipedia"  : [],
                          "Wiktionary" : [] 
                        }
    };




    /**
     * Asettaa löytyneen otsikon.
     * @param title:  sivun otsikko
     * @param wiki:   wikitiedot-listan alkio
     * @param tulos:  true, jos sivu löytyi
     *                  false, jos ei
     *                  virheviesti, jos tapahtui virhe
     */
    function aseta(title, wiki, tulos) {
    	var i;
    	var tekstit;
    	var on_click_func = function() { 
                        $('#wpTextbox1').textSelection('replaceSelection', $(this).attr("title"));
                        return false;
                    };
    	
        if ( tulos === true ) {
            wiki.$kentta.html("" + wiki.kieli + ': <a target="_BLANK" href="' 
                              + hae_sivu_url(wiki) + title +  '">' 
                              + title + '</a>');

            if ( mw.config.get("wgAction") == "edit" ) {
                tekstit = hae_tekstit(wiki);
                //console.log("tekstejä: " + tekstit.length);
                
                for ( i in tekstit ) {
                    var teksti = tekstit[i].replace("%t", title);
                    //console.log("teksti: " + teksti);
                    
                    var $lisaysnappi = $('<a href="#" title="' 
                                         + teksti + '">&darr;</a>');
                    $lisaysnappi.click(on_click_func);
                    wiki.$kentta.append($lisaysnappi);
                }
                if ( wiki.tyyppi == "Wiktionary" ) {
                    wiki.$kentta.data("kielilinkki", "[[" 
                                      + wiki.kieli + ":" + title + "]]");
                    lisaa_kielilinkit([wiki.$kentta.data("kielilinkki")]);
                }
            }
        } else if ( tulos === false ) {
            wiki.$kentta.html("" + wiki.kieli + ': sivua ei ole');
        } else {
            wiki.$kentta.html("" + wiki.kieli + ': virhe: ' + tulos + '');
        }
    }
    /**
     * Testaa onko sivu 'title' olemassa wikissä 'wiki'.
     * Kutsuu antaa tuloksen funktiolle aseta.
     **/
    function on_olemassa(title, wiki) {
        //console.log("on olemassa, wiki: " + wiki.kieli);
        var q = {
            format: 'json', 
            action: 'query',
            titles: title,
        };
        var url = hae_apiurl(wiki) + "?" + $.param(q, true) + "&callback=?";
        //console.log("url: " +url);
        $.ajax({
            url: url,
            dataType: 'json',
            timeout: 3000      // 3 sekuntia
        })
            .done( function(data) {
            	var e;
                if ( data && data.query && data.query.pages ) {
                    if ( data.query.pages[-1] ) {
                        aseta(title, wiki, false);
                    } else {
                        for ( e in data.query.pages ) {
                            title = data.query.pages[e].title;
                            break;
                        }
                        aseta(title, wiki, true);
                    }
                } else {
                    aseta(title, wiki, "?");
                }
            })
            .fail(function (jqXHR, status, error) {
                aseta(title, wiki, status);
            })
            .always(function () {
                //console.log("haku valmis");
            });
    }

    function hae_nimi(w) {
        if ( !w.nimi ) {
            w.nimi = w.malli.nimi.replace("%k", w.kieli);
        }
        return w.nimi;
    }
    function hae_apiurl(w) {
        return w.malli.apiurl.replace("%k", w.kieli);
    }
    function hae_sivu_url(w) {
        return w.malli.sivu_url.replace("%k", w.kieli);
    }
    function hae_tekstit(w) {
    	var i;
        var a = [];
        for ( i in w.malli.tekstit ) {
            a.push(w.malli.tekstit[i].replace("%k", w.kieli));
        }
        return a;
    }

    function hae_asetus(nimi) {
        var arvo = JSON.parse($.cookie(nimi));

        if ( arvo === null ) {
            arvo = oletusasetukset[nimi];
            $.cookie(nimi, JSON.stringify(arvo));
        }
        return arvo;
    }

    function run($) {
        var $ydiv = null;
        var $nayta_btn = null;
        var $aukimerkki = null;
        var $div = null;
        var $linkkialue = null;
        var $ohje_btn = null;
        var title;

        $.ajaxSetup({ headers: { 'Api-User-Agent': USERAGENT }});

        /**
         * Tekee linkki-lomakkeen.
         * @param title: Sivun nimi, jota etsitään.
         * @return:      jquery-muotoisen li-elementtiluettelon linkeistä
         */
        function tee_linkkialue(title) {
        	var k, i;
            var naytetyt, valitut;
            // Näytettävät kielet
            naytetyt = hae_asetus("iwi.naytetyt");
            
            // Valitut kielet
            valitut = hae_asetus("iwi.valitut");
            
            var on_dblclick_func = function() {
                var data = $(this).data("tiedot");
                $(this).text("" + data.kieli + ": haetaan");
                on_olemassa(title, data);
                return false;
            };
            
            var ryhma = [];
            for ( k in naytetyt ) {
                var kieliversiot = [];
                var $li = $('<li class="iwi-ryhma" style="'
                            + 'margin: 0.2em; '
                            + 'line-height: 2.2em; '
                            + 'display: inline; '
                            + 'border: 1px solid lightblue; '
                            + 'padding: 5px; '
                            + 'border-radius: 5px; '
                            + '">' + k + ': </li>');

                for ( i in naytetyt[k] ) {
                    var instanssi = {};
                    var kieli = naytetyt[k][i];
                    if ( k == "Wikipedia" && kieli == "fi" ) {
                        instanssi.malli = fiwiki;
                    } else {
                        instanssi.malli = wikit[k];
                    }
                    instanssi.tyyppi = k;
                    instanssi.kieli = kieli;

                    var $label = $('<label style="margin: 0.5em; "></label>');
                    var $ch = $('<input type="checkbox" id="iwi-' 
                                + k + "-" + kieli + '" />');
                    if ( valitut[k] && valitut[k].indexOf(kieli) > -1 ) {
                        $ch.attr("checked", true);
                    }
                    $label.html([ $ch, kieli ]);
                    $label.data('tiedot', instanssi);
                    $label.on('dblclick', on_dblclick_func);
                    $label.attr('title', "Ruksita ja paina Hae-nappia tai tuplaklikkaa hakeaksesi suoraan.");
                    instanssi.$kentta = $label;
                    $li.append($label);
                }
                var $muuta = $('<a '
                               + 'style="font-size: 0.8em; margin-left: 0.5em;" '
                               + 'href="#" '
                               + 'title="Valitse näytettävät kieliversiot"'
                               + '>[&plusmn;]</a>');
                
                $muuta.data("iwi.ryhmä", k);
                try {
                    $muuta.data("iwi.kielet", naytetyt[k].join(" "));
                } catch ( e ) {
                    $muuta.data("iwi.kielet" ,"");
                }

                $muuta.click(function (e) {
                    var ryhma = $(this).data("iwi.ryhmä");
                    var kielet = $(this).data("iwi.kielet");
                    do {
                        var halutut = window.prompt(
                            'Luettele halutut kieliversiot välilyönnillä ' +
                                'eroteltuina (esim. "en fr et"):', kielet);

                    } while ( halutut != null                          
                              && halutut.search(/[^a-z- ]/) != -1 );

                    if ( halutut ) {
                        naytetyt[ryhma] = halutut.split(" ");
                        $.cookie("iwi.naytetyt", JSON.stringify(naytetyt));
                        $linkkialue.children("li.iwi-ryhma").remove();
                        $linkkialue.prepend(tee_linkkialue(title));
                    }
                    return false;
                });
                $li.append($muuta);

                ryhma.push($li);
            }
            return ryhma;
        }

        /**
         * Rakentaa interwikilinkit-napista avautuvan lomakkeen.
         * @param title: Etsittävän sivun nimi, joka liitetään painikkeisiin.
         */
        function tee_lomake(title) {

            // Linkkialue
            $linkkialue = $('<ul style=""></ul>');
            $linkkialue.html(tee_linkkialue(title));

            var $hae_btn = $('<input type="button" value="Hae" '
                             + 'title="Hae artikkelia ' 
                             + title 
                             + ' valituista wikeistä" />');

            $hae_btn.click(function (e) {
                
                var h = {};
                for ( w in wikit ) { 
                    h[w] = [];
                }
                $('#iwi-div ul :checked').each(function(index) {
                    var $label = $(this).parent();
                    var kvdata = $label.data("tiedot");
                    h[kvdata.tyyppi].push(kvdata.kieli);
                    $label.text("" + kvdata.kieli + ": haetaan");
                    on_olemassa(title, kvdata);
                });
                $.cookie("iwi.valitut", JSON.stringify(h));
                return false;
            });

            $linkkialue.append($hae_btn.wrap('<li style="margin: 1em; display: inline; "></li>').parent());
            $div.append($linkkialue);      
        }

        /**
         * Käynnistyessä ajettava koodi.
         **/
        
        var $h1 = $("#firstHeading");
        if ( $h1 ) {
            // Jos ollaan hakutulossivulla käytetään linkin tekstiä kohdasta, jossa
            // lukee "Luo sivu ''xxx'' Wikisanakirjaan". Muuten käytetään sivun nimeä.
            if ( $h1.text() === "Hakutulokset" ) {
                title = $('big > i > a').text();
            } else if ( $h1.text().startsWith("Luodaan sivua") ||
                        $h1.text().startsWith("Muokataan sivua") ) {
                title = mw.config.get("wgTitle");
            } else {
                return;
            }

            $ydiv = $('<div id="iwi-div" style="'
                      + 'text-align: right; "></div>');
            $div = $('<div id="iwi-div" style="clear: both;"></div>');
            $aukimerkki = $('<span style="font-size: 0.8em;">◀</span>');
            $nayta_btn = $('<a href="#" '
                           + 'title="Etsi sivua muista wikeistä" '
                           + 'style=" '
                           + ''
                           + '" '
                           + '>interwikilinkit</a>');
            
            $nayta_btn.click(function () {
                if ( $aukimerkki.html() == "◀" ) {
                    if ( $linkkialue === null ) {
                        tee_lomake(title);
                    } 
                    $div.slideDown();
                    $ohje_btn.fadeIn();
                    $aukimerkki.html("▼");
                } else {
                    $ohje_btn.fadeOut();
                    $div.slideUp();
                    $aukimerkki.html("◀");
                }
                return false;
            });
            var $floatdiv = $('<div style="font-size: 0.8em; float: right; ">'
                              + '</div>');
            $ohje_btn = $('<a href="' + ohjeurl + '" '
                          + 'title="Ohje" '
                          + 'style=" '
                          + '">[?]</a>');
            $ohje_btn.hide();
            $floatdiv.html([ $ohje_btn, "[", $aukimerkki, " ", $nayta_btn, "]"]);
            $ydiv.html([$floatdiv, $div]);
            $div.hide();
            $h1.after($ydiv);
        }
    }
    if ( mw.config.get("wgAction") == "view" 
         || mw.config.get("wgAction") == "edit"
         || mw.config.get("wgAction") == "submit"        
       ) {
        jQuery(document).ready(run);
    }

})(window);