MediaWiki:Gadget-Preview.js

De WikiMinecraft
Saltar a: navegación, buscar
// <nowiki>

// -------------------------------------------------------------------------------------------------------------
// Shows a "preview" button next to each linked article to get a preview of the article right next to the table.
// Much thanks to User:Denny/articlePreview.js, from which I got the idea.
//
// Usage: Enable the gadget Preview in your preferences.
// -------------------------------------------------------------------------------------------------------------

( function ( mw, $ ) {
	"use strict";

	if ( mw.config.get( 'wgNamespaceNumber' ) !== 0 ) {
		return;
	}

	switch ( mw.config.get( 'wgUserLanguage' ) ) {
	case 'de':
	case 'de-at':
	case 'de-ch':
	case 'de-formal':
		mw.messages.set( {
			'title' :	'Artikelvorschau',
			'preview' :	'Vorschau',
			'noarticle' :	'Du hast noch keinen Artikel ausgewählt.',
			'readmore' :	'Weiterlesen',
			'hide' :	'verstecken',
			'show' :	'zeigen'
		} );
		break;
	case 'bn':
                mw.messages.set( {
			'title' :	'নিবন্ধ প্রাকদর্শন',
			'preview' :	'প্রাকদর্শন',
			'noarticle' :	'আপনি এখনও কোন নিবন্ধ নির্বাচন করেন নি।',
			'readmore' :	'আরও পড়ুন',
			'hide' :	'আড়াল করো',
			'show' :	'দেখাও'
                } );
                break;
	case 'cs':
		mw.messages.set( {
			'title' :	'Náhled článku',
			'preview' :	'náhled',
			'noarticle' :	'Zatím není zvolen článek.',
			'readmore' :	'Více',
			'hide' :	'skryj',
			'show' :	'ukaž'
                } );
                break;
	case 'es':
		mw.messages.set( {
			'title' :	'Previsualización del artículo',
			'preview' :	'previsualizar',
			'noarticle' :	'Aún no seleccionaste ningún artículo.',
			'readmore' :	'Leer más',
			'hide' :	'ocultar',
			'show' :	'mostar'
		} );
		break;
	case 'fa':
		mw.messages.set( {
			'title' :	'پیش‌نمایش مقاله',
			'preview' :	'پیش‌نمایش',
			'noarticle' :	'شما هنوز مقاله‌ای را انتخاب نکرده‌اید.',
			'readmore' :	'مطالعهٔ بیشتر',
			'hide' :	'پنهان',
			'show' :	'نمایش'
		} );
		break;
	case 'fi':
		mw.messages.set( {
			'title' :	'Artikkelin esikatselu',
			'preview' :	'esikatselu',
			'noarticle' :	'Et ole vielä valinnut artikkelia.',
			'readmore' :	'Lue lisää',
			'hide' :	'piilota',
			'show' :	'näytä'
		} );
		break;
	case 'fr':
		mw.messages.set( {
			'title' :	'Visualisation des articles',
			'preview' :	'visualiser',
			'noarticle' :	'Aucun article n\'est sélectionné.',
			'readmore' :	'Lire la suite',
			'hide' :	'masquer',
			'show' :	'afficher'
		} );
		break;
	case 'gl':
		mw.messages.set( {
			'title' :	'Previsualización do artigo',
			'preview' :	'previsualizar',
			'noarticle' :	'Aínda non seleccionaches ningún artigo.',
			'readmore' :	'Ler máis',
			'hide' :	'ocultar',
			'show' :	'amosar'
		} );
		break;
	case 'hu':
		mw.messages.set( {
			'title' :	'Cikk előnézete',
			'preview' :	'előnézet',
			'noarticle' :	'Nem választottál cikket.',
			'readmore' :	'Tovább',
			'hide' :	'elrejt',
			'show' :	'mutat'
		} );
		break;
	case 'id':
		mw.messages.set( {
			'title' :       'Pratayang artikel',
			'preview' :     'pratayang',
			'noarticle' :   'Anda belum memilih artikel.',
			'readmore' :    'Lebih lanjut',
			'hide' :	'sembunyikan',
			'show' :	'tunjukan'
		} );
		break;
	case 'it':
		mw.messages.set( {
			'title' :	'Anteprime della voce',
			'preview' :	'anteprima',
			'noarticle' :	'Non hai ancora selezionato una voce.',
			'readmore' :	'Leggi tutto',
			'hide' :	'nascondi',
			'show' :	'mostra'
		} );
		break;
	case 'ja':
		mw.messages.set( {
			'title' :	'記事のプレビュー',
			'preview' :	'プレビュー',
			'noarticle' :	'記事が選択されていません',
			'readmore' :	'続きを読む',
			'hide' :	'非表示',
			'show' :	'表示'
		} );
		break;
	case 'ko':
		mw.messages.set( {
			'title' :	'문서 미리 보기',
			'preview' :	'미리 보기',
			'noarticle' :	'아직 문서를 선택하지 않으셧습니다.',
			'readmore' :	'더 보기',
			'hide' :	'숨기기',
			'show' :	'보이기'
		} );
		break;
	case 'min':
		mw.messages.set( {
			'title' :       'Pratonton laman',
			'preview' :     'pratonton',
			'noarticle' :   'Sanak alum mamiliah laman.',
			'readmore' :    'Labiah lanjuik',
			'hide' :	'suruakan',
			'show' :	'tunjuakan'
		} );
		break;
	case 'nl':
		mw.messages.set( {
			'title' :	'Voorbeeld van artikel',
			'preview' :	'voorbeeld',
			'noarticle' :	'Je hebt nog geen artikel geselecteerd.',
			'readmore' :	'Meer lezen',
			'hide' :	'Verbergen',
			'show' :	'Tonen'
		} );
		break;
	case 'zh':
	case 'zh-cn':
	case 'zh-hans':
	case 'zh-my':
	case 'zh-sg':
		mw.messages.set( {
			'title' :	'条目预览',
			'preview' :	'预览',
			'noarticle' :	'您尚未选择一个条目。',
			'readmore' :	'阅读更多',
			'hide' :	'隐藏',
			'show' :	'显示'
		} );
		break;
	case 'zh-hant':
	case 'zh-hk':
	case 'zh-mo':
	case 'zh-tw':
		mw.messages.set( {
			'title' :	'條目預覽',
			'preview' :	'預覽',
			'noarticle' :	'您尚無選擇一個條目。',
			'readmore' :	'閱讀更多',
			'hide' :	'隱藏',
			'show' :	'顯示'
		} );
		break;
	default:
	case 'en':
		mw.messages.set( {
			'title' :	'Article preview',
			'preview' :	'preview',
			'noarticle' :	'You have not selected an article yet.',
			'readmore' :	'Read more',
			'hide' :	'hide',
			'show' :	'show'
		} );
	}

	/**
	 * The cached previews.
	 */
	var cache = {};

	/**
	 * Initialising the links.
	 */
	function init() {
		var lang = mw.config.get( 'wgUserLanguage' );
		var wiki = lang + 'wiki'; // Guess default wiki
		$( '.wb-widget-container' ).html(
			$( '<div>' )
			.attr( {
				id: 'x-articlepreview',
				style: 'width: 35em; margin-left: 30px;'
			} )
			.append(
				$( '<h3>' )
				.text( mw.msg( 'title' ) )
			)
			.append(
				$( '<div>' )
				.attr( 'id', 'x-articlepreview-content' )
				.append(
					$( '<p>' )
					.attr( 'style', 'font-style: italic;' )
					.text( mw.msg( 'noarticle' ) )
				)
			)
		);

		if ( $( '.wb-sitelinks-link-' + wiki + ' a' ).text() ) {
			$( '#x-articlepreview-content p' )
			.append( '<br>&nbsp;&rarr;&nbsp;' )
			.append(
				$( '<a>' )
				.attr( 'href', '#' )
				.text( $( '.wb-sitelinks-link-' + wiki + ' a' ).text() )
				.click( function () {
					preview( wiki );
					return false;
				} ) // </a>
			);
		}

		$( document )
		.on( 'mouseenter', '.wb-sitelinks tbody tr .wb-sitelinks-link', function () {
			var wiki = $( this ).parent().find( '.wb-sitelinks-siteid' ).text();
			$( this ).append(
				$( '<span>' )
				.append(
					$( '<a>' )
					.attr( 'href', '#x-articlepreview' )
					.css( 'float', $( this ).attr( 'dir' ) === 'rtl' ? 'left' : 'right' )
					.text( mw.msg( 'preview' ) )
					.click( function () {
						preview( wiki );
						//return false;
					} )
				)
			);
		} )
		.on( 'mouseleave', '.wb-sitelinks tbody tr .wb-sitelinks-link', function () {
			$( this ).find( 'span' ).remove();
		} );
	}

	/**
	 * Showing the preview got by an http request. Requests are cached.
	 *
	 * @param wiki the article's wiki
	 */
	function preview( wiki ) {
		console.log( 'wiki: ' + wiki );
		var title = $( '.wb-sitelinks-link-' + wiki + ' a:eq(0)' ).text();
		var site = wikibase.getSite( wiki );
		var lang = site.getLanguage();
		console.log( 'title: ' + title );
		console.log( site );
		if ( !title ) {
			return;
		}
		if ( cache.hasOwnProperty( wiki ) ) {
			showPreview( cache[wiki] );
		}
		else {
			mw.loader.using( ['jquery.spinner'], function () {
				$( '#x-articlepreview-content' ).html( '' );
				$.createSpinner( {
					size: 'small',
					type: 'block'
				} ).appendTo( '#x-articlepreview-content' );
				$.getJSON(
					site.getApi() + '?callback=?',
					{
						action: 'query',
						prop: 'extracts',
						exintro: true,
						exchars: 1000,
						titles: title,
						format: 'json'
					},
					function ( data ) {
						var $preview = $( '<span>' )
						.css( 'float', lang.dir === 'ltr' ? 'right' : 'left' )
						.append( '[' )
						.append(
							$( '<a>' )
							.attr( {
								href: '#',
								id: 'x-articlepreview-toggle'
							} )
							.text( mw.msg( 'hide' ) ) // </a>
						)
						.append( ']' )
						.after(
							$( '<h4>' )
							.attr( 'dir', lang.dir )
							.attr( 'lang', lang.code )
							.text( $( '.wb-sitelinks-sitename-' + wiki ).text() + ' ' )
							.append(
								$( '<span>' )
								.attr( 'dir', 'ltr' )
								.attr( 'lang', 'en' )
								.text( '(' + wiki + ')' )
							)
						)
						.after(
							$( '<div>' )
							.attr( {
								id: 'x-articlepreview-article',
								'class': 'mw-content-' + lang.dir,
								dir: lang.dir,
								lang: lang.code
							} )
							.html( data.query.pages[Object.keys( data.query.pages )[0]].extract.replace( /<\/p>(…|...)/, '…</p>' ) )
							.append( 
								$( '<p>' )
								.append(
									$( '<a>' )
									.attr( {
										'href': site.getUrlTo( title ),
										'title': wiki + ':' + title
									} )
									.text( mw.msg( 'readmore' ) )
								) // </a>
							) // </p>
						); // </span>
						cache[wiki] = $preview;
						showPreview( $preview );
					}
				);
			} );
		}
	}

	/**
	 * Adds the preview to the document.
	 *
	 * @param preview the preview in html format
	 */
	function showPreview( preview ) {
		$( '#x-articlepreview-content' ).html( preview );
		// toggle link
		$( '#x-articlepreview-toggle' ).toggle( function () {
			$( '#x-articlepreview-article' ).slideUp();
			$( this ).text( mw.msg( 'show' ) );
		}, function () {
			$( '#x-articlepreview-article' ).slideDown();
			$( this ).text( mw.msg( 'hide' ) );
		} );
	}

	$( document ).ready( init );
} )( mediaWiki, jQuery );

// </nowiki>