MediaWiki:Common.js: Porovnání verzí
MediaWiki interface page
More actions
Bez shrnutí editace |
Bez shrnutí editace |
||
| Řádek 6: | Řádek 6: | ||
}); | }); | ||
// Mini-toolbar | /// Mini-toolbar nad PRVNÍM <textarea> parametru `text` v dialogu šablony (VE) | ||
(function () { | (function () { | ||
// | // --- helpers --- | ||
function toggleWrap(input, before, after) { | function toggleWrap(input, before, after) { | ||
const s = input.selectionStart, e = input.selectionEnd, v = input.value; | const s = input.selectionStart, e = input.selectionEnd, v = input.value; | ||
| Řádek 15: | Řádek 15: | ||
if (hasBefore && hasAfter) { | if (hasBefore && hasAfter) { | ||
input.value = v.slice(0, s - before.length) + v.slice(s, e) + v.slice(e + after.length); | input.value = v.slice(0, s - before.length) + v.slice(s, e) + v.slice(e + after.length); | ||
input.setSelectionRange(s - before.length, e - before.length); | |||
} else { | } else { | ||
input.value = v.slice(0, s) + before + v.slice(s, e) + after + v.slice(e); | input.value = v.slice(0, s) + before + v.slice(s, e) + after + v.slice(e); | ||
input.setSelectionRange(e + before.length + after.length, e + before.length + after.length); | |||
} | } | ||
input.focus(); | |||
} | } | ||
function toggleLinesPrefix(input, prefix) { | function toggleLinesPrefix(input, prefix) { | ||
const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e); | const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e); | ||
const lines = sel.split('\n'); | const lines = sel.split('\n'); | ||
const allHave = lines.filter(l => l.trim() | const allHave = lines.filter(l => l.trim()).every(l => l.startsWith(prefix)); | ||
const out = lines.map(l => !l.trim() ? l : (allHave ? l.replace(new RegExp('^' + prefix.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')), '') : prefix + l)).join('\n'); | const out = lines.map(l => !l.trim() ? l : | ||
(allHave ? l.replace(new RegExp('^' + prefix.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')), '') : prefix + l) | |||
).join('\n'); | |||
input.value = v.slice(0, s) + out + v.slice(e); | input.value = v.slice(0, s) + out + v.slice(e); | ||
input.focus(); input.setSelectionRange(s + out.length, s + out.length); | |||
input.focus(); input.setSelectionRange( | |||
} | } | ||
function headingOnLines(input, level) { | function headingOnLines(input, level) { | ||
| Řádek 35: | Řádek 36: | ||
const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e); | const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e); | ||
const lines = sel.split('\n'); | const lines = sel.split('\n'); | ||
const isAllSame = lines.filter(l => l.trim() | const isAllSame = lines.filter(l => l.trim()).every(l => { | ||
const m = l.match(/^\s*(=+)\s*(.*?)\s*(=+)\s*$/); return m && m[1].length === level && m[3].length === level; | const m = l.match(/^\s*(=+)\s*(.*?)\s*(=+)\s*$/); return m && m[1].length === level && m[3].length === level; | ||
}); | }); | ||
const strip = l => { | const strip = l => { const m = l.match(/^\s*(=+)\s*(.*?)\s*(=+)\s*$/); return m ? m[2] : l.trim(); }; | ||
const out = lines.map(l => !l.trim() ? l : (isAllSame ? strip(l) : open + strip(l) + close)).join('\n'); | const out = lines.map(l => !l.trim() ? l : (isAllSame ? strip(l) : open + strip(l) + close)).join('\n'); | ||
input.value = v.slice(0, s) + out + v.slice(e); | input.value = v.slice(0, s) + out + v.slice(e); | ||
input.focus(); input.setSelectionRange(s + out.length, s + out.length); | |||
input.focus(); input.setSelectionRange( | |||
} | } | ||
function insertLink(input){ | function insertLink(input){ | ||
const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e) || 'Cíl'; | const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e) || 'Cíl'; | ||
input.value = v.slice(0, s) + '[[' + sel + '|' + sel + ']]' + v.slice(e); | input.value = v.slice(0, s) + '[[' + sel + '|' + sel + ']]' + v.slice(e); | ||
input.focus(); input.setSelectionRange(s + 4 + sel.length + 1 + sel.length + 2, s + 4 + sel.length + 1 + sel.length + 2); | |||
} | } | ||
function makeBar(input){ | function makeBar(input){ | ||
const $bar = $('<div class="private-mini-toolbar" />'); | const $bar = $('<div class="private-mini-toolbar" />'); | ||
| Řádek 68: | Řádek 64: | ||
} | } | ||
function | // vlož lištu PŘÍMO nad první <textarea> | ||
const | function addToolbarForPage(pageEl){ | ||
const $ | const $page = $(pageEl); | ||
if ($ | if ($page.data('privateToolbar')) return; | ||
const $firstTA = $page.find('textarea.oo-ui-inputWidget-input').first(); // první textarea v poli | |||
$ | if (!$firstTA.length) return; | ||
$ | if ($firstTA.prev('.private-mini-toolbar').length) return; // už je | ||
$firstTA.addClass('pmt-textarea'); | |||
$firstTA.before( makeBar($firstTA.get(0)) ); // vlož lištu hned nad něj | |||
$page.data('privateToolbar', true); | |||
} | } | ||
function scan(root){ | function scan(root){ | ||
$(root).find('.ve-ui-mwTemplateDialog .ve-ui-mwParameterPage[data-param-name="text"]') | |||
$(root) | .each((_, el) => addToolbarForPage(el)); | ||
.each((_, el) => | |||
} | } | ||
function init(){ | function init(){ | ||
// | // znovu přidat i po rerenderu | ||
const mo = new MutationObserver(muts => muts.forEach(m => scan(m.target))); | const mo = new MutationObserver(muts => muts.forEach(m => scan(m.target))); | ||
mo.observe(document.body, { childList:true, subtree:true }); | mo.observe(document.body, { childList:true, subtree:true }); | ||
// když textarea chytí focus, zkontroluj znovu | |||
$(document).on('focus', '.ve-ui-mwTemplateDialog textarea.oo-ui-inputWidget-input', function(){ | |||
const page = $(this).closest('.ve-ui-mwParameterPage[data-param-name="text"]')[0]; | |||
if (page) addToolbarForPage(page); | |||
}); | |||
scan(document); | scan(document); | ||
} | } | ||
Verze z 9. 10. 2025, 23:27
mw.hook('wikipage.content').add(function ($c) {
var $ph = $c.find('.private-placeholder');
if ($ph.length > 1) {
$ph.slice(1).remove();
}
});
/// Mini-toolbar nad PRVNÍM <textarea> parametru `text` v dialogu šablony (VE)
(function () {
// --- helpers ---
function toggleWrap(input, before, after) {
const s = input.selectionStart, e = input.selectionEnd, v = input.value;
const hasBefore = v.slice(s - before.length, s) === before;
const hasAfter = v.slice(e, e + after.length) === after;
if (hasBefore && hasAfter) {
input.value = v.slice(0, s - before.length) + v.slice(s, e) + v.slice(e + after.length);
input.setSelectionRange(s - before.length, e - before.length);
} else {
input.value = v.slice(0, s) + before + v.slice(s, e) + after + v.slice(e);
input.setSelectionRange(e + before.length + after.length, e + before.length + after.length);
}
input.focus();
}
function toggleLinesPrefix(input, prefix) {
const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e);
const lines = sel.split('\n');
const allHave = lines.filter(l => l.trim()).every(l => l.startsWith(prefix));
const out = lines.map(l => !l.trim() ? l :
(allHave ? l.replace(new RegExp('^' + prefix.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')), '') : prefix + l)
).join('\n');
input.value = v.slice(0, s) + out + v.slice(e);
input.focus(); input.setSelectionRange(s + out.length, s + out.length);
}
function headingOnLines(input, level) {
const open = '='.repeat(level) + ' ', close = ' ' + '='.repeat(level);
const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e);
const lines = sel.split('\n');
const isAllSame = lines.filter(l => l.trim()).every(l => {
const m = l.match(/^\s*(=+)\s*(.*?)\s*(=+)\s*$/); return m && m[1].length === level && m[3].length === level;
});
const strip = l => { const m = l.match(/^\s*(=+)\s*(.*?)\s*(=+)\s*$/); return m ? m[2] : l.trim(); };
const out = lines.map(l => !l.trim() ? l : (isAllSame ? strip(l) : open + strip(l) + close)).join('\n');
input.value = v.slice(0, s) + out + v.slice(e);
input.focus(); input.setSelectionRange(s + out.length, s + out.length);
}
function insertLink(input){
const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e) || 'Cíl';
input.value = v.slice(0, s) + '[[' + sel + '|' + sel + ']]' + v.slice(e);
input.focus(); input.setSelectionRange(s + 4 + sel.length + 1 + sel.length + 2, s + 4 + sel.length + 1 + sel.length + 2);
}
function makeBar(input){
const $bar = $('<div class="private-mini-toolbar" />');
const add = (label, title, fn) => $('<button type="button" class="pmt-btn" />')
.text(label).attr('title', title).on('click', () => fn(input)).appendTo($bar);
add('B','Tučné (toggle)', el=>toggleWrap(el,"'''","'''"));
add('I','Kurzíva (toggle)', el=>toggleWrap(el,"''","''"));
add('H2','Nadpis H2', el=>headingOnLines(el,2));
add('H3','Nadpis H3', el=>headingOnLines(el,3));
add('H4','Nadpis H4', el=>headingOnLines(el,4));
add('H5','Nadpis H5', el=>headingOnLines(el,5));
add('•','Odrážky (toggle)', el=>toggleLinesPrefix(el,'* '));
add('[]','Odkaz [[…]]', insertLink);
return $bar;
}
// vlož lištu PŘÍMO nad první <textarea>
function addToolbarForPage(pageEl){
const $page = $(pageEl);
if ($page.data('privateToolbar')) return;
const $firstTA = $page.find('textarea.oo-ui-inputWidget-input').first(); // první textarea v poli
if (!$firstTA.length) return;
if ($firstTA.prev('.private-mini-toolbar').length) return; // už je
$firstTA.addClass('pmt-textarea');
$firstTA.before( makeBar($firstTA.get(0)) ); // vlož lištu hned nad něj
$page.data('privateToolbar', true);
}
function scan(root){
$(root).find('.ve-ui-mwTemplateDialog .ve-ui-mwParameterPage[data-param-name="text"]')
.each((_, el) => addToolbarForPage(el));
}
function init(){
// znovu přidat i po rerenderu
const mo = new MutationObserver(muts => muts.forEach(m => scan(m.target)));
mo.observe(document.body, { childList:true, subtree:true });
// když textarea chytí focus, zkontroluj znovu
$(document).on('focus', '.ve-ui-mwTemplateDialog textarea.oo-ui-inputWidget-input', function(){
const page = $(this).closest('.ve-ui-mwParameterPage[data-param-name="text"]')[0];
if (page) addToolbarForPage(page);
});
scan(document);
}
if (mw.loader.getState('ext.visualEditor.desktopArticleTarget.init')) init();
else mw.loader.using('ext.visualEditor.desktopArticleTarget.init').then(init);
})();