Szerkesztő:Tilar Vehulor/navbox-unify.js

Megjegyzés: közzététel után frissítened kell a böngésződ gyorsítótárát, hogy lásd a változásokat.

  • Firefox / Safari: tartsd lenyomva a Shift gombot és kattints a Frissítés gombra a címsorban, vagy használd a Ctrl–F5 vagy Ctrl–R (Macen ⌘–R) billentyűkombinációt
  • Google Chrome: használd a Ctrl–Shift–R (Macen ⌘–Shift–R) billentyűkombinációt
  • Internet Explorer / Edge: tartsd nyomva a Ctrl-t, és kattints a Frissítés gombra, vagy nyomj Ctrl–F5-öt
  • Opera: Nyomj Ctrl–F5-öt
(function() {
	"use strict";
	
	function unifyNavbox() {
		var result = $("#wpTextbox1").val();
		
		// navbox2 substolása, ha ez van használatban
		// ezután el kell menteni a sablont, majd a substolt (magyarított) verziót még egyszer megnyitni és javítani ezzel a scripttel
		if (result.match(/\{\{[Nn]avbox2/g)) {
			result = result.replaceAll(/\{\{[Nn]avbox2/g, "{{subst:Navbox2");
			$("#wpTextbox1").val(result);
			
			alert("A módosítandó szövegben {{Navbox2}} volt, ami most substolva lett, más változás nem történt.\nMost mentsd el a lapot, majd a substolt, magyar paraméterneveket tartalmazó szöveget javítsd ki újra ezzel a scripttel.\n(Ha nem akarod, hogy ez az üzenet minden substoláskor megjelenjen, tegyél // jelet a scriptben az \"alert\" kezdetű sor elejére.)");
			
			return;
		}
		
		// szóköz törlése a paraméternevek elől ("\n | csoport1=" -> "\n|csoport1=")
		result = result.replaceAll(
			/[ \n]*\| *((csoport|lista)[0-9]+(osztály|stílus)?|(csoport|lista)(osztály|stílus)|(alul|felül)(osztály|stílus)?|(bal)?kép|név|cím|állapot)/g,
			"\n|$1"
		);
		
		// paraméternevek kipótlása szóközzel 10 karakterre (9 karakter + még egy szóköz) ("|lista1=" -> "|lista1    =")
		result = result.replaceAll(
			/\n\|((csoport|lista)[0-9]+(osztály|stílus)?|(csoport|lista)(osztály|stílus)|(alul|felül)(osztály|stílus)?|(bal)?kép|név|cím|állapot) *=/g,
			(match, p1) => ("\n|" + p1.padEnd(9, " ") + " =")
		);
		
		// "|paraméternév = érték"-ben szóköz az egyenlőségjel után
		result = result.replaceAll(
			/\n\|((csoport[0-9]+|(csoport|lista)(osztály|stílus)|(alul|felül)(osztály|stílus)|(bal)?kép|név|cím|állapot) *)= */g,
			"\n|$1= "
		);
		
		// szóköz törlése sor végi egyenlőségjel után
		result = result.replaceAll(/= +\n/g, "=\n");
		
		// paraméter végén lévő pötty törlése
		result = result.replaceAll(/[ \n]*((\{\{(·|•|,)\}\})|·|•)[ \n]*(?=\n\|)/g, "");
		
		// {{·}}, {{•}}, {{,}} sablonok cseréje felsorolásra
		// csak a "|listaN =" paraméterek értékében
		result = result.replaceAll(
			/(\n\|lista[0-9]+ *=) *([^ ][^\n]*[^ ])[ \n]*/g,
			(match, p1, p2) => (p1 + "\n* " + p2.replaceAll(/[ \n]*((\{\{(·|•|,)\}\})|·|•)[ \n]*/g, "\n* "))
		);
		
		// {{·}}, {{•}}, {{,}} sablonok cseréje felsorolásra
		// mindenhol
		result = result.replaceAll(/[ \n]*((\{\{(·|•|,)\}\})|·|•)[ \n]*/g, "\n* ");
		
		// •, • cseréje felsorolásra
		result = result.replaceAll(/[ \n]*&bull(et)?;[ \n]*/g, "\n* ");
		
		// sor végi   törlése
		result = result.replaceAll(/ *  *\n/g, "\n");
		
		// <br />, <br> cseréje felsorolásra
		// sokszor felesleges, inkább kiveszem
		//result = result.replaceAll(/[ \n]*<br ?\/?>[ \n]*/g, "\n* ");
		
		// <br />, <br> cseréje üres sorra
		// lehet, hogy ez jobb
		//result = result.replaceAll(/[ \n]*<br ?\/?>[ \n]*/g, "\n\n");
		
		// felsorolásjelben legyen szóköz ("\n*szöveg" -> "\n* szöveg")
		result = result.replaceAll(/\n(\*+) */g, "\n$1 ");
		
		// paraméter végén lévő <br>, <br /> törlése
		result = result.replaceAll(/ *<br ?\/?> *(\n+)\|/g, "$1|");
		
		// csoportNstílus törlése, ha üres
		result = result.replaceAll(/(\|csoport[0-9]+stílus[ \n]*=[ \n]*)(?=\|)/g, "");
		
		// címstílus, csoportstílus törlése, ha üres
		result = result.replaceAll(/(\|(cím|csoport)stílus[ \n]*=[ \n]*)(?=\|)/g, "");
		
		// "|listaosztály = hlist" beszúrása az első csoport elé
		result = result.replaceAll(/[ \n]*(([ \n]*\|csoport1 *=[^\n]*)?(\n\|lista1 *=))/g, "\n|listaosztály = hlist\n$1");
		
		// duplikált "|listaosztály = hlist" javítása
		result = result.replaceAll("\n|listaosztály = hlist\n|listaosztály = hlist\n", "\n|listaosztály = hlist\n");
		
		// "|listaN =" után sortörés
		//result = result.replaceAll(/(lista[0-9]+[ \n]*=)[ \n]*/g, "$1\n* ");
		
		// üres sor beszúrása minden csoport elé
		result = result.replaceAll(/[ \n]*((\n\|csoport[0-9]+ *=[^\n]*)?(\n\|lista[0-9]+ *=))/g, "\n$1");
		
		// minden csoportN előtt egy üres sor
		//result = result.replaceAll(/\n(\|csoport[0-9]+[ \n]*=)/g, "\n\n$1");
		
		// {{navbox|...}}, {{navbox alcsoport|...}} csere nagy kezdőbetűre
		result = result.replaceAll("{{navbox", "{{Navbox");
		
		// {{navoszlop|...}} csere nagy kezdőbetűre
		result = result.replaceAll("{{navoszlop", "{{Navoszlop");
		
		// {{Navbox|gyerek|...}}, {{Navbox|alcsoport|...}} -> {{Navbox alcsoport|...}}
		result = result.replaceAll(/=[ \n]*\*[ \n]*\{\{Navbox *\| *(gyerek|alcsoport) */g, "= {{Navbox alcsoport");
		
		// {{Navbox alcsoport|...}} előtt ne legyen felsorolásjel
		result = result.replaceAll(/=[ \n]*\*[ \n]*\{\{Navbox alcsoport/g, "= {{Navbox alcsoport");
		
		// "{{Navbox alcsoport" után legyen üres sor
		result = result.replaceAll(/\{\{Navbox alcsoport[ \n]*/g, "{{Navbox alcsoport\n\n");
		
		// {{Navbox alcsoport|...}}-ban ne legyen még egyszer "|listaosztály = hlist"
		result = result.replaceAll(/(\{\{Navbox alcsoport)([^\}]*)(\n\|listaosztály *= *hlist *\n\n?)/g, "$1$2\n");
		
		// {{Navbox alcsoport|...}}-ot lezáró }} legyen külön sorban
		// sokszor feleslegesen módosít, kivettem
		//result = result.replaceAll(/(\n\|lista[0-9]+ *=) *((\n\* [^\n]*)+)\}\}\n(?=\|)*/g, "$1$2\n}}\n\n");
		
		// "|alul =" és "|felül =" előtt üres sor
		result = result.replaceAll(/[ \n]*(\|(alul|felül) *=)/g, "\n\n$1");
		
		// "|alul =" és "|felül =" átalakítás listává, -osztály = hlist hozzáadása
		result = result.replaceAll(
			/\|((alul|felül) *=) *([^ ][^\n]*)/g,
			(match, p1, p2, p3) => ("|" + p2 + "osztály = hlist\n" +"|" + p1 + "\n* " + p3.replaceAll(/[ \n]*\{\{(·|•|,)\}\}[ \n]/g, "\n* "))
		);
		
		// üres felsorolásos sorok törlése
		result = result.replaceAll(/\n\*+ *(?=\n)/g, "");
		
		// "}}</includeonly>" előtt egy üres sor
		result = result.replaceAll(/[ \n]*(\}\}[ \n]*<\/includeonly>)/g, "\n\n}}</includeonly>");
		
		// </includeonly> és <noinclude> közötti szóköz, új sor törlése
		result = result.replaceAll(/<\/includeonly>[ \n]*<noinclude>/g, "</includeonly><noinclude>");
		
		// [[kategória: csere nagy kezdőbetűre
		result = result.replaceAll("[[kategória:", "[[Kategória:");
		
		// kategóriák külön sorba
		result = result.replaceAll(/[ \n]*(\[\[Kategória:[^\]]+\]\])/g, "\n$1");
		result = result.replaceAll(/(\[\[Kategória:[^\]]+\]\])[ \n]*/g, "$1\n");
		
		// {{Navboxdoc}} -> {{Navbox sablondokumentációja}}
		result = result.replaceAll(/\{\{[Nn]avboxdoc[ \n]*(\||\}\})/g, "{{Navbox sablondokumentációja$1");
		
		// {{navbox sablondokumentációja}} csere nagy kezdőbetűre
		result = result.replaceAll("{{navbox sablondokumentációja", "{{Navbox sablondokumentációja");
		
		// {{Navbox sablondokumentációja}} külön sorba
		result = result.replaceAll(/[ \n]*\{\{Navbox sablondokumentációja([^\}]*)\}\}[ \n]*/g, "\n{{Navbox sablondokumentációja$1}}\n");
		
		// az elején ne legyen üres sor, a végén 1 legyen
		result = result.trim() + "\n";
		
		// <includeonly>...</includeonly> pótlása
		if (!result.includes("<includeonly>") && !result.includes("</includeonly>")) {
			result = "<includeonly>" + result;
			result = result.replaceAll("<noinclude>", "</includeonly><noinclude>");
		}
		
		// <noinclude>...</noinclude> pótlása, ha egyik sincs
		if (!result.includes("<noinclude>") && !result.includes("</noinclude>")) {
			result = result.replaceAll(/<\/includeonly>((.|\n)*)$/g, "</includeonly><noinclude>$1</noinclude>\n");
		}
		
		// </noinclude> pótlása, ha <noinclude> van
		if (result.includes("<noinclude>") && !result.includes("</noinclude>")) {
			result = result + "</noinclude>\n";
		}
		
		// lezáró }} előtt üres sor
		result = result.replaceAll(/\n+\}\}<\/includeonly><noinclude>/g, "\n\n}}</includeonly><noinclude>");
		
		// {{Navbox sablondokumentációja}} pótlása, ha nincs
		if (!result.includes("{{Navbox sablondokumentációja")) {
			result = result.replaceAll("<noinclude>", "<noinclude>\n{{Navbox sablondokumentációja}}");
		}
		
		// sor végi szóközök törlése
		result = result.replaceAll(/ +\n/g, "\n");
		
		// alsablonok paramétereinek behúzása
		var lines = result.split("\n");
		var level = 0;
		for (var i = 0; i < lines.length; i++) {
			if (lines[i].match(/^\|[0-9a-záéíóöőúüű]+ *=/)) {
				lines[i] = "  ".repeat(level - 1) + lines[i];
			}
			var opener = (lines[i].match(/\{/g) || []).length;
			var closer = (lines[i].match(/\}/g) || []).length;
			level = level + Math.floor((opener - closer) / 2);
			if (level < 0) {level = 0;}
		}
		result = lines.join("\n");
		
		$("#wpTextbox1").val(result);
	}
	
	function splitInfobox() {
		var result = $("#wpTextbox1").val();
		
		result = result.replaceAll(
			/\{\{([0-9a-záéíóöőúüű ]+ infobox) *((\| *([^=\|\{\}]+) *= *(([^=\|\{\}]|\[\[[^\[\]]+\]\]|\{\{[^\{\}]+\}\})*))*)\}\}[ \n]*/gi,
			(match, p1, p2) => (
				"{"+"{" + p1 +
				p2.replaceAll(/\| *([^=\|\{\}]+) *= *(([^=\|\{\}]|\[\[[^\[\]]+\]\]|\{\{[^\{\}]+\}\})*)/g, "\n|$1 = $2") +
				"\n}}\n\n")
		);
		
		$("#wpTextbox1").val(result);
	}
	
	var $menu = $("<div>")
		.attr("style", "border: 1px solid #808080; margin: 4px 0px; padding: 2px 4px;");
	$("<a>")
		.attr("id", "unify-navbox")
		.attr("href", "#")
		.text("Navbox egységesít")
		.click(unifyNavbox)
		.appendTo($menu);
	$("<span>")
		.html(" &middot; ")
		.appendTo($menu);
	$("<a>")
		.attr("id", "split-infobox")
		.attr("href", "#")
		.text("Infobox tördelése")
		.click(splitInfobox)
		.appendTo($menu);
	$("#specialchars").after($menu);
	
}) ();