Benutzer:Schnark/js/virtuelleEinzelnachweise.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
//Dokumentation unter [[Benutzer:Schnark/js/virtuelleEinzelnachweise]] <nowiki>
/*global mediaWiki*/

(function ($, mw) {
"use strict";

function getMissingRefs ($preview) {
	var missing = [];
	$preview.find('sup.reference a').each(function () {
		var id = this.href.replace(/.*#/, '');
		if (!document.getElementById(id) && $.inArray(id, missing) === -1) {
			missing.push(id);
		}
	});
	return missing;
}

function parseAllRefs (callback) {
	$.post(mw.util.wikiScript('api'), {
		action: 'parse',
		title: mw.config.get('wgPageName'),
		text: $('#wpTextbox1').val() + '\n\n<div id="virtuelleEinzelnachweiseHilfstext">{{:{{PAGENAME}}}}</div>',
		prop: 'text',
		format: 'json',
		formatversion: 2
	}, function (json) {
		if (json && json.parse && json.parse.text) {
			callback($.parseHTML('<div style="display:none;">' + json.parse.text + '</div>'));
		}
	});
}

function filterBacklinks () {
	/*jshint validthis: true*///expliziter Kontext durch $.fn.filter
	return $(document.getElementById(
		$(this).attr('href').replace(/.*#/, '')
	)).is('#virtuelleEinzelnachweiseHilfstext *');
}

function extractMissingRefs (content, missing) {
	var i, html = [], ref, $content = $(content);
	$('body').prepend($content);
	for (i = 0; i < missing.length; i++) {
		ref = document.getElementById(missing[i]);
		if (ref) {
			$(ref).find('.mw-cite-backlink a').filter(filterBacklinks).remove();
		}
		html.push(mw.html.element('li', {id: missing[i]}, new mw.html.Raw(
			ref ? ref.innerHTML : mw.html.element('span', {'class': 'error'}, mw.msg('schnark-virt-refs-error'))
		)));
	}
	$content.remove();
	return html.join('');
}

function addVirtualRefs ($preview) {
	var missing = getMissingRefs($preview);
	if (missing.length === 0) {
		return;
	}
	parseAllRefs(function (content) {
		var $virtRefs = $(mw.html.element('ol',
			{'class': 'references', style: 'background-color: #ddd;'}, new mw.html.Raw(
				extractMissingRefs(content, missing)
			)));
		mw.hook('wikipage.content').fire($virtRefs);
		$preview.append($virtRefs);
	});
}

function initL10N (l10n) {
	var i, chain = mw.language.getFallbackLanguageChain();
	for (i = chain.length - 1; i >= 0; i--) {
		if (chain[i] in l10n) {
			mw.messages.set(l10n[chain[i]]);
		}
	}
}

function init ($content) {
	if ($content.find('#wikiPreview').length === 1) {
		$content = $content.find('#wikiPreview');
	}
	$content.find('ol.references:has(span.mw-ext-cite-warning)').remove(); //MW versucht hilfreich zu sein, ist es aber nicht
	addVirtualRefs($content);
}

if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) > -1) {
	mw.loader.using(['mediawiki.util', 'mediawiki.language'], function () {
		initL10N({
			en: {
				'schnark-virt-refs-error': 'Reference error!'
			},
			de: {
				'schnark-virt-refs-error': 'Einzelnachweisfehler!'
			}
		});
		mw.hook('wikipage.content').add(init);
	});
}

})(jQuery, mediaWiki);
//</nowiki>