/**
* Pienoisohjelma, joka lisää luontilinkin kielilinkkeihin ], kun
* niihin on liitetty artikkelipohja.
**/
(function () {
/**
* Väliaikainen funktio, joka muuttaa vanhoilla tavoilla tehdyt luo-linkit näyttämään samalta kuin uudet.
*/
function muuta_vanhat () {
$('a.external').each(function () {
var $kohde = $(this);
var href = $kohde.attr('href');
var $puna;
var $kohdep;
if ( $kohde.text() == "" && href.indexOf('preload') > -1 ) { // Mallineella luo-nappi merkityt
$kohdep = $kohde.parent();
// nappia edeltävä välin sisältävä tekstisolmu
$kohdep.get(0).previousSibling.nodeValue = $kohdep.get(0).previousSibling.nodeValue.replace(/\s+$/, "");
$puna = $kohde.parent().prev('.linkki').children('a.new');
if ( $puna.length === 0 ) {
$puna = $kohde.parent().prevAll(':has(.linkki):first').children('.linkki').children('a.new');
}
if ( $puna.length === 0 ) {
$puna = $kohde.parent().prev('a.new');
}
if ( $puna.length > 0 ) {
$puna.attr('href', href);
$puna.addClass('avustettu-luonti-linkki');
$puna.attr('title', $puna.attr('title').replace(/\(sivua ei ole\)/, '(avustettu luonti)'));
$kohdep.detach();
}
} else if ( $kohde.text() == "luo" && href.indexOf('preload') > -1 ) { // Suoraan linkillä merkityt
$puna = $kohde.prevAll('.linkki:first').children('a.new');
if ( $puna.length > 0 ) {
$puna.attr('href', href);
$puna.addClass('avustettu-luonti-linkki');
$puna.attr('title', $puna.attr('title').replace(/\(sivua ei ole\)/, '(avustettu luonti)'));
$kohde.detach();
}
}
});
}
/**
* 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('wgPageName');
// Haetaan tiedot siitä sanaluokkaosiosta, jossa linkki sijaitsee.
// Lähin sanaluokkaotsikko.
var $h3 = $this.parentsUntil("*:has('h3')").last().prevUntil('h3').addBack().first().prev();
// Lähin kieliotsikko
var $h2 = $h3.prevAll("h2").first();
// Sanarivin hakusana. Voi olla eri kuin sivun otsikko
var $hakusana = $h3.nextUntil('h2, h3', ':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)
tiedot.hakusana_lat = $h3.nextUntil('h2, h3', ':has(.hakusana-lat)')
.first()
.find(".hakusana-lat").text();
if ( ! tiedot.hakusana_lat || tiedot.hakusana_lat === "" ) {
tiedot.hakusana_lat = $hakusana.nextAll(".lat").slice(0, 1).text();
}
tiedot.kieliotsikko = $h2.children(".mw-headline").text()
tiedot.sanaluokkaotsikko = $h3.children(".mw-headline").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(/^+\. /, "") // 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) {
return params.reduce(function (pohja, param, index) {
return pohja.replace("$" + (index + 1), param);
}, artikkelipohja)
}
/**
* 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 https://dictious.com/fi/-muodossa.
var m = tiedot.href.match(/\/wiki\/(+)/);
if ( m ) {
tiedot.href = mw.config.get("wgScript") + "?title=" + m + "&action=edit";
}
if ( $this.length > 0
&& $this.nextSibling
&& $this.nextSibling.nodeValue
&& $this.nextSibling.nodeValue.match(/^\s*\((+)\)/) ) {
tiedot.latinisointi = $this.nextSibling.nodeValue.match(/^\s*\((+)\)/);
}
// 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').each(function () {
var params = ;
var $aElem, $aElem2;
var $this = $(this);
var url;
var summary = "";//"Luotu automaattisesti sivun ] 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 = linkkiTieto.params_d;
});
// 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 = params !== undefined ? params : ymparistoTieto.kieliotsikko;
// 2. Sanaluokkaotsikko.
params = params !== undefined ? params : ymparistoTieto.sanaluokkaotsikko;
// 3. Kielikoodi.
params = params !== undefined ? params : linkkiTieto.kielikoodi;
// 4. Linkittävä sivu tai sitä vastaava artikkelisivu, jos linkittävä sivu on liitesivu.
params = params !== undefined ? params : ymparistoTieto.artikkeli;
// 5. Kohdesivun linkin teksti.
params = params !== undefined ? params : linkkiTieto.linkkiteksti;
// 6. Linkittävän sivun sanarivimuoto,
params = params !== undefined ? params : ymparistoTieto.hakusana;
// 7. Kohdesivun latinisointi.
params = params !== undefined ? params : linkkiTieto.latinisointi;
// 8. Linkittävän sivun latinisointi.
params = params !== undefined ? params : ymparistoTieto.hakusana_lat;
// 9. vain käännöksillä
params = params !== undefined ? params : ymparistoTieto.kaannoslaatikonSelite;
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-linkki');
$aElem2.attr('title', $aElem.attr('title') + ' (lisää sivulle)');
$aElem.after($aElem2);
}
});
muuta_vanhat();
}());