Vés al contingut

Usuari:Forat Negre/fastreadhelper.js

De la Viquipèdia, l'enciclopèdia lliure

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>