|
|
| Line 4: |
Line 4: |
| /* sliders using jquery by User:Tierrie */ | | /* sliders using jquery by User:Tierrie */ |
| /****************************************/ | | /****************************************/ |
| mw.loader.using( ['jquery.cookie']); | | mw.loader.using(['jquery.cookie']); |
|
| | |
| /****************************************/ | | /****************************************/ |
| /* sliders using jquery by User:Tierrie */ | | /* sliders using jquery by User:Tierrie */ |
| /****************************************/ | | /****************************************/ |
| mw.loader.using( ['jquery.ui'], function() { | | mw.loader.using(['jquery.ui'], function () { |
| $( "[class^=portal_vtab]" ).tabs().addClass( "ui-tabs-vertical ui-helper-clearfix" ); | | $("[class^=portal_vtab]").tabs().addClass("ui-tabs-vertical ui-helper-clearfix"); |
| $( "[class^=portal_vtab] li" ).removeClass( "ui-corner-top" ).addClass( "ui-corner-left" ); | | $("[class^=portal_vtab] li").removeClass("ui-corner-top").addClass("ui-corner-left"); |
|
| | |
| var $tabs = $("#portal_slider").tabs({ fx: {opacity:'toggle', duration:100} } ); | | var $tabs = $("#portal_slider").tabs({ fx: { opacity: 'toggle', duration: 100 } }); |
| $("[class*=portal_sliderlink]").click(function() { // bind click event to link | | $("[class*=portal_sliderlink]").on('click', function () { |
| $tabs.tabs('select', this.className.match(/portal_sliderlink-(\d+)/)[1]); | | $tabs.tabs('select', this.className.match(/portal_sliderlink-(\d+)/)[1]); |
| console.log("Sliding to " + this.className.match(/portal_sliderlink-(\d+)/)[1]);
| |
| return false; | | return false; |
| }); | | }); |
| $('#portal_next').click(function() { | | $('#portal_next').on('click', function () { |
| $tabs.tabs('select', ($tabs.tabs('option', 'selected') == ($tabs.tabs('length'))-1) ? 0 : $tabs.tabs('option', 'selected') + 1 ); // switch to next tab | | $tabs.tabs('select', ($tabs.tabs('option', 'selected') == ($tabs.tabs('length')) - 1) ? 0 : $tabs.tabs('option', 'selected') + 1); |
| return false; | | return false; |
| }); | | }); |
| $('#portal_prev').click(function() { // bind click event to link | | $('#portal_prev').on('click', function () { |
| $tabs.tabs('select', ($tabs.tabs('option', 'selected') == 0) ? ($tabs.tabs('length')-1) : $tabs.tabs('option', 'selected') - 1 ); // switch to previous tab | | $tabs.tabs('select', ($tabs.tabs('option', 'selected') == 0) ? ($tabs.tabs('length') - 1) : $tabs.tabs('option', 'selected') - 1); |
| return false; | | return false; |
| }); | | }); |
| Line 35: |
Line 34: |
| mw.config.set('UMFBypassLicenseCheck', true); | | mw.config.set('UMFBypassLicenseCheck', true); |
|
| |
|
| | /* Hide Admin toolbox for non-admins */ |
| mw.loader.using('mediawiki.util').then(function () { | | mw.loader.using('mediawiki.util').then(function () { |
| var g = mw.config.get('wgUserGroups')||[]; | | var g = mw.config.get('wgUserGroups') || []; |
| var isAdmin = g.indexOf('sysop')!==-1 || g.indexOf('interface-admin')!==-1; | | var isAdmin = g.indexOf('sysop') !== -1 || g.indexOf('interface-admin') !== -1; |
| if (!isAdmin) document.querySelectorAll('.only-sysop').forEach(el=>el.style.display='none'); | | if (!isAdmin) document.querySelectorAll('.only-sysop').forEach(function (el) { el.style.display = 'none'; }); |
| });
| |
| | |
| /* Random Page Teaser on Main Page
| |
| * Fetches a random page (namespace 0), shows title, extract and thumbnail.
| |
| */
| |
| mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () {
| |
| // Run only on main page (adjust if your main page title differs)
| |
| var isMain = mw.config.get('wgIsMainPage') || mw.config.get('wgPageName') === 'Main_Page';
| |
| var box = document.getElementById('random-teaser');
| |
| if (!isMain || !box) return;
| |
| | |
| var api = new mw.Api();
| |
| | |
| function renderCard(data) {
| |
| var page = (data && data.query && data.query.pages && data.query.pages[0]) || null;
| |
| if (!page) {
| |
| box.innerHTML = '<div class="content"><h3>Random page</h3><p>Could not load a page.</p></div>';
| |
| box.classList.remove('loading');
| |
| return;
| |
| }
| |
| | |
| var title = page.title;
| |
| var url = mw.util.getUrl(title);
| |
| var extract = (page.extract || '').replace(/\n+/g, ' ').trim();
| |
| if (extract.length > 420) extract = extract.slice(0, 420).replace(/\s+\S*$/, '') + '…';
| |
| | |
| var img = (page.thumbnail && page.thumbnail.source) ? page.thumbnail.source : null;
| |
| | |
| box.innerHTML =
| |
| '<div class="thumb">' +
| |
| (img ? '<img src="' + img + '" alt="">' : '<span>🡲</span>') +
| |
| '</div>' +
| |
| '<div class="content">' +
| |
| '<h3><a href="' + url + '">' + mw.html.escape(title) + '</a></h3>' +
| |
| '<p>' + (extract || 'No description available.') + '</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() {
| |
| api.get({
| |
| action: 'query',
| |
| formatversion: 2,
| |
| generator: 'random',
| |
| grnnamespace: 0, // only main/article namespace
| |
| grnlimit: 1,
| |
| prop: 'extracts|pageimages',
| |
| exintro: 1,
| |
| explaintext: 1, // plain text extract
| |
| exchars: 600, // server-side clamp
| |
| pithumbsize: 280, // thumbnail width
| |
| pilicense: 'any'
| |
| }).then(renderCard).catch(function () {
| |
| renderCard(null);
| |
| });
| |
| }
| |
| | |
| loadRandom();
| |
| }); | | }); |
|
| |
|
| | | /* ============================ |
| api.get({
| | RANDOM PAGE TEASER (robust) |
| action: 'query',
| | ============================ */ |
| formatversion: 2,
| |
| generator: 'random',
| |
| grnnamespace: 0,
| |
| grnlimit: 1,
| |
| prop: 'extracts|images',
| |
| exintro: 1,
| |
| explaintext: 1,
| |
| exchars: 600
| |
| }).then(function (data) {
| |
| var page = data.query.pages[0];
| |
| if (page.images && page.images.length) {
| |
| // vezme prvý obrázok
| |
| var file = page.images[0].title;
| |
| api.get({
| |
| action: 'query',
| |
| titles: file,
| |
| prop: 'imageinfo',
| |
| iiprop: 'url',
| |
| iiurlwidth: 280
| |
| }).then(function (imgData) {
| |
| var imgPage = Object.values(imgData.query.pages)[0];
| |
| var img = imgPage.imageinfo[0].thumburl;
| |
| // tu už máš thumbnail
| |
| });
| |
| }
| |
| });
| |
| | |
| /* Random Page Teaser with robust thumbnail fallback (no PageImages required) */
| |
| mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () { | | mw.loader.using(['mediawiki.api', 'mediawiki.util']).then(function () { |
| var isMain = mw.config.get('wgIsMainPage') || mw.config.get('wgPageName') === 'Main_Page';
| |
| var box = document.getElementById('random-teaser'); | | var box = document.getElementById('random-teaser'); |
| if (!isMain || !box) return; | | if (!box) return; // run only if the container exists |
|
| |
|
| var api = new mw.Api(); | | var api = new mw.Api(); |
| var THUMB_WIDTH = 280; | | var THUMB_WIDTH = 280; |
|
| |
|
| function esc(s){ return mw.html.escape(String(s || '')); }
| | function esc(s) { return mw.html.escape(String(s || '')); } |
| | |
| function render(page, imgUrl) {
| |
| var title = page.title;
| |
| var url = mw.util.getUrl(title);
| |
| var extract = (page.extract || '').replace(/\n+/g, ' ').trim();
| |
| if (extract.length > 420) extract = extract.slice(0, 420).replace(/\s+\S*$/, '') + '…';
| |
| | |
| 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) || 'No description available.') + '</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();
| |
| });
| |
| }
| |
| | |
| // Try to resolve a thumbnail URL from PageImages; if absent, fallback to first image->imageinfo
| |
| function resolveThumb(page) {
| |
| // 1) If PageImages is installed AND page has .thumbnail, use it
| |
| if (page.thumbnail && page.thumbnail.source) {
| |
| return Promise.resolve(page.thumbnail.source);
| |
| }
| |
| | |
| // 2) Fallback: get first File used on the page
| |
| return api.get({
| |
| action: 'query',
| |
| formatversion: 2,
| |
| prop: 'images',
| |
| pageids: page.pageid,
| |
| imlimit: 50
| |
| }).then(function (res) {
| |
| var p = (res.query && res.query.pages && res.query.pages[0]) || {};
| |
| var files = (p.images || []).map(function (x){ return x.title; });
| |
| | |
| // Prefer common raster types, skip SVG/ICO if chceš
| |
| var pick = files.find(function (t) {
| |
| return /\.(jpg|jpeg|png|gif|webp)$/i.test(t || '');
| |
| }) || files[0];
| |
| | |
| if (!pick) return null;
| |
| | |
| // 3) Ask for thumbnail url of that file
| |
| return api.get({
| |
| action: 'query',
| |
| formatversion: 2,
| |
| titles: pick,
| |
| prop: 'imageinfo',
| |
| iiprop: 'url',
| |
| iiurlwidth: THUMB_WIDTH
| |
| }).then(function (imgRes) {
| |
| var imgPage = imgRes.query && imgRes.query.pages && imgRes.query.pages[0];
| |
| var info = imgPage && imgPage.imageinfo && imgPage.imageinfo[0];
| |
| return info && (info.thumburl || info.url) || null;
| |
| });
| |
| });
| |
| }
| |
| | |
| function loadRandom() {
| |
| api.get({
| |
| action: 'query',
| |
| formatversion: 2,
| |
| generator: 'random',
| |
| grnnamespace: 0,
| |
| grnlimit: 1,
| |
| // PageImages (if present) + extract; if PageImages is missing, API len ignoruje thumbnail a nič sa nepokazí
| |
| prop: 'extracts|pageimages',
| |
| exintro: 1,
| |
| explaintext: 1,
| |
| exchars: 600,
| |
| pithumbsize: THUMB_WIDTH,
| |
| pilicense: 'any'
| |
| }).then(function (data) {
| |
| var page = data.query && data.query.pages && data.query.pages[0];
| |
| if (!page) throw new Error('No random page returned');
| |
| | |
| return resolveThumb(page).then(function (thumbUrl) {
| |
| render(page, thumbUrl);
| |
| });
| |
| }).catch(function (e) {
| |
| console.warn('Random teaser error:', e);
| |
| box.classList.remove('loading');
| |
| box.innerHTML = '<div class="content"><h3>Random page</h3><p>Could not load a preview.</p></div>';
| |
| });
| |
| }
| |
| | |
| loadRandom();
| |
| });
| |
| | |
| /* Random Page Teaser — works without PageImages/TextExtracts */
| |
| $(function () {
| |
| var box = document.getElementById('random-teaser');
| |
| if (!box) return;
| |
| | |
| var api = new mw.Api();
| |
| var THUMB_WIDTH = 280;
| |
| | |
| function esc(s){ return mw.html.escape(String(s || '')); } | |
|
| |
|
| function makeExcerptFromHTML(html, maxChars) { | | function makeExcerptFromHTML(html, maxChars) { |
| // Build a sandbox DOM, pick first paragraph text
| |
| var tmp = document.createElement('div'); | | var tmp = document.createElement('div'); |
| tmp.innerHTML = html; | | tmp.innerHTML = html; |
| Line 273: |
Line 64: |
| function pickImageTitle(list) { | | function pickImageTitle(list) { |
| if (!Array.isArray(list) || !list.length) return null; | | if (!Array.isArray(list) || !list.length) return null; |
| // Prefer common raster formats
| |
| var preferred = list.find(function (t) { return /\.(jpe?g|png|gif|webp)$/i.test(t); }); | | var preferred = list.find(function (t) { return /\.(jpe?g|png|gif|webp)$/i.test(t); }); |
| return preferred || list[0] || null; | | return preferred || list[0] || null; |
| Line 291: |
Line 81: |
| var ii = p && p.imageinfo && p.imageinfo[0]; | | var ii = p && p.imageinfo && p.imageinfo[0]; |
| return (ii && (ii.thumburl || ii.url)) || null; | | return (ii && (ii.thumburl || ii.url)) || null; |
| }).catch(function(){ return null; }); | | }).catch(function () { return null; }); |
| } | | } |
|
| |
|
| Line 319: |
Line 109: |
|
| |
|
| function loadRandom() { | | function loadRandom() { |
| // 1) Get random article (namespace 0) | | // 1) pick random title |
| api.get({ | | api.get({ |
| action: 'query', | | action: 'query', |
| Line 327: |
Line 117: |
| rnlimit: 1 | | rnlimit: 1 |
| }).then(function (r) { | | }).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 needed)
| |
| 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);
| |
|
| |
| // 3) Resolve thumbnail URL (if any)
| |
| return getThumbUrl(fileTitle).then(function (thumb) {
| |
| render(title, excerpt, thumb);
| |
| });
| |
| });
| |
| }).catch(function (e) {
| |
| // Graceful fallback
| |
| 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();
| |
| });
| |