Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

MediaWiki:Common.js: Difference between revisions

MediaWiki interface page
No edit summary
No edit summary
Line 102: Line 102:


   const rows = Array.from(table.querySelectorAll("tr"));
   const rows = Array.from(table.querySelectorAll("tr"));
  // Must have header + at least 1 row
   if (rows.length <= 1) return;
   if (rows.length <= 1) return;


Line 117: Line 115:
   }
   }


   // Sort rows by Time column (column index 3)
   // Time column is now index 4
   dataRows.sort((a, b) => {
   dataRows.sort((a, b) => {
     const timeA = parseTime(a.cells[3].innerText);
     const timeA = parseTime(a.cells[4].innerText);
     const timeB = parseTime(b.cells[3].innerText);
     const timeB = parseTime(b.cells[4].innerText);
     return timeA - timeB;
     return timeA - timeB;
   });
   });


  // Re-append sorted rows
   dataRows.forEach(row => table.appendChild(row));
   dataRows.forEach(row => table.appendChild(row));


  // Apply ranking
   dataRows.forEach((row, index) => {
   dataRows.forEach((row, index) => {
     const rankCell = row.cells[0];
     const rankCell = row.cells[0];

Revision as of 02:51, 1 March 2026

/* Any JavaScript here will be loaded for all users on every page load. */// Load DataTables library

mw.hook('wikipage.content').add(function ($content) {
  $content.find('.spoiler').on('click', function () {
    $(this).toggleClass('revealed');
  });
});

// Auto-embed X/Twitter status links into live tweets (no extension required)
(function () {
  'use strict';

  // Options you can tweak
  var TW_OPTIONS = {
    // theme: 'dark',            // uncomment for dark
    // conversation: 'none',     // hide reply thread
    // dnt: true,                // "Do Not Track"
    // align: 'center'           // center the embed
  };

  function loadXWidgets (cb) {
    // If the widget API is ready, go
    if (window.twttr && twttr.widgets) { cb(); return; }

    // Already loading?
    if (document.querySelector('script[src*="platform.twitter.com/widgets.js"]')) {
      // Poll until ready
      var tries = 0, t = setInterval(function () {
        if (window.twttr && twttr.widgets) { clearInterval(t); cb(); }
        else if (++tries > 40) { clearInterval(t); }
      }, 250);
      return;
    }

    // Inject the widgets.js script
    var s = document.createElement('script');
    s.async = true;
    s.src = 'https://platform.twitter.com/widgets.js';
    s.onload = function () { cb(); };
    document.head.appendChild(s);
  }

  // Find eligible links and embed them
  function embedLinks(root) {
    var scope = root || document;
    var selector = [
      'a[href^="https://x.com/"][href*="/status/"]',
      'a[href^="http://x.com/"][href*="/status/"]',
      'a[href^="https://twitter.com/"][href*="/status/"]',
      'a[href^="http://twitter.com/"][href*="/status/"]'
    ].join(',');

    var anchors = scope.querySelectorAll(selector);
    if (!anchors.length) return;

    loadXWidgets(function () {
      anchors.forEach(function (a) {
        if (a.dataset.tweetEmbedded === '1') return; // avoid duplicates
        a.dataset.tweetEmbedded = '1';

        // Extract the numeric tweet ID
        var match = a.href.match(/\/status\/(\d+)/);
        if (!match) return;
        var id = match[1];

        // Create a container after the link
        var container = document.createElement('div');
        container.className = 'tweet-embed';
        a.insertAdjacentElement('afterend', container);

        // Ask widgets API to render
        if (window.twttr && twttr.widgets && twttr.widgets.createTweet) {
          twttr.widgets.createTweet(id, container, TW_OPTIONS).catch(function(){});
        }
      });

      // Ensure any dynamically added blockquotes also render
      if (window.twttr && twttr.widgets && twttr.widgets.load) {
        twttr.widgets.load(scope);
      }
    });
  }

  // Run on page load and whenever VE/LQT/etc. inject content
  if (window.mw && mw.hook) {
    mw.hook('wikipage.content').add(function ($content) {
      embedLinks($content && $content[0]);
    });
  } else {
    document.addEventListener('DOMContentLoaded', function () { embedLinks(document); });
  }
})();

/* ===========================
   Dungeon Leaderboard Script
   =========================== */

mw.hook('wikipage.content').add(function () {

  const table = document.getElementById("leaderboardTable");
  if (!table) return;

  const rows = Array.from(table.querySelectorAll("tr"));
  if (rows.length <= 1) return;

  const header = rows[0];
  const dataRows = rows.slice(1);

  function parseTime(timeString) {
    if (!timeString || !timeString.includes(":")) return 999999;
    const parts = timeString.trim().split(":");
    const minutes = parseInt(parts[0], 10);
    const seconds = parseInt(parts[1], 10);
    return (minutes * 60) + seconds;
  }

  // Time column is now index 4
  dataRows.sort((a, b) => {
    const timeA = parseTime(a.cells[4].innerText);
    const timeB = parseTime(b.cells[4].innerText);
    return timeA - timeB;
  });

  dataRows.forEach(row => table.appendChild(row));

  dataRows.forEach((row, index) => {
    const rankCell = row.cells[0];

    if (index === 0) rankCell.innerHTML = "🥇 1";
    else if (index === 1) rankCell.innerHTML = "🥈 2";
    else if (index === 2) rankCell.innerHTML = "🥉 3";
    else rankCell.innerText = index + 1;
  });

});