MediaWiki:Common.js: Porovnání verzí
MediaWiki interface page
More actions
Bez shrnutí editace |
Bez shrnutí editace |
||
| Řádek 6: | Řádek 6: | ||
}); | }); | ||
// Mini toolbar pro formátování parametru `text` v dialogu šablony (VE) | |||
(function () { | (function () { | ||
function wrapSelection(input, before, after) { | function wrapSelection(input, before, after) { | ||
const | const s = input.selectionStart, e = input.selectionEnd; | ||
const val = input.value | const val = input.value, sel = val.slice(s, e); | ||
input.value = val.slice(0, s) + before + sel + after + val.slice(e); | |||
input.value = val.slice(0, | const pos = s + before.length + sel.length + after.length; | ||
const pos = | |||
input.focus(); | input.focus(); | ||
input.setSelectionRange(pos, pos); | input.setSelectionRange(pos, pos); | ||
} | } | ||
function wrapEachLine(input, prefix) { | function wrapEachLine(input, prefix) { | ||
const | const s = input.selectionStart, e = input.selectionEnd; | ||
const val = input.value | const val = input.value, sel = val.slice(s, e); | ||
const wrapped = sel.split('\n').map(l => (l ? prefix + l : l)).join('\n'); | |||
const wrapped = sel.split('\n').map( | input.value = val.slice(0, s) + wrapped + val.slice(e); | ||
input.value = val.slice(0, | const pos = s + wrapped.length; | ||
const pos = | |||
input.focus(); | input.focus(); | ||
input.setSelectionRange(pos, pos); | input.setSelectionRange(pos, pos); | ||
} | } | ||
function addToolbarForPage(pageEl) { | |||
function | const $page = $(pageEl); | ||
if ($ | if ($page.data('privateToolbar')) return; | ||
const $textarea = $ | const $textarea = $page.find('textarea.oo-ui-inputWidget-input').first(); | ||
if (!$textarea.length) return; | if (!$textarea.length) return; | ||
const input = $textarea.get(0); | const input = $textarea.get(0); | ||
const $bar = $('<div class="private-mini-toolbar" />'); | const $bar = $('<div class="private-mini-toolbar" />'); | ||
function btn(label, title, handler) { | |||
$('<button type="button" class="pmt-btn" />') | |||
.text(label).attr('title', title).on('click', () => handler(input)) | |||
.appendTo($bar); | |||
} | } | ||
btn('B', "Tučné ('''...''')", el => wrapSelection(el, "'''", "'''")); | |||
btn('B', | btn('I', "Kurzíva (''...'' )", el => wrapSelection(el, "''", "''")); | ||
btn('I', | btn('H2', 'Nadpis úrovně 2', el => wrapSelection(el, '== ', ' ==')); | ||
btn('H2','Nadpis úrovně 2', el => wrapSelection(el, '== ', ' ==')); | btn('•', 'Seznam (odrážky)', el => wrapEachLine(el, '* ')); | ||
btn('•','Seznam (odrážky)', el => wrapEachLine(el, '* ')); | btn('[]', 'Odkaz [[...]]', el => { | ||
btn('[]','Odkaz [[...]]', | const s = el.selectionStart, e = el.selectionEnd; | ||
const | const val = el.value, sel = val.slice(s, e) || 'Cíl'; | ||
const val = el.value, sel = val.slice( | wrapSelection(el, '[[' + sel + '|', ']]'); | ||
wrapSelection(el, '[[' | |||
}); | }); | ||
$ | // vlož lištu před textarea (nad popisek pole) | ||
$ | $textarea.closest('.oo-ui-widget').before($bar); | ||
$page.data('privateToolbar', true); | |||
} | } | ||
function | function scan(root) { | ||
// Stránka parametru v dialogu šablony s datovým atributem parametru | |||
$(root).find('.ve-ui-mwTemplateDialog .ve-ui-mwParameterPage[data-param-name="text"]') | |||
.each((_, el) => addToolbarForPage(el)); | |||
} | |||
// Když se aktivuje VisualEditor, připoj pozorovatele | |||
function init() { | |||
const mo = new MutationObserver(muts => muts.forEach(m => scan(m.target))); | |||
mo.observe(document.body, { childList: true, subtree: true }); | |||
scan(document); // pro případ, že dialog už je otevřený | |||
} | } | ||
mw. | // Počkej, až je VE načtený (ale funguje i kdyby už byl) | ||
if (mw.loader.getState('ext.visualEditor.desktopArticleTarget.init')) { | |||
init(); | |||
} else { | |||
mw.loader.using('ext.visualEditor.desktopArticleTarget.init').then(init); | |||
} | } | ||
})(); | })(); | ||
Verze z 9. 10. 2025, 22:59
mw.hook('wikipage.content').add(function ($c) {
var $ph = $c.find('.private-placeholder');
if ($ph.length > 1) {
$ph.slice(1).remove();
}
});
// Mini toolbar pro formátování parametru `text` v dialogu šablony (VE)
(function () {
function wrapSelection(input, before, after) {
const s = input.selectionStart, e = input.selectionEnd;
const val = input.value, sel = val.slice(s, e);
input.value = val.slice(0, s) + before + sel + after + val.slice(e);
const pos = s + before.length + sel.length + after.length;
input.focus();
input.setSelectionRange(pos, pos);
}
function wrapEachLine(input, prefix) {
const s = input.selectionStart, e = input.selectionEnd;
const val = input.value, sel = val.slice(s, e);
const wrapped = sel.split('\n').map(l => (l ? prefix + l : l)).join('\n');
input.value = val.slice(0, s) + wrapped + val.slice(e);
const pos = s + wrapped.length;
input.focus();
input.setSelectionRange(pos, pos);
}
function addToolbarForPage(pageEl) {
const $page = $(pageEl);
if ($page.data('privateToolbar')) return;
const $textarea = $page.find('textarea.oo-ui-inputWidget-input').first();
if (!$textarea.length) return;
const input = $textarea.get(0);
const $bar = $('<div class="private-mini-toolbar" />');
function btn(label, title, handler) {
$('<button type="button" class="pmt-btn" />')
.text(label).attr('title', title).on('click', () => handler(input))
.appendTo($bar);
}
btn('B', "Tučné ('''...''')", el => wrapSelection(el, "'''", "'''"));
btn('I', "Kurzíva (''...'' )", el => wrapSelection(el, "''", "''"));
btn('H2', 'Nadpis úrovně 2', el => wrapSelection(el, '== ', ' =='));
btn('•', 'Seznam (odrážky)', el => wrapEachLine(el, '* '));
btn('[]', 'Odkaz [[...]]', el => {
const s = el.selectionStart, e = el.selectionEnd;
const val = el.value, sel = val.slice(s, e) || 'Cíl';
wrapSelection(el, '[[' + sel + '|', ']]');
});
// vlož lištu před textarea (nad popisek pole)
$textarea.closest('.oo-ui-widget').before($bar);
$page.data('privateToolbar', true);
}
function scan(root) {
// Stránka parametru v dialogu šablony s datovým atributem parametru
$(root).find('.ve-ui-mwTemplateDialog .ve-ui-mwParameterPage[data-param-name="text"]')
.each((_, el) => addToolbarForPage(el));
}
// Když se aktivuje VisualEditor, připoj pozorovatele
function init() {
const mo = new MutationObserver(muts => muts.forEach(m => scan(m.target)));
mo.observe(document.body, { childList: true, subtree: true });
scan(document); // pro případ, že dialog už je otevřený
}
// Počkej, až je VE načtený (ale funguje i kdyby už byl)
if (mw.loader.getState('ext.visualEditor.desktopArticleTarget.init')) {
init();
} else {
mw.loader.using('ext.visualEditor.desktopArticleTarget.init').then(init);
}
})();