=head1 NAME HTML::Microformats::Format::hRecipe - the hRecipe microformat =head1 SYNOPSIS use Data::Dumper; use HTML::Microformats::DocumentContext; use HTML::Microformats::Format::hRecipe; my $context = HTML::Microformats::DocumentContext->new($dom, $uri); my @recipes = HTML::Microformats::Format::hRecipe->extract_all( $dom->documentElement, $context); foreach my $recipe (@recipes) { print $recipe->get_summary . "\n"; } =head1 DESCRIPTION HTML::Microformats::Format::hRecipe inherits from HTML::Microformats::Format. See the base class definition for a description of property getter/setter methods, constructors, etc. =cut package HTML::Microformats::Format::hRecipe; use base qw(HTML::Microformats::Format HTML::Microformats::Mixin::Parser); use strict qw(subs vars); no warnings; use 5.010; use Object::AUTHORITY; BEGIN { $HTML::Microformats::Format::hRecipe::AUTHORITY = 'cpan:TOBYINK'; $HTML::Microformats::Format::hRecipe::VERSION = '0.105'; } sub new { my ($class, $element, $context) = @_; my $cache = $context->cache; return $cache->get($context, $element, $class) if defined $cache && $cache->get($context, $element, $class); my $self = { 'element' => $element , 'context' => $context , 'cache' => $cache , 'id' => $context->make_bnode($element) , }; bless $self, $class; my $clone = $element->cloneNode(1); $self->_expand_patterns($clone); $self->_simple_parse($clone); $cache->set($context, $element, $class, $self) if defined $cache; return $self; } sub format_signature { my $lr = 'http://linkedrecipes.org/schema/'; my $hr = 'http://ontologi.es/hrecipe#'; my $rdfs = 'http://www.w3.org/2000/01/rdf-schema#'; return { 'root' => 'hrecipe', 'classes' => [ ['fn', '1'], ['ingredient', '+'], ['yield', '?'], ['instructions', 'H?'], ['duration', 'D*'], ['photo', 'u*'], ['summary', '?'], ['author', 'M*', {embedded=>'hCard !person'}], ['published', 'd?'], ['nutrition', '*'], ], 'options' => { 'rel-tag' => 'tag', }, 'rdf:type' => ["${lr}Recipe"] , 'rdf:property' => { 'fn' => { 'literal' => ["${rdfs}label"] } , 'yield' => { 'literal' => ["${lr}servings"] } , 'html_instructions' => { 'literal' => ["${hr}instructions"], 'literal_datatype'=>'http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral' } , 'duration' => { 'literal' => ["${lr}time"] } , 'photo' => { 'resource' => ['http://xmlns.com/foaf/0.1/depiction'] }, 'summary' => { 'literal' => ["${rdfs}comment"] } , 'published' => { 'literal' => ['http://purl.org/dc/terms/issued'] }, 'nutrition' => { 'literal' => ["${lr}dietaryInformation"] } , }, }; } sub add_to_model { my $self = shift; my $model = shift; $self->_simple_rdf($model); my $lr = 'http://linkedrecipes.org/schema/'; my $hr = 'http://ontologi.es/hrecipe#'; my $rdfs = 'http://www.w3.org/2000/01/rdf-schema#'; # Handle ingredients. my $i = 0; foreach my $ingredient (@{ $self->data->{'ingredient'} }) { $model->add_statement(RDF::Trine::Statement->new( $self->id(1), RDF::Trine::Node::Resource->new("${lr}ingredient"), $self->id(1, "ingredient.${i}"), )); $model->add_statement(RDF::Trine::Statement->new( $self->id(1, "ingredient.${i}"), RDF::Trine::Node::Resource->new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), RDF::Trine::Node::Resource->new("${lr}IngredientPortion"), )); $model->add_statement(RDF::Trine::Statement->new( $self->id(1, "ingredient.${i}"), RDF::Trine::Node::Resource->new("${rdfs}label"), $self->_make_literal($ingredient), )); $i++; } foreach my $author (@{ $self->data->{'author'} }) { $model->add_statement(RDF::Trine::Statement->new( $self->id(1), RDF::Trine::Node::Resource->new("http://xmlns.com/foaf/0.1/maker"), $author->id(1, "holder"), )); $author->add_to_model($model); } return $self; } sub profiles { my $class = shift; return qw(http://purl.org/uF/hRecipe/0.23/); } 1; =head1 MICROFORMAT HTML::Microformats::Format::hRecipe supports hRecipe 0.23 as described at L. =head1 RDF OUTPUT L, L. =head1 BUGS Please report any bugs to L. =head1 SEE ALSO L, L. =head1 AUTHOR Toby Inkster Etobyink@cpan.orgE. =head1 COPYRIGHT AND LICENCE Copyright 2008-2012 Toby Inkster This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 DISCLAIMER OF WARRANTIES THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. =cut