REMOVA OS ANÚNCIOS!

Apoiando através de https://apoia.se/arddhu a partir do tier de Apoiador, você pode navegar na wiki sem anúncios e ainda colabora com o projeto!

MediaWiki:Common.js: mudanças entre as edições

De Runarcana Wiki
Sem resumo de edição
Sem resumo de edição
 
(10 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 61: Linha 61:
});
});


/* Runa TOC */
// Hide Sitenotice
$(document).ready(function() {
  if (mw && mw.config) {
    var userGroups = mw.config.get('wgUserGroups');
    var cargosOcultos = ['sysop', 'bureaucrat', 'bot', 'interface-admin', 'supporter'];
    var ocultarSitenotice = cargosOcultos.some(function(cargo) {
      return userGroups.includes(cargo);
    });
    if (ocultarSitenotice) {
      $('#siteNotice').hide();
    }
  }
});
 
/* TOC */
/* TOC */
$(document).ready(function () {
$(document).ready(function () {
   var $window = $(window);
   $(function () {
  var $mwPanel = $("#mw-panel");
    var $window,
  var $toc = $("#toc");
      $mwPanel,
      $floatTOC,
      scrollHandler,
      tocLimit,
      headingOffsets,
      headingThreshold,
      $toc = $("#toc");


  if (!$toc.length) {
    if (!$toc.length) {
    return;
      return;
  }
    }


  var headingThreshold = $window.height() / 5.0;
    $window = $(window);
    $mwPanel = $("#mw-panel");


  // Clonando a TOC
    headingThreshold = $window.height() / 5.0;
  var $floatTOC = $toc
    .clone()
    .removeAttr("id")
    .attr("id", "floatTOC")
    .addClass("floatTOC")
    .appendTo("body");


  $floatTOC.find("ul").show();
    $floatTOC = $toc
      .clone()
      .removeAttr("id")
      .attr("id", "floatTOC")
      .addClass("floatTOC")
      .appendTo("body");


  // Criando o botão de alternância
    $floatTOC.find("ul").show();
  const tocToggleButton = document.createElement("button");
  tocToggleButton.setAttribute("id", "toctogglebutton");
  tocToggleButton.setAttribute("onclick", "toggleTOCVisibility()");


  const tocToggleButtonIconNode = document.createElement("i");
    const tocToggleButton = document.createElement("button");
  tocToggleButtonIconNode.setAttribute("class", "material-icons");
    tocToggleButton.setAttribute("id", "toctogglebutton");
    tocToggleButton.setAttribute("onclick", "toggleTOCVisibility()");


  // Verificando o cookie para decidir se a TOC deve ser visível
     const tocToggleButtonIconNode = document.createElement("i");
  if (getCookie("showTOC") === "false") {
     tocToggleButtonIconNode.setAttribute("class", "material-icons");
     tocToggleButtonIconNode.textContent = "chevron_left";
    $floatTOC.addClass("hiddenFloatTOC");
  } else {
     tocToggleButtonIconNode.textContent = "chevron_right";
  }


  tocToggleButton.appendChild(tocToggleButtonIconNode);
    var tocToggleButtonIconNodeContent;
  $floatTOC.prepend(tocToggleButton);


  // Evento de clique nos links da TOC
    if (getCookie("showTOC") == "false") {
  $floatTOC.find("a").click(function (e) {
      tocToggleButtonIconNodeContent = document.createTextNode("chevron_left");
    e.preventDefault(); // Previne o comportamento padrão
      $floatTOC.addClass("hiddenFloatTOC");
    var targetId = decodeURIComponent(this.hash).replace(/\./g, "\\."); // Decodifica e escapa pontos
    if ($(targetId).length) { // Verifica se o elemento existe
      $("html, body").animate({
        scrollTop: $(targetId).offset().top - headingThreshold,
      });
     } else {
     } else {
       console.warn("Elemento não encontrado: " + targetId);
       tocToggleButtonIconNodeContent = document.createTextNode("chevron_right");
     }
     }
  });


  var tocLimit = $toc.offset().top + $toc.height();
    tocToggleButtonIconNode.appendChild(tocToggleButtonIconNodeContent);
  var headingOffsets = [];
    tocToggleButton.appendChild(tocToggleButtonIconNode);
 
    $floatTOC.prepend(tocToggleButton);
 
    $floatTOC.find("a").click(function (e) {
      e.preventDefault(); // Impede o comportamento padrão do clique
 
      // Decodifica a hash
      var targetId = decodeURIComponent(this.hash);
      var targetElement = $(targetId.replace(/\./g, "\\."));
     
      if (targetElement.length) {
        $("html, body").animate({
          scrollTop: targetElement.offset().top - headingThreshold,
        });
      }
 
      return false;
    });
 
    tocLimit = $toc.offset().top + $toc.height();
    headingOffsets = [];
 
    $(".mw-headline").each(function () {
      headingOffsets.push([$(this).attr("id"), $(this).offset().top]);
    });
 
    scrollHandler = function () {
      var $current,
        scrollTop = $window.scrollTop();
 
      if (scrollTop > tocLimit) {
        $mwPanel.hide();
 
        var highlight = false;
 
        $.each(headingOffsets, function (i, v) {
          if (i !== 0 && scrollTop + headingThreshold < v[1]) {
            highlight = headingOffsets[i - 1][0];
            return false;
          }
        });
 
        if (highlight) {
          $current = $floatTOC.find('a[href="#' + highlight + '"]');
          $floatTOC.find("a").not($current).removeClass("active");
          $current.addClass("active");
         
          // Centralizar o item ativo na visão do TOC
          var activeItemOffset = $current.position().top;
          var tocScrollTop = $floatTOC.scrollTop();
          var tocHeight = $floatTOC.height();
 
          if (activeItemOffset < tocScrollTop || activeItemOffset > tocScrollTop + tocHeight) {
            $floatTOC.scrollTop(activeItemOffset - tocHeight / 2);
          }
        }
      } else {
        $mwPanel.show();
      }
    };


  // Salvando as posições dos cabeçalhos
    // Use the custom throttle function
  $(".mw-headline").each(function () {
     $window.on("scroll", throttle(scrollHandler, 250));
     headingOffsets.push([$(this).attr("id"), $(this).offset().top]);
   });
   });
});


  function updateFloatTOC() {
// Throttle function
    var scrollTop = $window.scrollTop();
function throttle(func, limit) {
    var floatTOCVisible = scrollTop > tocLimit;
  let lastFunc;
    if (floatTOCVisible) {
  let lastRan;
      $mwPanel.hide();
      var highlight = false;


      // Lógica para determinar qual cabeçalho destacar
  return function() {
      $.each(headingOffsets, function (i, v) {
    const context = this;
        if (i !== 0 && scrollTop + headingThreshold < v[1]) {
    const args = arguments;
          highlight = headingOffsets[i - 1][0];
          return false;
        }
      });


      // Destacar o item atual no TOC
    if (!lastRan) {
      $floatTOC.find("a").css({ "font-weight": "", "text-decoration": "" }).find('.toc-ball').remove();
       func.apply(context, args);
       if (highlight) {
      lastRan = Date.now();
        var $current = $floatTOC.find('a[href="#' + $.escapeSelector(highlight) + '"]');
        $current.css({ "font-weight": "bold", "text-decoration": "underline" });
        $current.prepend('<span class="toc-ball" style="margin-right: 5px;">•</span>');
      }
     } else {
     } else {
       $mwPanel.show();
       clearTimeout(lastFunc);
      lastFunc = setTimeout(function() {
        if ((Date.now() - lastRan) >= limit) {
          func.apply(context, args);
          lastRan = Date.now();
        }
      }, limit - (Date.now() - lastRan));
     }
     }
   }
   }
 
}
  // Inicializa o manipulador de rolagem
  $window.on("scroll", updateFloatTOC);
  updateFloatTOC(); // Chama uma vez para garantir que a TOC esteja visível corretamente
});


function toggleTOCVisibility() {
function toggleTOCVisibility() {
   var $floatTOC = $("#floatTOC");
   var $floatTOC = $("#floatTOC");
   var $tocToggleButton = $("#toctogglebutton i"); // Seleciona apenas o ícone dentro do botão
   var $tocToggleButton = $("#toctogglebutton");


   if ($floatTOC.hasClass("hiddenFloatTOC")) {
   if ($floatTOC.hasClass("hiddenFloatTOC")) {
     $floatTOC.removeClass("hiddenFloatTOC");
     $floatTOC.removeClass("hiddenFloatTOC");
     $tocToggleButton.text("chevron_right");
 
    const tocToggleButtonIconNode = document.createElement("i");
    tocToggleButtonIconNode.setAttribute("class", "material-icons");
 
    const tocToggleButtonIconNodeContent =
      document.createTextNode("chevron_right");
    tocToggleButtonIconNode.appendChild(tocToggleButtonIconNodeContent);
 
     $tocToggleButton.html("");
    $tocToggleButton.append(tocToggleButtonIconNode);
 
     setCookie("showTOC", "true");
     setCookie("showTOC", "true");
   } else {
   } else {
     $floatTOC.addClass("hiddenFloatTOC");
     $floatTOC.addClass("hiddenFloatTOC");
     $tocToggleButton.text("chevron_left");
 
    const tocToggleButtonIconNode = document.createElement("i");
    tocToggleButtonIconNode.setAttribute("class", "material-icons");
 
    const tocToggleButtonIconNodeContent =
      document.createTextNode("chevron_left");
    tocToggleButtonIconNode.appendChild(tocToggleButtonIconNodeContent);
 
     $tocToggleButton.html("");
    $tocToggleButton.append(tocToggleButtonIconNode);
 
     setCookie("showTOC", "false");
     setCookie("showTOC", "false");
   }
   }

Edição atual tal como às 15h01min de 4 de novembro de 2024

/* Códigos JavaScript aqui colocados serão carregados por todos aqueles que acessarem alguma página deste wiki */

/* Organize */
$(document).ready(function () {
  var tables = document.getElementsByClassName("organize");
  Array.prototype.forEach.call(tables, function (table) {
    var rows, switching, i, x, y, shouldSwitch;
    switching = true;
    /* Make a loop that will continue until
        no switching has been done: */
    while (switching) {
      // start by saying: no switching is done:
      switching = false;
      rows = table.rows;
      /* Loop through all table rows (except the
            first, which contains table headers): */
      for (i = 1; i < rows.length - 1; i++) {
        // start by saying there should be no switching:
        shouldSwitch = false;
        /* Get the two elements you want to compare,
                one from current row and one from the next: */
        x = rows[i].querySelector("h3>span.mw-headline");
        y = rows[i + 1].querySelector("h3>span.mw-headline");
        // check if the two rows should switch place:
        if (
          x.getAttribute("id").toLowerCase() >
          y.getAttribute("id").toLowerCase()
        ) {
          // if so, mark as a switch and break the loop:
          shouldSwitch = true;
          break;
        }
      }
      if (shouldSwitch) {
        /* If a switch has been marked, make the switch
                and mark that a switch has been done: */
        rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);

        var rowIdA = rows[i].querySelector(".mw-headline").getAttribute("id");
        var rowIdB = rows[i + 1]
          .querySelector(".mw-headline")
          .getAttribute("id");
        var floatTOCLinkA = document.querySelector(
          'a[href$="' + rowIdA + '"]'
        ).parentNode;
        var floatTOCLinkB = document.querySelector(
          'a[href$="' + rowIdB + '"]'
        ).parentNode;

        floatTOCLinkB.parentNode.insertBefore(floatTOCLinkA, floatTOCLinkB);

        rowIdA = null;
        rowIdB = null;
        floatTOCLinkA = null;
        floatTOCLinkB = null;

        switching = true;
      }
    }
  });
});

// Hide Sitenotice
$(document).ready(function() {
  if (mw && mw.config) {
    var userGroups = mw.config.get('wgUserGroups');
    var cargosOcultos = ['sysop', 'bureaucrat', 'bot', 'interface-admin', 'supporter'];
    var ocultarSitenotice = cargosOcultos.some(function(cargo) {
      return userGroups.includes(cargo);
    });
    if (ocultarSitenotice) {
      $('#siteNotice').hide();
    }
  }
});

/* TOC */
$(document).ready(function () {
  $(function () {
    var $window,
      $mwPanel,
      $floatTOC,
      scrollHandler,
      tocLimit,
      headingOffsets,
      headingThreshold,
      $toc = $("#toc");

    if (!$toc.length) {
      return;
    }

    $window = $(window);
    $mwPanel = $("#mw-panel");

    headingThreshold = $window.height() / 5.0;

    $floatTOC = $toc
      .clone()
      .removeAttr("id")
      .attr("id", "floatTOC")
      .addClass("floatTOC")
      .appendTo("body");

    $floatTOC.find("ul").show();

    const tocToggleButton = document.createElement("button");
    tocToggleButton.setAttribute("id", "toctogglebutton");
    tocToggleButton.setAttribute("onclick", "toggleTOCVisibility()");

    const tocToggleButtonIconNode = document.createElement("i");
    tocToggleButtonIconNode.setAttribute("class", "material-icons");

    var tocToggleButtonIconNodeContent;

    if (getCookie("showTOC") == "false") {
      tocToggleButtonIconNodeContent = document.createTextNode("chevron_left");
      $floatTOC.addClass("hiddenFloatTOC");
    } else {
      tocToggleButtonIconNodeContent = document.createTextNode("chevron_right");
    }

    tocToggleButtonIconNode.appendChild(tocToggleButtonIconNodeContent);
    tocToggleButton.appendChild(tocToggleButtonIconNode);

    $floatTOC.prepend(tocToggleButton);

    $floatTOC.find("a").click(function (e) {
      e.preventDefault(); // Impede o comportamento padrão do clique

      // Decodifica a hash
      var targetId = decodeURIComponent(this.hash);
      var targetElement = $(targetId.replace(/\./g, "\\."));
      
      if (targetElement.length) {
        $("html, body").animate({
          scrollTop: targetElement.offset().top - headingThreshold,
        });
      }

      return false;
    });

    tocLimit = $toc.offset().top + $toc.height();
    headingOffsets = [];

    $(".mw-headline").each(function () {
      headingOffsets.push([$(this).attr("id"), $(this).offset().top]);
    });

    scrollHandler = function () {
      var $current,
        scrollTop = $window.scrollTop();

      if (scrollTop > tocLimit) {
        $mwPanel.hide();

        var highlight = false;

        $.each(headingOffsets, function (i, v) {
          if (i !== 0 && scrollTop + headingThreshold < v[1]) {
            highlight = headingOffsets[i - 1][0];
            return false;
          }
        });

        if (highlight) {
          $current = $floatTOC.find('a[href="#' + highlight + '"]');
          $floatTOC.find("a").not($current).removeClass("active");
          $current.addClass("active");
          
          // Centralizar o item ativo na visão do TOC
          var activeItemOffset = $current.position().top;
          var tocScrollTop = $floatTOC.scrollTop();
          var tocHeight = $floatTOC.height();

          if (activeItemOffset < tocScrollTop || activeItemOffset > tocScrollTop + tocHeight) {
            $floatTOC.scrollTop(activeItemOffset - tocHeight / 2);
          }
        }
      } else {
        $mwPanel.show();
      }
    };

    // Use the custom throttle function
    $window.on("scroll", throttle(scrollHandler, 250));
  });
});

// Throttle function
function throttle(func, limit) {
  let lastFunc;
  let lastRan;

  return function() {
    const context = this;
    const args = arguments;

    if (!lastRan) {
      func.apply(context, args);
      lastRan = Date.now();
    } else {
      clearTimeout(lastFunc);
      lastFunc = setTimeout(function() {
        if ((Date.now() - lastRan) >= limit) {
          func.apply(context, args);
          lastRan = Date.now();
        }
      }, limit - (Date.now() - lastRan));
    }
  }
}

function toggleTOCVisibility() {
  var $floatTOC = $("#floatTOC");
  var $tocToggleButton = $("#toctogglebutton");

  if ($floatTOC.hasClass("hiddenFloatTOC")) {
    $floatTOC.removeClass("hiddenFloatTOC");

    const tocToggleButtonIconNode = document.createElement("i");
    tocToggleButtonIconNode.setAttribute("class", "material-icons");

    const tocToggleButtonIconNodeContent =
      document.createTextNode("chevron_right");
    tocToggleButtonIconNode.appendChild(tocToggleButtonIconNodeContent);

    $tocToggleButton.html("");
    $tocToggleButton.append(tocToggleButtonIconNode);

    setCookie("showTOC", "true");
  } else {
    $floatTOC.addClass("hiddenFloatTOC");

    const tocToggleButtonIconNode = document.createElement("i");
    tocToggleButtonIconNode.setAttribute("class", "material-icons");

    const tocToggleButtonIconNodeContent =
      document.createTextNode("chevron_left");
    tocToggleButtonIconNode.appendChild(tocToggleButtonIconNodeContent);

    $tocToggleButton.html("");
    $tocToggleButton.append(tocToggleButtonIconNode);

    setCookie("showTOC", "false");
  }
}

function setCookie(cname, cvalue, exdays) {
  const d = new Date();
  d.setTime(d.getTime() + (exdays || 365) * 24 * 60 * 60 * 1000);
  const expires = "expires=" + d.toUTCString();
  document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}

function getCookie(cname) {
  var name = cname + "=";
  var ca = document.cookie.split(";");
  for (var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == " ") {
      c = c.substring(1);
    }
    if (c.indexOf(name) == 0) {
      return c.substring(name.length, c.length);
    }
  }
  return "";
}