MediaWiki-diskusjon:Gadget-collect-references.js

message: Forslag til oppdatert kode. — Jeblad 7. sep. 2015 kl. 02:39 (CEST)
* Bugfix i regex for å parse name attributt.
* Feature for å sortere referanselista.
Oppdatert kode for tilleggsfunksjonen	                 	                        		                                          	                                     	                                     		
// 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 , 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 , 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 , 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 
		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
						? ( '\n' + refs + '\n' )
						: ( '\n' + refs + '\n' );
				else
					return group
						? ( '' )
						: ( '' );
			}
		);
		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 );
			}
		});
	}
}());
replies: text: Når jeg limer koden inn får jeg gul varseltrekant på linje 127: Don't make funktions within a loop.. Må den fikses, eller kan koden likevel oppdateres? Cocu (d) 7. sep. 2015 kl. 09:06 (CEST)
replies: text: :Det er Lint som oppdager at en funksjon lages flere ganger, men faktisk skjer dette med tre forskjellige funksjoner i samme for-loop. To av dem kan trekkes ut, men jeg har ikke gjort det. I koden brukes det nokså mage kall hvor closure brukes for å ta vare informasjon om funksjonenes kjøremiljø, derfor brukes det såvidt mange anonyme funksjoner. Dette er en vanlig programmeringsteknikk i Javascript. Det er mulig å forenkle koden, men da blir den mer ulesbar. Tror den kan lagres som den er. — Jeblad 7. sep. 2015 kl. 11:34 (CEST)
replies: text: ::Den er god! Da er koden oppdatert. Cocu (d) 7. sep. 2015 kl. 12:25 (CEST)
thread_title: Oppdatert kode