Benutzer:Revolus/Datei-syntax-updater.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
/**
 * Aus [[:de:Benutzer:Revolus/Datei-syntax-updater.js]]
 * Einbinden mit    importScript("Benutzer:Revolus/Datei-syntax-updater.js");   in deine [[Spezial:Mypage/monobook.js]]
 */

function rev_syntax() {
	var eb = document.getElementById("wpTextbox1");
	if(!eb || eb.getAttribute("readonly")) return;
	
	function vllt(s) { return "(?:" + s + ")?"; }
	function trim(s) { return "\\s*" + s + "\\s*"; }
	function link(s) { return "\\[\\[" + s + "\\]\\]"; }
	function extl(s) { return "\\[" + s + "\\]"; }
	function oder(a) { return "(?:" + a.join("|") + ")"; }
	
	var plainZeichen = "[^\\|\\[\\]\\{\\}]";
	var htmlZeichen  = "[^\\|\\[\\]\\{\\}]";
	
	var dateiPattern    = "[ _]*"+ oder(["[Dd][Aa][Tt][Ee][Ii]", "[Ff][Ii][Ll][Ee]", "[Bb][Ii][Ll][Dd]", "[Ii][Mm][Aa][Gg][Ee]"]) + "[ _]*:[ _]*" + "(" + plainZeichen + "+?)[ _]*";
	var extlinkPattern  = extl(plainZeichen+"+" + vllt(" "   + plainZeichen+"*"));
	var wikilinkPattern = link(plainZeichen+"+" + vllt("\\|" + plainZeichen+"*"));
	var paramPattern    = oder([plainZeichen+"*?", wikilinkPattern, extlinkPattern]);
	
	var innerRegex = new RegExp(trim("(" + paramPattern + "*?)") + "(\\||$)", "g");
	var outerRegex = new RegExp(link(dateiPattern + vllt("\\|(" + vllt(oder(["\\|", paramPattern])+"*") + ")")), "g");
	
	function bildHandler(_, file, attrs) {
		var nowiki = false;
		var texts = [];
		
		var attribute = {
			"miniatur":  false,
			"gerahmt":   false,
			"rahmenlos": false,
			"rand":      false,
			"links":     false,
			"rechts":    false,
			"ohne":      false,
			"zentriert": false,
			
			"pixel":     "",
			"seite":     "",
			"hochkant" : "",
			"verweis":   "",
			"alternativtext": ""
		};
		
		function deepReplace(_, str, delim) {
			if((str.length <= 0) || nowiki) {
				return "";
			}
			if(str.indexOf("<nowiki") >= 0) {
				nowiki = true;
				return "";
			}
			
			switch(str) {
				case("thumb"): case("thumbnail"): case("miniatur"):
					attribute["miniatur"] = true;
					return "";
				case("left"): case("links"):
					attribute["links"] = true;
					return "";
				case("right"): case("rechts"):
					attribute["rechts"] = true;
					return "";
				case("none"): case("ohne"):
					attribute["ohne"] = true;
					return "";
				case("center"): case("centre"): case("zentriert"):
					attribute["zentriert"] = true;
					return "";
				case("frame"): case("framed"): case("enframed"): case("gerahmt"):
					attribute["gerahmt"] = true;
					return "";
				case("frameless"): case("rahmenlos"):
					attribute["rahmenlos"] = true;
					return "";
				case("border"): case("rand"):
					attribute["rand"] = true;
					return "";
				case("upright"): case("hochkant"):
					attribute["hochkant"] = true;
					return "";
				default: {
					var e = /^(page|seite|upright|hochkant|alt(?:ernativtext)?|link|verweis)=\s*(.*?)\s*$/.exec(str);
					if(e) {
						switch(e[1]) {
							case("page"):
							case("seite"):
								// ignorieren: ich konnte noch nicht herausfinden,
								// was das überhaupt ist ...
								break;
							case("upright"):
							case("hochkant"):
								attribute["hochkant"] = "hochkant=" + e[2];
								return "";
							case("alt"):
							case("alternativtext"):
								attribute["alternativtext"] = "alternativtext=" + e[2];
								return "";
							case("link"):
							case("verweis"):
								attribute["verweis"] = "verweis=" + e[2];
								return "";
						}
					}
					e = /^\s*(\d*x?\d+px)\s*$/.exec(str);
					if(e) {
						attribute["pixel"] = e[1];
						return "";
					}
				}
			}
			texts.push(str);
			return "";
		}
		
		if(!attrs || (attrs.length == 0)) {
			return "[[Datei:" + file + "]]";
		} else {
			attrs.replace(innerRegex, deepReplace);
			if(nowiki) {
				return "[[Datei:" + file + "|" + attrs + "]]";
			} else {
				var mitte = "";
				if(attribute["miniatur"]) {
					attribute["rechts"] = false;
				}
				for(var i in attribute) {
					var mitteAlt = mitte;
					switch(typeof(attribute[i])) {
						case("boolean"): if(attribute[i]) {
							mitte += "|" + i;
						} break;
						case("string"): if(attribute[i].length > 0) {
							mitte += "|" + attribute[i];
						} break;
					}
				}
				var rechts = "";
				for(var i = 0; i < texts.length; ++i) {
					rechts += "|" + texts[i];
				}
				return "[[Datei:" + file + mitte + rechts + "]]";
			}
		}
	}
	
	eb.value = eb.value.replace(outerRegex, bildHandler);
}

if(
	(mw.config.get('wgAction') === "edit") &&
	(mw.config.get('wgNamespaceNumber') === 0) &&
	("x".replace(/x/, function() {
		 /* schlechte IE-Versionen verstehen das evtl. nicht */
		return "y";
	}) === "y")
) {
	$(rev_syntax);
}