MediaWiki:RessourceLoader.js

aus Kamelopedia, der wüsten Enzyklopädie
Wechseln zu: Navigation, Suche

Hinweis: Leere nach dem Speichern 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: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen
"use strict";
 
/**
 * Der Kamelopedia ihr eigener RessourceLoader!
 * Doku: http://kamelopedia.net/wiki/MediaWiki_Diskussion:RessourceLoader.js
 */
(function() {
	if (!window.kp)
		window.kp = {};
 
	if (!window.kp.util)
		window.kp.util = {};
 
	kp.util.isString = function (s) {
		return (s instanceof String) || (typeof s === 'string');	
	};
 
	kp.util.isNumber = function (s) {
		return (s instanceof Number) || (typeof s === 'number');	
	};
 
	kp.util.mkUrl = function (args) {
		// benutze kein wgXxx oder mw.config.get(...) das müsste ggf. erst nachgeladen werden
		return location.origin+"/index.php?"+$.param(args);
	}
 
	kp.loader = {};
	for (var k in mw.loader)
		kp.loader[k] = mw.loader[k];
 
	var loadedWikipages = {};
 
	var translate = function(data, callback) {
		var modules = [];
		var events = [];
 
		if (!(data instanceof Array)) {
			// Liste von einzeln zu übersetzenden Einträgen
			return translate([data], callback);
		}
 
		for (var i=0; i<data.length; i++){
			if (!kp.util.isString(data[i])) {
				// Kein String, gehe von einem Deferred aus, direkt an jQuery weitergeben!
				events.push(data[i]);
			} else if (/^\[\[.*\]\]$/.test(data[i])) {
				// String mit [[...]]
				var wikipage = data[i].substring(2, data[i].length - 2);
				if (loadedWikipages[wikipage] !== undefined) {
					// Ignorieren, da bereits geladen
				} else if (wikipage.endsWith(".js")) {
					// Wikiseiten-Javascript-Modul implementieren und hinzufügen
					var sc = $.getScript(kp.util.mkUrl({title:wikipage, action:"raw", ctype:"text/javascript", smaxage:21600, maxage:86400}));
					events.push(sc);
					loadedWikipages[wikipage] = 1;
				} else if (wikipage.endsWith(".css")) {
					// Wikiseiten-CSS-Modul: Wird nie vom Script benötigt, d.h. immer .load() statt .using()!
					mw.loader.load(kp.util.mkUrl({title:wikipage, action:"raw", ctype:"text/css", smaxage:21600, maxage:86400}), 'text/css');
					loadedWikipages[wikipage] = 1;
				}
			} else {
				// Nichts umzuwandeln, gehe von einem Modulnamen aus, direkt an den Loader weitergeben
				modules.push(data[i]);
			}
		}
 
		return callback(modules, events);
	};
 
	kp.loader.load = function(data, dtype, async) {
		return translate(data, function(modules, events){
			if (modules)
				return mw.loader.load(modules, dtype, async);
		});	
	};
 
	kp.loader.using = function(data, ready, error) {
		return translate(data, function(modules, events){
			if (events.length == 0) {
				// einfach nur den Loader aufrufen
				return mw.loader.using(modules, ready, error);
			} else {
				// Loader aufrufen und auf Events warten
				events = events.concat(mw.loader.using(modules));
				return $.when.apply(null, events).then(ready, error);
			}
		});	
	};
})();