Järjestelmäviesti:Gadget-Kaannosartikkeli.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.
/**
 * Pienoisohjelma artikkelien generoimiseen käännöslaatikon tiedoista.
 *
 * Ohjelmalla voi aloittaa artikkelin nopeasti täyttämällä artikkelipohja [[Malline:käännös]]
 * -mallineella merkityillä tiedoilla.
 **/
(function () {

    /**
     * Palauttaa sopivan artikkelipohjan annetuille parametriarvoille.
     *
     * Tässä funktiossa voi määrittää käytettävät kielikohtaiset artikkelipohjat eri parametriarvoille
     * ja niiden yhdistelmille. Artikkelipohjien tulee olla sellaisia, että ne ottavat para-
     * metrit järjestyksessä: 1. kielen nimi (kieliotsikko), 2. sanaluokka (otsikko), 3. kielikoodi, 
     * 4. viittaavan artikkelin nimi (johon luotava on käännös), 5. selite (käännöslaatikon teksti),
     * 6. latinisointi, 7. suku, 8. artikkelin nimi, nimi painomerkeillä tai vokaalimerkeillä. Artikkelipohjassa 
     * voi jättää tarpeettomat parametrit huomiotta.
     *
     * TODO: painomerkitty sana (puuttuu käännökset-gadgetista)
     * 
     * @param kielikoodi:  kielikoodi, esim. "fr"
     * @param sanaluokka:  esim. "Substantiivi"
     * @param suku:        esim. "m."; undefined, jos sukua ei ole
     * @param lat:         latinisointi. Undefined, jos ei ole.
     * @return:            käytettävä artikkelipohja, esim. "Malline:artikkelipohja-fr-subs", tai null
     **/
    function kielikohtainenArtikkelipohja(kielikoodi, sanaluokka, suku, lat) {
    	
        if ( sanaluokka === "Adjektiivi" ) {
        	switch ( kielikoodi ) {
        	case "en":
        	case "es":
		    case "pt":
		   		return "Malline:artikkelipohja-standardi-adj";
        	}
        } else if ( sanaluokka === "Adverbi" ) {
        	switch ( kielikoodi ) {
        	case "en":
        	case "es":
		      	return "Malline:artikkelipohja-standardi-adv";
        	}
        } else if ( sanaluokka === "Substantiivi" ) {
        	switch ( kielikoodi ) {
        	case "es":
        	case "pt":
		       	return "Malline:artikkelipohja-standardi-subs-suku";
        	}
        } else if ( sanaluokka === "Verbi" ) {
        	switch ( kielikoodi ) {
        	case "en":
        	case "es":
			  	return "Malline:artikkelipohja-standardi-verbi";
        	}
        }

        return null;
    }

    /**
     * Artikkelipohjat, joita käytetään, jos kielikohtaista ei ole määritetty 
     * kielikohtainenArtikkelipohja-funktiossa.
     **/
    var yleisetArtikkelipohjat = {
        // sanaluokka,   suku?, lat?
        'Adjektiivi' :   { 0 : { 0 : 'Malline:artikkelipohja-yleinen-adjektiivi',
                                 1 : 'Malline:artikkelipohja-yleinen-adjektiivi-lat' } },
        'Adverbi' :      { 0 : { 0 : 'Malline:artikkelipohja-yleinen-adverbi',
                                 1 : 'Malline:artikkelipohja-yleinen-adverbi-lat' } },
        'Erisnimi' :     { 0 : { 0 : 'Malline:artikkelipohja-yleinen-erisnimi',
                                 1 : 'Malline:artikkelipohja-yleinen-erisnimi-lat' } },
        'Interjektio' :  { 0 : { 0 : 'Malline:artikkelipohja-yleinen-interjektio',
                                 1 : 'Malline:artikkelipohja-yleinen-interjektio-lat' } },
        'Numeraali' :    { 0 : { 0 : 'Malline:artikkelipohja-yleinen-numeraali',
                                 1 : 'Malline:artikkelipohja-yleinen-numeraali-lat' } },
        'Substantiivi' : { 0 : { 0 : 'Malline:artikkelipohja-yleinen-substantiivi',
                                 1 : 'Malline:artikkelipohja-yleinen-substantiivi-lat' },
                           1 : { 0 : 'Malline:artikkelipohja-yleinen-substantiivi-suku',
                                 1 : 'Malline:artikkelipohja-yleinen-substantiivi-suku-lat' } },
        'Verbi' :        { 0 : { 0 : 'Malline:artikkelipohja-yleinen-verbi' ,
                                 1 : 'Malline:artikkelipohja-yleinen-verbi-lat' } },
    };
 
    function haeArtikkelipohja(kielikoodi, sanaluokka, suku, lat) {
        var pohja = kielikohtainenArtikkelipohja(kielikoodi, sanaluokka, suku, lat);
        if ( pohja ) {
            return pohja;
        }
    
    	if ( yleisetArtikkelipohjat[sanaluokka] ) {
        	return yleisetArtikkelipohjat[sanaluokka][suku ? 1 : 0][lat ? 1 : 0];
    	}
    	return null;
    }
    
    /**
     * Muuttaa käännös-mallineen luoman sukutekstin takaisin parametrimuotoon.
     **/
    function haeSukuparametri(suku) {
        return suku.replace(/[\./]/g, "");

    }
 
 /**
  * Palauttaa urlin johon on perään lisätty parametrit.
  **/
 function teeLinkki(url, pohja, kieli, sanaluokka, kielikoodi, viittaava_sivu, selite, lat, suku, luotava_sivu) {
     var params = [ kieli.substr(0, 1).toUpperCase() + kieli.substr(1),
                    sanaluokka,
                    kielikoodi,
                    viittaava_sivu,
                    selite,
                    lat,
                    suku,
                    luotava_sivu ];
     
     return url + '&preload=' + pohja + params.map(function (elt) {
         return '&preloadparams[]=' + encodeURIComponent(elt);
     }).join('');
 }

 function main() {
     var sanaluokka;
     // Käydään läpi sanaluokkaotsikot ja käännöslaatikoiden rivit.
     $('h3 > .mw-headline, .käännöstaulukko > tbody > tr > td > ul > li').each(function () {
         var $this = $(this);
         var kieli, selite;
         
         if ( $this.attr('class') === 'mw-headline' ) {
             
             // Luetaan sanaluokka otsikosta.
             sanaluokka = $this.text();
         } else {
             
             // Luetaan kieli käännösrivin alusta.
             kieli = $this.text().match(/^[^:]+/) [0];
             
             if ( kieli && sanaluokka ) {
                 // Luetaan seliteteksti käännöslaatikosta. 
                 selite = $this.parents(".käännöskohta").find(".NavHead > b").html();
                 // Poistetaan numero alusta.
                 selite = selite.replace(/^[0-9]+\. /, "");
                 // Muutetaan mahdollinen kursivointi tai lihavointi wikimuotoon.
                 selite = selite.replace(/<\/?i>/g, "''").replace(/<\/?b>/g, "'''");
                 
                 // Käydään läpi punalinkit, jotka ovat käännösmallineiden sisällä.
                 $this.find('.käännös a.new').each(function () {
                     var $kaannosMalline = $(this).closest('.käännös'), // käännös-mallinetta vastaava html-elementti merkitty [class=käännös]
                         kielikoodi     = $kaannosMalline.children('.linkki').attr('lang');
                         suku           = haeSukuparametri($kaannosMalline.find('.käännös-suku').text()),
                         lat            = $kaannosMalline.find('.käännös-lat').text(),
                         pohja          = haeArtikkelipohja(kielikoodi, sanaluokka, suku, lat),
                         viittaava_sivu = mw.config.get('wgTitle'),
                         $luolinkki     = $("<a></a>"),
                         url            = $(this).attr('href'),
                         luotava_sivu   = $(this).text();
                     
                     if ( pohja ) {
                        $(this).attr('href', teeLinkki(url, pohja, kieli, sanaluokka, kielikoodi, viittaava_sivu, selite, lat, suku, luotava_sivu));
                        $(this).attr('class', 'avustettu-luonti-linkki');
                        $(this).attr('title', $(this).attr('title').replace(/\(sivua ei ole\)/,
                                                              '(luo käännösartikkeli automaattisesti tälle sanalle)'));
                     }
                 });
             }
         }
     });
 }

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