Benutzer:Finn/zutatenumrechner.js

aus dem Koch-Wiki (kochwiki.org)
Wechseln zu:Navigation, Suche

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
/* ============================================================================================== 
   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();
    }
}