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();});