Järjestelmäviesti:Gadget-Luolinkit.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
/**
 * Pienoisohjelma, joka lisää luontilinkin kielilinkkeihin [[Malline:l]], [[Malline:käännös]], kun
 * niihin on liitetty artikkelipohja.
 **/
(function () {

    // Kielet, joille on tehty omat pohjat.
    var kielikohtaisetPohjat = [
        "da", // tanska
        "de", // saksa
        "en", // englanti
        "es", // espanja
        "pt", // portugali
        "sv", // ruotsi
    ];

    // Sanaluokat, joille voi olla kielikohtaiset pohjat. Huom. joka kielelle, joka on ylläolevassa luettelossa
    // pitää toteuttaa kaikki tässä luetellut sanaluokat, koska työkalu ei tarkista onko artikkelipohjaa olemassa.
    var kielikohtaisetSanaluokat = [
        "Adjektiivi",
        "Adverbi",
        "Substantiivi",
        "Verbi"
    ];


    /**
     * Muotoilee URLin annetuista osista.
     *
     * @param url: vanha url (täytyy olla "index.php"-muodossa)
     * @param preload: artikkelipohjan nimi
     * @param params:  artikkelipohjan parametrit taulukkona
     * @param summary: yhteenvetokenttään asetettava oletusteksti
     **/
    function teeURL(url, preload, params, summary) {
        return url + '&preload=Malline:artikkelipohja/' + preload + params.map(function (elt) {
            return '&preloadparams[]=' + encodeURIComponent(elt);
        }).join('') + '&summary=' + encodeURIComponent(summary);
    }

    /**
     * Dekoodaa HTML-entitteetit attribuuttiarvosta.
     **/
    function decode(str) {
        return $("<textarea/>").html(str).html();
    }

    /**
     * Lukee luolinkkiin liitettävät yleiset tiedot linkin ympäristöstä, kun ollaan artikkelisivulla.
     **/
    function lueArtikkelinTiedot($this) {

	var tiedot = {};

	tiedot.artikkeli = mw.config.get('wgTitle');

        // Haetaan tiedot siitä sanaluokkaosiosta, jossa linkki sijaitsee.
        // Käännös-linkin sellainen vanhempi, joka on samalla tasolla kuin mw-heading-elementit.
        var $mwHeadingLevelParent = $this.parentsUntil("*:has('.mw-heading')").last();

        // Edellinen h3-tason otsikko eli sanaluokkaotsikko.
        var $mwHeadingWithH3 = $mwHeadingLevelParent.prevUntil(".mw-heading:has('h3')").addBack().first().prev();
        var $h3 = $mwHeadingWithH3.find('h3');
        tiedot.sanaluokkaotsikko = $h3.text();

        // Edellinen kieliotsikko.
        var $h2 = $mwHeadingWithH3.prevAll(".mw-heading:has('h2')").first().find('h2');
	tiedot.kieliotsikko = $h2.text();

        // Sanarivin hakusana. Voi olla eri kuin sivun otsikko
        var $hakusana = $h3.nextUntil('.mw-heading', ':has(.hakusana)')
                           .first()
                           .find(".hakusana");

	tiedot.hakusana = $hakusana.text();

        // Hakusana ja latinisointi on peräkkäin tai välissä on sukumerkintä,
	// tai merkitty erikseen hakusana-lat-merkinnällä (esim. japani)
        var $hakusanaLat = $h3.nextUntil('.mw-heading', ':has(.hakusana-lat)')
			      .first()
			      .find(".hakusana-lat");
        tiedot.hakusana_lat = $hakusanaLat.text();

        if ( ! tiedot.hakusana_lat || tiedot.hakusana_lat === "" ) {
	    tiedot.hakusana_lat = $hakusana.nextAll(".lat").slice(0, 1).text();
        }




        var $kaannoslaatikko = $this.parents(".käännöskohta");
        if ( $kaannoslaatikko.length > 0 ) {
            // Luetaan seliteteksti käännöslaatikosta.
            tiedot.kaannoslaatikonSelite = $kaannoslaatikko.find(".NavHead > b").html()
                                                           .replace(/^[0-9]+\. /, "") // poistetaan numero
            // Muutetaan kursivointi ja lihavointi wikimuotoon.
                                                           .replace(/<\/?i>/g, "''").replace(/<\/?b>/g, "'''");
        }

	return tiedot;
    }

    /**
     * Lukee luolinkkiin liitettävät tiedot, kun ollaan liitesivulla.
     **/
    function lueLiitteenTiedot($this) {
	var tiedot = {};

	tiedot.kieliotsikko      = $('.fiwikt-kieliotsikko').text();
	tiedot.sanaluokkaotsikko = $('.fiwikt-sanaluokkaotsikko').text();
	tiedot.artikkeli         = $('.fiwikt-artikkeli').text();
	tiedot.hakusana          = $('.fiwikt-hakusana').text();
	tiedot.hakusana_lat      = $('.fiwikt-hakusana-lat').text();

	return tiedot;
    }

    // Korvaa parametrinumerot artikkelipohjan nimestä.
    function korvaaParametrit(artikkelipohja, params) {
        var korvattu = params.reduce(function (pohja, param, index) {
            return pohja.replace("$" + (index + 1), param);
        }, artikkelipohja);

        // Listäään kielikoodi pohjan nimeen, jos kielellä on omat pohjat.
        if ( kielikohtaisetPohjat.indexOf(params[2]) > -1 && kielikohtaisetSanaluokat.indexOf(params[1]) > -1 ) {
            return korvattu.replace("/*/", "/" + params[2] + "/");
        }

        return korvattu;
    }

    /**
     * Lukee linkkiä koskevat tiedot linkistä ja sen välittömästä ympäristöstä (latinisointi).
     **/
    function lueLinkinTiedot($this) {
	var tiedot = {};

	var $aElem          = $this.children('a').first();
        tiedot.href         = $aElem.attr('href');
        tiedot.linkkiteksti = $aElem.text();
        tiedot.kielikoodi   = $this.attr('lang');  // kielikoodi, jossa voi olla mukana kirjoitusjärjestelmäkoodi
        tiedot.pohja        = $this.attr('data-kuvaus');

        // Muutetaan linkki index.php-muotoon, jos se on /wiki/-muodossa.
        var m = tiedot.href.match(/\/wiki\/([^#]+)/);
        if ( m ) {
            tiedot.href = mw.config.get("wgScript") + "?title=" + m[1] + "&action=edit";
        }

        if ( $this.length > 0
	  && $this[0].nextSibling
	  && $this[0].nextSibling.nodeValue
	  && $this[0].nextSibling.nodeValue.match(/^\s*\(([^)]+)\)/) ) {
            tiedot.latinisointi = $this[0].nextSibling.nodeValue.match(/^\s*\(([^)]+)\)/)[1];
        }

	// Luetaan välitetyt parametrit elementin attribuutista. Tiedot on dictissä eikä taulukossa,
        // koska numerointi ei yleensä ala alusta, ja ensimmäinen mahdollinen numero on 1. Tiedot täytyy muuttaa taulukoksi.
        var data = $this.attr('data-kuvaus-param');

	if ( data ) {
            tiedot.params_d = JSON.parse(decode(data));
        } else {
	    tiedot.params_d = {};
	}

	return tiedot;
    }


    // Käydään läpi kielilinkit, joihin on liitetty artikkelipohja.
    $('.linkki[data-kuvaus]').each(function () {
        var params   = [];
        var $aElem, $aElem2;
        var $this    = $(this);
        var url;
        var summary = "";//"Luotu automaattisesti sivun [[" + mw.config.get("wgTitle") + "]] tietojen pohjalta";
	var ymparistoTieto;

	if ( mw.config.get('wgNamespaceNumber') === 0 ) { // Artikkelinimiavaruus
	    ymparistoTieto = lueArtikkelinTiedot($this);
	} else {
	    ymparistoTieto = lueLiitteenTiedot($this);
	}

	var linkkiTieto = lueLinkinTiedot($this);

        // Tarkistetaan onko artikkelipohja tehty tälle gadgetille.
        if ( ! (linkkiTieto.pohja.startsWith("tm/")
	     || linkkiTieto.pohja.startsWith("rm/")
	     || linkkiTieto.pohja.startsWith("tr/")
	     || linkkiTieto.pohja.startsWith("käännös/")) ) {
            return;
        }

	// Luodaan taulukko, johon artikkelipohjan parametrit tulevat ja alustetaan se mahdollisilla
	// 'kuvaus-param'-attribuutista luetuilla parametreilla.
        var sz = Object.keys(linkkiTieto.params_d).reduce(function (acc, elt) { return Math.max(acc, parseInt(elt)); }, 4);
        params = new Array(sz);

        Object.keys(linkkiTieto.params_d).forEach(function (key) {
            params[parseInt(key) - 1] = linkkiTieto.params_d[key];
        });


        // Täytetään vakioparametrit linkin arvoilla ellei niitä ole jo asetettu parametreina annetuilla arvoilla.
        // Täytetään vakioparametrit linkin arvoilla ellei niitä ole jo asetettu parametreina annetuilla arvoilla.
        // 1. Kieliotsikko.
        params[0] = params[0] !== undefined ? params[0] : ymparistoTieto.kieliotsikko;
        // 2. Sanaluokkaotsikko.
        params[1] = params[1] !== undefined ? params[1] : ymparistoTieto.sanaluokkaotsikko;
        // 3. Kielikoodi.
        params[2] = params[2] !== undefined ? params[2] : linkkiTieto.kielikoodi;
        // 4. Linkittävä sivu tai sitä vastaava artikkelisivu, jos linkittävä sivu on liitesivu.
        params[3] = params[3] !== undefined ? params[3] : ymparistoTieto.artikkeli;
        // 5. Kohdesivun linkin teksti.
        params[4] = params[4] !== undefined ? params[4] : linkkiTieto.linkkiteksti;
        // 6. Linkittävän sivun sanarivimuoto,
        params[5] = params[5] !== undefined ? params[5] : (ymparistoTieto.hakusana || params[3]);
        // 7. Kohdesivun latinisointi.
        params[6] = params[6] !== undefined ? params[6] : linkkiTieto.latinisointi;
        // 8. Linkittävän sivun latinisointi.
        params[7] = params[7] !== undefined ? params[7] : ymparistoTieto.hakusana_lat;
        // 9. vain käännöksillä
        params[8] = params[8] !== undefined ? params[8] : ymparistoTieto.kaannoslaatikonSelite;

        // Ei muuteta linkkiä jos tarpeellisia tietoja ei löydy. Esim. kun muokataan osiota.
        if ( !params[0] || !params[1] || !params[2] || !params[3] ) {
            return;
        }

        params = params.map(function (param) { return param === undefined ? "" : param; });

        linkkiTieto.pohja = korvaaParametrit(linkkiTieto.pohja, params);
        url  = teeURL(linkkiTieto.href, linkkiTieto.pohja, params, summary);

	$aElem = $this.children('a').first();
        if ( $aElem.hasClass('new') ) {
            // Jos sivua ei ole, muokataan alkuperäistä linkkiä.
            $aElem.attr('href', url);
            $aElem.addClass('avustettu-luonti-linkki');
            $aElem.attr('title', $aElem.attr('title').replace(/\(sivua ei ole\)/, '(avustettu luonti)'));
        } else if ( mw.loader.getState("ext.gadget.Artikkeliyhdistaja") === "ready" ) {
            // Jos sivu on jo olemassa ja artikkeliyhdistäjä on käytössä, lisätään linkin perään lisäyslinkki.
            $aElem2 = $('<a>&thinsp;⊞</a>');
            $aElem2.attr('href', url);
            $aElem2.addClass('avustettu-luonti-plus-linkki');
            $aElem2.attr('title', $aElem.attr('title') + ' (lisää sivulle)');
            $aElem.after($aElem2);
        }
    });

}());