(function () {
/**
* Valikossa näkyvät kieliotsikot. Ei vaikuta otsikoiden järjestykseen. Se määräytyy
* `kielijarj`-funktiolla.
*/
var kielet = [ "Kansainvälinen", "Suomi", "Englanti", "Espanja", "Ranska", "Ruotsi", "Saksa",
"Venäjä", "Viro", "Lähteet", "Viitteet" ];
/**
* Sanaluokat yms.. Valikossa näkyvät. Osioiden järjestys määräytyy aakkosjärjestyksen mukaan.
*/
var taso3 = [ "Aakkonen", "Adjektiivi", "Adverbi", "Erisnimi", "Fraasi", "Interjektio",
"Konjunktio", "Lyhenne", "Numeraali", "Postpositio", "Prefiksi", "Prepositio",
"Pronomini", "Substantiivi", "Suffiksi", "Supistuma", "Verbi" ];
/**
* Sanaluokkien aliosiot. Otsikoiden järjestys ja valikossa näkyvät.
*/
var taso4 = [ "Ääntäminen", "Taivutus", "Huomautukset", "Etymologia", "Käännökset",
"Lainaukset", "Liittyvät sanat", "Idiomit", "Aiheesta muualla", "Lähteet" ];
/**
* Liittvät sanat. Otsikoiden järjestys ja valikossa näkyvät.
*/
var liittyvat = [ "Rinnakkaiset kirjoitusasut", "Rinnakkaismuodot", "Synonyymit",
"Vastakohdat", "Johdokset", "Yhdyssanat", "Sanaliitot", "Yhdyssanat ja sanaliitot",
"Tästä johtuvat tytärkielten sanat", "Lainat muissa kielissä",
"Yläkäsitteet", "Vieruskäsitteet", "Alakäsitteet", "Osakäsitteet",
"Kokonaiskäsitteet" ];
/**
* Osioihin lisättävä oletusteksti.
*/
var oletusarvot = {
"." : ,
"Suomi" :
{
"." : ,
"Adjektiivi" : { "." : },
"Adverbi" : { "." : },
"Substantiivi" :
{
"." : ,
"Taivutus" : { "." : },
},
"Verbi" : { "." : },
"*" :
{
"Ääntäminen" : { "." : },
},
},
"Englanti" :
{
"Adjektiivi" : { "." : },
"Adverbi" : { "." : },
"Substantiivi" : { "." : },
"Verbi" : { "." : },
},
"Espanja" :
{
"Adjektiivi" : { "." : },
"Adverbi" : { "." : },
"Substantiivi" : { "." : },
"Verbi" : { "." : },
},
"Ruotsi" :
{
"Adjektiivi" : { "." : },
"Adverbi" : { "." : },
"Substantiivi" : { "." : },
"Verbi" :
{
"." : ,
"Taivutus" : { "." : },
},
},
"Saksa" :
{
"Adjektiivi" : { "." : },
"Adverbi" : { "." : },
"Substantiivi" : { "." : },
"Verbi" : { "." : },
},
"Venäjä" :
{
"Adjektiivi" : { "." : },
"Adverbi" : { "." : },
"Substantiivi" : { "." : },
"Verbi" : { "." : },
},
"Viitteet" :
{
"." : ,
},
"Lähteet" :
{
"." : "",
},
"*" :
{
"." : , // erikoisarvo, joka estää rivinvaihdon lisäämisen
"Adjektiivi" : { "." : },
"Adverbi" : { "." : },
"Erisnimi" : { "." : },
"Fraasi" : { "." : },
"Interjektio" : { "." : },
"Konjunktio" : { "." : },
"Lyhenne" : { "." : },
"Numeraali" : { "." : },
"Partikkeli" : { "." : },
"Postpositio" : { "." : },
"Prefiksi" : { "." : },
"Prepositio" : { "." : },
"Pronomini" : { "." : },
"Substantiivi" :
{
"." : ,
},
"Suffiksi" : { "." : },
"Supistuma" : { "." : },
"Verbi" : { "." : },
"*" :
{
"." : ,
"Ääntäminen" : { "." : },
"Käännökset" : { "." : },
"Etymologia" : { "." : },
"Lainaukset" : { "." : },
"Liittyvät sanat" :
{
"." : ,
"Johdokset" : { "." : },
"Yhdyssanat" : { "." : },
"Yhdyssanat ja sanaliitot" : { "." : },
},
},
},
};
// Sivun otsikot.
var osat = ;
/**
* Osion polku osat-taulukon indekseinä.
*/
var polku = ;
/**
* Tekstin pituus ilman kielilinkkejä ja luokkia.
*/
var tekstin_loppu = -1;
/**
* Kielilinkit ja luokat sivun lopusta.
*/
var luokat = "";
var $textbox = $('#wpTextbox1');
/**
* Sektion numero, jos editoidaan artikkelin osaa.
*/
var wpSection = $('input').val();
/**
* Tekee indeksipolusta tekstipolun. Esim. ->
*/
function tekstipoluksi(polk) {
var opolku = ;
for ( var i = 2; i < polk.length; i++ )
if ( typeof polk !== "undefined" ) {
if ( polk === null )
opolku.push(null);
// else if ( polk == -1 )
// opolku.push("");
else
opolku.push(osat]);
}
return opolku;
}
/**
* Palauttaa oletusarvon taulukosta 'oletusarvot' osiolle, jonka polku on 'polku'.
*/
function oletusarvo(polku) {
function _apu(opolku, i, okohta) {
if ( i == opolku.length ) {
if ( "." in okohta )
return okohta;
return null;
}
var ret = null;
if ( opolku in okohta )
ret = _apu(opolku, i+1, okohta]);
if ( !ret && "*" in okohta )
ret = _apu(opolku, i+1, okohta);
return ret;
}
var ret = _apu(polku, 0, oletusarvot) ;
if ( ret === null ) ret = "";
return ret;
}
function kielijarj(k) {
switch ( k ) {
case "Kansainvälinen":
return -2;
case "Suomi":
return -1;
case "Lähteet":
return +1;
case "Viitteet":
return +2;
default:
return 0;
}
}
/*
* Jakaa tekstin 'teksti' kahteen osaan joista jälkimmäinen sisältää kielilinkit ja luokat
* ja ensimmäinen muun tekstin. Palauttaa taulukon.
*/
function erota_luokat(teksti) {
var p = teksti.search(/\n(\+:]+\]\]\s*\n*)+$/);
if ( p == -1 ) {
p = teksti.length;
}
return ;
}
/**
* Palauttaa otsikkovalikon otsikot polulle 'polku'.
* Param polku: , jonka alkiot ovat indeksejä osat-taulukkoon.
*/
function hae_otsikot(polku) {
var grp;
var i;
var sivu = false;
var taso2ots = null;
var taso3ots = null;
var taso4ots = null;
var otsikot = ;
if ( polku !== null ) sivu = true;
if ( polku !== null && osat] ) taso2ots = osat];
if ( polku !== null && osat] ) taso3ots = osat];
if ( polku !== null && osat] ) taso4ots = osat];
otsikot.push("<option>- Lisää otsikko -</option>");
if ( taso4ots == "Liittyvät sanat" ) {
grp = $("<optgroup label='Liittyvät sanat'></optgroup>");
grp.prop("level", 5);
for ( i in liittyvat ) {
grp.append("<option>" + liittyvat + "</option>");
}
otsikot.push(grp);
}
if ( taso3ots ) {
if ( taso3.indexOf(taso3ots) != -1
&& taso2ots != "Lähteet"
&& taso2ots != "Viitteet" ) {
grp = $("<optgroup label='" + taso3ots + "'></optgroup>");
grp.prop("level", 4);
for ( i in taso4 ) {
// Suodatetaan Käännökset-otsikko pois, jos kieli ei ole suomi tai
// määrittelemätön kieli.
if ( taso4 != "Käännökset" || (taso2ots == "Suomi" || taso2ots === null) ) {
grp.append("<option>" + taso4 + "</option>");
}
}
otsikot.push(grp);
}
}
if ( taso2ots ) {
grp = $("<optgroup label='" + taso2ots + "'></optgroup>");
grp.prop("level", 3);
for ( i in taso3 ) {
grp.append("<option>" + taso3 + "</option>");
}
otsikot.push(grp);
}
if ( sivu ) {
grp = $("<optgroup label='- sivu -'></optgroup>");
grp.prop("level", 2);
for ( var j in kielet ) {
grp.append("<option>" + kielet + "</option>");
}
otsikot.push(grp);
}
return otsikot;
}
/**
* Palauttaa true, jos otsikko 'a' tulee ennen otsikkoa 'b', kun molempien taso on 'taso'.
*/
function tulee_ennen(taso, a, b) {
switch ( taso ) {
case 2: // kielet
var ai = kielijarj(a), bi = kielijarj(b);
if ( ai == bi )
return (a < b);
return (ai < bi);
case 3: // Sanaluokat
return (a < b);
case 4: // Sanaluokan aliosiot
return (taso4.indexOf(a) < taso4.indexOf(b));
case 5: // liittyvät sanat
return (liittyvat.indexOf(a) < liittyvat.indexOf(b));
}
return false;
}
function lisaa_teksti(teksti, valitse) {
var ppos = $textbox.textSelection('getCaretPosition', { 'startAndEnd' : true });
var spos = ppos;
var epos = ppos;
if ( false && document.queryCommandSupported('insertText')) {
$textbox.focus();
document.execCommand('insertText', false, teksti);
} else {
$textbox.val($textbox.val().substring(0, spos) + teksti
+ $textbox.val().substring(epos, $textbox.val().length));
}
epos = spos + teksti.length;
$textbox.textSelection('setSelection', { 'start': spos, 'end': epos });
$textbox.focus();
}
function lisaa_blokki(pos, otsikko, osio) {
if ( pos != -1 ) $textbox.textSelection('setSelection', { 'start': pos, 'end': pos });
var ppos = $textbox.textSelection('getCaretPosition', { 'startAndEnd' : true });
var spos = ppos-1, epos = ppos-1;
// Valitaan tyhjä alue osioiden välistä.
while ( $textbox.val() == "\n" ) spos--; spos += 1;
while ( $textbox.val() == "\n" ) epos++;
$textbox.textSelection('setSelection', { 'start': spos, 'end': epos });
//HÄ?????????
// Lisätään ennen ensimmäistä otsikkoa vain yksi rivinvaihto.
if ( spos == 0 ) alku = "\n"; else alku = "\n\n";
// Haetaan lisäyksessä liikkunut kursori.
var spos = $textbox.textSelection('getCaretPosition', { 'startAndEnd' : false });
spos += alku.length + otsikko.length + 1;
var epos = spos + osio.length;
if ( osio != "" ) epos -= 1; // Miksi tarvitaan??
var teksti = alku + otsikko + "\n" + osio + "\n";
lisaa_teksti(teksti, false);
// Valitaan lisätty osio, pois lukien viimeinen rivinvaihto.
$textbox.textSelection('setSelection', { 'start': spos, 'end': epos });
}
function tee_otsikko(taso, teksti) {
var eq = Array(taso+1).join("=");
return eq + teksti + eq;
}
function kirjoita_teksti() {
var rivit = ;
for ( var i in osat ) {
var lvl = osat;
if ( lvl > 0 ) {
rivit.push(tee_otsikko(osat));
} else {
rivit.push(osat);
}
}
// Yhdistetään osat.
var txt = rivit.join("\n") + luokat;
$textbox.val(txt);
}
function lisaa_otsikko(taso, lisattava) {
var i = 0, a = 0, l = -1;
if ( taso == 2 ) a = 0;
else a = polku+1;
// Etsitään otsikko, jota ennen tämä otsikko lisätään.
for ( var i = a; i < osat.length; i++ ) {
if ( osat < taso ) {
break;
} else if ( osat == taso ) {
if ( tulee_ennen(taso, lisattava, osat) ) {
break;
}
}
}
// Lasketaan uusi kursorin kohta.
var pos = 0;
if ( i < osat.length ) {
pos = osat;
} else {
pos = tekstin_loppu;
}
// Uuden osion polku
var tpolku = tekstipoluksi(polku.slice(0, taso))
tpolku.push(lisattava);
var blokki = oletusarvo(tpolku);
// Jos arvo on -1 jätetään rivinvaihto lisäämättä
if ( blokki == -1 ) blokki = ""; else blokki += "\n";
lisaa_blokki(pos, tee_otsikko(taso, lisattava), blokki);
}
function ovalikko_onchange() {
var $otsikkovalikko = $("#otsikkovalikko");
var $valittu = $otsikkovalikko.find("option:selected");
var lisattava = $valittu.text();
if ( $otsikkovalikko.prop("selectedIndex") != 0 ) {
var taso = $valittu.parent().prop("level");
lisaa_otsikko(taso, lisattava);
$textbox.focus();
} else {
//$textbox.focus();
}
$otsikkovalikko.children(':first').prop('selected', true);
}
function parsi_teksti() {
var pos = $textbox.textSelection('getCaretPosition', { 'startAndEnd' : false }) + 1;
var txt = "\n" + $textbox.val();
var pat = /\n(==+)(.*)\1/g;
var result;
var arr = erota_luokat(txt);
txt = arr;
luokat = arr;
tekstin_loppu = arr.length;
// Taso, jolla kursori on.
var postaso = 0;
polku = ;
if ( wpSection == "" ) { polku = -1; postaso = 1 };
osat = ;
while ( (result = pat.exec(txt)) !== null ) {
// Matchin alku + 1. Huom. osoittaa otsikon alkuun eikä otsikkoa edelliseen
// rivinvaihtoon, koska tekstin alkuun lisättiin ylimääräinen \n.
var s = pat.lastIndex - result.length
var taso = result.length;
osat.push( ]);
// Lopetetaan polun kokoaminen, jos ollaan yli kursorin kohdan.
if ( s < pos ) {
polku = osat.length-1;
postaso = taso;
}
}
polku = polku.slice(0, postaso+1);
}
function tayta_otsikkovalikko() {
parsi_teksti();
var lst = hae_otsikot(polku);
$("#otsikkovalikko").empty();
for ( var i in lst ) {
$("#otsikkovalikko").append(lst);
}
}
function run($) {
var $sailio = $('<span></span>');
if ( $("#tyokalupakki").length == 0 ) {
$textbox.before('<div id="tyokalupakki"></div>');
}
$("#tyokalupakki").append([ '<span class="tyokaluerotin" style="color: gray; ">'
+ ' | </span>', $sailio ]);
var $ohje_lnk = $('<a href="https://dictious.com/fi/Ohje:Gadget-Otsikot">?</a></div>');
var $ohje_span = $('<span class="ohjenappi"></span>');
$ohje_span.html(" ]);
var $ovalikko = $('<select style="width: 15em;" id="otsikkovalikko" '
+ 'title="Lisää otsikko ">'
+ '<option>- Lisää otsikko -</option>'
+ '</select>');
$ovalikko.on("focus", tayta_otsikkovalikko);
$ovalikko.on("change", ovalikko_onchange);
$ovalikko.keyup(function(event) {
if ( event.keyCode == 27 ) /* ESC */ $textbox.focus();
else if ( event.keyCode == 18 ) /* Enter */ event.preventDefault();
});
$sailio.append();
$(document).keyup(function(event){
if ( event.ctrlKey && event.altKey && event.keyCode == 79 ) { // 'o'
$ovalikko.focus();
}
});
$textbox.focus();
}
if ( (mw.config.get('wgAction') == "edit" || mw.config.get('wgAction') == "submit")
&& mw.config.get('wgNamespaceNumber') == 0) {
jQuery(document).ready(run);
}
})();