Järjestelmäviesti:Gadget-Kaannokset.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)
  • Internet Explorer ja Edge: Napsauta Ctrl-näppäin pohjassa Päivitä tai paina Ctrl-F5
  • Opera: Paina Ctrl-F5.
(function(w){


    function main($) {
		var k;
        var kielikoodit = {};
        // kielokohtaiset ominaisuudet
        var ominat = { 
            az: { nimi: "azeri", suku: false, latin: false }, 
            uk: { nimi: "ukraina", suku: true, latin: true }, 
            be: { nimi: "valkovenäjä", suku: true, latin: true }, 
            bg: { nimi: "bulgaria", suku: true, latin: true }, 
            zh: { nimi: "kiina", suku: false, latin: true }, 
            de: { nimi: "saksa", suku: true, latin: false }, 
            en: { nimi: "englanti", suku: false, latin: false }, 
            es: { nimi: "espanja", suku: true, latin: false }, 
            et: { nimi: "viro", suku: false, latin: false }, 
            fr: { nimi: "ranska", suku: true, latin: false }, 
            it: { nimi: "italia", suku: true, latin: false }, 
            ja: { nimi: "japani", suku: false, latin: true }, 
            pt: { nimi: "portugali", suku: true, latin: false }, 
            ru: { nimi: "venäjä", suku: true, latin: true }, 
            sr: { nimi: "serbia", suku: true, latin: true }, 
            nn: { nimi: "norja (nynorsk)", suku: true, latin: false }, 
            nb: { nimi: "norja (bokmål)", suku: true, latin: false }, 
            sv: { nimi: "ruotsi", suku: true, latin: false }, 
            tr: { nimi: "turkki", suku: false, latin: false }, 

        };

        // nimi->kielikoodi taulukon
        for (k in ominat) {
            kielikoodit[ominat[k].nimi] = k;
        }


        //console.log("wgScript: " + mw.config.get('wgScript') + ", wgPageName: " + mw.config.get('wgPageName'));

        /*
         * Käännöksen lisäyslomakkeen avausnappi ja taulukkoon lisättävä rivi.
         */
        var nappi = '<input style="" type="button" onclick="gadget_kaannos.lisaa_kaannos_onclick(@);" value="Lisää käännös..." />';
        var syottolomake = '<tr style="background-color: #aaf;" class="gk_kaannoslomake"><td colspan="3" id="gk_kaannoslomake@">'
            + nappi
            + '</td></tr>';

        // Lomake, joka näytetään kun lisää...-nappia on painettu, ennen kuin kieli on kirjoitettu.
        var alkulomake = '\
<label for="gk_luettelo">Kieli: </label>\
<input type="text" class="gk_kieli" id="gk_kieli" onchange="gadget_kaannos.nimi_onchange();" style="width: 4em"/>: \
<span id="gk_luettelo"><span class="kg_info" style="">Kirjoita kielen <a target="_blank" href="//fi.wiktionary.org/wiki/Malline:kohta/kielikoodit">kielikoodi</a> ja paina &lt;tab&gt; tai &lt;enter&gt;.</span></span>\
<div id="gk_lisaparamt">\
</div>\
';

        /*
         * Näkymätön lomake, jolla tiedot lähetetään. Peräisin HotCatin koodista.
         */
        var tallennuslomake = '<form id="commitForm" method="post" enctype="multipart/form-data" action="'
            + mw.config.get('wgScript') + '?title=' + encodeURIComponent (mw.config.get('wgPageName'))
            + '&action=edit">'
            + '<input type="hidden" name="wpTextbox1" />'
            + '<input type="hidden" name="wpSummary" value="" />'
            + '<input type="hidden" name="wpMinoredit" value="0" />'
            + '<input type="hidden" name="wpWatchthis" value="0" />'
            + '<input type="hidden" name="wpAutoSummary" value="" />'
            + '<input type="hidden" name="wpEdittime" />'
            + '<input type="hidden" name="wpStarttime" />'
            + '<input type="hidden" name="wpEditToken" />'
            + '<input type="hidden" name="wpDiff" value="wpDiff" />'
            + '<input type="hidden" name="oldid" value="0" />'
			+ '<input type="hidden" name="wpUltimateParam" value="1">'
			+ '<input type="hidden" name="wpChangeTags">'
			+ '<input type="hidden" value="ℳ𝒲♥𝓊𝓃𝒾𝒸ℴ𝒹ℯ" name="wpUnicodeCheck">'
            + '</form>';



        /*
         * Muotoilee aikaleiman tämänhetkisestä ajasta. Peräisin HotCatin koodista.
         */
        function currentTimestamp () {
            var now = new Date();
            var ts  = "" + now.getUTCFullYear();
            function two (s) { return s.substr (s.length - 2); }
            ts = ts
                + two ('0' + (now.getUTCMonth() + 1))
                + two ('0' + now.getUTCDate())
                + two ('00' + now.getUTCHours())
                + two ('00' + now.getUTCMinutes())
                + two ('00' + now.getUTCSeconds());
            return ts;
        }

        /*
         * Muotoilee urlista absoluuttisen. Peräisin HotCatin koodista.
         */
        function armorUri (uri) {
            // Avoid protocol-relative URIs, IE7 has a bug with them in Ajax calls
            if (uri.length >= 2 && uri.substring(0, 2) == '//') return document.location.protocol + uri;
            return uri;
        }


        /*
         * Palauttaa kielen kielikoodin, jos sellainen on. Muuten, jos parametrin pituus on 2 tai 3
         * olettaa että parametri on kielikoodi ja palauttaa sen. Muuten palauttaa null.
         */
        function kielikoodiksi(kn) {
            if ( kielikoodit[kn] )
                return kielikoodit[kn];
            if ( kn.length == 2 || kn.length == 3 )
                return kn;
            return null;
        }

        /*
         * Kielikoodia vastaavan nimen, jos sellainen on.
         * on kielikoodi ja palauttaa sen.
         */
        function kieleksi(kk) {
            if ( ominat[kk] !== undefined )
                return ominat[kk].nimi;
            return kk;
        }


        /*
         * Callback-funktio, jota kutsutaan kun sivun wikiteksti on ladattu.
         */
        function koodi_ladattu(json) {

            /*
             * Tallennuslomakkeen tiedot.
             */
            var setupTimeout;
            var pageText;
            var pageTime;
            var pageTextRevId = null;
            var conflictingUser = null;
            var lastRevId = null;
            var serverTime = null;
            var startTime = null;
            var pageWatched = null;
            var editToken = null;
            var commitForm = null;
            
            /*
             * Purkaa palvelimen palauttamat tiedot. Muutettu HotCatin koodista.
             */
            function setPage (json) {
                //alert(JSON.stringify(json, undefined, 2));
                var startTime = null;
                if (json && json.query) {
                    if (json.query.pages) {
                        //var page = json.query.pages[wgArticleId == 0 ? "-1" : "" + wgArticleId];
                        var page = json.query.pages[Object.keys(json.query.pages)[0]];
                        if (page) {
                            if (page.revisions && page.revisions.length > 0) {
                                // Revisions are sorted by revision ID, hence [0] is the one we asked for, and possibly there's a [1] if we're
                                // not on the latest revision (edit conflicts and such).
                                pageText = page.revisions[0]['*'];
                                if (page.revisions[0].timestamp) pageTime = page.revisions[0].timestamp.replace (/\D/g, "");
                                if (page.revisions[0].revid) pageTextRevId = page.revisions[0].revid;
                                if (page.revisions.length > 1) conflictingUser = page.revisions[1].user;
                            }
                            if (page.lastrevid) lastRevId = page.lastrevid;
                            if (page.starttimestamp) startTime = page.starttimestamp.replace (/\D/g, "");
                            pageWatched = typeof (page.watched) == 'string';
                            editToken = page.edittoken;            
                        }
                    }
                }
            }

            /*
             * Lähettää muutokset palvelimelle.
             */
            function laheta(teksti, muutoskom) {
                // Täytetään näkymätön lomake joka lähettää tiedot submit()illa.
                var commitForm = document.getElementById ('commitForm');
                commitForm.wpAutoSummary.value = 'd41d8cd98f00b204e9800998ecf8427e'; // MD5 hash of the empty string
                commitForm.removeChild(commitForm.wpMinoredit);
                commitForm.wpWatchthis.checked = 1;
                commitForm.wpSummary.value = muutoskom;
                commitForm.wpTextbox1.value = teksti;
                commitForm.wpStarttime.value = serverTime || currentTimestamp ();
                commitForm.wpEdittime.value = pageTime || commitForm.wpStarttime.value;
                commitForm.submit();
                //console.log("Muutoskommentti: " + muutoskom);
                //console.log("Teksti: " + teksti);
                //console.log("Lähetetty");
            }

            /*
             * Muuttaa syötteen wikikoodiksi.
             */
            function kasittele_syote(syote, kielikoodi, kielinimi) {
                //console.log("kielikoodi: " + kielikoodi + ", kieli: " + kielinimi);
                var tulos = [];
                for ( var i = 0; i < syote.length; i++ )
                {
                    // jos sana alkaa :-merkillä lisätään sellaisenaan (ilman :-merkkiä)
                    if ( syote[i].sana.charAt(0) == ':' )
                    {
                        tulos.push(syote[i].sana.substr(1));
                    }
                    else {
                        tulos.push("{{käännös|");
                        if ( kielikoodi ) tulos.push(kielikoodi); 
                        else tulos.push(kielinimi.slice(0,1).toUpperCase() + kielinimi.slice(1));
                        tulos.push("|");
                        tulos.push(syote[i].sana);
                        if ( syote[i].suku ) {
                            tulos.push("|suku=");
                            tulos.push(syote[i].suku);
                        }
                        if ( syote[i].latin ) {
                            tulos.push("|lat=");
                            tulos.push(syote[i].latin);
                        }
                        tulos.push("}}");
                        if ( i < syote.length - 1 )
                            tulos.push(", ");
                    }
                }
                return tulos.join("");
            }

            var kieli = window.gadget_kaannos.kieli;
            var num = window.gadget_kaannos.numero;
            var sanat = window.gadget_kaannos.sanat;

            //console.log("Lataus: ok");

            // tallentaa sivun tekstin pageText-muuttujaan
            setPage (json); 

            // etsitään oikea käännöslaatikko
            var lisays = "*" + kieli + ": " + kasittele_syote(sanat, kielikoodiksi(kieli), kieleksi(kieli)) + "\n";
            var e = '{{kohta|';
            var a, l, i = 0;
            while ( i <= num )
            {
                a = pageText.indexOf(e, l);
                if ( a == -1 )
                    return;
                l = a + e.length;
                i++;
            }
            l = pageText.indexOf('\n', l) + 1;

            // korvataan kohta subst:kohtalla ja lisätään uusi käännös seuraavalle riville
            pageText = pageText.substring(0, a) + '{{subst:' +  pageText.substring(a + 2, l) + lisays + pageText.substring(l);
            laheta(pageText, "/* Käännökset */ +" + kieli);
        };


        /*
         * Lähettää kyselyn palvelimelle. Muutettu HotCatin koodista.
         */
        function getPage () {
            // apin latauskripti joka kutsuu callbackia palautetulla arvolla
            var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') 
                + '/api.php?format=json&callback=window.gadget_kaannos.koodi_ladattu&action=query&titles=' 
                + encodeURIComponent (mw.config.get('wgPageName'))
                + '&prop=info%7Crevisions&rvprop=content%7Ctimestamp%7Cids&meta=siteinfo&rvlimit=1&rvstartid='
                + mw.config.get('wgCurRevisionId');
            var s = document.createElement('script');
            s.src = armorUri(url);
            s.type = 'text/javascript';
            document.getElementsByTagName ('head')[0].appendChild (s);
            // callback näkyväksi api-skripitille
            window.gadget_kaannos.koodi_ladattu = koodi_ladattu; 
        }
        


        /************
         * Alustus. *
         ************/  
        (function() {

            // Lisätyt sanat.
            var luettelo = new Array();

            // Avatun lisäyslaatikon numero. Laatikot numeroidaan 0:sta alkaen.
            var numero = -1;

            function piilota(num) {
                if ( numero != -1 ) {
                    $("#gk_kaannoslomake" + num).html(nappi.replace(/@/g, num));
                }
            }

            function hae_kielikohtainen_lomake(kieli) {
                
                var osat = [];

                // kaikille yhteinen alkuosa
                osat.push('\
<div style="border: solid black 1px; padding: 2px; background-color: #aef;"><label for="gk_sana">Käännös: </label><input type="text" id="gk_sana"/>\
');

                if ( typeof ominat[kieli] == "undefined" || ominat[kieli].suku )
                {
                    osat.push('\
<br/><label>Suku: </label>\
<input type="checkbox" class="gk_suku" id="gk_suku_m" style="width: 2em;"/>\
<label for="gk_suku_m">maskuliini</label>\
<input type="checkbox" class="gk_suku" id="gk_suku_f" style="width: 2em;"/>\
<label for="gk_suku_f">feminiini</label>\
<input type="checkbox" class="gk_suku" id="gk_suku_n" style="width: 2em;"/>\
<label for="gk_suku_n">neutri</label>\
<input type="checkbox" class="gk_suku" id="gk_suku_yl" style="width: 2em;"/>\
<label for="gk_suku_yl">yleinen suku</label>\
');
                }

                if ( typeof ominat[kieli] == "undefined" || ominat[kieli].latin )
                {
                    osat.push('\
<br/><label for="gk_latinalaistus">Latinalaistus: </label><input type="text" id="gk_latinalaistus" style="width: 10em;"/>\
');
                }

                // kaikille yhteinen loppuosa
                osat.push(' \
<input type="button" value="+" title="Lisää toinen käännös." onclick="gadget_kaannos.lisaa_sana_onclick();"/></div><input style="alignment: right;" type="button" onclick="gadget_kaannos.tallennusnappi_onclick();" value="OK" />\
');

                return osat.join("");
            }

            /*
             * Palauttaa lomakkeen tiedot oliona. 
             */
            function lue_tiedot(num) {
                var tiedot = {};
                tiedot.sana = $("#gk_sana").prop('value');
                tiedot.suku = ($("#gk_suku_m").prop('checked') ? "m" : "")
                			+ ($("#gk_suku_f").prop('checked') ? "f" : "") 
                			+ ($("#gk_suku_n").prop('checked') ? "n" : "")
                			+ ($("#gk_suku_yl").prop('checked') ? "yl" : "");
                tiedot.latin = $("#gk_latinalaistus").prop('value');
                return tiedot;
            }

            // ei käytössä
            function lataa_tiedot(tiedot) {
                var tiedot = {};
                $("#gk_sana").prop('value', tiedot.sana);
                $("#gk_suku_m").prop('checked', (tiedot.suku.indexOf("m") != -1 ? true : false))
                $("#gk_suku_f").prop('checked', (tiedot.suku.indexOf("f") != -1 ? true : false))
                $("#gk_suku_n").prop('checked', (tiedot.suku.indexOf("n") != -1 ? true : false))    
                $("#gk_latinalaistus").prop('value', tiedot.latin);
            }


            window.gadget_kaannos = {};

            window.gadget_kaannos.tallennusnappi_onclick = function() {
                var kieli = null;
                kieli = $("#gk_kieli").prop('value').trim().toLowerCase();

                // lisätään mahdollinen lisäämätön sana muiden perään
                if ( $("#gk_sana").prop('value') != "" ) {
                    gadget_kaannos.lisaa_sana_onclick();
                }

                window.gadget_kaannos.kieli = kieli;
                window.gadget_kaannos.sanat = luettelo;
                window.gadget_kaannos.numero = numero;

                if ( kieli != "" && luettelo.length > 0 ) {
                    // lisätään palautuslomake
                    $("#mw-content-text").prepend(tallennuslomake);
                    getPage();
                }
                else {
                    alert("Tarvitaan kieli ja ainakin yksi käännös.");
                }
            };

            window.gadget_kaannos.nimi_onchange = function() {
                var kieli = $("#gk_kieli").prop('value').trim().toLowerCase();

                // Jos laatikossa on kielikoodi, korvataan se kielen nimellä, jos tiedossa.
                if ( ominat[kieli] != undefined )
                    $("#gk_kieli").prop('value', kieleksi(kieli));

                $("#gk_luettelo").html("");
                $("#gk_lisaparamt").html(hae_kielikohtainen_lomake(kielikoodiksi(kieli)));
                $("#gk_sana").prop('value', '').focus();
            };


            window.gadget_kaannos.lisaa_sana_onclick = function() {
                var tiedot = lue_tiedot();

                if ( tiedot.sana != "" )
                {
                    var l = $("#gk_luettelo").html();
                    l += '<a style="border: 1px solid gray; padding: 2px;">' + tiedot.sana + '</a>' + ', ';
                    $("#gk_luettelo").html(l);
                    luettelo.push(tiedot);
                    $(".gk_suku").prop('checked', false);
                    $("#gk_latinalaistus").prop('value', '');
                    $("#gk_sana").prop('value', '').focus();

                    //console.log("luettelo: " + luettelo);
                    //console.log("sana: " + tiedot.sana + ", suku: " + tiedot.suku + ", latinalaistus: " + tiedot.latin);
                }
            };
            
            window.gadget_kaannos.lisaa_kaannos_onclick = function(num) {
                // piilotetaan mahdollinen edellinen avonainen
                piilota(numero);
                numero = num;

                $("#gk_kaannoslomake" + num).html(alkulomake);
                $("#gk_kieli").focus();
            };

            $( ".käännöskohta" ).each(function( index ) {
                if ( !$(this).hasClass('käännöskohta_ohjaus') ) {
                    $(this).find(".käännöstaulukko > tbody").append(syottolomake.replace(/@/g, index));
                }
            });
 
        })() // alustus
    }

    if ( mw.config.get('wgAction') == "view" ) {
        jQuery(document).ready(main);
    }

})(window);