Järjestelmäviesti:Gadget-Otsikot.js

Hei, olet tullut tänne etsimään sanan Järjestelmäviesti:Gadget-Otsikot.js merkitystä. DICTIOUS-sanakirjasta löydät paitsi kaikki sanan Järjestelmäviesti:Gadget-Otsikot.js sanakirjamerkitykset, myös sen etymologian, ominaisuudet ja sen, miten Järjestelmäviesti:Gadget-Otsikot.js sanotaan yksikössä ja monikossa. Kaikki mitä sinun tarvitsee tietää sanasta Järjestelmäviesti:Gadget-Otsikot.js on tässä. Sanan Järjestelmäviesti:Gadget-Otsikot.js määritelmä auttaa sinua olemaan täsmällisempi ja oikeampi puhuessasi tai kirjoittaessasi tekstejäsi. Kun tunnet sananJärjestelmäviesti:Gadget-Otsikot.js määritelmän sekä muiden sanojen määritelmät, rikastutat sanavarastoasi ja saat lisää ja parempia kielellisiä resursseja.
(function () {

    /**
     * Valikossa näkyvät kieliotsikot. Ei vaikuta otsikoiden järjestykseen. Se määräytyy 
     * `kielijarj`-funktiolla.
     */
    var kielet = [ "Kansainvälinen", "Suomi", "Englanti", "Espanja", "Ranska", "Ruotsi", "Saksa", 
                   "Venäjä", "Viro", "Lähteet", "Viitteet" ];
 
    /**
     * Sanaluokat yms.. Valikossa näkyvät. Osioiden järjestys määräytyy aakkosjärjestyksen mukaan.
     */
    var taso3 = [ "Aakkonen", "Adjektiivi", "Adverbi", "Erisnimi", "Fraasi", "Interjektio", 
                  "Konjunktio", "Lyhenne", "Numeraali", "Postpositio", "Prefiksi", "Prepositio", 
                  "Pronomini", "Substantiivi", "Suffiksi", "Supistuma", "Verbi" ];
 
    /**
     * Sanaluokkien aliosiot. Otsikoiden järjestys ja valikossa näkyvät.
     */
    var taso4 = [ "Ääntäminen", "Taivutus", "Huomautukset", "Etymologia", "Käännökset", 
                  "Lainaukset", "Liittyvät sanat", "Idiomit", "Aiheesta muualla", "Lähteet" ];
 
    /**
     * Liittvät sanat. Otsikoiden järjestys ja valikossa näkyvät.
     */
    var liittyvat = [ "Rinnakkaiset kirjoitusasut", "Rinnakkaismuodot", "Synonyymit", 
                      "Vastakohdat", "Johdokset", "Yhdyssanat", "Sanaliitot", "Yhdyssanat ja sanaliitot", 
                      "Tästä johtuvat tytärkielten sanat", "Lainat muissa kielissä", 
                      "Yläkäsitteet", "Vieruskäsitteet", "Alakäsitteet", "Osakäsitteet", 
                      "Kokonaiskäsitteet" ];
 
    /**
     * Osioihin lisättävä oletusteksti.
     */
    var oletusarvot = { 
        "." : ,
        "Suomi" : 
        {
            "." : ,
            "Adjektiivi" : { "." :  },
            "Adverbi" : { "." :  },
            "Substantiivi" : 
            {
                "." : ,
                "Taivutus" : { "." :  },
            },
            "Verbi" : { "." :  },
            "*" : 
            {
                "Ääntäminen" : { "." :  },
            },
        },
        "Englanti" : 
        {
            "Adjektiivi" : { "." :  },
            "Adverbi" : { "." :  },
            "Substantiivi" : { "." :  },
            "Verbi" : { "." :  },
        },
        "Espanja" : 
        {
            "Adjektiivi" : { "." :  },
            "Adverbi" : { "." :  },
            "Substantiivi" : { "." :  },
            "Verbi" : { "." :  },
        },
        "Ruotsi" : 
        {
            "Adjektiivi" : { "." :  },
            "Adverbi" : { "." :  },
            "Substantiivi" : { "." :  },
            "Verbi" : 
            { 
                "." : , 
                "Taivutus" : { "." :  },
            },
        },
        "Saksa" : 
        {
            "Adjektiivi" : { "." :  },
            "Adverbi" : { "." :  },
            "Substantiivi" : { "." :  },
            "Verbi" : { "." :  },
        },
        "Venäjä" : 
        {
            "Adjektiivi" : { "." :  },
            "Adverbi" : { "." :  },
            "Substantiivi" : { "." :  },
            "Verbi" : { "." :  },
        },
        "Viitteet" : 
        {
            "." : ,
        },
        "Lähteet" :
        {
            "." : "",
        },
        "*" : 
        {
            "." : , // erikoisarvo, joka estää rivinvaihdon lisäämisen
            "Adjektiivi" : { "." :  },
            "Adverbi" : { "." :  },
            "Erisnimi" : { "." :  },
            "Fraasi" : { "." :  },
            "Interjektio" : { "." :  },
            "Konjunktio" : { "." :  },
            "Lyhenne" : { "." :  },
            "Numeraali" : { "." :  },
            "Partikkeli" : { "." :  },
            "Postpositio" : { "." :  },
            "Prefiksi" : { "." :  },
            "Prepositio" : { "." :  },
            "Pronomini" : { "." :  },
            "Substantiivi" : 
            {
                "." : ,
            },
            "Suffiksi" : { "." :  },
            "Supistuma" : { "." :  },
            "Verbi" : { "." :  },
            "*" : 
            {
                "." : , 
                "Ääntäminen" : { "." :  },
                "Käännökset" : { "." :  },
                "Etymologia" : { "." :  },
                "Lainaukset" : { "." :  },
                "Liittyvät sanat" : 
                { 
                    "." : ,
                    "Johdokset" :  { "." :  },
                    "Yhdyssanat" :  { "." :  },
                    "Yhdyssanat ja sanaliitot" :  { "." :  },
                },
            },
        },
    };


    // Sivun otsikot.
    var osat = ;

    /**
     * Osion polku osat-taulukon indekseinä.
     */
    var polku = ;

    /**
     * Tekstin pituus ilman kielilinkkejä ja luokkia.
     */
    var tekstin_loppu = -1;

    /**
     * Kielilinkit ja luokat sivun lopusta.
     */
    var luokat = "";
    
    var $textbox = $('#wpTextbox1');

    /**
     * Sektion numero, jos editoidaan artikkelin osaa.
     */
    var wpSection = $('input').val();


    /**
     * Tekee indeksipolusta tekstipolun. Esim.  -> 
     */
    function tekstipoluksi(polk) {
        var opolku = ;
        for ( var i = 2; i < polk.length; i++ )
            if ( typeof polk !== "undefined" ) {
                if ( polk === null )
                    opolku.push(null);
//              else if ( polk == -1 )
//                  opolku.push("");
                else
                    opolku.push(osat]);
            }
        return opolku;
    }

    /**
     * Palauttaa oletusarvon taulukosta 'oletusarvot' osiolle, jonka polku on 'polku'.
     */
    function oletusarvo(polku) {
        function _apu(opolku, i, okohta) {
            if ( i == opolku.length ) {
                if ( "." in okohta )
                    return okohta;
                return null;
            }

            var ret = null;
            if ( opolku in okohta )
                ret =  _apu(opolku, i+1, okohta]);
            if ( !ret && "*" in okohta )
                ret = _apu(opolku, i+1, okohta);
            return ret;
        }

        var ret =  _apu(polku, 0, oletusarvot) ;
        if ( ret === null ) ret = "";
        return ret;
    }


    function kielijarj(k) {
        switch ( k ) {
        case "Kansainvälinen":
            return -2;
        case "Suomi":
            return -1;
        case "Lähteet":
            return +1;
        case "Viitteet":
            return +2;
        default:
            return 0;
        }
    }

    /*
     * Jakaa tekstin 'teksti' kahteen osaan joista jälkimmäinen sisältää kielilinkit ja luokat
     * ja ensimmäinen muun tekstin. Palauttaa taulukon.
     */
    function erota_luokat(teksti) {
        var p = teksti.search(/\n(\+:]+\]\]\s*\n*)+$/);
        if ( p == -1 ) {
            p = teksti.length;
        }
        return ;
    }

    /**
     * Palauttaa otsikkovalikon otsikot polulle 'polku'.
     * Param polku: , jonka alkiot ovat indeksejä osat-taulukkoon.
     */
    function hae_otsikot(polku) {
		var grp;
		var i;
        var sivu = false;
        var taso2ots = null;
        var taso3ots = null;
        var taso4ots = null;
        var otsikot = ;

        if ( polku !== null ) sivu     = true;
        if ( polku !== null && osat] ) taso2ots = osat];
        if ( polku !== null && osat] ) taso3ots = osat];
        if ( polku !== null && osat] ) taso4ots = osat];

        otsikot.push("<option>- Lisää otsikko -</option>");

        if ( taso4ots == "Liittyvät sanat" ) {
            grp = $("<optgroup label='Liittyvät sanat'></optgroup>");
            grp.prop("level", 5);

            for ( i in liittyvat ) { 
                grp.append("<option>" + liittyvat + "</option>");
            }

            otsikot.push(grp);
        }

        if ( taso3ots ) {
            if ( taso3.indexOf(taso3ots) != -1 
                 && taso2ots != "Lähteet" 
                 && taso2ots != "Viitteet" ) {
                
                grp = $("<optgroup label='" + taso3ots + "'></optgroup>");
                grp.prop("level", 4);

                for ( i in taso4 ) { 
                    // Suodatetaan Käännökset-otsikko pois, jos kieli ei ole suomi tai 
                    // määrittelemätön kieli.
                    if ( taso4 != "Käännökset" || (taso2ots == "Suomi" || taso2ots === null) ) {
                        grp.append("<option>" + taso4 + "</option>");
                    }
                }

                otsikot.push(grp);
            }
        }

        if ( taso2ots ) {
            grp = $("<optgroup label='" + taso2ots + "'></optgroup>");
            grp.prop("level", 3);

            for ( i in taso3 ) { 
                grp.append("<option>" + taso3 + "</option>");
            }

            otsikot.push(grp);
        }


        if ( sivu ) {
            grp = $("<optgroup label='- sivu -'></optgroup>");
            grp.prop("level", 2);

            for ( var j in kielet ) { 
                grp.append("<option>" + kielet + "</option>");
            }

            otsikot.push(grp);
        }

        return otsikot;
    }


    /**
     * Palauttaa true, jos otsikko 'a' tulee ennen otsikkoa 'b', kun molempien taso on 'taso'.
     */
    function tulee_ennen(taso, a, b) {
        switch ( taso ) {
        case 2:  // kielet
            var ai = kielijarj(a), bi = kielijarj(b);
            if ( ai == bi )
                return (a < b); 
            return (ai < bi);
        case 3:  // Sanaluokat
            return (a < b);
        case 4:  // Sanaluokan aliosiot
            return (taso4.indexOf(a) < taso4.indexOf(b));
        case 5:  // liittyvät sanat
            return (liittyvat.indexOf(a) < liittyvat.indexOf(b));
        }
        return false;
    }

    function lisaa_teksti(teksti, valitse) {
        var ppos = $textbox.textSelection('getCaretPosition', { 'startAndEnd' : true });
        var spos = ppos;
        var epos = ppos;

        if ( false && document.queryCommandSupported('insertText')) {
            $textbox.focus();
            document.execCommand('insertText', false, teksti);
        } else {
            $textbox.val($textbox.val().substring(0, spos) + teksti 
                         + $textbox.val().substring(epos, $textbox.val().length));
        }
        epos = spos + teksti.length;
        $textbox.textSelection('setSelection', { 'start': spos, 'end': epos }); 
        $textbox.focus();
    }

    function lisaa_blokki(pos, otsikko, osio) {
        if ( pos != -1 ) $textbox.textSelection('setSelection', { 'start': pos, 'end': pos }); 
        
        var ppos = $textbox.textSelection('getCaretPosition', { 'startAndEnd' : true });
        var spos = ppos-1, epos = ppos-1;

        // Valitaan tyhjä alue osioiden välistä.
        while ( $textbox.val() == "\n" ) spos--; spos += 1;
        while ( $textbox.val() == "\n" ) epos++;
        $textbox.textSelection('setSelection', { 'start': spos, 'end': epos }); 

        //HÄ?????????
        // Lisätään ennen ensimmäistä otsikkoa vain yksi rivinvaihto.
        if ( spos == 0 ) alku = "\n"; else alku = "\n\n";

        // Haetaan lisäyksessä liikkunut kursori.
        var spos = $textbox.textSelection('getCaretPosition', { 'startAndEnd' : false });
        spos += alku.length + otsikko.length + 1;

        var epos = spos + osio.length;
        if ( osio != "" ) epos -= 1; // Miksi tarvitaan??
        var teksti = alku + otsikko + "\n" + osio + "\n";
        lisaa_teksti(teksti, false);

        // Valitaan lisätty osio, pois lukien viimeinen rivinvaihto.
        $textbox.textSelection('setSelection', { 'start': spos, 'end': epos }); 
        
    }

    function tee_otsikko(taso, teksti) {
        var eq = Array(taso+1).join("=");
        return eq + teksti + eq;
    }
    
    function kirjoita_teksti() {
        var rivit = ;
        for ( var i in osat ) {
            var lvl = osat;
            if ( lvl > 0 ) {
                rivit.push(tee_otsikko(osat));
            } else {
                rivit.push(osat);
            }
        }
        // Yhdistetään osat.
        var txt = rivit.join("\n") + luokat;
        $textbox.val(txt);
    }
    

    function lisaa_otsikko(taso, lisattava) {
        var i = 0, a = 0, l = -1;
        if ( taso == 2 ) a = 0;
        else a = polku+1;

        // Etsitään otsikko, jota ennen tämä otsikko lisätään.
        for ( var i = a; i < osat.length; i++ ) {
            if ( osat < taso ) {
                break;
            } else if ( osat == taso ) {
                if ( tulee_ennen(taso, lisattava, osat) ) {
                    break;
                }
            }
        }

        // Lasketaan uusi kursorin kohta.
        var pos = 0;
        if ( i < osat.length ) {
            pos = osat;
        } else {
            pos = tekstin_loppu;
        }

        // Uuden osion polku
        var tpolku = tekstipoluksi(polku.slice(0, taso))
        tpolku.push(lisattava);
        var blokki = oletusarvo(tpolku);
        // Jos arvo on -1 jätetään rivinvaihto lisäämättä
        if ( blokki == -1 ) blokki = ""; else blokki += "\n";
        lisaa_blokki(pos, tee_otsikko(taso, lisattava), blokki);
    }

    function ovalikko_onchange() {
        var $otsikkovalikko = $("#otsikkovalikko");
        var $valittu = $otsikkovalikko.find("option:selected");
        var lisattava = $valittu.text();

        if ( $otsikkovalikko.prop("selectedIndex") != 0 ) {
            var taso = $valittu.parent().prop("level");
            
            lisaa_otsikko(taso, lisattava);
            
            $textbox.focus();

        } else {
            //$textbox.focus();
        }

        $otsikkovalikko.children(':first').prop('selected', true);
    }



    function parsi_teksti() {
        var pos = $textbox.textSelection('getCaretPosition', { 'startAndEnd' : false }) + 1;
        var txt = "\n" + $textbox.val(); 
        var pat = /\n(==+)(.*)\1/g;
        var result;


        var arr = erota_luokat(txt);
        txt = arr;
        luokat = arr;
        tekstin_loppu = arr.length;

        // Taso, jolla kursori on.
        var postaso = 0;
        polku = ;
        if ( wpSection == "" )  { polku = -1; postaso = 1 };
        osat = ;

        while ( (result = pat.exec(txt)) !== null ) {
            // Matchin alku + 1. Huom. osoittaa otsikon alkuun eikä otsikkoa edelliseen
            // rivinvaihtoon, koska tekstin alkuun lisättiin ylimääräinen \n.
            var s = pat.lastIndex - result.length
            var taso = result.length;

            osat.push( ]);

            // Lopetetaan polun kokoaminen, jos ollaan yli kursorin kohdan.
            if ( s < pos ) {
                polku = osat.length-1;
                postaso = taso;
            }
        }

        polku = polku.slice(0, postaso+1);
    }

    function tayta_otsikkovalikko() {
        parsi_teksti();

        var lst = hae_otsikot(polku);
        $("#otsikkovalikko").empty();
        for ( var i in lst ) {
            $("#otsikkovalikko").append(lst);
        }
    }





    function run($) {
        var $sailio = $('<span></span>');
        if ( $("#tyokalupakki").length == 0 ) {
            $textbox.before('<div id="tyokalupakki"></div>');
        }
        $("#tyokalupakki").append([ '<span class="tyokaluerotin" style="color: gray; ">'
                                    + ' | </span>', $sailio ]);

        var $ohje_lnk = $('<a href="https://dictious.com/fi/Ohje:Gadget-Otsikot">?</a></div>');
        var $ohje_span = $('<span class="ohjenappi"></span>');
        $ohje_span.html(" ]);

        var $ovalikko = $('<select style="width: 15em;" id="otsikkovalikko" '
                          + 'title="Lisää otsikko ">'
                          + '<option>- Lisää otsikko -</option>'
                          + '</select>');

        $ovalikko.on("focus", tayta_otsikkovalikko);
        $ovalikko.on("change", ovalikko_onchange);
        $ovalikko.keyup(function(event) { 
            if ( event.keyCode == 27 ) /* ESC */ $textbox.focus();
            else if ( event.keyCode == 18 ) /* Enter */ event.preventDefault(); 
        });

        $sailio.append();

        $(document).keyup(function(event){
            if ( event.ctrlKey && event.altKey && event.keyCode == 79 ) { // 'o'
                $ovalikko.focus();
            }
        });
        $textbox.focus();
    }

    if ( (mw.config.get('wgAction') == "edit" || mw.config.get('wgAction') == "submit") 
         && mw.config.get('wgNamespaceNumber') == 0) {
        jQuery(document).ready(run);
    }

})();