Järjestelmäviesti:Gadget-nytt uppslag.js

Wikisanakirjasta

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.
// perustuu https://sv.wiktionary.org/wiki/MediaWiki:Gadget-nytt_uppslag.js

if ( (mw.config.get("wgAction") == "edit" ||
      mw.config.get("wgAction") == "submit") &&
     mw.config.get("wgNamespaceNumber") === 0) {
    jQuery(document).ready(function($) {

		/* Valintalistassa näkyvät sanaluokat. */
        var h3s = {
            adj: "adjektiivi",
            adv: "adverbi",
            subs: "substantiivi",
            verbi: "verbi",
            eris: "erisnimi",
            lyh: "lyhenne",
            artikkeli: "artikkeli",
            fraasi: "fraasi",
            interjektio: "interjektio",
            konjunktio: "konjunktio",
            numeraali: "numeraali",
            prefiksi: "prefiksi", 
            prepositio: "prepositio", 
            pronomini: "pronomini",
            suffiksi: "suffiksi"
        };


        /* Valintalistassa näkyvät kielet. */
        var languages = {
            fi: "suomi",
            en: "englanti",
            es: "espanja",
            it: "italia",
            pt: "portugali",
            pl: "puola",
            sv: "ruotsi",
            fr: "ranska",
            de: "saksa",
            uk: "ukraina",
            ru: "venäjä",
            et: "viro"
        };

        
        function ucFirst(str) {
            return str.charAt(0).toUpperCase() + str.substr(1);
        }


        // Kielikohtaiset mallineet, sisältää joka kielelle oman osan joka sisältää sanaluokille omat osat.
        // %k korvataan kielikoodilla ja %t artikkelin nimellä
        var sr_mallineet = { 
            fi: { adj: "fi-adj", adv: "fi-adv", subs:  "fi-subs", verbi: "fi-verbi" },
            en: { adj: "en-adj", adv: "en-adv", subs: "en-subs",  verbi: "en-verbi" }, 
            es: { verbi: "es-verbi" }, 
            sv: { verbi: "sv-verbi" }, 
            de: { verbi: "de-verbi" }, 
            fr: { verbi: "fr-verbi" }, 
            it: { verbi: "it-verbi" }, 
            pt: { subs: "pt-subs", verbi: "pt-verbi" }, 
        };
        // oletusarvot, kun kielelle ei löydy omaa sanaluokkakohtaista mallinetta. Huom. kielikoodi lisätään perään
        var sr_o_mallineet = { subs:  "substantiivi|%k",
                               adj:   "adjektiivi|%k",
                               adv:   "adverbi|%k",
                               eris:  "erisnimi|%k",
                               verbi: "verbi|%k",
                               lyh:   "lyhenne|%k",
                               aakkonen:    "aakkonen|k=%k",
                               fraasi:      "fraasi|%k",
                               interjektio: "interjektio|%k",
                               kirjoitusmerkki: "kirjoitusmerkki|%k",
                               konjunktio:  "konjunktio|%k",
                               partikkeli:  "partikkeli|%k",
                               prepositio:  "prepositio|%k",
                               prefiksi:    "prefiksi|%k",
                               pronomini:   "pronomini|%k",
                               suffiksi:    "suffiksi|%k",
                               supistuma:   "supistuma|%k" };

        function malline_kielelle(kk, sl, title) {
            // Tarkistetaan ettei syötteissä ole kiellettyjä merkkejä.
            if ( title.match(/[}{|\n]/) !== null ) {
                title = "";
            }
            
            if ( sr_mallineet[kk] !== undefined && sr_mallineet[kk][sl] !== undefined ) {
                return "{{" + sr_mallineet[kk][sl].replace("%t", title) + "}}";
            }
         
        	if ( sr_o_mallineet[sl] ) {
            	return "{{" + sr_o_mallineet[sl].replace("%k", kk).replace("%t", title) + "}}";
        	}
        	return "'''" + title + "'''";
        }

        /**
         * Poistaa määritelmätekstistä linkkimerkit.
         **/
        function poistaLinkit(text) {
            return text.replace(/\[\[[^\]|]+\|([^\]]+)\]\]/g, "$1")  // Esim. "[[katti|katin]]" -> "katin"
                .replace(/[\]\[]{2}/g, "");             			 // Yksinkertaiset likit, esim. "[[koira]]" -> "koira"
        }

        /**
         * Palauttaa ikkunan leveyden selainriippumattomasti.
         **/
        function getScreenWidth() {
            var width = 750; // viewport width
            // för alla vanliga webbläsare
            if (typeof window.innerWidth !== 'undefined') {
                width = window.innerWidth;
                // IE6
            } else if (typeof document.documentElement !== 'undefined'
                       && typeof document.documentElement.clientWidth !== 'undefined'
                       && document.documentElement.clientWidth !== 0) {
                width = document.documentElement.clientWidth;
                
            } // annars uråldrig, ännu äldre IE - vi struntar i dem
            return width;
        }

        /**
         * Luo monivalintahimmelin, joka näyttää osan annetuista arvoista linkkeinä, osan valintalistassa.
         * @param o: olio, jossa
         *    all:      kaikki vaihtoehdot (dict), esim. { "adj": "adjektiivi", "subs": "substantiivi" }
         *    show:     linkkeinä näytettävät vaihtoehdot; lista edellisen avaimia, esim. [ "adj", "subs" ]
         *    def:      tekstilaatikossa näkyvä arvo ennen kuin mitään on valittu
         *    title:    listassa näkyvä teksti
         *    id:       luotavan tekstilaatikon id-attribuutti
         *    func:     funktio, jota kutsutaan kun jokin valitaan
         **/
        function multipleChoice(o) {
            var i, 
                $input,           // Teksti-inputti.
                links = [], 
                $select,          // Listainputti.
                options = [], 
                show_flip = {},
                all     = o.all,
                show    = o.show, // Linkkeinä näytettävät vaihtoehdot.
                // Nykyinen valinta. Joko annettu oletusarvo tai ensimmäinen linkeistä.
                valittu = (o.def ? o.def : all[show[0]]);

            function onclick () { 
                o.func(this.value);
                return false;
            }
            
            for ( i = 0; i < show.length; i++ ) {
                links.push($('<a href=""></a>')
                           .html(all[show[i]])
                           .val(show[i])
                           .on("click", onclick));
                links.push(" &bull; ");
                show_flip[ show[i] ] = true;
            }
            
            
            // Select-laatikossa näkyvä otsikkoteksti.
            options.push($('<option value=""></option>')
                         .html(o.title));
            
            // Muut vaihtoehdot.
            for ( i in all ) {
                if (!show_flip[i]) { // lägg inte till den dubbelt;
                    options.push($('<option></option>')
                                 .val(i)
                                 .html(all[i]));
                }
            }

            $select = $('<select style="display:inline; size: small;"/>')
                .html(options)
                .on("change", function () { 
                    o.func(this.value); 
                });
            
            // Select-laatikossa näkyvä otsikkoteksti.
            $input = $('<input type="text" tabindex="1" />')
                .attr("id", o.id)
                .val(valittu);
            
            return $("<span></span>").append($input).append("<br/>").append(links).append($select);
        }

        /**
         * Palauttaa avaimen dictistä 'all', joka on tai vastaa arvoa 'chosen'.
         * @param all:    Dict sanaluokista tai kielistä, esim. { "en": "englanti", "sv": "ruotsi" }
         * @param chosen: valittu, esim. "englanti"
         * @reutrn        vastaava avain, esim. "en"
         **/
        function getCode(all, chosen) {
            var code;
            chosen = chosen.toLowerCase();
            if ( all[chosen] ) {
                return chosen;
            }
            for ( code in all ) {
                if (all[code] == chosen) {
                    return code;
                }
            }
            return null;
        }


        /** 
         * Generoi tekstin.
         **/
        window.nytt_uppslag.generate = function(e) {
            var $nu_lang        = $("#nu_lang"),
                $nu_h3          = $("#nu_h3"),
                $nu_definition  = $("#nu_definition"),
                $wpTextbox1     = $("#wpTextbox1"),
                $wpSummary      = $("#wpSummary"),
                $wpSave         = $("#wpSave"),
                $nu_saveTooltip = $("#nu_saveTooltip"),
                kieli           = $nu_lang.val(), // kielen nimi tai kielikoodi
                lang            = null, // kielen tunnus
                h3              = $nu_h3.val(), // sanaluokan nimi
                h3code,                         // sanaluokan tunnus
                definition      = $nu_definition.val(),
                output          = [];

            definition = definition.trim();
            kieli      = kieli.trim();
            h3         = h3.trim();

            if ( !kieli ) {
                alert("Et ole antanut kieltä. Valitse listasta tai kirjoita tekstilaatikkoon.");
                $nu_lang.focus();
                return false;
            }
            if ( !h3 ) {
                alert("Et ole antanut sanaluokkaa/H3-otsikkoa. Valitse listasta tai kirjoita tekstilaatikkoon.");
                $nu_h3.focus();
                return false;
            }
            if (!definition) {
                alert("Sinun täytyy kirjoittaa sananselitys.");
                $nu_definition.focus();
                return false;
            }

            lang = getCode(languages, kieli);
            if ( !lang ) { lang = "{{su" + "bst:kielikoodi|" + kieli + "}}"; }
            h3code = getCode(h3s, h3);

            // Tallennetaan kieli ja sanaluokka evästeeseen.
            jQuery.cookie( 'edellinen_nu_lang', kieli, { expires: 1,  path: '/' } );
            jQuery.cookie( 'edellinen_nu_h3',   h3,   { expires: 1,  path: '/' } );

            function print(str) {
                output.push(str);
            }

            print("==" + ucFirst(kieli) + "==\n");
            print("===" + ucFirst(h3) + "===\n");
            print(malline_kielelle(lang, h3code, mw.config.get("wgTitle")) + "\n");
            print("\n");
            print("# " + definition + "\n");
            print("");
            if ( $("#cb_aant").is(":checked") ) {
                print("\n");
                print("====Ääntäminen====\n");
                print("\n");
            }
            if ( $("#cb_taiv").is(":checked") ) {
                print("\n");
                print("====Taivutus====\n");
                print("\n");
            }
            if ( $("#cb_ety").is(":checked") ) {
                print("\n");
                print("====Etymologia====\n");
                print("\n");
            }
            if ( lang == "fi" ) {
                print("\n");
                print("====Käännökset====\n");
                print("{{subst" + ":kohta|1|" + poistaLinkit(definition) + "|\n");
                print("\n");
                print("|loppu}}\n");
                print("\n");
            }
            if ( $("#cb_liit").is(":checked") ) {
                print("\n");
                print("====Liittyvät sanat====\n");
                print("\n");
            }
            if ( $("#cb_laht").is(":checked") ) {
                print("\n");
                print("====Lähteet====\n");
                print("\n");
            }

            $nu_definition.val("");

	    // Käytetään Artikkeliyhdistäjä-gadgettia järjestämään osiot, jos se on päällä.
	    if ( window.articleMerger && window.articleMerger.mergeToArticle ) {
		window.articleMerger.mergeToArticle(output.join(""), "3+");
	    } else {
		$wpTextbox1.val($wpTextbox1.val() + ($wpTextbox1.val() ? "\n\n" : "") + output.join(""));
	    }
	    
            // Muutetaan tekstilaatikon rivimäärää TODO tarviiko??
            $wpTextbox1.attr('rows', $wpTextbox1.val().split("\n", 17).length + 8); // standard: 25
            //$wpSummary.val(($wpSummary.val() ? "; " : "") + "uusi artikkeli ("+ kieli +")");

            // Tooltippi näkyväksi.
            $nu_saveTooltip.css("display", "block");
            $wpSave.focus();
            
            return false;
        };


        /**
         * Alustus.
         **/
        (function() {
            var i,
                $container  = $("#nytt_uppslag"),
                $lang_input = $("#nu_language_input"),
                $h3_input   = $("#nu_h3_input"),
                $tips       = $("#nu_tips"),
                $help_link  = $("#nu_help_link"),
                $mo_input   = $("#muut_otsikot_input"),
                $wpSave         = $("#wpSave"),
                $nu_saveTooltip = $("#nu_saveTooltip"),
                $nu_submit,
                $wpSave,
                showLangs,
                showH3s;
            
            console.log("Gadget-nytt_uppslag.js");
            
            if ( $container.length === 0 ) {
                return;
            }

            // Luetaan mahdolliset käyttäjän asettamat kielet tai luetaan lomakkeesta.
            if ( typeof window.nyttUppslagKielet === "undefined" ) {
                showLangs = $lang_input.html();
            } else {
                showLangs = window.nyttUppslagKielet;
            }

            // Luetaan mahdolliset käyttäjän asettamat sanaluokat tai luetaan lomakkeesta.
            if ( typeof window.nyttUppslagSanaluokat === "undefined" ) {
                showH3s = $h3_input.html();
            } else {
                showH3s = window.nyttUppslagSanaluokat;
            }
            
            showLangs = showLangs.split(",");
            showH3s   = showH3s.split(",");
            
            var $mc_lang = multipleChoice({
                show:  showLangs,
                all:   languages,
                func:  function(lang) {
                    console.log("lang: " + lang);
                    if (lang) $("#nu_lang").val(languages[lang]);
                },
                id:    "nu_lang",
                def:   jQuery.cookie('edellinen_nu_lang'),
                title: "Lisää kieliä..."
            });
            
            var $mc_h3 = multipleChoice({
                show:  showH3s,
                all:   h3s,
                func:  function(h3) {
                    console.log("h3: " + h3);
                    if (h3) $("#nu_h3").val(h3s[h3]);
                },
                id:    "nu_h3",
                def:   jQuery.cookie('edellinen_nu_h3'),
                title: "Lisää H3-otsikoita..."
            });
            
            // sätt en <form> runt alltihop
            $container.wrap("<form></form>");
            
            // tips
            if ( $tips.length > 0 ) {
                var $new_tips = $tips.clone();
                $new_tips.attr("id", "nu_tips_new");
                $new_tips.attr("class", "");
                $("#nu_tips_position").append($new_tips);
                $tips.remove();
            }

            // Määritelmäkenttä.
            $nu_definition = $('<input type="text" id="nu_definition" tabindex="1"/>');
            $("#nu_definition_input").replaceWith($nu_definition);
            
            // Luodaan generointinappi.
            $nu_submit = $('<button tabindex="1"></button>');
            $nu_submit.html($("#nu_submit_button").html());
            $nu_submit.on("click", window.nytt_uppslag.generate);
            $("#nu_submit_button").replaceWith($nu_submit);
            
            $help_link.children(":first").attr("target", "_blank"); // hjälplänken öppnas i nytt fönster
            $lang_input.replaceWith($mc_lang);
            $h3_input.replaceWith($mc_h3);
            $mo_input.html('<label><input type="checkbox" id="cb_aant" tabindex="1"/> Ääntäminen </label>' + 
                           '<label><input type="checkbox" id="cb_taiv" tabindex="1"/> Taivutus </label>' + 
                           '<label><input type="checkbox" id="cb_ety"  tabindex="1"/> Etymologia </label>' + 
                           '<label><input type="checkbox" id="cb_liit" tabindex="1" /> Liittyvät sanat </label>' + 
                           '<label><input type="checkbox" id="cb_laht" tabindex="1"/> Lähteet </label>');
            
            $container.addClass("enabled");
            
            if ( getScreenWidth() < 750 ) {
                $container.addClass("smallscreen");
            }

            $nu_saveTooltip.on("mouseout", function() { $(this).fadeOut(500); });
            $wpSave.before($nu_saveTooltip);
        }());
    });
}