MediaWiki:Common.js
MediaWiki interface page
More actions
Poznámka: Po zveřejnění musíte vyprázdnit cache vašeho prohlížeče, jinak změny neuvidíte.
- Firefox / Safari: Při kliknutí na Aktualizovat držte Shift nebo stiskněte Ctrl-F5 nebo Ctrl-R (na Macu ⌘-R)
- Google Chrome: Stiskněte Ctrl-Shift-R (na Macu ⌘-Shift-R)
- Edge: Při kliknutí na Aktualizovat držte Ctrl nebo stiskněte Ctrl-F5.
/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky */
$( function () {
var root = document.getElementById( 'libertypedie-random-article' );
if ( !root ) {
return;
}
function showError( message ) {
$( root ).empty().append(
$( '<p>' )
.addClass( 'random-article-status' )
.text( message )
);
}
mw.loader.using( [ 'mediawiki.api', 'mediawiki.util' ] ).then( function () {
var api = new mw.Api();
var category = root.getAttribute( 'data-category' ) || 'Ukázkové články';
var maxLength =
parseInt( root.getAttribute( 'data-max-length' ), 10 ) || 1000;
var members = [];
function loadMembers( continueToken ) {
var params = {
action: 'query',
list: 'categorymembers',
cmtitle: 'Kategorie:' + category,
cmnamespace: 0,
cmtype: 'page',
cmlimit: 'max',
formatversion: 2
};
if ( continueToken ) {
params.cmcontinue = continueToken;
}
return api.get( params ).then( function ( data ) {
var batch = data.query && data.query.categorymembers ?
data.query.categorymembers : [];
members = members.concat( batch );
if ( data.continue && data.continue.cmcontinue ) {
return loadMembers( data.continue.cmcontinue );
}
return members;
} );
}
function loadArticleData( title ) {
return api.get( {
action: 'query',
prop: 'extracts|pageimages',
titles: title,
redirects: 1,
exintro: 1,
explaintext: 1,
exchars: Math.min( maxLength + 200, 1200 ),
piprop: 'thumbnail',
pithumbsize: 420,
formatversion: 2
} );
}
function shorten( text ) {
var clean = ( text || '' )
.replace( /\s+/g, ' ' )
.trim();
if ( clean.length <= maxLength ) {
return clean;
}
var cut = clean.slice( 0, maxLength - 1 );
var lastSpace = cut.lastIndexOf( ' ' );
if ( lastSpace > maxLength * 0.8 ) {
cut = cut.slice( 0, lastSpace );
}
return cut.replace( /[,:;–—-]+$/, '' ) + '…';
}
function shuffle( list ) {
for ( var i = list.length - 1; i > 0; i-- ) {
var j = Math.floor( Math.random() * ( i + 1 ) );
var temporary = list[ i ];
list[ i ] = list[ j ];
list[ j ] = temporary;
}
return list;
}
function findUsableArticle( list, index ) {
if ( index >= list.length ) {
throw new Error(
'V kategorii nebyl nalezen článek s úvodem a obrázkem.'
);
}
return loadArticleData( list[ index ].title ).then( function ( data ) {
var pages = data.query && data.query.pages ?
data.query.pages : [];
var page = pages[ 0 ];
var extract = page ? shorten( page.extract ) : '';
var thumbnail = page && page.thumbnail &&
page.thumbnail.source ? page.thumbnail : null;
if ( !page || page.missing || !extract || !thumbnail ) {
return findUsableArticle( list, index + 1 );
}
return {
page: page,
extract: extract,
thumbnail: thumbnail
};
} );
}
loadMembers()
.then( function ( list ) {
if ( !list.length ) {
throw new Error( 'Kategorie je prázdná.' );
}
return findUsableArticle( shuffle( list ), 0 );
} )
.then( function ( result ) {
var url = mw.util.getUrl( result.page.title );
var thumbnail = result.thumbnail;
var $preview = $( '<article>' )
.addClass( 'random-article-preview' );
var $image = $( '<img>' )
.addClass( 'random-article-image' )
.attr( {
src: thumbnail.source,
alt: '',
decoding: 'async'
} );
if ( thumbnail.width && thumbnail.height ) {
$image.attr( {
width: thumbnail.width,
height: thumbnail.height
} );
}
var $imageLink = $( '<a>' )
.addClass( 'random-article-image-link' )
.attr( {
href: url,
'aria-label': 'Přejít na článek ' + result.page.title
} )
.append( $image );
var $body = $( '<div>' )
.addClass( 'random-article-body' );
var $title = $( '<h3>' )
.addClass( 'random-article-title' )
.append(
$( '<a>' )
.attr( 'href', url )
.text( result.page.title )
);
var $extract = $( '<p>' )
.addClass( 'random-article-extract' )
.text( result.extract );
var $more = $( '<p>' )
.addClass( 'random-article-more' )
.append(
$( '<a>' )
.attr( 'href', url )
.text( 'Číst celý článek →' )
);
$body.append( $title, $extract, $more );
$preview.append( $imageLink, $body );
$( root ).empty().append( $preview );
} )
.then( null, function () {
showError( 'Náhodný článek se nyní nepodařilo načíst.' );
} );
}, function () {
showError( 'Náhodný článek se nyní nepodařilo načíst.' );
} );
} );