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> ⊞</a>');
$aElem2.attr('href', url);
$aElem2.addClass('avustettu-luonti-plus-linkki');
$aElem2.attr('title', $aElem.attr('title') + ' (lisää sivulle)');
$aElem.after($aElem2);
}
});
}());