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: Porovnání verzí

MediaWiki interface page
Bez shrnutí editace
značka: revertováno
Bez shrnutí editace
značka: revertováno
Řádek 1: Řádek 1:
/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky */
/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky */
// Shift+Enter = <br> ve VisualEditoru
// Smart Shift+Enter pro VisualEditor:
// + když je kurzor uprostřed slova, přesuň se na nejbližší mezeru vlevo a tam vlož <br>
// - vloží <br> místo nového odstavce
// - pokud je kurzor uprostřed slova, posune se k nejbližší mezeře vlevo
mw.hook('ve.activationComplete').add(function () {
mw.hook('ve.activationComplete').add(function () {
   var target = ve.init && ve.init.target;
   var target = ve.init && ve.init.target;
Řádek 9: Řádek 10:
   if (!surface || !surface.$element) return;
   if (!surface || !surface.$element) return;


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


   surface.$element.on('keydown', function (e) {
   surface.$element.on('keydown', function (e) {
Řádek 21: Řádek 21:
       var doc  = model.getDocument();
       var doc  = model.getDocument();
       var sel  = model.getSelection();
       var sel  = model.getSelection();
      var ranges = sel.getRanges ? sel.getRanges() : (sel ? [ sel.getRange() ] : []);
      if (!ranges.length) return;


       // vezmeme první range
       var range = ranges[0];
       var range = sel.getRanges ? sel.getRanges()[0] : sel.getRange();
       var pos = (range.start !== undefined) ? range.start : range.from;
       if (!range) return;
       var end = (range.end !== undefined) ? range.end : range.to;


      var start = (range.start !== undefined) ? range.start : range.from;
       // Pokud je něco označeno, rovnou nahraď výběr za <br>
      var end  = (range.end  !== undefined) ? range.end  : range.to;
       if (pos !== end) {
      var collapsed = (start === end);
 
       // když je něco označeno, prostě nahraď výběr <br>
       if (!collapsed) {
         model.getFragment(sel).insertContent([{ type: 'break' }]);
         model.getFragment(sel).insertContent([{ type: 'break' }]);
         return;
         return;
       }
       }


      // jsme v jednom místě – zjistíme znak vlevo a případně se posuneme na předchozí mezeru
       var data = doc.data;
       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 leftItem  = data.getData(pos - 1);
       var rightItem = data.getData(pos);
       var rightItem = data.getData(pos);
       var isChar = function (it) { return typeof it === 'string' && it.length === 1; };
 
       var isChar = function (it) { return typeof it === 'string' && it.length === 1; };
       var isSpace = function (ch) { return typeof ch === 'string' && /\s/.test(ch); };
       var isSpace = function (ch) { return typeof ch === 'string' && /\s/.test(ch); };


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


       if (inWord) {
       if (inWord) {
         // hledej nejbližší mezeru vlevo
         // Jdi doleva, ignoruj netextové uzly (slugy, obrázky, apod.)
         for (var i = pos - 1; i >= 0; i--) {
         for (var i = pos - 1; i >= 0; i--) {
           var it = data.getData(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)) {
          if (typeof it === 'string') {
            newPos = i + (isSpace(it) ? 1 : 0);
            if (/\s/.test(it)) {        // našli jsme mezeru
            break;
              newPos = i + 1;
              break;
            } else {
              continue;                // písmeno/cifra – pokračuj dál doleva
            }
           } else {
            // netextové položky ignoruj (slug, obrázky…)
            // POZN: kdybychom narazili na začátek bloku, vyskočíme
            if (it.type === 'paragraph' || it.type === 'pre' || it.type === 'heading') {
              newPos = i + 1;
              break;
            }
           }
           }
          // bezpečnostní stop na úplném začátku dokumentu
          if (i === 0) newPos = 0;
         }
         }
       }
       }


       // posuň kurzor (jen pokud jsme našli něco vlevo)
       // Přesuň caret a vlož <br>
       if (newPos !== pos) {
       if (newPos !== pos) {
         model.setSelection(new ve.dm.LinearSelection(doc, new ve.Range(newPos)));
         model.setSelection(new ve.dm.LinearSelection(doc, new ve.Range(newPos)));
       }
       }
      // vlož samotný <br>
       model.getFragment().insertContent([{ type: 'break' }]);
       model.getFragment().insertContent([{ type: 'break' }]);


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

Verze z 9. 10. 2025, 17:14

/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky */
// Smart Shift+Enter pro VisualEditor:
// - vloží <br> místo nového odstavce
// - pokud je kurzor uprostřed slova, posune se k nejbližší mezeře vlevo
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;

  if (surface.$element.data('smartShiftEnterBound')) return;
  surface.$element.data('smartShiftEnterBound', 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();
      var ranges = sel.getRanges ? sel.getRanges() : (sel ? [ sel.getRange() ] : []);
      if (!ranges.length) return;

      var range = ranges[0];
      var pos = (range.start !== undefined) ? range.start : range.from;
      var end = (range.end !== undefined) ? range.end : range.to;

      // Pokud je něco označeno, rovnou nahraď výběr za <br>
      if (pos !== end) {
        model.getFragment(sel).insertContent([{ type: 'break' }]);
        return;
      }

      var data = doc.data;
      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);

      var newPos = pos;

      if (inWord) {
        // Jdi doleva, ignoruj netextové uzly (slugy, obrázky, apod.)
        for (var i = pos - 1; i >= 0; i--) {
          var it = data.getData(i);

          if (typeof it === 'string') {
            if (/\s/.test(it)) {        // našli jsme mezeru
              newPos = i + 1;
              break;
            } else {
              continue;                 // písmeno/cifra – pokračuj dál doleva
            }
          } else {
            // netextové položky ignoruj (slug, obrázky…)
            // POZN: kdybychom narazili na začátek bloku, vyskočíme
            if (it.type === 'paragraph' || it.type === 'pre' || it.type === 'heading') {
              newPos = i + 1;
              break;
            }
          }

          // bezpečnostní stop na úplném začátku dokumentu
          if (i === 0) newPos = 0;
        }
      }

      // Přesuň caret a vlož <br>
      if (newPos !== pos) {
        model.setSelection(new ve.dm.LinearSelection(doc, new ve.Range(newPos)));
      }
      model.getFragment().insertContent([{ type: 'break' }]);

    } catch (err) {
      // Fallback: když se cokoli pokazí, aspoň vlož <br> zde
      try {
        surface.getModel().getFragment().insertContent([{ type: 'break' }]);
      } catch (e2) {}
    }
  });
});