|
značky: nahrazeno ruční vrácení zpět |
| Řá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 */ |
| // 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) {}
| |
| }
| |
| });
| |
| });
| |