MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
No edit summary Tag: Reverted |
No edit summary Tag: Reverted |
||
| Line 172: | Line 172: | ||
loadRandom(); | loadRandom(); | ||
}); | |||
mw.loader.using(['mediawiki.api','mediawiki.util']).then(function () { | |||
var box = document.getElementById('random-teaser'); | |||
if (!box) return; | |||
var api = new mw.Api(); | |||
var THUMB = 280; | |||
function esc(s){ return mw.html.escape(String(s||'')); } | |||
function excerptFromHTML(html, maxChars){ | |||
var d=document.createElement('div'); d.innerHTML=html; | |||
var p=d.querySelector('p'); var t=(p?p.innerText:d.innerText||'').replace(/\s+/g,' ').trim(); | |||
if(t.length>maxChars) t=t.slice(0,maxChars).replace(/\s+\S*$/,'')+'…'; | |||
return t||'No description available.'; | |||
} | |||
function firstRaster(list){ | |||
if(!Array.isArray(list)||!list.length) return null; | |||
return list.find(function(t){return /\.(jpe?g|png|gif|webp)$/i.test(t||'');}) || list[0]; | |||
} | |||
function thumbUrl(fileTitle){ | |||
if(!fileTitle) return Promise.resolve(null); | |||
return api.get({ | |||
action:'query',formatversion:2,titles:fileTitle, | |||
prop:'imageinfo',iiprop:'url',iiurlwidth:THUMB | |||
}).then(function(r){ | |||
var p=r.query&&r.query.pages&&r.query.pages[0]; | |||
var ii=p&&p.imageinfo&&p.imageinfo[0]; | |||
return (ii&&(ii.thumburl||ii.url))||null; | |||
}).catch(function(){return null;}); | |||
} | |||
function render(title,text,img){ | |||
var url=mw.util.getUrl(title); | |||
box.innerHTML= | |||
'<div class="thumb">'+(img?'<img src="'+esc(img)+'" alt="">':'<span>🡲</span>')+'</div>'+ | |||
'<div class="content">'+ | |||
'<h3><a href="'+url+'">'+esc(title)+'</a></h3>'+ | |||
'<p>'+esc(text)+'</p>'+ | |||
'<div class="actions">'+ | |||
'<a class="btn" href="'+url+'">Open</a>'+ | |||
'<button type="button" class="btn" id="rand-refresh">Another</button>'+ | |||
'<a class="btn" href="'+mw.util.getUrl("Special:Random")+'">Special:Random</a>'+ | |||
'</div>'+ | |||
'</div>'; | |||
box.classList.remove('loading'); | |||
var btn=document.getElementById('rand-refresh'); | |||
if(btn) btn.addEventListener('click',function(){ box.classList.add('loading'); load(); }); | |||
} | |||
function load(){ | |||
// 1) vezmi náhodnú stránku (id + title) | |||
api.get({ action:'query', formatversion:2, list:'random', rnnamespace:0, rnlimit:1 }) | |||
.then(function(r){ | |||
var it=r && r.query && r.query.random && r.query.random[0]; | |||
if(!it) throw new Error('no random page'); | |||
var pageid=it.id; // <— použijeme pageid, nie title | |||
var title=it.title; | |||
// 2) parse cez pageid (vyhne sa missingtitle) | |||
return api.get({ | |||
action:'parse', pageid:pageid, prop:'text|images', redirects:1 | |||
}).then(function(p){ | |||
var html=p.parse && p.parse.text && p.parse.text['*'] || ''; | |||
var images=p.parse && p.parse.images || []; | |||
var text=excerptFromHTML(html, 420); | |||
var file=firstRaster(images); | |||
return thumbUrl(file).then(function(url){ render(title, text, url); }); | |||
}); | |||
}) | |||
.catch(function(e){ | |||
console.error('[teaser] failed:', e); | |||
box.classList.remove('loading'); | |||
box.innerHTML='<div class="content"><h3>Random page</h3><p>Could not load a preview.</p></div>'; | |||
}); | |||
} | |||
load(); | |||
}); | }); | ||
Revision as of 09:00, 5 September 2025
mw.loader.using(['mediawiki.api']).then(function () {
var box = document.getElementById('random-teaser');
if (!box) { console.warn('[teaser] #random-teaser not found'); return; }
box.textContent = 'JS loaded, calling API…';
new mw.Api().get({ action: 'query', meta: 'siteinfo', formatversion: 2 })
.then(function(){ box.textContent = 'API OK — teaser will load next…'; })
.catch(function(e){ box.textContent = 'API error: ' + e; console.error(e); });
});
/* Any JavaScript here will be loaded for all users on every page load. */
/****************************************/
/* sliders using jquery by User:Tierrie */
/****************************************/
mw.loader.using(['jquery.cookie']);
/****************************************/
/* sliders using jquery by User:Tierrie */
/****************************************/
mw.loader.using(['jquery.ui'], function () {
$("[class^=portal_vtab]").tabs().addClass("ui-tabs-vertical ui-helper-clearfix");
$("[class^=portal_vtab] li").removeClass("ui-corner-top").addClass("ui-corner-left");
var $tabs = $("#portal_slider").tabs({ fx: { opacity: 'toggle', duration: 100 } });
$("[class*=portal_sliderlink]").on('click', function () {
$tabs.tabs('select', this.className.match(/portal_sliderlink-(\d+)/)[1]);
return false;
});
$('#portal_next').on('click', function () {
$tabs.tabs('select', ($tabs.tabs('option', 'selected') == ($tabs.tabs('length')) - 1) ? 0 : $tabs.tabs('option', 'selected') + 1);
return false;
});
$('#portal_prev').on('click', function () {
$tabs.tabs('select', ($tabs.tabs('option', 'selected') == 0) ? ($tabs.tabs('length') - 1) : $tabs.tabs('option', 'selected') - 1);
return false;
});
});
/* lockdown for reference popup configuration */
((window.dev = window.dev || {}).ReferencePopups = dev.ReferencePopups || {}).lockdown = true;
/* Disable license check for multi upload */
mw.config.set('UMFBypassLicenseCheck', true);
/* Hide Admin toolbox for non-admins */
mw.loader.using('mediawiki.util').then(function () {
var g = mw.config.get('wgUserGroups') || [];
var isAdmin = g.indexOf('sysop') !== -1 || g.indexOf('interface-admin') !== -1;
if (!isAdmin) document.querySelectorAll('.only-sysop').forEach(function (el) { el.style.display = 'none'; });
});
/* ============================
RANDOM PAGE TEASER (robust)
============================ */
mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
var box = document.getElementById('random-teaser');
if (!box) return; // run only if the container exists
var api = new mw.Api();
var THUMB_WIDTH = 280;
function esc(s) { return mw.html.escape(String(s || '')); }
function makeExcerptFromHTML(html, maxChars) {
var tmp = document.createElement('div');
tmp.innerHTML = html;
var p = tmp.querySelector('p');
var txt = (p ? p.innerText : tmp.innerText || '').replace(/\s+/g, ' ').trim();
if (txt.length > maxChars) txt = txt.slice(0, maxChars).replace(/\s+\S*$/, '') + '…';
return txt || 'No description available.';
}
function pickImageTitle(list) {
if (!Array.isArray(list) || !list.length) {
console.log('[teaser] no images in page');
return null;
}
// Logni všetky
console.log('[teaser] candidate images:', list);
// Vyber len rastre (jpg/png/gif/webp)
var raster = list.find(function (t) {
return /\.(jpe?g|png|gif|webp)$/i.test(t || '');
});
if (raster) {
console.log('[teaser] picked raster:', raster);
return raster;
}
// fallback – prvý
console.log('[teaser] fallback to first:', list[0]);
return list[0];
}
function getThumbUrl(fileTitle) {
if (!fileTitle) return Promise.resolve(null);
return api.get({
action: 'query',
formatversion: 2,
titles: fileTitle,
prop: 'imageinfo',
iiprop: 'url',
iiurlwidth: THUMB_WIDTH
}).then(function (res) {
var p = res.query && res.query.pages && res.query.pages[0];
var ii = p && p.imageinfo && p.imageinfo[0];
return (ii && (ii.thumburl || ii.url)) || null;
}).catch(function () { return null; });
}
function render(title, extract, imgUrl) {
var url = mw.util.getUrl(title);
box.innerHTML =
'<div class="thumb">' +
(imgUrl ? '<img src="' + esc(imgUrl) + '" alt="">' : '<span>🡲</span>') +
'</div>' +
'<div class="content">' +
'<h3><a href="' + url + '">' + esc(title) + '</a></h3>' +
'<p>' + esc(extract) + '</p>' +
'<div class="actions">' +
'<a class="btn" href="' + url + '">Open</a>' +
'<button type="button" class="btn" id="rand-refresh">Another</button>' +
'<a class="btn" href="' + mw.util.getUrl('Special:Random') + '">Special:Random</a>' +
'</div>' +
'</div>';
box.classList.remove('loading');
var refreshBtn = document.getElementById('rand-refresh');
if (refreshBtn) refreshBtn.addEventListener('click', function () {
box.classList.add('loading');
loadRandom();
});
}
function loadRandom() {
// 1) pick random title
api.get({
action: 'query',
formatversion: 2,
list: 'random',
rnnamespace: 0,
rnlimit: 1
}).then(function (r) {
var item = r && r.query && r.query.random && r.query.random[0];
if (!item) throw new Error('No random page');
var title = item.title;
// 2) parse HTML + list images (no extensions required)
return api.get({
action: 'parse',
page: title,
prop: 'text|images',
redirects: 1
}).then(function (p) {
var html = p.parse && p.parse.text && p.parse.text['*'] || '';
var images = p.parse && p.parse.images || [];
var excerpt = makeExcerptFromHTML(html, 420);
var fileTitle = pickImageTitle(images);
return getThumbUrl(fileTitle).then(function (thumb) {
render(title, excerpt, thumb);
});
});
}).catch(function (e) {
console.warn('Random teaser failed:', e);
box.classList.remove('loading');
box.innerHTML = '<div class="content"><h3>Random page</h3><p>Could not load a preview.</p></div>';
});
}
loadRandom();
});
mw.loader.using(['mediawiki.api','mediawiki.util']).then(function () {
var box = document.getElementById('random-teaser');
if (!box) return;
var api = new mw.Api();
var THUMB = 280;
function esc(s){ return mw.html.escape(String(s||'')); }
function excerptFromHTML(html, maxChars){
var d=document.createElement('div'); d.innerHTML=html;
var p=d.querySelector('p'); var t=(p?p.innerText:d.innerText||'').replace(/\s+/g,' ').trim();
if(t.length>maxChars) t=t.slice(0,maxChars).replace(/\s+\S*$/,'')+'…';
return t||'No description available.';
}
function firstRaster(list){
if(!Array.isArray(list)||!list.length) return null;
return list.find(function(t){return /\.(jpe?g|png|gif|webp)$/i.test(t||'');}) || list[0];
}
function thumbUrl(fileTitle){
if(!fileTitle) return Promise.resolve(null);
return api.get({
action:'query',formatversion:2,titles:fileTitle,
prop:'imageinfo',iiprop:'url',iiurlwidth:THUMB
}).then(function(r){
var p=r.query&&r.query.pages&&r.query.pages[0];
var ii=p&&p.imageinfo&&p.imageinfo[0];
return (ii&&(ii.thumburl||ii.url))||null;
}).catch(function(){return null;});
}
function render(title,text,img){
var url=mw.util.getUrl(title);
box.innerHTML=
'<div class="thumb">'+(img?'<img src="'+esc(img)+'" alt="">':'<span>🡲</span>')+'</div>'+
'<div class="content">'+
'<h3><a href="'+url+'">'+esc(title)+'</a></h3>'+
'<p>'+esc(text)+'</p>'+
'<div class="actions">'+
'<a class="btn" href="'+url+'">Open</a>'+
'<button type="button" class="btn" id="rand-refresh">Another</button>'+
'<a class="btn" href="'+mw.util.getUrl("Special:Random")+'">Special:Random</a>'+
'</div>'+
'</div>';
box.classList.remove('loading');
var btn=document.getElementById('rand-refresh');
if(btn) btn.addEventListener('click',function(){ box.classList.add('loading'); load(); });
}
function load(){
// 1) vezmi náhodnú stránku (id + title)
api.get({ action:'query', formatversion:2, list:'random', rnnamespace:0, rnlimit:1 })
.then(function(r){
var it=r && r.query && r.query.random && r.query.random[0];
if(!it) throw new Error('no random page');
var pageid=it.id; // <— použijeme pageid, nie title
var title=it.title;
// 2) parse cez pageid (vyhne sa missingtitle)
return api.get({
action:'parse', pageid:pageid, prop:'text|images', redirects:1
}).then(function(p){
var html=p.parse && p.parse.text && p.parse.text['*'] || '';
var images=p.parse && p.parse.images || [];
var text=excerptFromHTML(html, 420);
var file=firstRaster(images);
return thumbUrl(file).then(function(url){ render(title, text, url); });
});
})
.catch(function(e){
console.error('[teaser] failed:', e);
box.classList.remove('loading');
box.innerHTML='<div class="content"><h3>Random page</h3><p>Could not load a preview.</p></div>';
});
}
load();
});