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
- Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
/* ==============================================================================================
Zutatenumrechner 0.43 von Finn Pauls ([[Benutzer:Finn]])
============================================================================================== */
addOnloadHook(
function () {
/* Stylesheet einbinden
Klassen: zum_aktiviert und zum_deaktiviert*/
importStylesheet('Benutzer:Finn/zutatenrechner.css');
document.getElementsByTagName("table")[0].innerHTML = document.getElementsByTagName("table")[0].innerHTML.replace(/<td>\s*Rezeptmenge\sfür\:\s*<\/td><td>\s*(\d+)–(\d+)\s([A-Za-zäÄöÖüÜß]+)/g, '<td> Rezeptmenge für: </td><td><span id="zum_print" class="zum_printonly">$1</span><input class="zum_noprint" style="display:none;" id="zum_input" type="text" size="4" maxlength="5" value="$1" onkeydown="javascript:enter_als_ok(event)" onchange="javascript:bis_menge_neu();">–<span id="zum_bis_menge">$2</span> <span id="zum_mengenart">$3</span><button class="zum_noprint" style="display:none;" onmouseup="javascript:aktualisieren();">OK</button>');
// Eingabefeld und Buttons einfügen. Das Inputfeld "zum_input" hat die Grundanzahl als value.
document.getElementsByTagName("table")[0].innerHTML = document.getElementsByTagName("table")[0].innerHTML.replace(/<td>\s*Rezeptmenge\sfür\:\s*<\/td><td>\s*(\d+)\s([A-Za-zäÄöÖüÜß]+)/g, '<td> Rezeptmenge für: </td><td><span id="zum_print" class="zum_printonly">$1</span><input id="zum_input" class="zum_noprint" style="display:none;" type="text" size="4" maxlength="5" onkeydown="javascript:enter_als_ok(event)" value="$1"> <span id="zum_mengenart">$2</span><button class="zum_noprint" style="display:none;" onmouseup="javascript:aktualisieren();">OK</button>');
// Diese Anzahl wird in der Variable 'alte_anzahl' gespeichert.
alte_anzahl = document.getElementById("zum_input").value;
if(document.getElementById('zum_bis_menge')) {
bis_menge = document.getElementById('zum_bis_menge').innerHTML/alte_anzahl; }
// Funktion verpackt die Zutatenliste in einem <span> mit der id 'zum_zutatenliste'. Die Zutatenliste wird zustälich in der Variable 'zutatenliste' gespeichert.
zutatenliste = zutatenliste_in_span();
// Regulärer Ausdruck zur Erkennung der Mengenanzahlen der Zutaten
zutaten_regex = /(<.*?>|(\d*)\s*<sup>(\d+)<\/sup>[//]<sub>(\d+)<\/sub>|(\d+(,\d+)?))/g;
zutaten_zahlen = new Array();
zeilen = zutatenliste.split("\n");
// Der Zutatenumrechner geht davon aus, dass die Zutatenmenge immer als erstes genannt wird und danach auftretende Zahlen nicht mit umgerechnet werden sollen
// Wie z.B. der Mehltyp oder Prozentangaben
// Dazu wird jede Zeile zwischen links und rechts unterschieden. Zum Teilen wird der erste auftretende Buchstabe genutzt.
links_und_rechts = new Array();
links_und_rechts[0] = new Array(); //links, aktiviert
links_und_rechts[1] = new Array(); //rechts, deaktiviert
buchstabe_regex = /[A-Za-z]/g;
open_regex = /</g;
close_regex = />/g;
var keinelement = true;
var j = 0;
var k = 1;
var n = 0;
// Jedes Zeiche wird einzelnd überprüft. Die Buchstaben innerhalb von Elementen z.B. <em> wrden ignoriert.
while(zeilen[k]) {
while(!(keinelement && buchstabe_regex.test(zeilen[k][n]))) {
if(open_regex.test(zeilen[k][n])) {
keinelement = false;
} else if (close_regex.test(zeilen[k][n])) {
keinelement = true;
}
n++;
}
links_und_rechts[0][k] = zeilen[k].substr(0,n); // 0 steht für links
links_und_rechts[1][k] = zeilen[k].substr(n); // 1 steht für rechts
n = 0;
k++;
}
k = 1;
zutatenliste = "";
var speicher = "";
while(links_und_rechts[0][k] || links_und_rechts[1][k]) {
start = 0;
// Zahlen auf der linken Seite mit aktivierten Schaltern austatten.
while(inhalt = zutaten_regex.exec(links_und_rechts[0][k])){
if(!isNaN(inhalt[1].replace(/,/g,".")) || !isNaN(inhalt[3])) {
j++;
if(inhalt[1]==inhalt[5]) {
neu = inhalt[1].replace(/,/g,".");
} else if(inhalt[2]){
neu = parseFloat(inhalt[2])+inhalt[3]/inhalt[4];
} else {
neu = inhalt[3]/inhalt[4];
}
zutaten_zahlen[j] = neu/alte_anzahl;
neu = neu.toString().replace(/\./g,",");
speicher += links_und_rechts[0][k].substring(start, inhalt.index)+"<a href='#' onClick='javascript:schalter(this)' id='zum_zutat_" + j + "'class='zum_aktiviert'>"+neu+"</a>";
start = inhalt.index+inhalt[0].length;
}
}
speicher += links_und_rechts[0][k].substring(start);
start = 0;
// Zahlen auf der rechten Seite mit deaktivierten Schaltern austatten.
while(inhalt = zutaten_regex.exec(links_und_rechts[1][k])){
if(!isNaN(inhalt[1].replace(/,/g,".")) || !isNaN(inhalt[3])) {
j++;
if(inhalt[1]==inhalt[5]) {
neu = inhalt[1].replace(/,/g,".");
} else if(inhalt[2]){
neu = parseFloat(inhalt[2])+inhalt[3]/inhalt[4];
} else {
neu = inhalt[3]/inhalt[4];
}
zutaten_zahlen[j] = neu/alte_anzahl;
neu = neu.toString().replace(/\./g,",");
speicher += links_und_rechts[1][k].substring(start, inhalt.index)+"<a href='#' onClick='javascript:schalter(this)' id='zum_zutat_" + j + "'class='zum_deaktiviert'>" + neu + "</a>";
start = inhalt.index+inhalt[0].length;
}
}
speicher += links_und_rechts[1][k].substring(start);
speicher += "\n";
k++;
}
document.getElementById('zum_zutatenliste').innerHTML = speicher; // Schalterveränderungen an Dokument
})
function schalter(element) {
if(element.className == 'zum_aktiviert') {
element.className = 'zum_deaktiviert';
} else {
element.className = 'zum_aktiviert';
aktualisieren();
}
}
// Mengenarten als Einzahl und Mehrzahl
var mengen = new Object();
mengen["Person"] = "Personen";
mengen["Glas"] = "Gläser";
mengen["Portion"] = "Portionen";
mengen["Backblech"] = "Backbleche";
function mengenname(mengenart, anzahl) {
if(anzahl!=1) {
for (var einzahl in mengen) {
if (mengenart == einzahl)
return mengen[einzahl];
}
} else {
for (var einzahl in mengen) {
if (mengenart == mengen[einzahl] )
return einzahl;
}
}
}
function aktualisieren() {
// Eingabeüberprüfung
if(isNaN(document.getElementById("zum_input").value)) {
alert('Fehler: Menge ist keine Zahl.');
} else if(document.getElementById("zum_input").value<=0) {
alert('Fehler: Menge ist nicht positiv.');
} else {
neue_anzahl = document.getElementById("zum_input").value;
document.getElementById("zum_print").innerHTML = neue_anzahl;
i = 1;
while(document.getElementById("zum_zutat_"+i)) {
menge = document.getElementById("zum_zutat_"+i);
if(menge.className=="zum_aktiviert") {
menge.innerHTML = Math.round(zutaten_zahlen[i]*neue_anzahl*100)/100;
menge.innerHTML = menge.innerHTML.replace(/\./g,",");
}
i++;
}
if (mengenname(document.getElementById('zum_mengenart').innerHTML, neue_anzahl))
document.getElementById('zum_mengenart').innerHTML = mengenname(document.getElementById('zum_mengenart').innerHTML, neue_anzahl);
}
}
function bis_menge_neu () {
if(isNaN(document.getElementById("zum_input").value)) {
document.getElementById('zum_bis_menge').innerHTML = "?";
} else if(document.getElementById("zum_input").value<=0) {
document.getElementById('zum_bis_menge').innerHTML = "?";
} else {
neue_anzahl = document.getElementById("zum_input").value;
document.getElementById('zum_bis_menge').innerHTML = Math.round(bis_menge*neue_anzahl);
}
}
function zutatenliste_in_span () {
// Der Quelltext des Artikels wird in der Variable 'bodycontent' gespeichert.
bodycontent = document.getElementById('bodyContent').innerHTML;
// Regulärer Ausdruck, um die Überschrift "Zutaten" zu finden.
headline_regex = /Zutaten\s<\/span><\/h2>/g;
// Überschrift suchen und Position in 'headline' speichern.
headline = headline_regex.exec(bodycontent);
// Bereich vor der Überschrift in 'rezept_anfang' abspeichern.
rezept_anfang = bodycontent.substring(0,headline.index+20);
// Bereich nach der Überschrift 'Zutaten' in 'rezept_ende' anspeichern.
rezept_ende = bodycontent.substring(headline.index+20);
// Regulärer Ausdruck, um das Ende des Zutatenabschnitts zu finden.
endezutaten_regex = /<a\sname="(Kochgeschirr|Zubereitung)"\sid="(Kochgeschirr|Zubereitung)"><\/a>/g;
endezutaten = endezutaten_regex.exec(rezept_ende);
// Den Zutatenabschnitt aus 'rezept_ende' extrahieren und in 'rezept_zutaten' abspeichern.
rezept_zutaten = rezept_ende.substring(0,endezutaten.index);
// 'rezept_ende' wird nun der Teil nach der Zutatenliste. 'rezept_anfang', 'rezept_zutaten' und 'rezept_ende' ergeben damit den ganzen bodycontent.
rezept_ende = rezept_ende.substring(endezutaten.index);
// Nun wird wieder alles zusammengesetzt und die Zutatenliste in dem Span verpackt.
document.getElementById('bodyContent').innerHTML = rezept_anfang + "<span id='zum_zutatenliste'>" + rezept_zutaten + "</span>" + rezept_ende;
return rezept_zutaten;
}
function enter_als_ok(e) {
var key=e.keyCode || e.which;
if (key==13){
aktualisieren();
}
}