MediaWiki:Citizen.js: Porovnání verzí
MediaWiki interface page
More actions
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 | |||
// + když je kurzor uprostřed slova, přesuň se na nejbližší mezeru vlevo a tam vlož <br> | |||
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 7: | Řádek 9: | ||
if (!surface || !surface.$element) return; | if (!surface || !surface.$element) return; | ||
if (surface.$element.data(' | // Nebindovat víckrát | ||
surface.$element.data(' | if (surface.$element.data('shiftEnterSmartBound')) return; | ||
surface.$element.data('shiftEnterSmartBound', true); | |||
surface.$element.on('keydown', function (e) { | surface.$element.on('keydown', function (e) { | ||
if (e.key | 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) {} | |||
} | } | ||
}); | }); | ||
}); | }); | ||
Verze z 9. 10. 2025, 17:09
/* 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) {}
}
});
});