MediaWiki:Common.js

From Franklinova expedice

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.
/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */

/**
 * AlertDismiss (global) — keep Bootstrap 5 alerts dismissed across pages.
 * Works for anonymous users (localStorage). No Gadgets needed.
 *
 * Usage in your wikitext/SiteNotice:
 *  <div id="site-alert"
 *       class="alert alert-warning alert-dismissible fade show"
 *       role="alert"
 *       data-alert-ttl="86400"        <!-- seconds; default 86400 (1 day) -->
 *       data-alert-version="1">       <!-- bump to force re-show -->
 *    <strong>Heads up:</strong> Maintenance tonight.
 *    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
 *  </div>
 *
 * Optional: ?resetalerts=1 in the URL clears stored state for alerts on that page.
 */
(function (mw, $) {
  'use strict';

  var DEFAULT_TTL_MS = 86400 * 1000; // 1 day
  var STORAGE_PREFIX = 'AlertDismiss/';

  function now() { return Date.now(); }
  function keyFor(id, version) { return STORAGE_PREFIX + id + '/v' + (version || 1); }

  function parseIntAttr($el, name, fallback) {
    var v = $el.attr(name);
    if (!v) return fallback;
    var n = parseInt(v, 10);
    return Number.isFinite(n) ? n : fallback;
  }

  function getStableId($el) {
    return $el.attr('data-alert-id') || $el.attr('id') || null;
  }

  function readStore(k) {
    try { var r = localStorage.getItem(k); return r ? JSON.parse(r) : null; } catch (e) { return null; }
  }
  function writeStore(k, obj) { try { localStorage.setItem(k, JSON.stringify(obj)); } catch (e) {} }
  function removeStore(k) { try { localStorage.removeItem(k); } catch (e) {} }

  function isDismissed(k, ttlMs) {
    var d = readStore(k);
    return d && d.time && (now() - d.time) < ttlMs;
  }

  function bindDismiss($alert, k) {
    // If Bootstrap JS is present, use its event; otherwise fall back to button click.
    if (window.bootstrap || $.fn.alert) {
      $alert.on('closed.bs.alert', function () {
        writeStore(k, { time: now() });
      });
    } else {
      $alert.find('.btn-close').on('click', function () {
        writeStore(k, { time: now() });
        setTimeout(function () { $alert.remove(); }, 0);
      });
    }
  }

  function process($root) {
    var resetParam = mw.util && mw.util.getParamValue ? mw.util.getParamValue('resetalerts') : null;

    $root.find('.alert.alert-dismissible').each(function () {
      var $a = $(this);
      var id = getStableId($a);
      if (!id) return; // require a stable id

      var version = parseIntAttr($a, 'data-alert-version', 1);
      var ttlSec  = parseIntAttr($a, 'data-alert-ttl', DEFAULT_TTL_MS / 1000);
      var ttlMs   = ttlSec * 1000;
      var k       = keyFor(id, version);

      if (resetParam === '1') removeStore(k);

      if (isDismissed(k, ttlMs)) {
        $a.remove(); // hide before user sees it
        return;
      }
      bindDismiss($a, k);
    });
  }

  // Run on initial render and on any content refresh (previews/VE/etc.)
  mw.hook('wikipage.content').add(function ($content) { process($content); });
  $(function () { process($(document)); });
})(mediaWiki, jQuery);


/**
 * Extra buttons in toolbar
 * @stats [[File:Krinkle_InsertWikiEditorButton.js]]
 */
$.ajax({ dataType: 'script', cache: true,
	url: 'https://meta.wikimedia.org/w/index.php?title=User:Krinkle/Scripts/InsertWikiEditorButton.js&action=raw&ctype=text/javascript'
}).then(function () {

	// Ship
	krInsertWikiEditorButton({
		id: "mw-customeditbutton-ship",
		icon: "/wiki/resources/assets/custom-icons/button-ship.png",
		label: 'Ship',
		insertBefore: '<span class="name-ship">',
		insertAfter: '</span>',
		sampleText: 'Loď'
	});
        // Person
	krInsertWikiEditorButton({
		id: "mw-customeditbutton-person",
		icon: "/wiki/resources/assets/custom-icons/button-person.png",
		label: 'Person',
		insertBefore: '<span class="name-person">',
		insertAfter: '</span>',
		sampleText: 'Osoba'
	});
        // Place
	krInsertWikiEditorButton({
		id: "mw-customeditbutton-place",
		icon: "/wiki/resources/assets/custom-icons/button-place.png",
		label: 'Place',
		insertBefore: '<span class="name-place">',
		insertAfter: '</span>',
		sampleText: 'Místo'
	});
        // Date
	krInsertWikiEditorButton({
		id: "mw-customeditbutton-date",
		icon: "/wiki/resources/assets/custom-icons/button-date.png",
		label: 'Date',
		insertBefore: '<span class="text-date">',
		insertAfter: '</span>',
		sampleText: 'Datum'
	});
        // English (blok)
	krInsertWikiEditorButton({
		id: "mw-customeditbutton-enblock",
		icon: "/wiki/resources/assets/custom-icons/button-en.png",
		label: 'English block',
		insertBefore: '<div lang="en">',
		insertAfter: '</div>',
		sampleText: 'English text'
	});
        // Citace (blok)
	krInsertWikiEditorButton({
		id: "mw-customeditbutton-blockquote",
		icon: "/wiki/resources/assets/custom-icons/button-blockquote.png",
		label: 'Bloková citace',
		insertBefore: '<blockquote>',
		insertAfter: '</blockquote>',
		sampleText: 'Citovaný odstavec'
	});
        // Citace (inline text)
	krInsertWikiEditorButton({
		id: "mw-customeditbutton-inlinequote",
		icon: "/wiki/resources/assets/custom-icons/button-quote.png",
		label: 'Řádková citace',
		insertBefore: '<q>',
		insertAfter: '</q>',
		sampleText: 'Citovaný text'
	});
});

/* Viz https://www.mediawiki.org/wiki/Manual:Custom_edit_buttons#Classic_edit_toolbar */
mw.hook( 'wikipage.editform' ).add( function () {
    mw.loader.using( 'mediawiki.toolbar' ).then( function () {
        mw.toolbar.addButton( {
            imageFile: '/wiki/resources/assets/custom-icons/button-ship.png',
            speedTip: 'Loď',
            tagOpen: '<span class="name-ship">',
            tagClose: '</span>',
            sampleText: 'Jméno lodi',
            imageId: 'button-ship'
        } );
        mw.toolbar.addButton( {
            imageFile: '/wiki/resources/assets/custom-icons/button-person.png',
            speedTip: 'Osoba',
            tagOpen: '<span class="name-person">',
            tagClose: '</span>',
            sampleText: 'Jméno osoby',
            imageId: 'button-person'
        } );
        mw.toolbar.addButton( {
            imageFile: '/wiki/resources/assets/custom-icons/button-place.png',
            speedTip: 'Místo',
            tagOpen: '<span class="name-place">',
            tagClose: '</span>',
            sampleText: 'Jméno místa',
            imageId: 'button-place'
        } );
        mw.toolbar.addButton( {
            imageFile: '/wiki/resources/assets/custom-icons/button-date.png',
            speedTip: 'Datum',
            tagOpen: '<span class="text-date">',
            tagClose: '</span>',
            sampleText: 'Datum',
            imageId: 'button-date'
        } );
        mw.toolbar.addButton( {
            imageFile: '/wiki/resources/assets/custom-icons/button-en.png',
            speedTip: 'English',
            tagOpen: '<div lang="en">',
            tagClose: '</div>',
            sampleText: 'English text',
            imageId: 'button-english'
        } );
        mw.toolbar.addButton( {
            imageFile: '/wiki/resources/assets/custom-icons/button-blockquote.png',
            speedTip: 'Bloková citace',
            tagOpen: '<blockquote>',
            tagClose: '</blockquote>',
            sampleText: 'Citovaný odstavec',
            imageId: 'button-blockquote'
        } );
        mw.toolbar.addButton( {
            imageFile: '/wiki/resources/assets/custom-icons/button-quote.png',
            speedTip: 'Řádková citace',
            tagOpen: '<q>',
            tagClose: '</q>',
            sampleText: 'Citovaný text',
            imageId: 'button-quote'
        } );
    } );
} );