Järjestelmäviesti:Gadget-Luokkaselain.js

Wikisanakirjasta

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.
if ( mw.config.get('wgAction') === 'view' &&
     mw.config.get('wgNamespaceNumber') === 14 /* Luokka */ ) {

    var colorOdd  = "#ddd", 
        colorEven = "#eee", 
        colorTop  = "#def";

    function reverseString(string) {
        return string.split("").reverse().join("");
    }

    function addTextbox($toc, value, reversed) {
        // tekstilaatikko
        $toc.children('tbody').append(
            '<tr>'
            + '<td id="container" align="center">'
            + '<form class="createbox" action="/w/index.php" method="get">'
            + '</form>'
            + '</td>'
            + '</tr>'
        );

        var $form = $toc.find("#container form"),
            $textInput = $('<input type="text" width="4" />'),
            $hiddenInput = $('<input type="hidden" name="from" />');

        $textInput.val(
            reversed
            ? reverseString(value)
            : value
        );

        var $submit = $('<input type="submit" value="Siirry" />');

        // Jos ollaan käänteissanakirjassa, käännetään hakukentän teksti ennen submittia.
        // Siirretään hakukentän teksti nimettyyn piilokenttään ennen tietojen lähettämistä, koska
        // jos hakukenttä on nimetty ja teksti käännetään, vilahtaa käännetty teksti hakukentässä.
        $submit.on('click', function (event) {
            if ( reversed ) {
                $hiddenInput.val(reverseString($textInput.val()));
            } else {
                $hiddenInput.val($textInput.val());
            }
            return true;
        });
        
        $form.append([
            '<input type="hidden" name="title" value="' + mw.config.get("wgPageName") + '" />',
            (reversed ? "Listaus alkaen kohdasta (suffiksi): " : "Listaus alkaen kohdasta: "),
            $textInput,
            $hiddenInput,
            ' ',
            $submit
        ]);
    }

    function getNumberOfLevels($tr0) {
        // Luetaan sivujen kokonaismäärä luokassa.
        var total = (function () {
            var $p = $('#mw-pages p:contains("Sivujen kokonaismäärä luokassa on")');
            var num = $p.text().match(/Sivujen kokonaismäärä luokassa on (.*)\./)[1].replace(/\s/g, "");
            
            return parseInt(num);
        }());
        
        // Kerralla näkyvien sivujen määrä.
        var N_VISIBLE = 200; 
        
        // Aakkosten määrä
	var n_aak     = $tr0.find("a").length - 1;
        
        // Ratkaistaan tasojen määrä epäyhtälöstä
        //  total / n_aak^levels < N_VISIBLE
        //  <=> levels = ceil ( log_(n_aak)(total/N_Visible) )
        //             = ceil ( log(total/N_VISIBLE) / log(n_aak) )
        var levels     = Math.ceil(Math.log(total/N_VISIBLE) / Math.log(n_aak));
        
        return levels;
    }

    function getURL(baseURL, fromParam) {
	return baseURL + "&from=" + encodeURIComponent(fromParam);
    }

    /**
     * Poistaa from-parametrin urlista.
     **/
    function getBaseURL(url) {
        return url.replace(/&from=.*$/, '')
                  .replace(/from=[^&#].*?(&|$)/, '');
    }

    /**
     * Lisää uuden tason edellisen alle. Uudessa tasossa on yksi kirjain enemmän kuin edellisessä.
     **/
    function addLevel($tr0, $tr_prev, level, fromParam, baseURL, reversed) {
        var color       = (level % 2 === 0 ? colorEven : colorOdd);
        var $tr_current = $tr0.clone();       
        var $elements   = $tr_current.find("a, .aakkosluettelo-pseudolinkki");
        var baseString  = fromParam.substring(0, level);
        var next        = fromParam.substring(0, level + 1);
        
        
        if ( level < fromParam.length ) { 
            fromParam.substring(0, level+1); 
        }
        
        if ( level === fromParam.length ) {
            color = colorTop;
        }
        
        $tr_current.css("font-size", "0.8em");
        $tr_current.css("background-color", color);
        
        $elements.each(function (index) {
            var $this = $(this);
            var s = baseString + $this.text().toLowerCase();
            
            if ( $this.text() === "Alkuun" ) {
                $this.text("↑");
                $this.attr("href", getURL(baseURL, baseString));
            } else {
                if ( s === next ) {
                    $this.html('<strong>' + (reversed ? ("-" + reverseString(s.toLowerCase())) : s) + '</strong>');
                } else {
                    $this.text(reversed ? ("-" + reverseString(s.toLowerCase())) : s);
                }
                $this.attr("href", getURL(baseURL, s));
            }
        });
        
        $tr_prev.after($tr_current);
        
        return $tr_current;
    }
    
    function getFromParam(url) {
        var param = url.indexOf("?from=") > -1 || url.indexOf("&from=") > -1
                                                                        ? url.replace(/.*\bfrom=(.*?)(?=&|#|$).*/, "$1").replace(/#.*$/, "")
                                                                        : "";
        param = param.split("%0A")[0];
        return decodeURIComponent(param);
    }

    window.jQuery(document).ready(function ($) {

        var url       = document.location.toString();
        var fromParam = getFromParam(url);
        var baseURL   = getBaseURL(url);
        
        var $toc = $('#toc');
        if ( $toc.length === 0 ) {
            return;
        }

        var reversed  = $(".suffiksihakemisto").length > 0;


        addTextbox($toc, fromParam, reversed);

        if ( fromParam === "" ) {
            return;
        }

        var $tr0 = $toc.find("a:first").closest("tr");
        var levels = getNumberOfLevels($tr0);
        
        $tr0.css("text-align", "center"); // TODO muuta mallineesta

        if ( levels > 1 ) {
            var $prevTr = $tr0;
            for ( var level = 0; level < fromParam.length && level < levels; level++ ) {
                $prevTr = addLevel($tr0, $prevTr, level + 1, fromParam, baseURL, reversed);
            }
        }
    });
    
}