CookML-Markup-Language
Definition eines offenen Rezept- und Menü Austauschformates auf Basis von XML

Revision:

1.1.2

Status:

Letzte freigegebene Revission 1.1.2

Ersteller:

Jochen 'Nunz' Herz

Autoren:

Jochen Herz, Roland Jesse, Ralf Kürbitz, Rolf Wilhelm, 
Robert Freitag, Uwe Klatt


Spezifikation des XML-Formats zum programm- und länderüberschreitenden Austausch von Kochrezepten, Zutatendaten und Menüs.

CookML ist die Beschreibung eines Rezeptaustausch-Formats, das programm-übergreifend den Austausch von Rezepten aller Art erlaubt.
CookML entstand aus dem Wunsch für das Rezeptprogramm Kalorio ein Austauschformat zu erstellen, daß alle angebotenen Rezeptdaten transferieren kann. Das bisher verwendete Textformat MealMaster ist zwar sehr verbreitet und lesbarer, aber es kann nur die absoluten Grunddaten eines Rezeptes übertragen. CookML entstand daraufhin in Form einer offenen Diskussion mit diversen Programmierern von Rezept- und Gastronomie-Software, damit das Austauschformat keine Insellösung darstellt sondern programmübergreifend Rezeptdaten übertragen kann.

Grundlage von CookML (kurz CML) ist XML. Es bietet die Möglichkeit alle erdenklichen Zusatzinformationen zu einem Rezept von Benutzer zu Benutzer auszutauschen. So unterstützt dieses Format auch Rezeptbilder, Menüs und Zuordnung von Zutaten zum Bundeslebensmittelschlüssel.
Sollte dieses Format in der aktuellen Revision für etwaige Daten eines Rezeptes nicht ausreichen, so kann dieses Format in Form einer neuen Revision in Absprache erweitert werden.

CML ist frei benutzbar. Jeder Programmierer hat die Möglichkeit, dieses Format in seinem eigenen Programm zu benutzen. Es ist ausdrücklich erwünscht die CML in eigenen Programmen, Projekten, Tools und Internet-Portalen einzusetzen.
Es sind lediglich folgende Bedingungen einzuhalten:
1. Die folgende Spezifikation muß eingehalten werden. Es dürfen keine Tags ohne Freigabe einer neuen Revision hinzugefügt oder geändert werden.
2. Alle Felder, die in der DTD als "#Required" also als bindend definiert sind, müssen sinnvoll unterstützt und bei der Durchreichung mit weitergegeben werden. Daher wurden nur die wichtigsten Felder als bindend gekennzeichnet, so daß eine Implementierung sehr einfach ist.
3. Jedes Programm oder sonstige Projekt muß einen Link auf diese Seite beinhalten, damit dieses Format für jeden einsehbar ist.
4. Wird eine CookML als Datei weitergegeben, so muss die Extension "*.cml" lauten


Inhaltsverzeichnis:

Einleitung

Weitere technische Dokumente

Definition der Markup-Language CookML 

Verwendeter Zeichensatz UTF-8

Aufbau der Rezept-ID

Erlaubte Einheiten für Zutaten-Beschreibungen


Weitere technische Dokumente:

Eine aktuelle Version dieses Dokuments kann immer unter www.kalorio.de/cml/cookml.html abgerufen werden.

Eine KML-Beispielsdatei mit 3 Rezepten gibts hier im Download: www.kalorio.de/cml/Example.zip 

Eine Document-Type-Definition (DTD) die zur Validierung der erzeugten KML-Dateien benutzt werden kann und sollte findet sich unter http://www.kalorio.de/cml/cookml.dtd.  Um den Export seines eigenen CMLs mit Hilfe der DTD zu überprüfen gibt es diverse DTD-Validatoren..

Eine XSD-Datei wird unter www.kalorio.de/cml/cookml.xsd ebenfalls zum Download angeboten

Eine einfache Anzeige der XML-Daten im Internet-Explorer ist durch die XSL-Datei möglich: www.kalorio.de/cml/cookml.xsl

Zum Parsen oder Erzeugen von KML (XML)-Dateien können beliebige XML-Bibliotheken eingesetzt werden, die im Internet über jede Suchmaschine einfach zu finden sind. Der Autor stellt auch gerne einen selbst geschriebenen XML-Parser auf Basis des Borland C++-Compilers zur Verfügung.

Änderungsvorschläge, Fehlerhinweise und Anmeldungen werden unter JoHerz@codev.de gerne entgegengenommen.


Definition der Markup-Language CookML zum Austausch von Rezepturen

 Inhaltsverzeichnis:

XML-Header Standard XML-Header
cookml Wurzel der eigentlichen Daten
cookml version Revisionsnummer der CML-Spezifikation, auf die sich die Implementierung bezieht
cookml name Name der Rezeptsammlung in der Datei
cookml prog Name des erzeugenden Programmes
cookml progver Versionsnummer des erzeugenden Programmes
cookmlrecipe Wurzel eines jeden Rezeptes
cookml : recipe : lang Sprache des Rezeptes
cookml : recipe : head Informationszeilen zu einem Rezept
cookml : recipe : head : title Titel des Rezeptes
cookml : recipe : head : rid Eindeutiger Rezept-Ident
cookml : recipe : head : servingqty Für wieviele Einheiten (Personen, Stücke usw.)
cookml : recipe : head : servingtype In welcher Einheit wird die Menge angegeben (Personen, Stücke usw.)
cookml : recipe : head : createdate Datum der Ersterstellung
cookml : recipe : head : createuser Erfasser des Rezeptes
cookml : recipe : head : createemail EMail des Erfassers
cookml : recipe : head : changedate Datum der letzten Änderung
cookml : recipe : head : changeuser Person, die die letzte Änderung vorgenommen hat
cookml : recipe : head : changeemail EMail der letzten ändernden Person
cookml : recipe : head : timeallqty Zeitangabe der kompletten Rezept-Zubereitung
cookml : recipe : head : timeprepqty Zeitangabe der Rezept-Vorbereitungszeit
cookml : recipe : head : timecookqty Zeitangabe der eigentlichen Kochzeit
cookml : recipe : head : costs Kosten des Rezepts
cookml : recipe : head : country Herkunftsland
cookml : recipe : head : proteins Menge der Eiweisse/Proteine
cookml : recipe : head : carbohydrates Menge der Proteine
cookml : recipe : head : Fat Menge der Fette
cookml : recipe : head : wwpoints Weight-Watcher Punkte oder ähnliches
cookml : recipe : head : cat Kategorien (Rezept-Gruppierungen)
cookml : recipe : head : hint Stichworte zum Rezept
cookml : recipe : head : sourceline Mehrzeilige Angabe zur Quelle
cookml : recipe : head : card Nähere Beschreibung des Rezepts (z.B. Restaurantkarte)
cookml : recipe : head : allergies Allergie-Stoffe
cookml : recipe : head : allergies : allergy Angaben zu einem Allergie-Stoff
cookml : recipe : head : allergies : allergy : name Name des Allergie-Stoffes
cookml : recipe : head : allergies : allergy : contains Allergie-Stoff im Rezept vorhanden
cookml : recipe : head : content Angabe über Stoffangaben in einem Rezept
cookml : recipe : head : content : type Art der Stoffangabe
cookml : recipe : head : content : value Wert der Stoffangabe
cookml : recipe : head : picture Rezeptbild
cookml : recipe : head : picture : file Pfad auf das Bild lokal oder im Web
cookml : recipe : head : picbin Rezeptbild binär als Bestandteil des XMLs
cookml : recipe : head : picbin : format Format des übertragenen Binärbildes
cookml : recipe : custom Feld für weitere Daten
cookml : recipe : custom : name Name eines freien Feldes
cookml : recipe : custom : datatype Datentyp eines freien Feldes
cookml : recipe : custom : value Wert eines freien Feldes
cookml : recipe : part Gruppierung einer Zutateneinheit
cookml : recipe : part:: title Benennung einer Zutatengruppe
cookml : recipe : part:: ingredient  Zutat (Wurzel einer neuen Zutat)
cookml : recipe : part : ingredient : qty Benötigte Menge der Zutat
cookml : recipe : part : ingredient : unit Einheit der Zutat
cookml : recipe : part : ingredient : item Name der Zutat
cookml : recipe : part : ingredient : inote Weitere Erläuterungen zur Zutat
cookml : recipe : part : ingredient : bls Der Zutat entsprechender BLS-Code
cookml : recipe : part : ingredient : gram Gramm-Entsprechung bei nicht umrechenbaren Einheiten
cookml : recipe : part : ingredient : shop Flag, ob Zutat auf Einkaufslisten soll
cookml : recipe : part : ingredient : calc Flag, ob Zutat bei Nährwertberechnung mit berücksichtigt werden soll
cookml : recipe : part : ingredient : ridlink URL auf ein Rezept, dass als Zutat eingesetzt wird
cookml : recipe : preparation Anleitungsschritt (Rezepttext)
cookml : recipe : preparation : text Anleitungsschritt als einzelner Textkörper
cookml : recipe : preparation : step Anleitungsschritt als Folge von Verarbeitungschritten
cookml : recipe : remark Anmerkung eines Benutzers
cookml : recipe : remark : user Der Name des Benutzers einer Anmerkung
cookml : recipe : remark : line Eine Zeile der Anmerkung
cookml : menu Ein Menü beginnt
cookml : menu : title Name des Menüs
cookml : menu : mcustom Feld für weitere Daten
cookml : menu : mcustom : name Name eines freien Feldes
cookml : menu : mcustom : datatype Datentyp eines freien Feldes
cookml : menu : mcustom : value Wert eines freien Feldes
cookml : menu : mrecipe Rezept eines Menüs
cookml : menu : mrecipe : title Titel des Menürezeptes
cookml : menu : mrecipe : rid Rezept-Ident des Menü-Rezeptes
cookml : menu : mrecipe : amount Rezeptmenge für Menü (in der Einheit des Rezeptes)
cookml : menu : mrecipe : persons Rezeptmenge für Menü (immer in der Einheit "Personen")
cookml : menu : mrecipe : desc Nähere Angaben zum Menü-Rezept

XML-Header

XML-Standard-Header
Folgende Header-Zeilen müssen laut XML-Standard implementiert sein.
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet href="cookml.dtd" type="text/dtd"?>
<?xml-stylesheet href="cookml.xsl" type="text/xsl"?>

Unterstützung: Alle

cookml

"cookml" stellt die Wurzel aller Rezepte und Menüs dar.
Die Tags prog und progver sind programm-spezifisch und sollte mit dem Programmname und dessen Versionsnummer bestückt werden, die das XML erzeugen..
<cookml version=" 0.1" prog="cook" progver="2.01">

Unterstützung: Alle

cookml : version

Revisionsnummer der Spezifikation.
Version gibt die Revisisionsnummer derjenigen CookML-Spezifikation an, auf die sich die Implementierung des erzeugenden Programmes bezieht.

Datentyp: string, XML-Attribut
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : name

Name der Rezeptsammlung.
Oft werden ganze Rezeptpakete geschnürt und diesen paketen werden Namen gegeben (z.B. "rec.mampf.de 01-03/2002"). Sofern ein CML ein solches Paket darstellt und einen Namen hat, kann dieser hier eingetragen werden und damit das Paket kennzeichnen.

Datentyp: string, XML-Attribut
Unterstützung: Optional
Kompatibilität:

cookml : prog

Name des erzeugenden Programmes.
Hier muss das Programm, das die CML-Datei erzeugt, seinen Namen hinterlassen. Zusamen mit dem Attribut  'progver' ist dies für die Fehlersuche ein wichtiger Hinweis und ist daher Pflicht.

Datentyp: string, XML-Attribut
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : progver

Versiosnummer des erzeugenden Programmes.
DBeschreibung siehe 'cookml:prog'.

Datentyp: string, XML-Attribut
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : recipe

"recipe" leitet ein neues Rezept ein.
Dieses Tag stellt die Wurzel eines jeden Rezepts dar. recipe kann in einer Datei beliebig oft wiederholt werden.

Datentyp: complex typ, XML-Element, Sequenz
Unterstützung: Zwingend.
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : lang

"lang" definiert die Sprache in dem das Rezept abgefasst wurde
Zwar ist es dem Programm prinzipiell egal, in welcher Sprache das Rezept vorliegt, dennoch ist die Information später wichtig für die automatische Umwandlung von Einheiten in die Sprache des Benutzers. So kann man bei US-Rezepten nicht-metrische Einheiten automatisch in Landeseinheiten umrechnen (z.B. oz in gramm).
Die erlaubten Sprachkürzel isnd folgender Seite zu entnehmen: http://lcweb.loc.gov/standards/iso639-2/englangn.html

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Muss in jedem Rezept gesetzt werden, muss von der Applikation unterstützt werden
Kompatibilität: Alle

cookml : recipe : head

"head" leitet eine Section mit weiteren Rezeptinformationen ein
Die Länge ist zwar nicht begrenzt aber man sollte den Titel nicht zu lang wählen, damit keine Probleme bei der Anzeige oder beim Druck auftreten. Auch sollte man daran denken, dass die weitergegeben Rezepte eventuell im Mealmaster-Format weitergegeben werden könnten und dann bei 64 Zeichen abgeschnitten werden

Datentyp: complex type, XML-Element, Singulär
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : recipe : head : title

"title" gibt den Namen des aktuellen Rezeptes an.
Die Länge ist zwar nicht begrenzt aber man sollte den Titel nicht zu lang wählen, damit keine Probleme bei der Anzeige oder beim Druck auftreten. Auch sollte man daran denken, dass die weitergegeben Rezepte eventuell im Mealmaster-Format weitergegeben werden könnten und dann bei 64 Zeichen abgeschnitten werden

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : recipe : head : rid

"RID" kennzeichnet jedes Rezept rechnerübergreifend mit einem eindeutigen Ident.
Bei der Erzeugung eines Rezeptes wird eine eindeutige ID generiert, die jedes Rezept eindeutig kennzeichnet. Dadurch kann man Bezug nehmen auf andere Rezepte, z.B. auf Grundteige als Bestandteil des aktuellen Rezeptes. Oder man verweist bei der Zusammenstellung eines Menüs nur noch auf Rezepte.
Das erste Programm, dass solche Idents eingesetzt hat, war Ambrosio. Daher wurde das Format der Ambrosio-Ident hier übernommen.
Am Ende des Dokument gibt es ein Kapitel "Aufbau der Rezept-ID:", in dem beschrieben ist wie die RID aufgebaut ist.

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : recipe : head : servingqty

Für wieviele Einheiten (Personen, Stücke usw.)
In servingtype steht die Einheit, die dem Rezept zugewiesen wurde (z.B. Portionen, Stück usw). In servingqty wird die Anzahl dieser Einheiten angegeben, für die das Rezept ausgelegt ist.

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : recipe : head : servingtype

In welcher Einheit wird die Menge angegeben (Personen, Stücke usw.)
In servingtype steht die Einheit, die dem Rezept zugewiesen wurde (z.B. Portionen, Stück usw). In servingqty wird die Anzahl dieser Einheiten angegeben, für die das Rezept ausgelegt ist.

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : recipe : head : createdate

Datum der Ersterstellung
Hier wird das Tagesdatum festgehalten, an dem das Rezept erstellt worden ist. Dieses Datum darf später nicht mehr verändert werden können (z.B. durch Änderungen am Rezept).
Das Format für jedes Datum ist: "2003-02-16T10:00:00"

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : recipe : head : createuser

Erfasser des Rezeptes
Hier wird der Name des Erfassers festgehalten, der das Rezept verfasst hat. Dieses Datum darf später nicht mehr verändert werden können (z.B. durch Änderungen am Rezept).

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Zwingend.
Kompatibilität: Alle

cookml : recipe : head : createemail

EMail des Erfassers
Hier wird die EMail des Erfassers festgehalten, der das Rezept verfasst hat. Dies kann zur Kontaktaufnahme oder Nachfragen sinnvoll sein.

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : head : changedate

Datum der letzten Änderung
Hier wird das Tagesdatum festgehalten, an dem das Rezept zum letzten Mal verändert wurde. Die Information über die vorletzte Änderung wird dabei überschrieben.

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Muss in jedem Rezept gesetzt werden, muss von der Applikation unterstützt werden
Kompatibilität: Alle

cookml : recipe : head : changeuser

Person, die die letzte Änderung vorgenommen hat
Hier wird der Name der Person festgehalten, der das Rezept zum letzten Mal verändert wurde. Die Information über die vorletzte Änderung wird dabei überschrieben.

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : changeemail

EMail der letzten ändernden Person
Hier wird die EMail der Person festgehalten, der das Rezept zum letzten Mal verändert wurde. Die Information über die vorletzte Änderung wird dabei überschrieben.

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head :timeallqty

Zeitangabe der kompletten Rezept-Zubereitung
timeallqty gibt den Zeitaufwand an, der insgesamt für das Rezept aufzuwenden ist inklusive Vorbereitungs- und Kochphase.
Die Einheit ist immer Minuten.

Datentyp: non negative integer, XML-Attribut von head, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : timeprepqty

Zeitangabe der Rezept-Vorbereitungszeit
Gibt den abgeschätzten Zeitraum an, der für die Vorbereitungsphase der Rezeptzubereitung zu erwarten ist. Die Einheit ist immer Minuten.

Datentyp: non negative integer, XML-Attribut von head, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : timecookqty

Zeitangabe der eigentlichen Kochzeit
Gibt den abgeschätzten Zeitraum an, der für die eigentliche Kochphase der Rezeptzubereitung zu erwarten ist. Die Einheit ist immer Minuten.

Datentyp: non negative integer, XML-Attribut von head, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : costs

Kosten des Rezepts
Gibt umgangssprachlich die zu erwartenden Kosten an, die für das Rezept aufzuwenden sind. Eine Weiterverarbeitung dieser Information durch Programme ist nicht vorgesehen, diese Angabe hat nur informativen Charakter.

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : country

Herkunftsland
Gibt das Land oder die Gegend an, aus der das Rezept kulinarisch stammt.

Datentyp: string, XML-Attribut von head, Singulär
Unterstützung: Optional
Kompatibilität: KalorioNext

cookml : recipe : head : Eiweisse

Anteil der Eiweisse/Proteine
Gibt den Anteil/Menge der Eiweisse/Proteine an den Kalorien an.
Die Angaben sind pro Portion anzugeben und müssen daher bei der Umrechnung der Portionsmenge nicht umgerechnet werden.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : head : Kohlenhydrate

Anteil der Kohlenhydrate
Gibt den Anteil/Menge der Kohlenhydrate an den Kalorien an.
Die Angaben sind pro Portion anzugeben und müssen daher bei der Umrechnung der Portionsmenge nicht umgerechnet werden.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : head : Fette

Anteil der Fette
Gibt den Anteil/Menge der Fette an den Kalorien an.
Die Angaben sind pro Portion anzugeben und müssen daher bei der Umrechnung der Portionsmenge nicht umgerechnet werden.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : head : wwpoints

Weight-Watcher Punkte
Die Weight-Watcher-Gemeinde hat mich des öfteren angeschrieben, daß Sie ein Feld zur Angabe der Weight-Watcher-Punkte benötigen. Bei diesen Punkten werden jedem Gericht eine bestimmte Anzahl von Punkten zugewiesen. Hier werden die Punkte für das Gesamtrezept, also für alle Portionen addiert aufgenommen.

Datentyp: float, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : head : cat

Kategorien (Rezept-Gruppierungen)
In jedem cat-Eintrag wird eine Rezeptkategorie festgelegt. Die Bezeichnungen der Kategorien sind nicht genormt und können sich von Benutzer zu Benutzer unterscheiden. Geplant ist eine Standardisierung, in der eine sinnvolle Menge an Kategorien vorgeschlagen wird.

Datentyp: string, XML-Element, Sequenz
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : head : sourceline

Quellenangaben
Sofern die Quelle des Rezeptes bekannt ist sollte die Quelle der fariness halber dem Rezept beigefüggt sein. In den Sourcelines kann man diese Quelle aufführen.

Datentyp: string, XML-Element, Sequenz
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : head : hint

Stichworte zu einem Rezept
Zu einem Rezept können beliebige Stichwörter hinzugefügt werden. Meistens kann nach diesen Stichworten auch gesucht werden. Im Gegensatz zu ing:cat gibt es keine Bestrebungen, diese zu normieren, es sind also freie Texte zur freien Verwendung.

Datentyp: string, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : card

Nähere Beschreibung des Rezepts (z.B. Restaurantkarte)
Sofern aus einer Rezeptzusammenstellung eine Speisekarte oder Menükarte erstellt werden soll, können hier erklärende Texte zum Rezept oder der Rezepttitel in anderen Sprachen aufgenommen werden.

Datentyp: string, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Ambrosia

cookml : recipe : allergies

Allergien
In diesem Tag sammeln sich alle Allergie-Informationen.

Datentyp: string, XML-Element, Single
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : allergies : allergy

Allergie-Angabe
Hier werden die Werte für eine Allergie angegeben.

Datentyp: string, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : allergies : allergy : name

Name des allergenen Stoffes

Datentyp: string, XML-Element
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : allergies : allergy : contains

Ist der allergene Stoff vorhanden
'F'=Frei von diesem allergischen Stoff, 'C'-contains, enthält diesen allergischen Stoff

Datentyp: string, XML-Element
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : head : content

Inhalt eines Rezeptes (Stofflicher Art)
Hier kann die Summe aller IInhaltsstoffe bezüglich eines Stoffes laut Bundelebensmittelschlüssel abgelegt werden. Die meisten Programme werden hier eine Kalorienangabe ablegen, aber es ist auch die Übermittlung von Vitamingehalten, Broteinheiten usw. möglich.
Ein Datensatz besteht immer aus 2 Teilen: Der Stoffangabe (Schlüssel = Kürzel der Bundeslebensmittelschlüssel) und die Menge (gleiche Einheit wie die, die im Bundeslebensmittelschlüssel vorgesehen ist.
Ausnahmen: 
1. nur quantitative BLS-Stoffe (DIE BLS-Datenbank gibt diese Info her). Strings sind hier nicht sinnvoll wie zB "BLS-Code" der ja auch in dieser Liste steht.
Beispiel:
<content type="GCAL" value="627"/> // Kalorien in kCal
<content type="GKB" value="42"/> // Broteinheiten

Datentyp: complex type, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : head : content : type

Kennzeichnung des Stoffes
Beschreibung siehe recipe : content

Datentyp: string, XML-Attribut von content
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : content : value

Menge eines Stoffes
Beschreibung siehe recipe : content

Datentyp: string, XML-Attribut von content
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : picture

Rezeptbild (Dateiname)
Hier wird ein Bild zu einem Rezept in Form eines Dateinamens festgelegt. Die Datei befindet sich dabei nur lokal bei dem Benutzer auf der Festplatte und ist daher nur sinnvoll, wenn entweder die Dateihierarchie immer gleich ist, oder sich alle Bilder in einem festgelegten Verzeichnis befinden und hier nur der Dateiname ohne Pfad angegeben wird.

Datentyp: complex type, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : picture : file

Pfad auf das Bild lokal im Netzwerk
Hier wird ein Bild zu einem Rezept in Form eines Dateinamens oder einer URL festgelegt. Sofern hier das Feld für eine URL benutzt wird ist eine komplette URL Pflicht (http://www.???.com/???.JPG. Das Format ist nicht festgelegt aber aus Gründen der Verbreitung ist JPG zu preferieren.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : head : picbin

Rezeptbild binär als Bestandteil des XMLs
Hier wird ein Bild binär als Bestandteil der XML-Datei mitgeschickt. Dabei ist das Bild mit Mime64 zu einem 7-Bit Zeichensatz zu konvertieren.

Datentyp: mime64, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : head : picbin : format

Format der Bilddatei
Um ein besseres Handling eines mitgeschickten Bildes zu erreichen, muss bei der Übertragung eines Binärbildes dessen Format hier mit übermittelt werden. Dabei muss immer die allgemein gültige Extension in Grossbuchstaben benutzt werden.
Festgelegt sind bislang: BMP, JPG, PNG, TIF

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Zwingend
Kompatibilität: Kalorio

cookml : recipe : head : custom

Freie Felderdefinition
In diesem Tag lassen sich beliebige eigene Informationen unterbringen. Bitte bei der Verwendung immer daran denken, daß eigene Informationen, die hier untergebracht werden nicht von Benutzern anderer Programme ausgewertet werden können. Es ist sinnvoll, Informationen, die allgemein sinnvoll sind hier zur Standardisierung anzumelden. Nur so kann ein Wildwuchs vermieden werden.
"custom" setzt sich zusammen aus den Attributen "name", "datatype" und "value". Name muss in jedem "custom"-Tag vorhanden sein, da es die Aufgabe des Knotens spezifiziert.

Datentyp: string, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : head : custom : name

Name eines freien Feldes
Beschreibung siehe "cookml:recipe:custom"

Datentyp: string, XML-Attribut
Unterstützung: Zwingend
Kompatibilität: Kalorio

cookml : recipe : head : custom : datatype

Name eines freien Feldes
Beschreibung siehe "cookml:recipe:custom"

Datentyp: string, XML-Attribut
Unterstützung: Zwingend
Kompatibilität:

cookml : recipe : head : custom : value

Wert eines freien Feldes
Beschreibung siehe "cookml:recipe:custom"

Datentyp: string, XML-Attribut
Unterstützung: Zwingend
Kompatibilität: Kalorio

cookml : recipe : part

Definition einer Zutatengruppe
Zutaten sind oft sortiert zu Einheiten wie Teig oder Belag. Eine solche Einheit ist hier definierbar. Sofern man der Einheit eine Überschrift geben möchte, kann man dieses über das Attribut "title" tun.

Datentyp: complex type, XML-Element, Sequenz
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : part : title

Benennung einer Zutatengruppe
Zutaten sind oft sortiert zu Einheiten wie Teig oder Belag. Eine solche Einheit ist hier definierbar. Sofern man der Einheit eine Überschrift geben möchte, kann man dieses über das Attribut "title" tun.

Datentyp: complex type, XML-Attribut
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : part : ingredient

Zutat (Wurzel einer neuen Zutat)
Eine neue Zutat beginnt.

Datentyp: complex type, XML-Element, Sequenz
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : part : ingredient : qty

Benötigte Menge der Zutat
Hier wird mit einer Zahl die Menge der Einheit beschrieben. Diese Zahl bezieht sich immer auf ing:unit. Erlaubt sind nur Dezimalzahlen. Brüche müssen zuvor in Gleitkommazaheln umgerechnet werden.

Datentyp: float, XML-Attribut, Singulär
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : part : ingredient : unit

Einheit der Zutat
Die Einheit der Zutatenbeschreibung. Damit die Rezepte international ausgetauscht werden können, dürfen keine nationalen Einheiten benutzt werden sondern ausschliesslich amerikanische Einheiten. Hierfür gibt es einen Quasi-Standard bei Rezepten: Meal-Master. In Unit dürfen nur gültige Mealmaster-Einheiten Verwendung finden. Eine Liste der erlaubten Einheiten und deutschen Entsprechungen gibt es im Kapitel "Erlaubte Einheiten".

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : part : ingredient : item

Name der Zutat
Der Name der eigentlichen Zutat. Hier darf wirklich nur der Name aufgeführt sein und nicht eine nähere Beschreibung (diese ist in inote anzugeben). Statt also "Festkochende Kartoffeln" hier anzugeben darf nur "Kartoffel" stehen und in inote dann "festkochend".

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : part : ingredient : inote

Weiterreichende Beschreibung der Zutat
In ing:item darf nur der Name stehen. Sind weitere Beschreibungen nötig, so können sie hier getrennt vom Name der Zutat aufgeführt werden. Statt also "Festkochende Kartoffeln"  anzugegeben darf nur ing:item="Kartoffel" sein und <inote>festkochend</inote>

Datentyp: string, XML-Element von head, Sequenz
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : part : ingredient : bls

Der Zutat entsprechender BLS-Code
Der BLS-Schlüssel der der Zutat entspricht oder zumindest sehr nahe kommt. Durch die Zuweisung von BLS-Schlüssel an die Zutaten ist eine jederzeitige Berechnung beliebiger Inhaltsstoffe des Rezeptes möglich.
Wichtig: Auch wenn ein Programm den BLS nicht selbst unterstützt, müssen diese Schlüssel beim Import/Export mit durchgereicht werden.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Unterstützung ist optional. Daten müssen aber durchgereicht werden.
Kompatibilität: Ambrosia, Kalorio

cookml : recipe : part : ingredient : gram

Gramm-Entsprechung bei nicht umrechenbaren Einheiten
Manche Einheiten können nicht direkt in Gramm umgerechnet werden. Für eine Berechnung der Nährstoffe zu einer Zutat ist in Verbindung mit dem Bundeslebensmittel-Schlüssel eine Mengenentsprechung in Gramm notwendig, die hier dann zusammen mit der Zutat angelegt werden kann. Bei "1 Packung Vanillepulver" kann man also hier "30" (Gramm) angeben. Vorteil der Speicherung: Man macht diese Zuweisung der Grammentsprechung einmalig bei der Rezepterstellung und kann nun die Inhaltsstoffe des Rezeptes jederzeit mit einem Mausklick berechnen lassen.

Datentyp: non negative integer, XML-Attribut, Singulär
Unterstützung: Unterstützung ist optional. Daten müssen aber durchgereicht werden.
Kompatibiltät: Ambrosia, Kalorio

cookml : recipe : part : ingredient : shop

Flag, ob Zutat auf Einkaufslisten soll
Sofern hier der Buchstabe "N" steht, taucht die Zutate bei einer Erstellung einer Einkaufsliste zum Rezept nicht auf. Fehlt dieses Tag zu einer Zutat, so wird die Zutat standardmässig mit auf die Einkaufsliste genommen.

Datentyp: bool ("true" oder "false"), XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : part : ingredient : calc

Flag, ob Zutat bei Nährwertberechnung mit berücksichtigt werden soll
Bei der Berechnung der Inhaltsstoffe eines Rezeptes gibt es immer wieder Zutaten, die für die Berechnung keine Rolle spielen. Diese Zutaten kann man als für die Berechnung unbedeutend kennzeichnen, in dem man calc="N" setzt. Die Zutat wird dann bei der Ermittlung der Inhaltsstoffberechnung nicht berücksichtigt. Fehlt dieses Attribut bei einem Rezept, so wird die Zutat in die Berechnung mit eingezogen.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Unterstützung ist optional. Daten müssen aber durchgereicht werden
Kompatibilität: Kalorio

cookml : recipe : part : ingredient : ridlink

URL auf ein Rezept, dass als Zutat eingesetzt wird
In manchen Rezepten wird ein anderes Rezept als Grundzutat benutzt. In diesem Falle kann man einer Zutat einen Link auf ein anderes Rezept zuweisen. Im Programm selbst könnte man dadurch einen direkten Sprung zu dem Grundrezept ermöglichen.
Der Link besteht dabei aus einer Rezept-ID die recipe:RID entspricht. Schön wäre es, wenn man auch in Web-Rezeptdatenbank einmal nach diesen übergreifenden Rezept-IDs suchen könnte.
Ein Beispiel wäre "Grundteig Mürbeküchen" als Grundlage für einen Obstkuchen.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität:

cookml : recipe : preparation

Anleitungsschritt (Rezepttext)
Dieser Knoten kapselt alle Verarbeitungsschritte. Dabei gibt es zwei Möglichkeiten:
1. Der gesamte Text wird in einem Tag "text" aufgenommen inklusive aller Zeilenumbrüche und Leerzeilen. "text" darf dabei genau einmal unterhalb von "preparation" vorkommen.
2. Jeder Verarbeitungsschritt wird in einem eigenen Knoten "step" aufgenommen. Step darf beliebig oft unterhalb von "preparation vorkommen. Die Anzahl der "step"-Knoten entspricht also der Anzahl der Veranreitungsschritte. Zwischen den Verarbeitungsschritten sollte das Programm einen Absatz oder Leerzeile in der Anzeige einfügen, da Leerzeilen am Ende nicht Bestandteil eines steps sein sollten.
Beim Export einer "preparation" darf entweder "test" oder "step" eingesetzt werden aber nicht gemischt.

Datentyp: string, XML-Element, Singulär
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : preparation : text

Anleitungsschritt (Rezepttext) als kompletter Textkörper
Siehe Beschreibung zu "preparation"

Datentyp: string, XML-Element, Singulär
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : preparation : step

Anleitungsschritt (Rezepttext) als Folge von Verarbeitungsschritten
Siehe Beschreibung zu "preparation"

Datentyp: string, XML-Element, Singulär
Unterstützung: Zwingend
Kompatibilität: Alle

cookml : recipe : remark

Anmerkung eines Benutzers
In jedem remark kann der Anwender eine eigene Anmerkung zum Rezept ablegen.
Dadurch ist die Unterstützung von Fliestext gewährleistet und man muss die Rezepttexte nicht mehr nach 70 oder weniger Spalten radikal umrechen.

Datentyp: complex type, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität:

cookml : recipe : remark : user

Der Name des Benutzers einer Anmerkung
Damit beim Export später noch sichtbar ist, wer die jeweilige Anmerkung gemacht hat, kann hier ein zugehöriger Benutzername mit angegeben werden.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Kalorio

cookml : recipe : remark : line

Eine Zeile der Anmerkung
Hier wird eine Zeile einer Anmerkung abgelegt.

Datentyp: string, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Ambrosia, Kalorio

cookml : menu

Ein Menü beginnt
Neben den Rezepten kann cookML auch ganze Menüs übermitteln. Dabei ist eine Menüdefinition immer nur als Linkliste auf externe rezepte zu sehen. Innerhalb eines Menüs werden keine Rezepte definiert.
Es ist natürlich möglich, im gleichen cml-File auch gleichzeitig die entsprechenden Rezepte und/oder Getränke mit zu liefern aber eben dann in den recipes.

Datentyp: complex type, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Ambrosia

cookml : menu : title

Name des Menüs
Jedes anständige Menü braucht auch einen Namen um es anzupreisen. Dieser kann hier einem Menü zugewiesen werden.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia

cookml : menu : mcustom

Freie Felderdefinition
In diesem Tag lassen sich beliebige eigene Informationen unterbringen. Bitte bei der Verwendung immer daran denken, daß eigene Informationen, die hier untergebracht werden nicht von Benutzern anderer Programme ausgewertet werden können. Es ist sinnvoll, Informationen, die allgemein sinnvoll sind hier zur Standardisierung anzumelden. Nur so kann ein Wildwuchs vermieden werden.
"custom" setzt sich zusammen aus den Attributen "name", "datatype" und "value". Name muss in jedem "custom"-Tag vorhanden sein, da es die Aufgabe des Knotens spezifiziert.

Datentyp: string, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Ambrosia

cookml : menu : mcustom : name

Name eines freien Feldes
Beschreibung siehe "cookml:menu:custom"

Datentyp: string, XML-Attribut
Unterstützung: Zwingend
Kompatibilität: Ambrosia

cookml : menu : mcustom : datatype

Name eines freien Feldes
Beschreibung siehe "cookml:menu:custom"

Datentyp: string, XML-Attribut
Unterstützung: Optional
Kompatibilität: Ambrosia

cookml : menu : mcustom : value

Wert eines freien Feldes
Beschreibung siehe "cookml:menu:custom"

Datentyp: string, XML-Attribut
Unterstützung: Optional
Kompatibilität: Ambrosia 

cookml : menu : mrecipe

Rezept eines Menüs
Hier können hintereinander Rezepte zu einem Menü zusammengefasst werden.
Achting: Es ist bindend, dass alle Rezepte, die im Menü auftauchen in der gleichen CML-Datei mitgeschickt werden. Ansonsten fehlen all zu leicht Rezepte.

Datentyp: complex type, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Ambrosia

cookml : menu : mrecipe : amount

Mengenangabe für Menü-Rezepte
Dient zur Angabe auf wieviele Einheiten das Rezepts im aktuellen Menü Verwendung finden soll. (also die klassische Hochrechnung der Rezeptmenge auf die im Menü geplante Menge des Rezeptes)
Die Einheit entspricht dabei immer der Einheit, die auch im Rezept Verwendung findet

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia

cookml : menu : mrecipe : persons

Mengenangabe für Menü-Rezepte
Gibt unabhängig von der im Rezept verwendeten Einheit die Anzahl der Personen an, für die das Rezept im Menü vorgesehen ist. Einheit ist immer "Personen". Sinnvoll, da viele Rezepte gerade in der Gastronomie andere Einheiten haben (z.B. "Liter").

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität:

cookml : menu : mrecipe : rid

Rezept-Ident des Menü-Rezeptes
In dem Menü-Strukturen selbst werden keine Rezepte mitgeliefert. Alle Rezepte werden hier nur als Link angegeben. Der Link bezieht sich dabei auf die Angaben recipe:RID.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität:

cookml : menu : mrecipe :title

Name des Menü-Rezeptes
Zur Sicherheit hier auch der Titel des Rezeptes. Er sollte mit jedem Rezept angegeben sein, falls die Rezept-ID nicht gefunden wird.

Datentyp: string, XML-Attribut, Singulär
Unterstützung: Optional
Kompatibilität: Ambrosia

cookml : menu : mrecipe : desc

Nähere Angaben zum Menü-Rezept
Da das Rezept innerhalb eines Menüs oftmals eine besondere ihm zugedachte Stellung einnehmen kann, ist es möglich hier eine eigens für das Menü passende Beschreibung mitzugeben.

Datentyp: string, XML-Element, Sequenz
Unterstützung: Optional
Kompatibilität: Ambrosia

Verwendeter Zeichensatz:

CML-Dateien werden immer unter Verwendung der UTF-8-Codierung erzeugt.
UTF-8 ist die einfachste Form von Unicode: Jedes ASCII-Zeichen mit einem ASCII-Wert <127 wird weiterhin als ASCII-Zeichen verwendet. Sonderzeichen mit einem ASCII-Wert >= 127 sind als 16-Bit-Unicode, also in Form von 2 Bytes zu übertragen. Viele Bibliotheken übernehmen diese Umwandlung. Falls diese Umsetzung selbst programmiert wird, bietet folgende Umsetzungstabelle eine Hilfe.

Ä (0xC384) ä (0xC3A4) À (0xC380) à (0xC3A0) Á (0xC381) á (0xC3A1) Â (0xC382) â (0xC3A2) Ã (0xC383) ã (0xC3A3)
    È (0xC388) è (0xC3A8) É (0xC389) é (0xC3A9) Ê (0xC38A) ê (0xC3AA) Ë (0xC38B) ë (0xC3AB)
    Ì (0xC38C) ì (0xC3AC) Í (0xC38D) í (0xC3AD) Î (0xC38E) î (0xC3AE) Ï (0xC38F) ï (0xC3AF)
Ö (0xC396) ö (0xC3B6) Ò (0xC392) ò (0xC3B2) Ó (0xC393) ó (0xC3B3) Ô (0xC394) ô (0xC3B4) Õ (0xC395) õ (0xC3B5)
Ü (0xC39C) ü (0xC3BC) Ù (0xC399) ù (0xC3B9) Ú (0xC39A) ú (0xC3BA) Û (0xC39B) û (0xC3BB)    
ß (0xC39F) Æ (0xC386) æ (0xC3A6) Ç (0xC387) ç (0xC3A7) Ñ (0xC391) ñ (0xC3B1)      
° (0xC2B0) © (0xC2A9) ¼ (0xC2BC) ½ (0xC2BD) ¾ (0xC2BE) ø (0xC3B8)        

Aufbau der Rezept-ID:

Die Rezept-IDs müssen immer nach dem gleichen Schema aufgebaut werden. Hier wird die ID von Rolf Wilhelm eingesetzt, der diese schon seit einiger Zeit in seinem Programm Ambrosia einsetzt und die allgemein akzeptiert ist.

Die CookML-Rezept-ID besteht immer aus zwei 32 Bit Werten.

Wert 1:
Kodiertes Datum Bit 0-30
0 1 2 3
Bit 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Minute |Stunde |Tag |Monat |Jahr-1980
6 Bit 5 Bit 5 Bit 4 Bit 11 Bit

Wert 2:
0 1 2 3
Bit 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
Serial-ID |Creator-ID
20 Bit 12 Bit

Generator-ID:
Der in Windows bekannte Benutzername wird wie folgt aufsummiert:
For Each Character: Creator-ID += Ascii(Character) * Character-Position
Character-Position: 1-n
Überläufe werden ignoriert, ebenso Gross/Kleinschreibung

Serial-ID:
Beginnend mit einem Zufallswert wird der Counter bei jeder Fingerprint-Neugenerierung
um 1 hochgezählt, ein Überlauf wird ignoriert.

Update:
Verfügt ein Objekt über einen gültigen Fingerprint, so wird im Falle eines Update
nur noch das Datum angepasst, Serial-ID sowie Creator-ID bleiben gleich.
Dies ist im Gegensatz zur ersten Implementierung der wesentliche Unterschied, hier
wurde der damalige "Counter" (jetzt neu "Serial-ID") um eins erhöht sowie die
Creator-ID auf den aktuellen Wert angepasst. Die Korrektur wurde notwendig, um neue
Versionen eines Objektes identifizieren zu können.


Erlaubte Einheiten für die Zutaten

CookML ist ein internationales Format. Daher sind alle Einheiten im amerikanischen Format anzugeben und gegebenenfalls umzurechnen.
Im Folgenden ein Liste, in der links die für den Transfer erlaubten Einheiten und rechts die deutsche Entsprechung stehen.
Diese Liste entspricht den Mealmaster-Einheiten und erleichtert die Implementierung, sofern das Mealmaster-Format auch unterstützt wird.

fl fluid ounce ~ 30 ml
x per serving  pro Portion
c cup  = 250 ml
sm small  klein
pt pint  1/2 Liter
md medium  mittel
qt quart  1 Liter
lg large gross
ga gallon  4 Liter
cn can  Dose
oz ounce  ~ 30 g
pk package  Packung
lb pound  ~ 450 g
pn pinch  Prise, Msp.
ml milliliter  ccm
cb cubic cm  ccm
dr drop  Tropfen
ds dash Schuss, Spur
cl centiliter  10 ccm
ct carton  Karton
dc deciliter  100 ccm = 0,1 Liter
bn bunch Bund 
l liter  Liter
sl slice Scheibe
mg milligram  Milligramm
ea each  pro Portion
cg centigram  1/100 Gramm
t teaspoon Teeloeffel 
dg decigram  1/10 Gramm
ts teaspoon Teeloeffel 
g gram  Gramm
T tablespoon Essloeffel 
tb tablespoon Essloeffel 
kg kilogram  Kilogramm

Zurück zum Seitenanfang


  

Weitere Hinweise zu den Seiten finden Sie in unserem Impressum
Hier finden Sie Hinweise zu unseren Datenschutzbestimmungen
Copyright © 2023 CODEV, Jochen Herz, www.kalorio.de