Toggle menu
Toggle preferences menu
Toggle personal menu
Nejste přihlášen(a)
Your IP address will be publicly visible if you make any edits.

MediaWiki:Citizen.js

MediaWiki interface page

Poznámka: Po zveřejnění musíte vyprázdnit cache vašeho prohlížeče, jinak změny neuvidíte.

  • Firefox / Safari: Při kliknutí na Aktualizovat držte Shift nebo stiskněte Ctrl-F5 nebo Ctrl-R (na Macu ⌘-R)
  • Google Chrome: Stiskněte Ctrl-Shift-R (na Macu ⌘-Shift-R)
  • Edge: Při kliknutí na Aktualizovat držte Ctrl nebo stiskněte Ctrl-F5.
/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky */
// Shift+Enter = <br> ve VisualEditoru
// + když je kurzor uprostřed slova, přesuň se na nejbližší mezeru vlevo a tam vlož <br>
mw.hook('ve.activationComplete').add(function () {
  var target = ve.init && ve.init.target;
  if (!target) return;

  var surface = target.getSurface && target.getSurface();
  if (!surface || !surface.$element) return;

  // Nebindovat víckrát
  if (surface.$element.data('shiftEnterSmartBound')) return;
  surface.$element.data('shiftEnterSmartBound', true);

  surface.$element.on('keydown', function (e) {
    if (e.key !== 'Enter' || !e.shiftKey) return;
    e.preventDefault();

    try {
      var model = surface.getModel();
      var doc   = model.getDocument();
      var sel   = model.getSelection();

      // vezmeme první range
      var range = sel.getRanges ? sel.getRanges()[0] : sel.getRange();
      if (!range) return;

      var start = (range.start !== undefined) ? range.start : range.from;
      var end   = (range.end   !== undefined) ? range.end   : range.to;
      var collapsed = (start === end);

      // když je něco označeno, prostě nahraď výběr <br>
      if (!collapsed) {
        model.getFragment(sel).insertContent([{ type: 'break' }]);
        return;
      }

      // jsme v jednom místě – zjistíme znak vlevo a případně se posuneme na předchozí mezeru
      var data = doc.data;
      var pos  = start;
      var newPos = pos; // default = bez posunu

      // když je bezprostředně vlevo písmeno/číslo a vpravo taky, jsme „uprostřed slova“
      var leftItem  = data.getData(pos - 1);
      var rightItem = data.getData(pos);
      var isChar = function (it) { return typeof it === 'string' && it.length === 1; };
      var isSpace = function (ch) { return typeof ch === 'string' && /\s/.test(ch); };

      var inWord = isChar(leftItem) && !isSpace(leftItem) && isChar(rightItem) && !isSpace(rightItem);

      if (inWord) {
        // hledej nejbližší mezeru vlevo
        for (var i = pos - 1; i >= 0; i--) {
          var it = data.getData(i);
          // zastavíme se na první mezeře nebo na hranici bloku
          if (isSpace(it) || (typeof it === 'object' && it.type)) {
            newPos = i + (isSpace(it) ? 1 : 0);
            break;
          }
        }
      }

      // posuň kurzor (jen pokud jsme našli něco vlevo)
      if (newPos !== pos) {
        model.setSelection(new ve.dm.LinearSelection(doc, new ve.Range(newPos)));
      }

      // vlož samotný <br>
      model.getFragment().insertContent([{ type: 'break' }]);

    } catch (err) {
      // nouzově aspoň vlož <br> v aktuální pozici
      try {
        surface.getModel().getFragment().insertContent([{ type: 'break' }]);
      } catch (e2) {}
    }
  });
});