User:Loki Laufeyjarson/common.js

From Heroes 3 wiki
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
mw.loader.using('mediawiki.util').then(function () {
  var cache = Object.create(null);

  function toAudioUrl(href) {
    if (!href) return null;
    var abs = new URL(href, location.href).toString();

    if (/\.(mp3|wav|ogg|m4a|webm)(\?|#|$)/i.test(abs)) return abs;

    var m = abs.match(/\/(File|Media):([^?#]+)/i);
    if (m) {
      var title = decodeURIComponent(m[2]);
      return mw.util.getUrl('Special:FilePath/' + title);
    }

    if (/\/Special:FilePath\//i.test(abs)) return abs;

    return null;
  }

  $(document).on('click', '.click-audio', function (e) {
    if (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey) return;

    var $a = $(this).find('a').first();
    if ($a.length === 0) return;

    var url = toAudioUrl($a.attr('href'));
    if (!url) return;

    e.preventDefault();
    e.stopImmediatePropagation();

    var a = cache[url] || (cache[url] = new Audio(url));
    try {
      a.currentTime = 0;
      a.play && a.play();
    } catch (_) {}
  });

  mw.hook('wikipage.content').add(function ($c) {
    $c.find('.click-audio')
      .css('cursor', 'pointer')
      .attr({ role: 'button', tabindex: 0 })
      .on('keydown', function (e) {
        if (e.which === 13 || e.which === 32) {
          e.preventDefault();
          $(this).trigger('click');
        }
      });
  });
});