Järjestelmäviesti:Gadget-Wikiviite.js

Wikiaineistosta

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){   
//    mw.loader.load('mediawiki.api');

    window.Wikiviite = { content: null, revid: null };


    /**
     * Palauttaa kohdasta `alku` alkavan mallinekutsun lopun tekstistä `str`.
     **/
    function hae_loppu(str, alku) {
        var p = 0;
        var re = /\{{2,3}|\}{2,3}/g;
        re.lastIndex = alku;
        while ((match = re.exec(str)) !== null) {
            if (match[0][0] == '{') p += match[0].length;
            else p -= match[0].length;
            if (p === 0) {
                return match.index + match[0].length;
            }
        }
        return -1;
    }
    /**
     * Palauttaa mallinekutsun `nimi` `n`:nen alkukohdan tekstistä `str`.
     **/
    function hae_alku(str, nimi, n) {
        var i = 0;
        var re = new RegExp("\{\{[\n\t ]*" + nimi + "[\n\t ]*[|}]", "g");
        while ( (match = re.exec(str)) !== null ) {
            if ( i == n )
                return match.index;
            i++;
        }
        return -1;
    }
    /**
     * Palauttaa mallineen `nimi` `n`:nen kutsun tekstistä `str`.
     **/
    function hae_mallinekutsu(str, nimi, n) {

        var alku = hae_alku(str, nimi, n);
        if ( alku != -1 ) {
            var loppu = hae_loppu(str, alku);
            if ( loppu == -1 ) loppu = str.length;
            return [str.substring(alku, loppu), alku, loppu];
        }
        return null;
    }

    /**
     * Sana kuin hae_mallinekutsu, mutta palauttaa koko rivin (edellisestä rivnvaihdosta seuraavaan, itse mallinekutsu voi olla jaettu 
     * useille riveille).
     * TODO: Ei toimi jos rivillä on useita mallineita, jotka on kirjoitettu usealle riville.
     */
    function hae_mallinerivi(str, nimi, n) {
        var kohta = hae_mallinekutsu(str, nimi, n);
        if ( kohta !== null ) {
            var m = kohta[0], a = kohta[1], l = kohta[2];
            var ra = str.lastIndexOf("\n", a), 
                rl = str.indexOf("\n", l);
            if ( ra == -1 ) ra = 0; else ra += 1;
            if ( rl == -1 ) rl = str.length;
            return [str.substring(ra, rl), ra, rl];
        }
        return null;
    }

    
    /**
     * Lataa sivun wikikoodin jos sitä ei ole ladattu.
     * Kutsuu funktioita `f` parametrilla `param`.
     **/
    function tee_wikikoodille(param, f) {
        if ( window.Wikiviite.content ) {
            f(param);
        } else {
            var q = {
                format: 'json', 
                action: 'query',
                titles: mw.config.get('wgPageName'), 
                prop: 'revisions', 
                rvprop: 'content|ids', 
            };
            var url = "https://fi.wikisource.org/w/api.php?" + $.param(q, true) + "&callback=?";

            $.getJSON(url ,function(data) {
                // api.get( q ).done ( function ( data ) {
                var hash = data;
                var page_value = "";
                $.each(data.query.pages,function(k,v){
                    if ( v && v.revisions && v.revisions[0] ) {
                        window.Wikiviite.content = v.revisions[0]["*"];
                        window.Wikiviite.revid = v.revisions[0].revid;

                        if ( window.Wikiviite.revid != mw.config.get('wgRevisionId') ) {
                            alert("Sivu on muuttunut. Osa tiedoista saattaa näkyä väärin. Lataa sivu uudelleen.");
                        }

                        f(param);
                    }
                });
            });
        }
    }

    function run($) {
        var $overlay, $ikkuna, $selite, $textbox, $sulje_btn, $form, $form_asetukset, $asetukset_btn;

        // var api = new mw.Api();
        $.ajaxSetup({ headers: { 'Api-User-Agent': 'Wikiviite/0.5' }});

        $overlay = $('<div id="wv_overlay"> </div>');
        $ikkuna = $('<div id="wv_ikkuna"> </div>');

        $sulje_btn = $('<input type="button" value="Sulje" />');        
        $sulje_btn.click(function () {
                $ikkuna.hide();
                $overlay.hide();
        });
        $ikkuna.on('keyup', function (e) {
            if ( e.which == 27 ) {
                $ikkuna.hide();
                $overlay.hide();
            }
        });

        $form_asetukset = $('<ul></ul>');       
        $form_asetukset.append('<li><label for="wv_rivi"  title="Valitse koko rivi, jolla malline on. (Huom. Ei toimi oikein kaikissa tapauksissa.)">Koko rivi: </label><input type="checkbox" name="wv_rivi" /></li>');
        $form_asetukset.append('<li><label for="wv_eteen" title="Valitun tekstin eteen automaattisesti lisättävä teksti. (Esim. &quot;&lt;ref&gt;&quot;)">Lisää eteen: </label><input type="text" name="wv_eteen" /></li>');
        $form_asetukset.append('<li><label ="wv_peraan"   title="Valitun tekstin eteen automaattisesti lisättävä teksti. (Esim. &quot;&lt/ref&gt;&quot;)">Lisää perään: </label><input type="text" name="wv_peraan" /></li>');
        $form_asetukset.append('<li><label for="wv_parametri" title="Viitemallineen sisään automaattisesti lisättävä teksti. (Esim. &quot;Viitattu=&quot;)">Lisää sisään (lisäparametrit): </label><input type="text" name="wv_parametri" /></li>');
        $asetukset_btn = $('<a style="font-size: 50%;" href="#">[asetukset]</a>');
        $asetukset_btn.click(function (e) {
            $form_asetukset.slideToggle();
            return false;
        });

        $textbox = $('<textarea></textarea>');  

        $form = $('<form></form>');     
        $form.append($textbox);
        $form.append($("<br/>"));
        $form.append($sulje_btn);


        $selite = $('<p id="wv_viiteteksti"></p>');
        $ikkuna.append("<p><strong>Kopioi viitteen wikikoodi alta:</strong></p>");
        $ikkuna.append($selite);
        $ikkuna.append($form);
        $ikkuna.append($form_asetukset);
        $ikkuna.append($asetukset_btn);

        $form_asetukset.hide();
        $ikkuna.hide();
        $overlay.hide();

        $overlay.appendTo(document.body);
        $ikkuna.appendTo(document.body);


        function nayta_ikkuna() {
            $overlay.show();
            $ikkuna.show();
            $sulje_btn.focus();
            $textbox.select();
        }

        /** 
         * Päivittää valitun viiteteksti ikkunaan kun ikkuna avataan tai asetuksia muutetaan.
         */
        function paivita_ikkuna() {
            var str    = window.Wikiviite.content,
                tyyppi = window.Wikiviite.vtyyppi,
                num    = window.Wikiviite.num,
                teksti = window.Wikiviite.viiteteksti;

            $selite.html(teksti);

            var kohta;
            
            var koko_rivi = ($("input[name=wv_rivi]").prop('checked') === true);
            if ( !koko_rivi ) {
                kohta = hae_mallinekutsu(str, tyyppi, num);
            } else {
                kohta = hae_mallinerivi(str, tyyppi, num);
            }
            var wikikoodi = kohta[0];

            var lisaparametri = $("input[name=wv_parametri]").val();
            var etulisa  = $("input[name=wv_eteen]").val();
            var peralisa = $("input[name=wv_peraan]").val();

            if ( lisaparametri ) {
                var pos = wikikoodi.lastIndexOf("}}");
                if ( pos != -1 ) {
                    wikikoodi = wikikoodi.substring(0, pos) + "| " + lisaparametri + wikikoodi.substring(pos);
                }
            }
            wikikoodi = etulisa + wikikoodi + peralisa;
            $textbox.val(wikikoodi);

            $.cookie( 'wikiviite_koko_rivi', (koko_rivi ? 1 : 0) , { expires: 1,  path: '/' } );
            $.cookie( 'wikiviite_etulisa', etulisa, { expires: 1,  path: '/' } );
            $.cookie( 'wikiviite_peralisa', peralisa, { expires: 1,  path: '/' } );
            $.cookie( 'wikiviite_lisaparametri', lisaparametri, { expires: 1,  path: '/' } );

        }

        /*
         * Viitteen perään lisättävä nappi.
         */
        function tee_nappi(index, vtyyppi) {
            var $btn = $('<a href="#" class="wv-nappi" style="border: 1px solid blue; background-color: lightblue; font-size: 50%; vertical-align: super; " title="Kopioi viitteen wikikoodi">w</a>');
            $btn.on('click', function (e) {

                window.Wikiviite.viiteteksti = $btn.prev().html();
                window.Wikiviite.num = index;
                window.Wikiviite.vtyyppi = vtyyppi;
                tee_wikikoodille(null, function (params) {
                    paivita_ikkuna();
                    nayta_ikkuna();
                });
                return false;
            });
            return $btn;
        }

        $("input[name=wv_rivi]").prop('checked', ($.cookie( 'wikiviite_koko_rivi' ) == 1));
        $("input[name=wv_parametri]").val($.cookie( 'wikiviite_lisaparametri' ));
        $("input[name=wv_eteen]").val($.cookie( 'wikiviite_etulisa' ));
        $("input[name=wv_peraan]").val($.cookie( 'wikiviite_peralisa' ));

        $("input[name=wv_rivi]").click(paivita_ikkuna);
        $("input[name=wv_parametri]").on('change', paivita_ikkuna);
        $("input[name=wv_eteen]").on('change', paivita_ikkuna);
        $("input[name=wv_peraan]").on('change', paivita_ikkuna);

        var indeksit = {};
        $(".wikiviite").each(function(index) {
            var tyyppi = $(this).attr("class").split(" ")[1];
            if ( indeksit[tyyppi] === undefined ) {
                indeksit[tyyppi] = 0;
            } else {
                indeksit[tyyppi]++;
            }
            $(this).after(tee_nappi(indeksit[tyyppi], tyyppi));
        });
    }

//    if ( wgAction == "view" ) {
        jQuery(document).ready(run);
//    }

})(window);