MediaWiki:Gadget-collect-references.js

Fra Wikipedia, den frie encyklopedi

Merk: Etter publisering vil det kanskje være nødvendig å slette mellomlageret i nettleseren din for å se endringene.

  • Firefox / Safari: Hold Shift mens du klikker på Oppdater, eller trykk enten Ctrl+F5 eller Ctrl+R (⌘+R på Mac)
  • Google Chrome: Trykk Ctrl+Shift+R (⌘+Shift+R på Mac)
  • Internet Explorer / Edge: Hold Ctrl mens du trykker på Oppdater eller trykk Ctrl+F5
  • Opera: Ttrykk Ctrl+F5.
// Code for gadget to collect references.
// © John Erling Blad, Creative Commons by Attribution 3.0
(function(){
	"use strict";
	var messages = {
		'en': {
			'error same group': 'Several "references" has the same "group", it should only be one entry for each group.',
			'error missing group': 'A "ref" use a "group" without any "references" using the same "group", there should be entries for all groups.',
			'error lost refs': 'Seems like we lost some references during processing, this is assumed to be a critical error.',
			'warning changed refs': 'Verify that nothing has been corrupted in the process.',
			'info changed refs': 'Navngitte referanser er samlet i referanseseksjonen',
			//'info changed refs': 'Navngitte referanser er samlet i referanseseksjonen',
			'info no changed refs': 'Nothing changed in the text',
			'button value': 'Collect references',
			'button title': 'Collect named references in the "References" section'
		},
		'nb': {
			'error same group': 'Flere "references" har samme "group", det skal kun være en oppføring per gruppe.',
			'error missing group': 'En "ref" bruker en "group" uten at noen "references" bruker samme "group", det må være oppføringer for alle grupper. :',
			'error lost refs': 'Det ser ut som om vi har mistet noen referanser under prosesseringen, dette er antatt å være en kritisk feil.',
			'warning changed refs': 'Kontroller at ingenting har blitt ødelagt i prosesseringen, bruk «Vis endringer».',
			'info changed refs': 'Navngitte referanser er samlet i referanseseksjonen',
			'info no changed refs': 'Ingenting er endret i teksten',
			'button value': 'Samle referanser',
			'button title': 'Samle navngitte referanser i «Referanser»-seksjonen'
		},
		'nn': {
			'error same group': 'Fleire "references" har same "group", det skal kun væra ei oppføring per gruppe.',
			'error missing group': 'Ein "ref" brukar ei "group" utan at nokon "references" brukar same "group", det må væra oppføringar for alle grupper.',
			'error lost refs': 'Det ser ut som om vi har mista nokon referansar under prosesseringa, dette er antakeleg ein kritisk feil.',
			'warning changed refs': 'Kontroller at ingenting har blitt øydelagt i prosesseringa, bruk «Vis endringar».',
			'info changed refs': 'Navngitte referanser er samlet i referanseseksjonen',
			//'info changed refs': 'Navngjevne referansar er samla i «Kjelde»-seksjonen',
			'info no changed refs': 'Ingenting er endra i teksten',
			'button value': 'Samle kjelder',
			'button title': 'Samle navngjevne kjelder i «Kjelde»-seksjonen'
		}
	};
	var conf = mw.config.get([
		'wgUserLanguage',
		'wgIsProbablyEditable',
		'wgIsRedirect',
		'wgAction',
		'wgNamespaceNumber',
		'wgPageContentModel'
	]);
	var lang = conf.wgUserLanguage ? conf.wgUserLanguage : 'nb';
	var msg = messages[lang];
	if ( !msg ) {
		msg = messages.en;
	}
	if ( !conf.wgIsProbablyEditable
		|| conf.wgIsRedirect
		|| conf.wgAction !== 'edit'
		|| !(
			conf.wgNamespaceNumber === 0  // main
			|| conf.wgNamespaceNumber === 5  // wikipedia
			|| conf.wgNamespaceNumber === 7  // file
			|| conf.wgNamespaceNumber === 13 // help
			|| conf.wgNamespaceNumber === 17 // portal
		)
		|| conf.wgPageContentModel !== "wikitext" ) {
			return;
	}
	var $editForm = $( '#editform' );
	var $textbox = $( '#wpTextbox1' );
	var $summary = $( '#wpSummary' );
	var $section = $editForm.find( "input[name='wpSection']" );
	if ( $section && $section.first().val() !== '' ) {
		// section editing, can't collect refs then
		return;
	}
	var collect = function() {
		var references = {};
		var text = $textbox.val();
		var refs = text.match( /<ref\n/ig );
		var refCount = refs ? refs.length : 0;
		// strip out <references/>, this is necessary to get all the group entries
		// the way this is done is slightly awkward as we pull the strings out and put them back in
		text = text.replace(
			/<((references)\b([^>]*))\/>/ig,
			function( match, head, tag, args ) {
				var group = args.match( /\bgroup\s*=\s*("[^"]+"|[^\s>]+ )/i);
				group = group ? group[1].replace( /^"|"$/g, '' ) : '';
				if ( references[group] ) throw( msg['error same group'] );
				references[group] = '';
				return match;
			}
		);
		// strip out <references></references>, keep the content for later in a group-specific structure
		text = text.replace(
			/<((references)\b([^>]*))>([\s\S]*?)<\/\2>/ig,
			function( match, head, tag, args, refs ) {
				var group = args.match( /\bgroup\s*=\s*("[^"]+"|[^\s>]+ )/i);
				group = group ? group[1].replace( /^"|"$/g, '' ) : '';
				if ( references[group] ) throw( msg['error same group'] );
				references[group] = refs;
				return '<' + head + '/>';
			}
		);
		// strip out <ref name=""></ref>, we leave those without a name in the text
		text = text.replace(
			/<((ref)\b([^\/>]*\bname\s*=\s*("[^"]+"|[^\/\s>]+)[^\/>]*))>([\s\S]*?)<\/\2>/ig,
			function( match, head, tag, args, name, content ){
				var group = args.match( /\bgroup\s*=\s*("[^"]+"|[^\s>]+)/i );
				group = group ? group[1].replace( /^"|"$/g, '' ) : '';
				if ( references[group] === undefined ) throw( msg['error missing group'] + group );
				if ( content !== '' ) references[group] += "\n" + match;
				return "<" + head + "/>";
			}
		);
		for (var group in references) {
			var items = [];
			references[group] = references[group].replace(
				/\s*(<((ref)\b([^\/>]*\bname\s*=\s*("[^"]+"|[^\/\s>]+)[^\/>]*))>([\s\S]*?)<\/\3>)\s*/ig,
				function( match, ref, head, tag, args, name, content ){
					var warp = name
					.replace( /^"|"$/g, '' )
					.replace(/^(\D+)(\d+)$/,
						function( match, str, num ) {
							return str + ('        '+num).slice(-8);
						}
					);
					items.push( [warp, match] );
					return "\n";
				}
			);
			items = items
			.sort(function( a, b ){
				return a[0].localeCompare( b[0] );
			})
			.map(function(a){ return a[1]; })
			.join("\n");
			references[group] = references[group].replace(/\s+$/, '') + "\n" + items;
		}
		// put back <references></references>
		text = text.replace(
			/<((references)\b([^>]*))\/>/ig,
			function( match, head, tag, args ) {
				var group = args.match( /\bgroup\s*=\s*("[^"]+"|[^\s>]+)/i );
				group = group ? group[1].replace( /^"|"$/g, '' ) : '';
				if ( references[group] === undefined ) return match;
				refs = references[group].replace( /^\s*|\s*$/, "" );
				if (refs.length >0)
					return group
						? ( '<references group="' + group + '">\n' + refs + '\n</references>' )
						: ( '<references>\n' + refs + '\n</references>' );
				else
					return group
						? ( '<references group="' + group + '" />' )
						: ( '<references />' );
			}
		);
		refs = text.match( /<ref\n/ig );
		if ( refs && refCount !== refs.length ) {
			throw( msg['error lost refs'] );
		}
		if ( $textbox.val() != text ) {
			$textbox.val( text );
			if ($summary.val() === '') {
				$summary.val( msg['info changed refs'] );
			}
			mw.notify( msg['warning changed refs'] );
		}
		else {
			mw.notify( msg['info no changed refs'] );
		}
	};
	if ( conf.wgAction === "edit" ) {
		var $editButtons = $editForm.find( '.editButtons' ).first();
		$( '<input>' )
		.attr({
			id: "wpCollect",
			type: "button",
			value: msg['button value'],
			title: msg['button title']
		})
		.insertAfter( $editButtons.find( 'input' ).last() )
		.click( function() {
			try {
				collect();
			}
			catch( err ) {
				mw.notify( err );
			}
		});
	}
}());