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
Tag: Manual revert
No edit summary
Line 6: Line 6:
   });
   });
});
});
// 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); });
  }
})();

Revision as of 00:20, 7 September 2025

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