Naar inhoud springen

Gebruiker:Vandervalp/common.js

Uit Wikipedia, de vrije encyclopedie

Opmerking: na het publiceren is het wellicht nodig uw browsercache te legen om de veranderingen te zien.

  • Firefox / Safari: houd Shift ingedrukt terwijl u:je op Vernieuwen klikt of druk op Ctrl-F5 of Ctrl-R (⌘-Shift-R op een Mac)
  • Google Chrome: druk op Ctrl-Shift-R (⌘-Shift-R op een Mac)
  • Edge: houd Ctrl ingedrukt terwijl u:je op Vernieuwen klikt of druk op Ctrl-F5.
// <nowiki>
mw.loader.using( 'mediawiki.util' )
.then( function () {

	mw.util.addCSS( '\
		.wikidata-redirect-linker-in-progress {\
			color: inherit !important;\
			pointer-events: none;\
		}\
		.wikidata-redirect-linker-in-progress:after {\
			content: " …";\
		}\
		.redirectMsg button {\
			margin-left: 1em;\
		}\
	' );

	function removeInterLanguageLinks( content, sitelinks ) {
		var i, sitelink, prefix, reg;

		for ( i in sitelinks ) {
			sitelink = sitelinks[ i ];
			prefix = sitelink.site.split( 'wiki' )[ 0 ].replace( /_/g, '-' );
			reg = new RegExp(
				'(^\\s*)?\\[\\[\\s*' +
				mw.util.escapeRegExp( prefix ) + '\\s*:\\s*' + // interwiki prefix
				sitelink.title.replace( /^([^:]*:)?(.+)$/, function( pg, ns, title ) { // page name
					return ( ns ?
							'(?:' + mw.util.escapeRegExp( ns ) + '|' + mw.util.escapeRegExp( mw.config.get( 'wgCanonicalNamespace' ) ) + ')' : // non-mainspace
							'' // main namespace
						) +
						mw.util.escapeRegExp( title );
				} ).replace( / /g, '[ _]+' ) +
				'\\s*\\]\\]\\s*\\n?',
				'ig' // case insensitive, multiple occurs
			);
			content = content.replace( reg, '' );
		}
		return content;
	}

	function setSiteLink( id, site, page ) {
		return mw.loader.using( [
			'jquery.wikibase.linkitem',
			'mediawiki.api',
			'mw.config.values.wbRepo'
		] )
		.then( function () {
			var api, repoConfig, repoApiUrl, mwApiForRepo, repoApi, deferredTitle;

			api = new mw.Api();
			repoConfig = mw.config.get( 'wbRepo' );
			repoApiUrl = repoConfig.url + repoConfig.scriptPath + '/api.php';
			mwApiForRepo = wikibase.api.getLocationAgnosticMwApi( repoApiUrl );
			repoApi = new wikibase.api.RepoApi( mwApiForRepo );

			function getTitle() {
				return api.get( {
					formatversion: 2,
					titles: page,
					prop: 'pageprops'
				} ).then( function ( data ) {
					var title = page.replace( /_/g, ' ' ),
						pageprops = data.query.pages[ 0 ].pageprops;

					if ( pageprops && pageprops.displaytitle &&
						pageprops.displaytitle.replace( /_/g, ' ' ).toLocaleLowerCase() === title.toLocaleLowerCase()
					) {
						return pageprops.displaytitle;
					}
					return title;
				} );
			}

			deferredTitle = getTitle();

			return deferredTitle.then( function ( title ) {
				var lang = mw.config.get( 'wgPageContentLanguage' );
				if ( id === 'new' ) {
					var entityData = {
						labels: {},
						sitelinks: {}
					};
					entityData.labels[ lang ] = {
						language: lang,
						value: title
					};
					entityData.sitelinks[ site ] = {
						site: site,
						title: page,
						badges: [ 'Q70894304' ]
					};
					return repoApi.createEntity( 'item', entityData );
				}
				return repoApi.setSitelink( id, 0, site, page, 'Q70894304' );
			} )
			.then( function ( data ) {
				var lang = mw.config.get( 'wgPageContentLanguage' ),
					id = data.entity.id;

				return repoApi.getEntities( [ id ], [ 'labels', 'sitelinks' ], lang )
				.then( function ( entities ) {
					var deferredLabel, deferredEdit,
						entity = entities.entities[ id ];

					// Set label if empty
					if ( !entity.labels[ lang ] ) {
						// The entity has no label. Set the title as label.
						deferredLabel = deferredTitle.then( function ( title ) {
							return repoApi.setLabel( id, data.entity.lastrevid, title, lang );
						} );
					} else {
						deferredLabel = $.Deferred().resolve();
					}

					deferredEdit = api.edit( page, function ( revision ) {
						var content = removeInterLanguageLinks( revision.content, entity.sitelinks )
							.replace( /__(STATICREDIRECT|PERMANENTE_WEITERLEITUNG)__ *\n*/g, '' )
							.replace( /\{\{\s*[Ww]ikidata-doorverwijzing\s*(\|\s*Q\d+\s*)?\}\} *\n*/g, '' );

						return {
							text: content.replace(
								/#(redirect|doorverwijzing)\s*:?\s*\[\[[_ ]*([^\]]*)[_ ]*\]\] *\n*/i,
								'#DOORVERWIJZING [[$2]]\n{{Wikidata-doorverwijzing|' + id + '}}\n\n'
							),
							summary: '{{[[Sjabloon:Wikidata-doorverwijzing|Wikidata-doorverwijzing]]|[[d:' + id + '|' + id + ']]}} toegevoegd.'
						};
					} );

					return $.when( deferredLabel, deferredEdit );
				} );
			} );
		} );
	}

	function linkAndLoad( id, site, page ) {
		return setSiteLink( id, site, page )
		.done( function () {
			location.href = mw.util.getUrl( page, { redirect: 'no' } );
		} )
		.fail( function ( error ) {
			var title = page.replace( /_/g, ' ' );
			mw.notify(
				'Die Verküpfung von Datenobjekt ' + id + ' mit ' + title + ' ist fehlgeschlagen: ' + error,
				{ type: 'error' }
			);
		} );
	}

	function init( $content ) {
		$content.find( 'a[class="external text"][href^="https://www.wikidata.org/wiki/Special:NewItem?"]' )
		.on( 'click', function ( e ) {
			var href, site, page, $link = $( this );

			href = $link.attr( 'href' );
			site = mw.util.getParamValue( 'site', href );
			page = mw.util.getParamValue( 'page', href );

			// Input validation
			if ( site !== mw.config.get( 'wgDBname' ) ||
				page !== mw.config.get( 'wgPageName' )
			) {
				return;
			}

			e.preventDefault();
			$link.addClass( 'wikidata-redirect-linker-in-progress' );

			linkAndLoad( 'new', site, page )
			.done( function () {
				$link.remove();
			} )
			.fail( function () {
				$link.removeClass( 'wikidata-redirect-linker-in-progress' );
			} );
		} );

		$content.find( 'a[class="external text"][href^="https://www.wikidata.org/wiki/Special:SetSiteLink?"]' )
		.on( 'click', function ( e ) {
			var href, site, id, page, $link = $( this );

			href = $link.attr( 'href' );
			site = mw.util.getParamValue( 'site', href );
			id = mw.util.getParamValue( 'id', href );
			page = mw.util.getParamValue( 'page', href );

			// Input validation
			if ( site !== mw.config.get( 'wgDBname' ) ||
				!/^Q\d+$/.test( id ) ||
				page !== mw.config.get( 'wgPageName' )
			) {
				return;
			}

			e.preventDefault();
			$link.addClass( 'wikidata-redirect-linker-in-progress' );

			linkAndLoad( id, site, page )
			.done( function () {
				$link.remove();
			} )
			.fail( function () {
				$link.removeClass( 'wikidata-redirect-linker-in-progress' );
			} );
		} );

		if ( mw.config.get( 'wgIsRedirect' ) &&
			mw.config.exists( 'wgWikibaseItemId' )
		) {
			$content.find( '.redirectMsg' )
				.append(
					$( '<button>' ).text( 'Sjabloon koppelen' ).on( 'click', function ( e ) {
						e.target.disabled = true;
						setSiteLink(
							mw.config.get( 'wgWikibaseItemId' ),
							mw.config.get( 'wgDBname' ),
							mw.config.get( 'wgPageName' )
						)
						.done( function () {
							e.target.remove();
						} )
						.fail( function ( error ) {
							mw.notify(
								'Das Eintragen der Vorlage ist fehlgeschlagen: ' + error,
								{ type: 'error' }
							);
							e.target.disabled = false;
						} );
					} )
				);
		}
	}

	mw.hook( 'wikipage.content' ).add( init );

} );
// </nowiki>