Usuari:Forat Negre/fastreadhelper.js
Aparença
El codi que afegiu en aquesta pàgina podria tenir contingut maliciós que comprometi el vostre compte. Si no esteu segur si el codi a afegir és segur, pregunteu abans en la Taverna. El codi s'executarà en mostrar una previsualització d'aquesta pàgina. |
Nota: Després de desar, heu de netejar la memòria cau del navegador per veure els canvis. En la majoria de navegadors amb Windows o Linux, premeu Ctrl+F5 o bé premeu Shift i cliqueu el botó "Actualitza" (Ctrl i "Actualitza" amb Internet Explorer). Vegeu més informació i instruccions per a cada navegador a Viquipèdia:Neteja de la memòria cau.
//<nowiki>
/* fastreadhelper.js
--------------------------------
Versió actual: 1.0
Autor: Forat Negre
--------------------------------
Aplica negreta al principi de les paraules per facilitar una lectura més eficient.
Aquest codi actua sobre totes les paraules del text automàticament per fer-ne la divisió per classes.
Llavors, es defineix el canvi desitjat a cada part, mitjançant un CSS personalitzat.
>> Registre de canvis
Versió 1.0 [27 de febrer 2023]
* Versió operativa
*/
$(function() {
// No aplicar el codi en pàgines especials (Portal, Taverna...)
if (window.location.pathname.includes(":")) return;
// El mode de format "Full mode" permet aplicar canvis de format també a la part no ressaltada.
// Amb això es poden fer efectes més avançats, com ara fer la part no ressaltada translúcida.
// Per defecte està desactivat perquè fa que la pàgina es carregui de forma més lenta en articles llargs.
const FastReadFullMode = false;
// Llista de classes on s'aplica el format FastReader
var handlers = [
".mw-parser-output p",
".mw-parser-output td",
".mw-parser-output ul",
".mw-parser-output dl",
".WDI-box"
];
// Aplicar el format a totes les classes definides a la llista, de manera asincrònica
var handlerIndex = 0;
$(handlers.join(",")).filter(function(){
if (this.innerText.length == 0) return;
handlerIndex++;
if (FastReadFullMode) {
setTimeout(applyFastReadHelper(this), handlerIndex * 10);
} else {
applyFastReadHelper(this);
}
});
// Funció per buscar totes les paraules del text on s'aplica el format
function findValidReaderMatches(text, inserted, matches){
var insideHTML = false;
for (var i = 0; i < text.length; i++) {
if (text.substr(i, 1) == "<") insideHTML = true;
if (text.substr(i, 1) == ">") insideHTML = false;
if (inserted.includes(i) && insideHTML == false) {
matches.push(i);
}
}
return matches;
}
// Aplicar el format als elements de text
function applyFastReadHelper(element) {
// Separar el text per paraules diferents
var r = new RegExp(/[·ÀÈÒàèòÁÉÍÓÚáéíóúÇçÏïÜüÑñ\w]+/gm);
var words = element.innerText.match(r); if (!words) return;
words = words.filter((v,i,a)=>a.indexOf(v)==i);
// Evaluar cada paraula diferent de la secció
words.forEach(function(word) {
// Obtenir les posicions de cada paraula a la secció
var s = new RegExp("(^|\\W)(" + word + ")(\\W|$)", "gm");
var inserted = [...element.innerHTML.matchAll(s)];
var ms = [], matches = [];
inserted.forEach(function(n) {
ms.push(n.index + n[1].length);
});
findValidReaderMatches(element.innerHTML, ms, matches);
// Obtenir el fragment de paraula ressaltat
// (Per defecte és la primera meitat d'aquesta, però es pot definir per cas)
var is = 0, ie = Math.ceil(word.length / 2);
// Aplicar el format a cada paraula de la secció, començant per l'última
matches = matches.reverse();
matches.forEach(function(n) {
var c = element.innerHTML;
var sString = "", eString = "";
if (FastReadFullMode) {
if (is > 0) sString = "<span class='no-fastRead'>" + c.substr(n,is) + "</span>";
if ((word.length-ie-is) > 0) eString = "<span class='no-fastRead'>" + c.substr(n+is+ie, word.length-ie-is) + "</span>";
c = c.substr(0,n) + sString + "<span class='fastRead'>" + c.substr(n+is,ie) + "</span>" + eString + c.substr(n+word.length);
} else {
c = c.substr(0,n+is) + "<span class='fastRead'>" + c.substr(n+is,ie) + "</span>" + c.substr(n+is+ie);
}
element.innerHTML = c;
});
});
}
});
//</nowiki>