MediaWiki:Common.js: Porovnání verzí
MediaWiki interface page
More actions
Bez shrnutí editace |
Bez shrnutí editace |
||
| (Není zobrazeno 17 mezilehlých verzí od stejného uživatele.) | |||
| Řádek 1: | Řádek 1: | ||
/* | mw.hook('wikipage.content').add(function ($c) { | ||
var $ph = $c.find('.private-placeholder'); | |||
if ($ph.length > 1) { | |||
$ph.slice(1).remove(); | |||
} | |||
}); | |||
(function () { | |||
function escRe(s){ return s.replace(/[.*+?^${}()|[\]\\]/g,'\\$&'); } | |||
function toggleWrap(input, before, after) { | |||
const s = input.selectionStart, e = input.selectionEnd, v = input.value; | |||
const hasB = v.slice(Math.max(0, s - before.length), s) === before; | |||
const hasA = v.slice(e, e + after.length) === after; | |||
if (hasB && hasA) { | |||
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); | |||
const pos = e + before.length + after.length; | |||
input.setSelectionRange(pos, pos); | |||
} | |||
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('^' + escRe(prefix)), '') : prefix + l) | |||
).join('\n'); | |||
input.value = v.slice(0, s) + out + v.slice(e); | |||
const pos = s + out.length; | |||
input.focus(); input.setSelectionRange(pos, pos); | |||
} | |||
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); | |||
const pos = s + out.length; | |||
input.focus(); input.setSelectionRange(pos, pos); | |||
} | |||
function insertLink(input){ | |||
const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e) || 'Cíl'; | |||
const w = '[[' + sel + '|' + sel + ']]'; | |||
input.value = v.slice(0, s) + w + v.slice(e); | |||
const pos = s + w.length; | |||
input.focus(); input.setSelectionRange(pos, pos); | |||
} | |||
function makeBar(input){ | |||
const $bar = $('<div class="private-mini-toolbar" />').hide(); | |||
let hold = false; | |||
$bar.on('mousedown', () => { hold = true; }); | |||
$(document).on('mouseup.privateMiniTb', () => { setTimeout(() => { hold = false; }, 0); }); | |||
const btn = (label, title, fn) => $('<button type="button" class="pmt-btn" />') | |||
.text(label).attr('title', title).on('click', () => fn(input)).appendTo($bar); | |||
btn('B','Tučné (toggle)', el=>toggleWrap(el,"'''","'''")); | |||
btn('I','Kurzíva (toggle)', el=>toggleWrap(el,"''","''")); | |||
btn('H2','Nadpis H2', el=>headingOnLines(el,2)); | |||
btn('H3','Nadpis H3', el=>headingOnLines(el,3)); | |||
btn('H4','Nadpis H4', el=>headingOnLines(el,4)); | |||
btn('H5','Nadpis H5', el=>headingOnLines(el,5)); | |||
btn('•','Odrážky (toggle)', el=>toggleLinesPrefix(el,'* ')); | |||
btn('[]','Odkaz [[…]]', insertLink); | |||
const $ta = $(input); | |||
$ta.on('focus.privateMiniTb', () => { | |||
$ta.addClass('pmt-textarea'); | |||
$bar.show(); | |||
}); | |||
$ta.on('blur.privateMiniTb', () => { | |||
setTimeout(() => { | |||
if (!hold && !$(document.activeElement).closest($bar).length) { | |||
$bar.hide(); | |||
$ta.removeClass('pmt-textarea'); | |||
} | |||
}, 0); | |||
}); | |||
return $bar; | |||
} | |||
function addToolbarForParamPage(pageEl){ | |||
const $page = $(pageEl); | |||
if ($page.data('privateToolbar')) return; | |||
const $ta = $page.find('textarea.oo-ui-inputWidget-input:not(.oo-ui-element-hidden):visible').first(); | |||
if (!$ta.length) return; | |||
if ($ta.prev('.private-mini-toolbar').length) return; | |||
const bar = makeBar($ta.get(0)); | |||
$ta.before(bar); | |||
$page.data('privateToolbar', true); | |||
} | |||
function scan(root){ | |||
$(root).find('.ve-ui-mwTemplateDialog .ve-ui-mwParameterPage') | |||
.filter(function(){ | |||
const n = this.getAttribute('data-param-name') || this.getAttribute('data-name') || ''; | |||
return n === 'text' || n === '1'; | |||
}) | |||
.each((_, el) => addToolbarForParamPage(el)); | |||
} | |||
function init(){ | |||
const mo = new MutationObserver(muts => muts.forEach(m => scan(m.target))); | |||
mo.observe(document.body, { childList:true, subtree:true }); | |||
$(document).on('focus', '.ve-ui-mwTemplateDialog textarea.oo-ui-inputWidget-input', function(){ | |||
const page = $(this).closest('.ve-ui-mwParameterPage')[0]; | |||
if (page) addToolbarForParamPage(page); | |||
}); | |||
scan(document); | |||
} | |||
mw.util.addCSS(` | |||
.private-mini-toolbar { display:inline-flex; gap:.25rem; flex-wrap:wrap; margin: .25rem 0; } | |||
.private-mini-toolbar .pmt-btn { | |||
border:1px solid #ccc; border-radius:4px; padding:.2rem .4rem; font:inherit; cursor:pointer; | |||
} | |||
.private-mini-toolbar .pmt-btn:hover { background:#f3f3f3; } | |||
`); | |||
if (mw.loader.getState('ext.visualEditor.desktopArticleTarget.init')) init(); | |||
else mw.loader.using('ext.visualEditor.desktopArticleTarget.init').then(init); | |||
})(); | |||
mw.hook('wikipage.content').add(function ($content) { | |||
$content.find('section.citizen-section').each(function () { | |||
const $sec = $(this); | |||
for (;;) { | |||
let $p = $sec.children('p:last-child'); | |||
if (!$p.length) break; | |||
if ($p.hasClass('mw-empty-elt')) { $p.remove(); continue; } | |||
const html = ($p.html() || '').trim(); | |||
if (!html) { $p.remove(); continue; } | |||
if (/^<br\s*\/?>$/i.test(html) || html === ' ' || html === ' ') { | |||
$p.remove(); continue; | |||
} | |||
break; | |||
} | |||
}); | |||
}); | |||
Aktuální verze z 10. 10. 2025, 14:26
mw.hook('wikipage.content').add(function ($c) {
var $ph = $c.find('.private-placeholder');
if ($ph.length > 1) {
$ph.slice(1).remove();
}
});
(function () {
function escRe(s){ return s.replace(/[.*+?^${}()|[\]\\]/g,'\\$&'); }
function toggleWrap(input, before, after) {
const s = input.selectionStart, e = input.selectionEnd, v = input.value;
const hasB = v.slice(Math.max(0, s - before.length), s) === before;
const hasA = v.slice(e, e + after.length) === after;
if (hasB && hasA) {
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);
const pos = e + before.length + after.length;
input.setSelectionRange(pos, pos);
}
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('^' + escRe(prefix)), '') : prefix + l)
).join('\n');
input.value = v.slice(0, s) + out + v.slice(e);
const pos = s + out.length;
input.focus(); input.setSelectionRange(pos, pos);
}
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);
const pos = s + out.length;
input.focus(); input.setSelectionRange(pos, pos);
}
function insertLink(input){
const s = input.selectionStart, e = input.selectionEnd, v = input.value, sel = v.slice(s, e) || 'Cíl';
const w = '[[' + sel + '|' + sel + ']]';
input.value = v.slice(0, s) + w + v.slice(e);
const pos = s + w.length;
input.focus(); input.setSelectionRange(pos, pos);
}
function makeBar(input){
const $bar = $('<div class="private-mini-toolbar" />').hide();
let hold = false;
$bar.on('mousedown', () => { hold = true; });
$(document).on('mouseup.privateMiniTb', () => { setTimeout(() => { hold = false; }, 0); });
const btn = (label, title, fn) => $('<button type="button" class="pmt-btn" />')
.text(label).attr('title', title).on('click', () => fn(input)).appendTo($bar);
btn('B','Tučné (toggle)', el=>toggleWrap(el,"'''","'''"));
btn('I','Kurzíva (toggle)', el=>toggleWrap(el,"''","''"));
btn('H2','Nadpis H2', el=>headingOnLines(el,2));
btn('H3','Nadpis H3', el=>headingOnLines(el,3));
btn('H4','Nadpis H4', el=>headingOnLines(el,4));
btn('H5','Nadpis H5', el=>headingOnLines(el,5));
btn('•','Odrážky (toggle)', el=>toggleLinesPrefix(el,'* '));
btn('[]','Odkaz [[…]]', insertLink);
const $ta = $(input);
$ta.on('focus.privateMiniTb', () => {
$ta.addClass('pmt-textarea');
$bar.show();
});
$ta.on('blur.privateMiniTb', () => {
setTimeout(() => {
if (!hold && !$(document.activeElement).closest($bar).length) {
$bar.hide();
$ta.removeClass('pmt-textarea');
}
}, 0);
});
return $bar;
}
function addToolbarForParamPage(pageEl){
const $page = $(pageEl);
if ($page.data('privateToolbar')) return;
const $ta = $page.find('textarea.oo-ui-inputWidget-input:not(.oo-ui-element-hidden):visible').first();
if (!$ta.length) return;
if ($ta.prev('.private-mini-toolbar').length) return;
const bar = makeBar($ta.get(0));
$ta.before(bar);
$page.data('privateToolbar', true);
}
function scan(root){
$(root).find('.ve-ui-mwTemplateDialog .ve-ui-mwParameterPage')
.filter(function(){
const n = this.getAttribute('data-param-name') || this.getAttribute('data-name') || '';
return n === 'text' || n === '1';
})
.each((_, el) => addToolbarForParamPage(el));
}
function init(){
const mo = new MutationObserver(muts => muts.forEach(m => scan(m.target)));
mo.observe(document.body, { childList:true, subtree:true });
$(document).on('focus', '.ve-ui-mwTemplateDialog textarea.oo-ui-inputWidget-input', function(){
const page = $(this).closest('.ve-ui-mwParameterPage')[0];
if (page) addToolbarForParamPage(page);
});
scan(document);
}
mw.util.addCSS(`
.private-mini-toolbar { display:inline-flex; gap:.25rem; flex-wrap:wrap; margin: .25rem 0; }
.private-mini-toolbar .pmt-btn {
border:1px solid #ccc; border-radius:4px; padding:.2rem .4rem; font:inherit; cursor:pointer;
}
.private-mini-toolbar .pmt-btn:hover { background:#f3f3f3; }
`);
if (mw.loader.getState('ext.visualEditor.desktopArticleTarget.init')) init();
else mw.loader.using('ext.visualEditor.desktopArticleTarget.init').then(init);
})();
mw.hook('wikipage.content').add(function ($content) {
$content.find('section.citizen-section').each(function () {
const $sec = $(this);
for (;;) {
let $p = $sec.children('p:last-child');
if (!$p.length) break;
if ($p.hasClass('mw-empty-elt')) { $p.remove(); continue; }
const html = ($p.html() || '').trim();
if (!html) { $p.remove(); continue; }
if (/^<br\s*\/?>$/i.test(html) || html === ' ' || html === ' ') {
$p.remove(); continue;
}
break;
}
});
});