User:GZWDer/Gadget-SitelinkCheck.js

From Wikidata
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
( function ( mw, $, wbt ) {
	
	var debug = mw.util.getParamValue( 'sitelinkcheck' );
	if( debug ) alert( wbt.id );
	
	var i18nData = {
		'zh': {
			'check sitelink': '检查站点链接',
			'intro': '检查指定站点的链接,如果链接已存在的话会给出相应的项目,不存在的话您可以创建此项目。',
			'lang': '语言',
			'title': '标题',
			'check': '检查',
			'exit': '退出',
			'create': '创建',
			'importinterwikis': '导入跨语言链接',
			'addlabels': '自动添加标签',
			'found': '$1 链接至 $2。',
			'nothing found': '未找到链接至 $1 的项目。',
			'redirect': '页面 $1 重定向至 $2。',
			'missing': '页面 $1 不存在。',
			'success': '已成功创建项目。'
		}
	};
	

        var lang = 'zh';
        var langParam = 'fr';
	
	var urlLang = mw.util.getParamValue( 'site' );
	if ( urlLang !== null ) {
		langParam = urlLang.substr( 0, urlLang.length - 4 );
	}
	
	var titleParam = '';
	var urlTitle = mw.util.getParamValue( 'page' );
	if ( urlTitle !== null ) {
		titleParam = urlTitle;
	}
	
	if( mw.util.getParamValue( 'createitem' ) == 'success' && wbt.id ) {
		mw.notify( i18n( 'success' ) );
	}
	
	function i18n( key ) {
		var msg;
		if( i18nData[ lang ][ key ] ) {
			msg = i18nData[ lang ][ key ];
		}
		else if( key in i18nData[ 'en' ] ) {
			msg = i18nData[ 'en' ][ key ];
		}
		else {
			msg = '<' + key + '>';
		}
		for ( var i = 1; i < arguments.length; i++ ) {
			msg = msg.replace( new RegExp( '\\$' + i, 'g' ), arguments[i] );
		}
		msg = jqueryMsg( msg );
		return msg.substr( 1, msg.length - 2 );
	}
	
	function init() {
		mw.loader.using( [ 'jquery.ui' ], function() {
			var $form = $( '<div>' )
			.attr( 'id', 'sitelink' )
			.append(
				$( '<form>' )
				.submit( check )
				.append(
					$( '<fieldset>' )
					.attr( 'id', 'sitelink-form' )
					.append(
						$( '<legend>' )
						.text( i18n( 'check sitelink' ) )
					) // </legend>
					.append(
						$( '<p>' )
						.attr( 'id', 'sitelink-intro' )
						.text( i18n( 'intro' ) )
					) // </p>
					.append(
						$( '<p>' )
						.append(
							$( '<label>' )
							.attr( {
								'for'	: 'sitelink-lang',
								'class'	: 'sitelink-label'
							} )
							.text( i18n( 'lang' ) + ': ' )
						)
						.append(
							$( '<input>' )
							.attr( {
								'type'	: 'text',
								'id'	: 'sitelink-lang',
								'class'	: 'sitelink-input',
								'value'	: langParam
							} )
						)
					) // </p>
					.append(
						$( '<p>' )
						.append(
							$( '<label>' )
							.attr( {
								'for'	: 'sitelink-title',
								'class'	: 'sitelink-label'
							} )
							.text( i18n( 'title' ) + ': ' )
						)
						.append(
							$( '<input>' )
							.attr( {
								'type'	: 'text',
								'id'	: 'sitelink-title',
								'class'	: 'sitelink-input',
								'value'	: titleParam
							} )
						)
					) // </p>
				) // </fieldset>
			) // </form>
			.append(
				$( '<p>' )
				.attr( 'id', 'sitelink-result' )
			); // </div>

			var contentForm = $( $form ).appendTo( '#content' );
			contentForm.dialog( {
				title: '<img src="//upload.wikimedia.org/wikipedia/commons/thumb/2/29/Symbol_question_green.svg/200px-Symbol_question_green.svg.png" width="20" alt="?" title="?" style="margin-right: 1.5em;">' + i18n( 'check sitelink' ),
				autoOpen: false,
				modal: true,
				width: 500,
				buttons: [ {
					id: 'sitelink-button-check',
					text: i18n( 'check' ),
					click: check
				}, {
					id: 'sitelink-button-exit',
					text: i18n( 'exit' ),
					click: function() {
						$( '#sitelink' ).dialog( 'close' );
					}
				} ]
			} );
		} );
		
		var portletLink = mw.util.addPortletLink( 'p-tb', '#', i18n( 'check sitelink' ), 't-sitelink', i18n( 'check sitelink' ) );
		$( portletLink ).click( show );
		
		$( '#wb-createentity-submit' ).after(
			$( '<a>' )
			.attr( {
				'id': 'sitelink-createentity',
				'href': '#'
			} )
			.text( i18n( 'check sitelink' ) )
			.click( show )
		);
	}
	
	function show() {		
		$( '#sitelink-result' ).html( '' );
		$( '#sitelink-title' ).attr( 'value', titleParam );
		$( '#sitelink' ).dialog( 'open' );
		$( '#sitelink-title' ).focus();
		return false;
	}
	
	function check() {
		var lang = $( '#sitelink-lang' ).attr( 'value' );
		var title = $( '#sitelink-title' ).attr( 'value' );
		if( debug ) alert( 'lang: ' + lang );
		if( debug ) alert( 'title: ' + title );

		if( !lang ) {
			error( i18n( 'missing lang' ) );
			return;
		}
		if( !title ) {
			error( i18n( 'missing title' ) );
			return;
		}
		createSpinner();

		$.ajax( {
			url: '//' + lang + '.wikipedia.org/w/api.php',
			data: {
				'format': 'json',
				'action': 'query',
				'prop': 'pageprops',
				'titles': title,
				'redirects': 'redirects'
			},
			dataType: 'jsonp'
		} )
		.done( function( data ) {
			var prefix = '[[' + lang + ':';
			if( data.error ) {
				error( data.error.info );
			}
			else if( !data.query ) {
				error( i18n( 'api-error' ) );
			}
			else if( data.query.pages['-1'] ) {
				error( i18n( 'missing', prefix + data.query.pages['-1'].title + ']]' ) );
			}
			else if( data.query.redirects ) {
				var redirect =  data.query.redirects[0];
				error( i18n( 'redirect', prefix + redirect.from + ']]', prefix + redirect.to + ']]' ) );
			}
			else {
				searchItem( lang, title );
			}
		} )
		.fail( function( jqXHR, textStatus, errorThrown ) {
			error( i18n( 'api-error' ) );
		} );
	}
	
	function searchItem( lang, title ) {
		$.ajax( {
			type: 'POST',
			url: mw.util.wikiScript( 'api' ),
			data: {
				'action': 'wbgetentities',
				'format': 'json',
				'sites': lang + 'wiki',
				'titles': title
			}
		} )
		.done( function( data ) {
			var id = getKey( data.entities );
			var $message;
			if( id === '-1' ) {
				var summary = '[[:' + lang + ':' + title + ']] ([[MediaWiki talk:Gadget-SitelinkCheck.js|SC]])';
				var data = { sitelinks: {} };
				var site = lang.replace( /-/g, '_' ) + 'wiki';
				data['sitelinks'][site] = {
					'site': site,
					'title': title
				};
				data['labels'] = {};
				data['labels'][lang] = {
					language: lang,
					value: title.replace( /\(.*\)/g, '' ) // regex
				};
				wbt.getInterwikiLinks( lang, title, function( links ) {
					for( var lang in links ) {
						var title = links[lang];
						var site = lang.replace( /-/g, '_' ) + 'wiki';
						data['sitelinks'][site] = {
							'site': site,
							'title': title
						};
						data['labels'][lang] = {
							language: lang,
							value: title.replace( /\(.*\)/g, '' ) // regex
						};
					}
					if( debug ) alert( $.toJSON( data ) );
					wbt.createItem( data, summary, success, error );
				}, error );
			}
			else {
				id = 'Q' + id.substr( 1 );
				$message = $( '<p>' ).append( i18n( 'found', '[[' + id + ']]', '[[' + lang + ':' + title + ']]' ) );
			}
			$( '#sitelink-result' ).html( $message );
		} )
		.fail( function( jqXHR, textStatus, errorThrown ) {
			error( i18n( 'api-error' ) );
		} );
	}
	
	function success( data ) {
	}
	
	function error( msg ) {
		$( '#sitelink-result' ).html( msg );
	}
	
	function createSpinner() {
		$( '#sitelink-result' ).html( '<div id="sitelink-spinner" />' );
		$.createSpinner( {
			size: 'large',
			type: 'block',
			id: 'sitelink-spinner'
		} ).replaceAll( '#sitelink-spinner' );
	}

	function getKey( data ) {
		for ( var prop in data )
			return prop;
	}
	
	$( document ).ready( init );
} )( mediaWiki, jQuery, wikibaseTools );