Jump to content
Toggle menu
  • 728 články
  • 376 Soubory
  • 17 uživatelé
  • 5,4 tis. Úpravy
Libertypedie
Toggle preferences menu
Toggle personal menu
Nejste přihlášen(a)
Your IP address will be publicly visible if you make any edits.

MediaWiki:Common.js

MediaWiki interface page

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.' );
	} );
} );