Järjestelmäviesti:Gadget-Kaannokset.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)
- Internet Explorer ja Edge: Napsauta Ctrl-näppäin pohjassa Päivitä tai paina Ctrl-F5
- Opera: Paina Ctrl-F5.
(function(w){
function main($) {
var k;
var kielikoodit = {};
// kielokohtaiset ominaisuudet
var ominat = {
az: { nimi: "azeri", suku: false, latin: false },
uk: { nimi: "ukraina", suku: true, latin: true },
be: { nimi: "valkovenäjä", suku: true, latin: true },
bg: { nimi: "bulgaria", suku: true, latin: true },
zh: { nimi: "kiina", suku: false, latin: true },
de: { nimi: "saksa", suku: true, latin: false },
en: { nimi: "englanti", suku: false, latin: false },
es: { nimi: "espanja", suku: true, latin: false },
et: { nimi: "viro", suku: false, latin: false },
fr: { nimi: "ranska", suku: true, latin: false },
it: { nimi: "italia", suku: true, latin: false },
ja: { nimi: "japani", suku: false, latin: true },
pt: { nimi: "portugali", suku: true, latin: false },
ru: { nimi: "venäjä", suku: true, latin: true },
sr: { nimi: "serbia", suku: true, latin: true },
nn: { nimi: "norja (nynorsk)", suku: true, latin: false },
nb: { nimi: "norja (bokmål)", suku: true, latin: false },
sv: { nimi: "ruotsi", suku: true, latin: false },
tr: { nimi: "turkki", suku: false, latin: false },
};
// nimi->kielikoodi taulukon
for (k in ominat) {
kielikoodit[ominat[k].nimi] = k;
}
//console.log("wgScript: " + mw.config.get('wgScript') + ", wgPageName: " + mw.config.get('wgPageName'));
/*
* Käännöksen lisäyslomakkeen avausnappi ja taulukkoon lisättävä rivi.
*/
var nappi = '<input style="" type="button" onclick="gadget_kaannos.lisaa_kaannos_onclick(@);" value="Lisää käännös..." />';
var syottolomake = '<tr style="background-color: #aaf;" class="gk_kaannoslomake"><td colspan="3" id="gk_kaannoslomake@">'
+ nappi
+ '</td></tr>';
// Lomake, joka näytetään kun lisää...-nappia on painettu, ennen kuin kieli on kirjoitettu.
var alkulomake = '\
<label for="gk_luettelo">Kieli: </label>\
<input type="text" class="gk_kieli" id="gk_kieli" onchange="gadget_kaannos.nimi_onchange();" style="width: 4em"/>: \
<span id="gk_luettelo"><span class="kg_info" style="">Kirjoita kielen <a target="_blank" href="//fi.wiktionary.org/wiki/Malline:kohta/kielikoodit">kielikoodi</a> ja paina <tab> tai <enter>.</span></span>\
<div id="gk_lisaparamt">\
</div>\
';
/*
* Näkymätön lomake, jolla tiedot lähetetään. Peräisin HotCatin koodista.
*/
var tallennuslomake = '<form id="commitForm" method="post" enctype="multipart/form-data" action="'
+ mw.config.get('wgScript') + '?title=' + encodeURIComponent (mw.config.get('wgPageName'))
+ '&action=edit">'
+ '<input type="hidden" name="wpTextbox1" />'
+ '<input type="hidden" name="wpSummary" value="" />'
+ '<input type="hidden" name="wpMinoredit" value="0" />'
+ '<input type="hidden" name="wpWatchthis" value="0" />'
+ '<input type="hidden" name="wpAutoSummary" value="" />'
+ '<input type="hidden" name="wpEdittime" />'
+ '<input type="hidden" name="wpStarttime" />'
+ '<input type="hidden" name="wpEditToken" />'
+ '<input type="hidden" name="wpDiff" value="wpDiff" />'
+ '<input type="hidden" name="oldid" value="0" />'
+ '<input type="hidden" name="wpUltimateParam" value="1">'
+ '<input type="hidden" name="wpChangeTags">'
+ '<input type="hidden" value="ℳ𝒲♥𝓊𝓃𝒾𝒸ℴ𝒹ℯ" name="wpUnicodeCheck">'
+ '</form>';
/*
* Muotoilee aikaleiman tämänhetkisestä ajasta. Peräisin HotCatin koodista.
*/
function currentTimestamp () {
var now = new Date();
var ts = "" + now.getUTCFullYear();
function two (s) { return s.substr (s.length - 2); }
ts = ts
+ two ('0' + (now.getUTCMonth() + 1))
+ two ('0' + now.getUTCDate())
+ two ('00' + now.getUTCHours())
+ two ('00' + now.getUTCMinutes())
+ two ('00' + now.getUTCSeconds());
return ts;
}
/*
* Muotoilee urlista absoluuttisen. Peräisin HotCatin koodista.
*/
function armorUri (uri) {
// Avoid protocol-relative URIs, IE7 has a bug with them in Ajax calls
if (uri.length >= 2 && uri.substring(0, 2) == '//') return document.location.protocol + uri;
return uri;
}
/*
* Palauttaa kielen kielikoodin, jos sellainen on. Muuten, jos parametrin pituus on 2 tai 3
* olettaa että parametri on kielikoodi ja palauttaa sen. Muuten palauttaa null.
*/
function kielikoodiksi(kn) {
if ( kielikoodit[kn] )
return kielikoodit[kn];
if ( kn.length == 2 || kn.length == 3 )
return kn;
return null;
}
/*
* Kielikoodia vastaavan nimen, jos sellainen on.
* on kielikoodi ja palauttaa sen.
*/
function kieleksi(kk) {
if ( ominat[kk] !== undefined )
return ominat[kk].nimi;
return kk;
}
/*
* Callback-funktio, jota kutsutaan kun sivun wikiteksti on ladattu.
*/
function koodi_ladattu(json) {
/*
* Tallennuslomakkeen tiedot.
*/
var setupTimeout;
var pageText;
var pageTime;
var pageTextRevId = null;
var conflictingUser = null;
var lastRevId = null;
var serverTime = null;
var startTime = null;
var pageWatched = null;
var editToken = null;
var commitForm = null;
/*
* Purkaa palvelimen palauttamat tiedot. Muutettu HotCatin koodista.
*/
function setPage (json) {
//alert(JSON.stringify(json, undefined, 2));
var startTime = null;
if (json && json.query) {
if (json.query.pages) {
//var page = json.query.pages[wgArticleId == 0 ? "-1" : "" + wgArticleId];
var page = json.query.pages[Object.keys(json.query.pages)[0]];
if (page) {
if (page.revisions && page.revisions.length > 0) {
// Revisions are sorted by revision ID, hence [0] is the one we asked for, and possibly there's a [1] if we're
// not on the latest revision (edit conflicts and such).
pageText = page.revisions[0]['*'];
if (page.revisions[0].timestamp) pageTime = page.revisions[0].timestamp.replace (/\D/g, "");
if (page.revisions[0].revid) pageTextRevId = page.revisions[0].revid;
if (page.revisions.length > 1) conflictingUser = page.revisions[1].user;
}
if (page.lastrevid) lastRevId = page.lastrevid;
if (page.starttimestamp) startTime = page.starttimestamp.replace (/\D/g, "");
pageWatched = typeof (page.watched) == 'string';
editToken = page.edittoken;
}
}
}
}
/*
* Lähettää muutokset palvelimelle.
*/
function laheta(teksti, muutoskom) {
// Täytetään näkymätön lomake joka lähettää tiedot submit()illa.
var commitForm = document.getElementById ('commitForm');
commitForm.wpAutoSummary.value = 'd41d8cd98f00b204e9800998ecf8427e'; // MD5 hash of the empty string
commitForm.removeChild(commitForm.wpMinoredit);
commitForm.wpWatchthis.checked = 1;
commitForm.wpSummary.value = muutoskom;
commitForm.wpTextbox1.value = teksti;
commitForm.wpStarttime.value = serverTime || currentTimestamp ();
commitForm.wpEdittime.value = pageTime || commitForm.wpStarttime.value;
commitForm.submit();
//console.log("Muutoskommentti: " + muutoskom);
//console.log("Teksti: " + teksti);
//console.log("Lähetetty");
}
/*
* Muuttaa syötteen wikikoodiksi.
*/
function kasittele_syote(syote, kielikoodi, kielinimi) {
//console.log("kielikoodi: " + kielikoodi + ", kieli: " + kielinimi);
var tulos = [];
for ( var i = 0; i < syote.length; i++ )
{
// jos sana alkaa :-merkillä lisätään sellaisenaan (ilman :-merkkiä)
if ( syote[i].sana.charAt(0) == ':' )
{
tulos.push(syote[i].sana.substr(1));
}
else {
tulos.push("{{käännös|");
if ( kielikoodi ) tulos.push(kielikoodi);
else tulos.push(kielinimi.slice(0,1).toUpperCase() + kielinimi.slice(1));
tulos.push("|");
tulos.push(syote[i].sana);
if ( syote[i].suku ) {
tulos.push("|suku=");
tulos.push(syote[i].suku);
}
if ( syote[i].latin ) {
tulos.push("|lat=");
tulos.push(syote[i].latin);
}
tulos.push("}}");
if ( i < syote.length - 1 )
tulos.push(", ");
}
}
return tulos.join("");
}
var kieli = window.gadget_kaannos.kieli;
var num = window.gadget_kaannos.numero;
var sanat = window.gadget_kaannos.sanat;
//console.log("Lataus: ok");
// tallentaa sivun tekstin pageText-muuttujaan
setPage (json);
// etsitään oikea käännöslaatikko
var lisays = "*" + kieli + ": " + kasittele_syote(sanat, kielikoodiksi(kieli), kieleksi(kieli)) + "\n";
var e = '{{kohta|';
var a, l, i = 0;
while ( i <= num )
{
a = pageText.indexOf(e, l);
if ( a == -1 )
return;
l = a + e.length;
i++;
}
l = pageText.indexOf('\n', l) + 1;
// korvataan kohta subst:kohtalla ja lisätään uusi käännös seuraavalle riville
pageText = pageText.substring(0, a) + '{{subst:' + pageText.substring(a + 2, l) + lisays + pageText.substring(l);
laheta(pageText, "/* Käännökset */ +" + kieli);
};
/*
* Lähettää kyselyn palvelimelle. Muutettu HotCatin koodista.
*/
function getPage () {
// apin latauskripti joka kutsuu callbackia palautetulla arvolla
var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath')
+ '/api.php?format=json&callback=window.gadget_kaannos.koodi_ladattu&action=query&titles='
+ encodeURIComponent (mw.config.get('wgPageName'))
+ '&prop=info%7Crevisions&rvprop=content%7Ctimestamp%7Cids&meta=siteinfo&rvlimit=1&rvstartid='
+ mw.config.get('wgCurRevisionId');
var s = document.createElement('script');
s.src = armorUri(url);
s.type = 'text/javascript';
document.getElementsByTagName ('head')[0].appendChild (s);
// callback näkyväksi api-skripitille
window.gadget_kaannos.koodi_ladattu = koodi_ladattu;
}
/************
* Alustus. *
************/
(function() {
// Lisätyt sanat.
var luettelo = new Array();
// Avatun lisäyslaatikon numero. Laatikot numeroidaan 0:sta alkaen.
var numero = -1;
function piilota(num) {
if ( numero != -1 ) {
$("#gk_kaannoslomake" + num).html(nappi.replace(/@/g, num));
}
}
function hae_kielikohtainen_lomake(kieli) {
var osat = [];
// kaikille yhteinen alkuosa
osat.push('\
<div style="border: solid black 1px; padding: 2px; background-color: #aef;"><label for="gk_sana">Käännös: </label><input type="text" id="gk_sana"/>\
');
if ( typeof ominat[kieli] == "undefined" || ominat[kieli].suku )
{
osat.push('\
<br/><label>Suku: </label>\
<input type="checkbox" class="gk_suku" id="gk_suku_m" style="width: 2em;"/>\
<label for="gk_suku_m">maskuliini</label>\
<input type="checkbox" class="gk_suku" id="gk_suku_f" style="width: 2em;"/>\
<label for="gk_suku_f">feminiini</label>\
<input type="checkbox" class="gk_suku" id="gk_suku_n" style="width: 2em;"/>\
<label for="gk_suku_n">neutri</label>\
<input type="checkbox" class="gk_suku" id="gk_suku_yl" style="width: 2em;"/>\
<label for="gk_suku_yl">yleinen suku</label>\
');
}
if ( typeof ominat[kieli] == "undefined" || ominat[kieli].latin )
{
osat.push('\
<br/><label for="gk_latinalaistus">Latinalaistus: </label><input type="text" id="gk_latinalaistus" style="width: 10em;"/>\
');
}
// kaikille yhteinen loppuosa
osat.push(' \
<input type="button" value="+" title="Lisää toinen käännös." onclick="gadget_kaannos.lisaa_sana_onclick();"/></div><input style="alignment: right;" type="button" onclick="gadget_kaannos.tallennusnappi_onclick();" value="OK" />\
');
return osat.join("");
}
/*
* Palauttaa lomakkeen tiedot oliona.
*/
function lue_tiedot(num) {
var tiedot = {};
tiedot.sana = $("#gk_sana").prop('value');
tiedot.suku = ($("#gk_suku_m").prop('checked') ? "m" : "")
+ ($("#gk_suku_f").prop('checked') ? "f" : "")
+ ($("#gk_suku_n").prop('checked') ? "n" : "")
+ ($("#gk_suku_yl").prop('checked') ? "yl" : "");
tiedot.latin = $("#gk_latinalaistus").prop('value');
return tiedot;
}
// ei käytössä
function lataa_tiedot(tiedot) {
var tiedot = {};
$("#gk_sana").prop('value', tiedot.sana);
$("#gk_suku_m").prop('checked', (tiedot.suku.indexOf("m") != -1 ? true : false))
$("#gk_suku_f").prop('checked', (tiedot.suku.indexOf("f") != -1 ? true : false))
$("#gk_suku_n").prop('checked', (tiedot.suku.indexOf("n") != -1 ? true : false))
$("#gk_latinalaistus").prop('value', tiedot.latin);
}
window.gadget_kaannos = {};
window.gadget_kaannos.tallennusnappi_onclick = function() {
var kieli = null;
kieli = $("#gk_kieli").prop('value').trim().toLowerCase();
// lisätään mahdollinen lisäämätön sana muiden perään
if ( $("#gk_sana").prop('value') != "" ) {
gadget_kaannos.lisaa_sana_onclick();
}
window.gadget_kaannos.kieli = kieli;
window.gadget_kaannos.sanat = luettelo;
window.gadget_kaannos.numero = numero;
if ( kieli != "" && luettelo.length > 0 ) {
// lisätään palautuslomake
$("#mw-content-text").prepend(tallennuslomake);
getPage();
}
else {
alert("Tarvitaan kieli ja ainakin yksi käännös.");
}
};
window.gadget_kaannos.nimi_onchange = function() {
var kieli = $("#gk_kieli").prop('value').trim().toLowerCase();
// Jos laatikossa on kielikoodi, korvataan se kielen nimellä, jos tiedossa.
if ( ominat[kieli] != undefined )
$("#gk_kieli").prop('value', kieleksi(kieli));
$("#gk_luettelo").html("");
$("#gk_lisaparamt").html(hae_kielikohtainen_lomake(kielikoodiksi(kieli)));
$("#gk_sana").prop('value', '').focus();
};
window.gadget_kaannos.lisaa_sana_onclick = function() {
var tiedot = lue_tiedot();
if ( tiedot.sana != "" )
{
var l = $("#gk_luettelo").html();
l += '<a style="border: 1px solid gray; padding: 2px;">' + tiedot.sana + '</a>' + ', ';
$("#gk_luettelo").html(l);
luettelo.push(tiedot);
$(".gk_suku").prop('checked', false);
$("#gk_latinalaistus").prop('value', '');
$("#gk_sana").prop('value', '').focus();
//console.log("luettelo: " + luettelo);
//console.log("sana: " + tiedot.sana + ", suku: " + tiedot.suku + ", latinalaistus: " + tiedot.latin);
}
};
window.gadget_kaannos.lisaa_kaannos_onclick = function(num) {
// piilotetaan mahdollinen edellinen avonainen
piilota(numero);
numero = num;
$("#gk_kaannoslomake" + num).html(alkulomake);
$("#gk_kieli").focus();
};
$( ".käännöskohta" ).each(function( index ) {
if ( !$(this).hasClass('käännöskohta_ohjaus') ) {
$(this).find(".käännöstaulukko > tbody").append(syottolomake.replace(/@/g, index));
}
});
})() // alustus
}
if ( mw.config.get('wgAction') == "view" ) {
jQuery(document).ready(main);
}
})(window);