MediaWiki:Common.js: Difference between revisions
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(); | |||
}); | }); | ||