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 | // 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 () { | 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; | ||
if (surface.$element.data('smartShiftEnterBound')) return; | |||
if (surface.$element.data(' | surface.$element.data('smartShiftEnterBound', true); | ||
surface.$element.data(' | |||
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; | |||
var range = ranges[0]; | |||
var range = | 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) { | |||
// | |||
if (! | |||
model.getFragment(sel).insertContent([{ type: 'break' }]); | model.getFragment(sel).insertContent([{ type: 'break' }]); | ||
return; | return; | ||
} | } | ||
var data = doc.data; | var data = doc.data; | ||
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) { | ||
// | // 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); | ||
// | |||
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) { | 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))); | ||
} | } | ||
model.getFragment().insertContent([{ type: 'break' }]); | model.getFragment().insertContent([{ type: 'break' }]); | ||
} catch (err) { | } catch (err) { | ||
// | // 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) {}
}
});
});