MediaWiki:Gadget-Mistrik.js

Z WikiSkript

Poznámka: Po zveřejnění musíte vyprázdnit cache vašeho prohlížeče, jinak změny neuvidíte.

  • Firefox / Safari: Při kliknutí na Aktualizovat držte Shift nebo stiskněte Ctrl-F5 nebo Ctrl-R (na Macu ⌘-R)
  • Google Chrome: Stiskněte Ctrl-Shift-R (na Macu ⌘-Shift-R)
  • Internet Explorer / Edge: Při kliknutí na Aktualizovat držte Ctrl nebo stiskněte Ctrl-F5
  • Opera: Stiskněte Ctrl-F5.
/**
 * Orientační výpočet Mistríkova skóre
 *
 * @file 
 * @author User:Slepi
 * @license https://www.gnu.org/copyleft/gpl.html GNU GPL 3.0
 */

var mistrikScore = {

    /**
     * získat text článku
     */
    getText : function() {

        /* text se nachází v #content, chci jen odstavce */
        textArray = document.getElementById("content").getElementsByTagName("p");

        /* prázdné pole mne nezajímá, skončíme */
        if (!textArray.length) return false;

        /* výstupní řetězec */
        articleText = "";

        /* z odstavců (odkazy na HTML DOM) vytěžím text, který končí ., :, ; */
        for (i = 0; i < textArray.length; i++) {
            a = textArray[i].innerText;
            if (/[\.\:\;]+[\s]?$/.test(a) === true) {
                articleText += a + " ";
            }
        }

        /* výsledek pošleme ke zpracování */
        mistrikScore.processArticle(articleText);

    },


    /**
     * Zpracování dat textu článku.
     * 
     * @param {article} Data předaná z HTML
     *
     * @return {int} Mistríkovo skóre
     */
    processArticle : function(article) {

        /* vyčistit text od nepotřebných znaků a řádků, krátký článek nehodnoť */
        article = mistrikScore.parseArticle(article);
        if (article === false) return false;

        /* zjistit počet slov a počet různých slov */
        words = mistrikScore.getWords(article);
        countWords = words[0];
        countDiffWords = words[1];

        /* zjistit počet slabik */
        countSyllables = mistrikScore.getSyllables(article);

        /* zjistit počet vět */
        countSentences = mistrikScore.getSentences(article);

        /* spočítat Mistríkovo skóre */
        score = mistrikScore.done(countSyllables, countDiffWords, countWords, countSentences);

        /* vložit skóre na stránky */
        mistrikScore.inputScore(score);

        /* předat hodnotu Mistríkova skóre */
        return score;

    },


    /**
     * Vyčistit text článku od znaků a nepotřebných řádků
     *
     * @param {article} Text článku
     *
     * @return {string} Čistý text článku bez nepotřebných znaků
     */
    parseArticle : function(article) {

        /* pole regulárních výrazů, které potřebujeme */
        regDeletions = {
            chars : /[\!\@\#\$\^\&\%\*\(\)\+\=\-\–\\\[\]\/\{\}\|\<\>\?\,\d\…]/g,    // speciální znaky
            white : /[\s]+/g,    // prázdné znaky
            doubles : /(ou|au)/ig,    // jednoslabičné dvojhlásky (eo, ie a ea apod. tvoří dvě slabiky: např. nausea)
            stop : /[\.\:\;]+/g,     // tečka, dvojtečka nebo středník na konci věty
        };

        /* převést tečky, dvojtečku a středník na jednu tečku (pro pozdější počet vět) */
        article = article.replace(regDeletions["stop"], ".");

        /* smazat nepotřebné znaky */
        article = article.replace(regDeletions["chars"], "");

        /* prázdné znaky zaměnit za jednu mezeru */
        article = article.replace(regDeletions["white"], " ");

        /* dvojhlásky zaměnit za jedno "o" třeba :-) */
        article = article.replace(regDeletions["doubles"], "o");

        /* smažeme prázdné znaky */
        article = article.trim();

        /* pokud je článek krátký, tak to nemá smysl */
        if (article.length < 50) return false;

        /* odešleme zpět */
        return article;

    },


    /**
     * Spočítat počet slov v textu
     *
     * @param {article} Čistý text článku
     *
     * @return {array} [počet slov v článku], [počet různých slov v článku]
     */
    getWords : function(article) {

        /* převést na malá písmena, ať můžu porovnávat */
        article = article.toLowerCase();

        /* rozdělit článek na slova */
        articleArray = article.split(" ");

        /* nejprve zjistíme počet slov v článku */
        countWords = articleArray.length;

        /* počet různých slov */
        diffWords = new Array();

        /* požiju prvních 5 znaků slova, pokud souhlasí, jsou to asi stejná slova */
        for (i = 0; i < articleArray.length; i++) {

            if (diffWords.indexOf(articleArray[i].substring(0,5)) === -1) {

                diffWords.push(articleArray[i].substring(0,5));

            }

        }
            
        countDiffWords = diffWords.length;

        /* a to je vše, vrátím zpět výsledky */
        return [countWords, countDiffWords];

    },


    /**
     * Spočítat počet vět v textu
     *
     * @param {article} Čistý text článku
     *
     * @return {int} Počet vět v článku
     */
    getSentences : function(article) {

        /* počet vět by měl skoro odpovídat počtu teček, které nejsou následovány mezerou a malým písmenem */
        countSentencesArray = article.match(/[\.](?!([\s]*[a-zžščřďňťáéóúí]))/g);

        /* pokud nenajdeme tečku, tak to považujme za jednu větu */
        if (countSentencesArray === null) return 1;

        /* předat počet vět zpět */
        return countSentencesArray.length;

    },


    /**
     * Spočítat počet slabik v textu
     *
     * @param {article} Čistý text článku
     *
     * @return {int} Počet slabik v textu
     */
    getSyllables : function(article) {

        /* samohlásky a slabikotvorné souhlásky */
        splitVowels = new Array("a", "á", "e", "é", "ě", "o", "ó", "u", "ú", "ů", "i", "í", "y", "ý");
        splitConsonants = /[bcčdďfghjklmnňpqrřsštťvwxzž][lr][bcčdďfghjklmnňpqrřsštťvwxzž]/ig;
        splitNasals = /[bcčdďfghjklpqrřsštťvwxzž][mnň][^aáeéěoóuúůiíyý]/ig;

        /* počet slabik je na začátku 0 */
        countSyllables = 0;

        /* počet slabik v článku */
        for (i = 0; i < splitVowels.length; i++) {

            /* seznam výskytů samohlásky */
            listSyll = article.match(new RegExp(splitVowels[i], "g"));

            /* počet slabik víceméně odpovídá počtu samohlásek (dvojhlásky jsou už zrušeny v processArticle()) */
            if (listSyll !== null) {
                countSyllables += listSyll.length;
            }

        }

        /* zkusím spočítat slabikotvorné souhlásky */
        splitConsonantArray = article.match(splitConsonants);
        if (splitConsonantArray !== null) countSyllables += splitConsonantArray.length;

        /* zkusím spočítat slabikotvorné nosovky */
        splitNasalsArray = article.match(splitNasals);
        if (splitNasalsArray !== null) countSyllables += splitNasalsArray.length;

        /* a to je vše, poslat výsledek zpět */
        return countSyllables;
            
    },


    /**
     * Spočítat Mistríkovo skóre
     *
     * @param {countSyllables} Počet slabik
     * @param {countDiffWords} Počet různých slov
     * @param {countWords} Počet slov
     * @param {countSentences} Počet vět
     *
     * @return {int} Mistríkovo skóre
     */
    done : function(countSyllables, countDiffWords, countWords, countSentences) {

        return Math.round(50 - (countSyllables * countDiffWords / countWords / countSentences));

    },   


    /**
     * Vložit Mistríkovo skóre na stránky
     *
     * @param {score} Skóre
     */
    inputScore : function(score) {

        /* odstavec */
        li = document.createElement("li");
        li.style.cursor = "pointer";
        li.className = "noprint";
        li.onclick = function() {location.href = mw.config.get("wgServer") + "/index.php/WikiSkripta:Skóre_čtivosti";}

        /* název skóre */
        span1 = document.createElement("span");
        span1.innerText = "Skóre čtivosti: ";
        li.appendChild(span1);

        /* skóre */
        span2 = document.createElement("span");
        span2.innerText = score;
        li.appendChild(span2);
        
        /* barva skóre */
        if (score >= 40) span2.style.color = "navy";
            else if (score >= 30) span2.style.color = "blue";
            else if (score >= 20) span2.style.color = "gold";
            else if (score >= 10) span2.style.color = "orange";
            else if (score < 10) span2.style.color = "red";

        /* vložení do stránky */
        if(document.getElementById("footer") !== null) document.querySelector("#footer ul:first-child").insertBefore(li, document.querySelector("#footer ul:first-child").childNodes[0]);

    },

    /**
     * Zahájit skript
     */
    start : function() {
         
        if (mw.config.get("wgNamespaceNumber") === 0 &&
            mw.config.get("wgAction") === "view" &&
            mw.config.get("wgPageName") !== "Home")
        {
            mistrikScore.getText();
        }

    }

}


/* Zahájit po načtení stránky */
$(function() {mistrikScore.start();});