MediaWiki:Gadget-collect-references.js
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 );
}
});
}
}());