recipe-brainstorming: Difference between revisions
m (→Implementations: demote heading level; mention rel-tag.) |
No edit summary |
||
Line 71: | Line 71: | ||
* The element {{must}} include the field item. | * The element {{must}} include the field item. | ||
* The element {{may}} include <code>quantity</code>, <code>note</code> and/or <code>optionality</code>. | * The element {{may}} include <code>quantity</code>, <code>note</code> and/or <code>optionality</code>. | ||
'''Quantity''': The quantity of an ingredient needed for the recipe. | '''Quantity''': The quantity of an ingredient needed for the recipe. | ||
Line 96: | Line 93: | ||
* A Recipe {{must}} include a <code>method</code>. | * A Recipe {{must}} include a <code>method</code>. | ||
* The field {{may}} include valid HTML markup (e.g. paragraphs). | * The field {{may}} include valid HTML markup (e.g. paragraphs). | ||
'''Yield''': Specifies the quantity produced by the recipe. | '''Yield''': Specifies the quantity produced by the recipe. | ||
Line 103: | Line 98: | ||
* A Recipe {{may}} include a <code>yield</code>. | * A Recipe {{may}} include a <code>yield</code>. | ||
=== | ==Brainstorming== | ||
===RecipeML-based Brainstorm=== | |||
==RecipeML-based Brainstorm== | |||
Excerpted from [http://conoroneill.com/2006/03/21/what-if-i-suggest-a-structured-recipe-format-and-you-critique-it/ Conor Bandon's Blog entry] and derived from The RecipeML Spec: | Excerpted from [http://conoroneill.com/2006/03/21/what-if-i-suggest-a-structured-recipe-format-and-you-critique-it/ Conor Bandon's Blog entry] and derived from The RecipeML Spec: | ||
Line 184: | Line 132: | ||
**Could be one per dish, or one for each (or for some of the) step(s). [[User:AndyMabbett|Andy Mabbett]] | **Could be one per dish, or one for each (or for some of the) step(s). [[User:AndyMabbett|Andy Mabbett]] | ||
== Additional Suggestions == | |||
===Cookcamp brainstorming=== | |||
At [http://barcamp.org/CookCamp CookCamp] in February 2007, Tantek moderated a fairly free form discussion of how to publish/share recipes. Here is a [http://flickr.com/photos/tantek/422072573/ photo of the whiteboard]: | |||
[http://flickr.com/photos/tantek/422072573/ http://farm1.static.flickr.com/162/422072573_9956d93f61.jpg] | |||
'''To Do''': OCR this and enter rough notes here... | |||
===Additional Suggestions=== | |||
*Steps - As cited above but to include estimated time per step. Include the type of step (prep, preheat, cook, bake, mix, saute, etc) as well as the ingredients involved. This would be very useful when trying to time a meal so all the food appears together. | *Steps - As cited above but to include estimated time per step. Include the type of step (prep, preheat, cook, bake, mix, saute, etc) as well as the ingredients involved. This would be very useful when trying to time a meal so all the food appears together. | ||
**I think this is being to specific. Are there any real world examples where this would be useful? --[[User:Yde|Yde]] 08:41, 30 May 2008 (PDT) | **I think this is being to specific. Are there any real world examples where this would be useful? --[[User:Yde|Yde]] 08:41, 30 May 2008 (PDT) | ||
Line 218: | Line 175: | ||
*Under what terms is the recipe licensed? Microformat: rel="license". Often a page is in the creative commons but the page author has taken some text from a copyrighted page and in theory re-published the work in violation to the terms of use, adding a rel="license" to each recipe on the page? [[User:Lee Jordan|Lee Jordan]] 20:55, 04 Feb 2008 (GMT) | *Under what terms is the recipe licensed? Microformat: rel="license". Often a page is in the creative commons but the page author has taken some text from a copyrighted page and in theory re-published the work in violation to the terms of use, adding a rel="license" to each recipe on the page? [[User:Lee Jordan|Lee Jordan]] 20:55, 04 Feb 2008 (GMT) | ||
=== Proposed Ingredient List Optimisation === | ===Single foodstuffs=== | ||
If "method" is made optional, this could be used for marking up individual foodstuffs in prose. for example, "I like to eat cheese for supper." would become: | |||
<pre><nowiki> | |||
I like to eat <span class="hRecipe"><span class="ingredient">cheese</span></span> for supper. | |||
</nowiki></pre> | |||
or simply (if the proposed "[http://microformats.org/discuss/mail/microformats-discuss/2008-January/011199.html sub-microformat-pattern]" is adopted): | |||
<pre><nowiki> | |||
I like to eat <span class="hRecipe-ingredient">cheese</span> for supper. | |||
</nowiki></pre> | |||
: [[User:AndyMabbett|Andy Mabbett]] 08:16, 5 Jan 2008 (PST) | |||
But that's not really a recipe, is it? And what would the purpose of knowing that cheese is an ingredient be? | |||
--[[User:Yde|Yde]] 12:46, 18 Apr 2008 (PDT) | |||
===Menus=== | |||
With the addition of a "price" field, and perhaps one or two others, and again making "method" optional, this microformat can also be used for menus. See [[recipe-examples#Menus|menu examples]]. | |||
: [[User:AndyMabbett|Andy Mabbett]] 02:39, 19 Feb 2008 (PST) | |||
I would consider this out of scope (which is to produce an as-simple-as-possible microformat "for the mark-up of instructions for creating meals, drinks or food-based items" - [[recipe-brainstorming#Introduction | introduction]]) --[[User:Yde|Yde]] 13:39, 23 Apr 2008 (PDT) | |||
===Multiple Items per Ingredient=== | |||
We need a way to mark-up more than one item per ingredient. This is useful when: | |||
* you need to mark-up more than one <code>item</code> in an <code>ingredient</code> e.g. "salt and pepper". | |||
* you need to mark-up multiple options for an <code>ingredient</code> e.g. "cream or whipping cream". | |||
The first problem could be solved by simply making the two items into two ingredients like this: | |||
<pre><nowiki><span class="ingredient">salt</span> and <span class="ingredient">pepper</span></nowiki></pre> | |||
But in a list it would be inconvinient and not very aesthetically pleasing: | |||
<pre><nowiki> | |||
<li class="ingredient">...</li> | |||
<li><span class="ingredient">salt</span> and <span class="ingredient">pepper</span></li> | |||
<li class="ingredient">...</li> | |||
</nowiki></pre> | |||
Could we just allow more than one <code>item</code> per <code>ingredient</code>? | |||
For the second problem there is currently no good workaround. There is ''no way to mark-up "or"''. Possible solutions: | |||
* We could reuse the <code>optional</code> property: | |||
<pre><nowiki><span class="ingredient"><span class="item optional">Cream</span> or <span class="item optional">whipping cream</span></span></nowiki></pre> | |||
* If this conflicts with other uses of the <code>optional</code> property we might invent another class name for this functionality (<code>option</code>?) but personally I like to keep the scema to a minimum. | |||
=== Proposed Optimisations === | |||
==== Proposed Ingredient List Optimisation ==== | |||
[[User:TobyInk|TobyInk]] 03:42, 23 Mar 2008 (PDT): | [[User:TobyInk|TobyInk]] 03:42, 23 Mar 2008 (PDT): | ||
Line 244: | Line 257: | ||
I agree. This would save a lot of space, especially combined with the proposed hmeasur [http://microformats.org/wiki/measure#hmeasure minimisation technique]. --[[User:Yde|Yde]] 12:57, 18 Apr 2008 (PDT) | I agree. This would save a lot of space, especially combined with the proposed hmeasur [http://microformats.org/wiki/measure#hmeasure minimisation technique]. --[[User:Yde|Yde]] 12:57, 18 Apr 2008 (PDT) | ||
=== Proposed Ingredient Name/Quantity Optimisation === | ==== Proposed Ingredient Name/Quantity Optimisation ==== | ||
[[User:TobyInk|TobyInk]] 03:42, 23 Mar 2008 (PDT): | [[User:TobyInk|TobyInk]] 03:42, 23 Mar 2008 (PDT): | ||
Line 268: | Line 281: | ||
Which (apart from the double spaces) is pretty close to how many people publish ingredients lists already. (Certainly close to how I do!) | Which (apart from the double spaces) is pretty close to how many people publish ingredients lists already. (Certainly close to how I do!) | ||
=== Alternative Proposed Ingredient Name/Quantity Optimisation === | ==== Alternative Proposed Ingredient Name/Quantity Optimisation ==== | ||
[[User:TobyInk|TobyInk]] 02:02, 24 Mar 2008 (PDT): Perhaps a better solution than the double spacing... | [[User:TobyInk|TobyInk]] 02:02, 24 Mar 2008 (PDT): Perhaps a better solution than the double spacing... | ||
Line 284: | Line 297: | ||
Or is this stretching the meaning of <var> too much? | Or is this stretching the meaning of <var> too much? | ||
=== Proposed Ingredient Name Optimisation === | ==== Proposed Ingredient Name Optimisation ==== | ||
--[[User:Yde|Yde]] 02:12, 23 Apr 2008 (PDT): | --[[User:Yde|Yde]] 02:12, 23 Apr 2008 (PDT): | ||
Line 307: | Line 320: | ||
NOTE: To avoid confusion, I used the class name "name" although I think it should be changed to "item". | NOTE: To avoid confusion, I used the class name "name" although I think it should be changed to "item". | ||
==Issues== | ==Issues== | ||
PLease see the seperate page [[recipe-issues]] section. | |||
==Implementations== | |||
===Cognition=== | |||
As of September 2008, [http://buzzword.org.uk/cognition/ Cognition] has experimental support for this format. Class names supported are: | |||
* <code>hrecipe</code> | |||
** <code>recipe-title</code> (required, singular) | |||
** <code>recipe-summary</code> (optional, singular) | |||
** <code>author</code> (optional, plural) | |||
*** embedded [[hCard]] | |||
** <code>published</code> (optional, plural) | |||
** <code>photo</code> (optional, plural) | |||
** <code>method</code> (if plural, then concatenated) | |||
** <code>ingredient</code> (required, plural) | |||
*** <code>quantity</code> | |||
**** embedded [[measure|hmeasure]] | |||
*** <code>item</code> | |||
*** <code>note</code> | |||
*** <code>optional</code> | |||
** <code>yield</code> (optional, singular) | |||
** <code>preparation-time</code> (optional, singular) | |||
** embedded [[rel-tag]]. | |||
< | Also you can use <code>class="ingredients"</code> on an element as a shorthand for putting <code>class="ingredient"</code> on all its direct child elements. | ||
Recipes may be exported in [[recipe-formats#RecipeBook_XML|RecipeBook XML]] format. | |||
== See Also == | == See Also == | ||
Line 397: | Line 359: | ||
* [[recipe-examples]] | * [[recipe-examples]] | ||
* [[recipe-formats]] | * [[recipe-formats]] | ||
* [[recipe-issues]] |
Revision as of 17:10, 30 September 2008
Recipe Brainstorming
Towards a Recipe microformat. Please read the process before editing this page.
Format-In-Progress
This format-in-progress follows the restarting of Recipe development by Frances Berriman on 25th September 2007. Note that this Format-In-Progress section is intended to be edited to reflect the discussion that occurs on the microformats-new list, rather than being a free-form playground for schema. This documentation was produced by Ben Ward and Frances Berriman.
- Editor
- Frances Berriman (BBC)
Introduction
Recipe is based on examples and fields in existing formats.
The recipe microformat is designed for the mark-up of instructions for creating meals, drinks or food-based items.
Root Class Name
To be decided. Likely ‘hrecipe’.
Property List
Class names author
and published
are taken from hAtom, photo
used from hCard and item
from measure.
- Title.
recipe-title
. required. text. - Summary.
recipe-summary
. optional. text. - Author.
author
. optional. hcard. - Date published.
published
. optional. datetime-design-pattern. - Photo(s).
photo
. optional. img or url. - Ingredient(s).
ingredient
. 1 or more required.- Quantity.
quantity
. optional. text, optionally measure. - Item.
item
. required. text. - Note.
note
. optional. text. - Optionality.
optional
. optional. text. Its absence should imply that the ingredient is required.
- Quantity.
- Method.
method
. required. text with optional valid HTML markup. - Yield.
yield
. optional. text. - Preparation time.
preparation-time
. optional. (see ISO-31-1 duration brainstorming) - Tags. optional. rel-tag.
- License. optional. rel-license.
Field Details
Title: The title of the recipe.
- The element is identified by class name
recipe-title
. - A Recipe MUST have a
recipe-title
Summary: The summary provides a short introduction or an accompanying statement about the recipe.
- The element is identified by class name
recipe-summary
. - A Recipe MAY have a
recipe-summary
.
Author: Author the person who authored the recipe.
- The element is identified by class name
author
. - A Recipe MAY include an
author
. - The contents of the element MUST include a valid hCard.
Date published: The date the recipe was published.
- The element is identified by the class name
published
. - A Recipe MAY include a
published
date. - SHOULD (?) use the datetime-design-pattern to encode the published datetime.
Photo: Accompanying image.
- The element is identified by the class name
photo
. - A Recipe MAY include one or more photo elements.
- The element SHOULD use an
<img>
element. - The element MAY use any other element that contains a URL, such as
<a>
or<object>
, but it is not recommended.
Ingredient: Describes an ingredient used in the recipe.
- The element is identified by the class name
ingredient
. - A Recipe MUST have one or more
ingredient
s. - The element MUST include the field item.
- The element MAY include
quantity
,note
and/oroptionality
.
Quantity: The quantity of an ingredient needed for the recipe.
- The element is identified by the class name
quantity
. - An ingredient MAY specify the
quantity
.
Item: Specifies the name of the ingredient.
- The element is identified by the class name
item
. - An ingredient MUST specify the
item
.
Note: A note concerning one of the ingredients.
- The element is identified by the class name
note
. - An ingredient MAY include a
note
.
Optionality: States that an ingredient is optional to the recipe.
- The element is identified by the class name
optionality
. - The
optionality
of aningredient
MAY be specified. - The absence of the element implies that the ingredient is required.
Method: The method of the recipe.
- The element is identified by the class name
method
. - A Recipe MUST include a
method
. - The field MAY include valid HTML markup (e.g. paragraphs).
Yield: Specifies the quantity produced by the recipe.
- The element is identified by the class name
yield
. - A Recipe MAY include a
yield
.
Brainstorming
RecipeML-based Brainstorm
Excerpted from Conor Bandon's Blog entry and derived from The RecipeML Spec:
- Recipe_Title
- Summary Description (one liner)
- Measurement System (U.S., Imperial etc)
- Ingredients (each one a separate "item" rather than block text with count/amount/range/unit broken out too)
- Some (e.g. meats, vegetables) could optionally be marked up with (elements of) the proposed species microformat. Andy Mabbett 06:41, 16 Nov 2006 (PST)
- Ingredient importance (e.g. Main, Required, Optional) should be listed as an attribute of each entry. α
- Units need separate microformat: see measure
- Ingredient Preparation: such as diced, chopped, sliced, grated, minced, etc. Steve Lewis 18:55, 11 Feb 2007 (PST)
- Preparation Time (overall time)
- Yield Quantity and Unit (4 pancakes or 5 servings)
- Calories per serving John LeMasney
- Calories per ounce John LeMasney
- Background Information - Optional section to encapsulate information that is useful but not necessarily required for a successful recipe. α
- Author (Person) (hcard?)
- Submitter (Person) (hcard?)
- Source (Book Title etc)
- could use the proposed citation microformat. Andy Mabbett 06:43, 16 Nov 2006 (PST)
- Date (Of Creation or Publication)
- Rights (Copyright or other)
- Meal Category (Starter, entree, dessert )
- Cuisine Category (Italian etc)
- Instructions (text, but can contain:)
- Steps (optional)
- Should be an ordered list Andy Mabbett 14:46, 16 Nov 2006 (PST)
- Another vote for an ordered list, perhaps in the XOXO format. α
- Many recipes associate ingredients with specific steps of a multi-step method; if methods are broken out into steps, then the format should support this association whether the complete ingredient list is up front or the ingredient list is itself broken out per step. Ben Curtis
- Steps (optional)
- Photo (optional) Cameron Perry
- Could be one per dish, or one for each (or for some of the) step(s). Andy Mabbett
Cookcamp brainstorming
At CookCamp in February 2007, Tantek moderated a fairly free form discussion of how to publish/share recipes. Here is a photo of the whiteboard:
To Do: OCR this and enter rough notes here...
Additional Suggestions
- Steps - As cited above but to include estimated time per step. Include the type of step (prep, preheat, cook, bake, mix, saute, etc) as well as the ingredients involved. This would be very useful when trying to time a meal so all the food appears together.
- I think this is being to specific. Are there any real world examples where this would be useful? --Yde 08:41, 30 May 2008 (PDT)
- Difficulty/Notes - Perhaps incorporation of hReview to describe difficulty (using rating) and general comments (review), as an optional field. Frances Berriman
- Suitability (e.g. vegetarian, vegan, wheat-free, etc.). Possibly rel-tag. Andy Mabbett 14:57, 16 Nov 2006 (PST)
- Ingredient Grouping - In baking you need to differentiate wet from dry ingredients. See also an example recipe from extratasty.com for useful grouping in cocktail mixing. Steve Lewis 19:10, 11 Feb 2007
- Maybe this ingredient grouping can be used to express some alternative ingredients, like "mayonnaise or cream cheese". Estêvão Samuel Procópio 15:33, 16 Dez 2007 (PDT)
- This could be solved by using a xoxo list and ignoring list items that don't include a class="name". Example:
<ul class="ingredients"> <li>Booze <ul> <li>1 part <span class="name">Rum</span></li> </ul> </li> <li>Mixer <li>1 part <span class="name">Cola</span></li> <li>1 part <span class="name">Lime juice</span></li> </li> </ul> --Yde 13:09, 18 Apr 2008 (PDT)
- We can't have a dependency on XOXO or any list mark-up for ingredients. That's too restrictive on publishing patterns, preventing patterns like:
<p class="method">Take <span class="ingredient"><span class="quantity">a handful</span> of spinach</span> and fry it</p>
--BenWard 13:20, 18 Apr 2008 (PDT)
You're right. I think grouping would introduce too many new elements (class="group", class="group-title") considering how relatively uncommon this is. --Yde 13:51, 23 Apr 2008 (PDT)
- Number of dishes or similary - often it's mentioned how many dishes (or breads in baking, etc) the ingredients are for. WilleRaab 16:57, 20 Jul 2007 (PDT)
- Suitable for occations - what occations are the dish suitable for? WilleRaab 16:57, 20 Jul 2007 (PDT)
- Category - many sites categorize their recipes. WilleRaab 16:57, 20 Jul 2007 (PDT)
- Tags could be used for both suitability and category.
Note: Comments added "WilleRaab 16:57, 20 Jul 2007 (PDT)" are added after looking at http://tasteline.com, example: here.
- Under what terms is the recipe licensed? Microformat: rel="license". Often a page is in the creative commons but the page author has taken some text from a copyrighted page and in theory re-published the work in violation to the terms of use, adding a rel="license" to each recipe on the page? Lee Jordan 20:55, 04 Feb 2008 (GMT)
Single foodstuffs
If "method" is made optional, this could be used for marking up individual foodstuffs in prose. for example, "I like to eat cheese for supper." would become:
I like to eat <span class="hRecipe"><span class="ingredient">cheese</span></span> for supper.
or simply (if the proposed "sub-microformat-pattern" is adopted):
I like to eat <span class="hRecipe-ingredient">cheese</span> for supper.
- Andy Mabbett 08:16, 5 Jan 2008 (PST)
But that's not really a recipe, is it? And what would the purpose of knowing that cheese is an ingredient be? --Yde 12:46, 18 Apr 2008 (PDT)
Menus
With the addition of a "price" field, and perhaps one or two others, and again making "method" optional, this microformat can also be used for menus. See menu examples.
- Andy Mabbett 02:39, 19 Feb 2008 (PST)
I would consider this out of scope (which is to produce an as-simple-as-possible microformat "for the mark-up of instructions for creating meals, drinks or food-based items" - introduction) --Yde 13:39, 23 Apr 2008 (PDT)
Multiple Items per Ingredient
We need a way to mark-up more than one item per ingredient. This is useful when:
- you need to mark-up more than one
item
in aningredient
e.g. "salt and pepper". - you need to mark-up multiple options for an
ingredient
e.g. "cream or whipping cream".
The first problem could be solved by simply making the two items into two ingredients like this:
<span class="ingredient">salt</span> and <span class="ingredient">pepper</span>
But in a list it would be inconvinient and not very aesthetically pleasing:
<li class="ingredient">...</li> <li><span class="ingredient">salt</span> and <span class="ingredient">pepper</span></li> <li class="ingredient">...</li>
Could we just allow more than one item
per ingredient
?
For the second problem there is currently no good workaround. There is no way to mark-up "or". Possible solutions:
- We could reuse the
optional
property:
<span class="ingredient"><span class="item optional">Cream</span> or <span class="item optional">whipping cream</span></span>
- If this conflicts with other uses of the
optional
property we might invent another class name for this functionality (option
?) but personally I like to keep the scema to a minimum.
Proposed Optimisations
Proposed Ingredient List Optimisation
TobyInk 03:42, 23 Mar 2008 (PDT):
If class="ingredients" (note: plural) is found on an element, class="ingredient" (note: singular) is automatically implied on all its children.
<ul class="ingredients"> <li><span class="quantity">3</span> <span class="name">eggs</span></li> <li><span class="quantity">6 oz</span> <span class="name">self-raising flour</span></li> <li><span class="quantity">6 oz</span> <span class="name">caster sugar</span></li> <li><span class="quantity">6 oz</span> <span class="name">butter</span></li> <li><span class="quantity">1 tsp</span> <span class="name">vanilla essence</span></li> </ul>
is a shorthand for:
<ul class="ingredients"> <li class="ingredient"><span class="quantity">3</span> <span class="name">eggs</span></li> <li class="ingredient"><span class="quantity">6 oz</span> <span class="name">self-raising flour</span></li> <li class="ingredient"><span class="quantity">6 oz</span> <span class="name">caster sugar</span></li> <li class="ingredient"><span class="quantity">6 oz</span> <span class="name">butter</span></li> <li class="ingredient"><span class="quantity">1 tsp</span> <span class="name">vanilla essence</span></li> </ul>
I agree. This would save a lot of space, especially combined with the proposed hmeasur minimisation technique. --Yde 12:57, 18 Apr 2008 (PDT)
Proposed Ingredient Name/Quantity Optimisation
TobyInk 03:42, 23 Mar 2008 (PDT):
This idea's a bit more "out there" and probably needs a bit more work.
<li class="ingredient">3 eggs</li>
(note the double-space between '3' and 'eggs') is treated as a shorthand for:
<li class="ingredient"><span class="quantity">3</span> <span class="name">eggs</span></li>
This is similar to N-optimisation in hCard, but uses a double space instead of a single space because the components (quantity, name) may themselves each contain spaces. With both of these optimisations in place, the sponge cake ingredient list can be written as concisely as:
<ul class="ingredients"> <li>3 eggs</li> <li>6 oz self-raising flour</li> <li>6 oz caster sugar</li> <li>6 oz butter</li> <li>1 tsp vanilla essence</li> </ul>
Which (apart from the double spaces) is pretty close to how many people publish ingredients lists already. (Certainly close to how I do!)
Alternative Proposed Ingredient Name/Quantity Optimisation
TobyInk 02:02, 24 Mar 2008 (PDT): Perhaps a better solution than the double spacing...
As above, but:
<ul class="ingredients"> <li><var>3</var> eggs</li> <li><var>6 oz</var> self-raising flour</li> <li><var>6 oz</var> caster sugar</li> <li><var>6 oz</var> butter</li> <li><var>1 tsp</var> vanilla essence</li> </ul>
Or is this stretching the meaning of <var> too much?
Proposed Ingredient Name Optimisation
--Yde 02:12, 23 Apr 2008 (PDT):
If no class="quantity" or class="name" is found, the content of the ingredient element is treated as the name of the ingredient.
<li class="ingredient">salt</li>
is a shorthand for:
<li class="ingredient"><span class="name">salt</span></li>
Maybe we should even allow markup like
<li class="ingredient"><span class="quantity">1 tbsp</span>salt</li>
which would be parsed as
- ingredient
- quantity: 1 tbsp
- name: salt
NOTE: To avoid confusion, I used the class name "name" although I think it should be changed to "item".
Issues
PLease see the seperate page recipe-issues section.
Implementations
Cognition
As of September 2008, Cognition has experimental support for this format. Class names supported are:
hrecipe
recipe-title
(required, singular)recipe-summary
(optional, singular)author
(optional, plural)- embedded hCard
published
(optional, plural)photo
(optional, plural)method
(if plural, then concatenated)ingredient
(required, plural)quantity
- embedded hmeasure
item
note
optional
yield
(optional, singular)preparation-time
(optional, singular)- embedded rel-tag.
Also you can use class="ingredients"
on an element as a shorthand for putting class="ingredient"
on all its direct child elements.
Recipes may be exported in RecipeBook XML format.