hangry 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/lib/hangry.rb +3 -1
  2. data/lib/hangry/data_vocabulary_recipe_parser.rb +3 -3
  3. data/lib/hangry/hrecipe_parser.rb +23 -7
  4. data/lib/hangry/parser_class_selecter.rb +3 -1
  5. data/lib/hangry/parsers/non_standard/all_recipes_parser.rb +1 -2
  6. data/lib/hangry/parsers/non_standard/eating_well_parser.rb +2 -6
  7. data/lib/hangry/parsers/non_standard/taste_of_home_parser.rb +22 -0
  8. data/lib/hangry/recipe_attribute_cleaner.rb +56 -0
  9. data/lib/hangry/recipe_parser.rb +4 -17
  10. data/lib/hangry/schema_org_recipe_parser.rb +8 -11
  11. data/lib/hangry/version.rb +1 -1
  12. data/spec/fixtures/bbc.co.uk.html +713 -0
  13. data/spec/fixtures/chow.com.html +1016 -0
  14. data/spec/fixtures/cooking.com.html +3655 -0
  15. data/spec/fixtures/cooks.com.html +623 -0
  16. data/spec/fixtures/copykat.com.html +782 -0
  17. data/spec/fixtures/food.com.html +2334 -0
  18. data/spec/fixtures/foodandwine.com.html +1667 -0
  19. data/spec/fixtures/heart.org.html +1188 -0
  20. data/spec/fixtures/pillsbury.com.html +1657 -0
  21. data/spec/fixtures/saveur.com.html +1527 -0
  22. data/spec/fixtures/tarladalal.com.html +865 -0
  23. data/spec/fixtures/taste.com.au.html +2034 -0
  24. data/spec/fixtures/tasteofhome.com.html +2527 -0
  25. data/spec/real_examples/bbc_co_uk_spec.rb +75 -0
  26. data/spec/real_examples/big_oven_spec.rb +15 -1
  27. data/spec/real_examples/chow_com_spec.rb +78 -0
  28. data/spec/real_examples/cooking_com_spec.rb +60 -0
  29. data/spec/real_examples/cooks_com_spec.rb +67 -0
  30. data/spec/real_examples/copykat_spec.rb +55 -0
  31. data/spec/real_examples/food_and_wine_spec.rb +58 -0
  32. data/spec/real_examples/food_com_spec.rb +108 -0
  33. data/spec/real_examples/heart_org_spec.rb +46 -0
  34. data/spec/real_examples/pillsbury_spec.rb +59 -0
  35. data/spec/real_examples/saveur_com_spec.rb +41 -0
  36. data/spec/real_examples/tarladalal_com_spec.rb +65 -0
  37. data/spec/real_examples/taste_com_au_spec.rb +41 -0
  38. data/spec/real_examples/taste_of_home_spec.rb +70 -0
  39. metadata +67 -13
@@ -1,5 +1,6 @@
1
1
  require "hangry/version"
2
2
  require 'hangry/parser_class_selecter'
3
+ require 'hangry/recipe_attribute_cleaner'
3
4
  require 'active_support/core_ext/object/blank'
4
5
  require 'date'
5
6
  require 'iso8601'
@@ -39,7 +40,8 @@ module Hangry
39
40
 
40
41
  def self.parse(html)
41
42
  parser_class = ParserClassSelecter.new(html).parser_class
42
- parser_class.new(html).parse
43
+ recipe = parser_class.new(html).parse
44
+ RecipeAttributeCleaner.new(recipe).clean
43
45
  end
44
46
 
45
47
  end
@@ -16,11 +16,11 @@ module Hangry
16
16
  private
17
17
 
18
18
  def parse_description
19
- clean_string node_with_itemprop(:summary).content
19
+ node_with_itemprop(:summary).content
20
20
  end
21
21
 
22
22
  def parse_instructions
23
- clean_string node_with_itemprop(:instructions).content, preserve_newlines: true
23
+ node_with_itemprop(:instructions).content
24
24
  end
25
25
 
26
26
  def parse_published_date
@@ -29,7 +29,7 @@ module Hangry
29
29
  end
30
30
 
31
31
  def parse_yield
32
- clean_string node_with_itemprop(:yield).content
32
+ node_with_itemprop(:yield).content
33
33
  end
34
34
 
35
35
  end
@@ -20,7 +20,7 @@ module Hangry
20
20
  end
21
21
 
22
22
  def parse_author
23
- clean_string node_with_class(:author).content
23
+ node_with_class(:author).content
24
24
  end
25
25
 
26
26
  def parse_cook_time
@@ -28,7 +28,7 @@ module Hangry
28
28
  end
29
29
 
30
30
  def parse_description
31
- clean_string node_with_class(:summary).content
31
+ node_with_class(:summary).content
32
32
  end
33
33
 
34
34
  def parse_ingredients
@@ -38,20 +38,33 @@ module Hangry
38
38
  # This is to support BigOven's janky usage of spans with margin-lefts...
39
39
  ingredient_node.children.map { |c| c.content }.join(' ')
40
40
  }.map { |ingredient|
41
- clean_string ingredient
41
+ ingredient
42
42
  }.reject(&:blank?)
43
43
  end
44
44
 
45
45
  def parse_instructions
46
- clean_string node_with_class(:instructions).content, preserve_newlines: true
46
+ nodes_with_class(:instructions).map(&:content).join("\n")
47
47
  end
48
48
 
49
49
  def parse_name
50
- clean_string node_with_class(:fn).content
50
+ node_with_class(:fn).content
51
51
  end
52
52
 
53
53
  def parse_nutrition
54
54
  #TODO
55
+ {
56
+ calories: nil,
57
+ cholesterol: nil,
58
+ fiber: nil,
59
+ protein: nil,
60
+ saturated_fat: nil,
61
+ sodium: nil,
62
+ sugar: nil,
63
+ total_carbohydrates: nil,
64
+ total_fat: nil,
65
+ trans_fat: nil,
66
+ unsaturated_fat: nil
67
+ }
55
68
  end
56
69
 
57
70
  def parse_prep_time
@@ -63,12 +76,15 @@ module Hangry
63
76
  end
64
77
 
65
78
  def parse_total_time
66
- node = value(node_with_class(:duration)) || value(node_with_class(:totalTime))
79
+ node = maybe(
80
+ value(node_with_class(:duration)) ||
81
+ value(node_with_class(:totalTime))
82
+ )
67
83
  parse_duration node.css('.value-title').first['title']
68
84
  end
69
85
 
70
86
  def parse_yield
71
- clean_string node_with_class(:yield).content
87
+ node_with_class(:yield).content
72
88
  end
73
89
 
74
90
  end
@@ -5,6 +5,7 @@ require 'hangry/schema_org_recipe_parser'
5
5
  require 'hangry/data_vocabulary_recipe_parser'
6
6
  require 'hangry/parsers/non_standard/all_recipes_parser'
7
7
  require 'hangry/parsers/non_standard/eating_well_parser'
8
+ require 'hangry/parsers/non_standard/taste_of_home_parser'
8
9
 
9
10
  module Hangry
10
11
  class ParserClassSelecter
@@ -16,7 +17,8 @@ module Hangry
16
17
  # Prefer the more specific parsers
17
18
  parser_classes = [
18
19
  Parsers::NonStandard::AllRecipesParser,
19
- Parsers::NonStandard::EatingWellParser
20
+ Parsers::NonStandard::EatingWellParser,
21
+ Parsers::NonStandard::TasteOfHomeParser
20
22
  ]
21
23
  parser_classes += [SchemaOrgRecipeParser, HRecipeParser, DataVocabularyRecipeParser]
22
24
  parser_classes << DefaultRecipeParser
@@ -8,8 +8,7 @@ module Hangry
8
8
  end
9
9
 
10
10
  def parse_instructions
11
- content = recipe_ast.css('.directions ol').first.content
12
- clean_string content, preserve_newlines: true
11
+ recipe_ast.css('.directions ol').first.content
13
12
  end
14
13
 
15
14
  end
@@ -12,8 +12,7 @@ module Hangry
12
12
  end
13
13
 
14
14
  def parse_instructions
15
- content = nodes_with_itemprop(:recipeinstructions).map(&:content).join("\n")
16
- clean_string content, preserve_newlines: true
15
+ nodes_with_itemprop(:recipeinstructions).map(&:content).join("\n")
17
16
  end
18
17
 
19
18
  def parse_nutrition
@@ -33,10 +32,7 @@ module Hangry
33
32
  end
34
33
 
35
34
  def parse_yield
36
- clean_string(
37
- value(node_with_itemprop(:recipeyield).content) ||
38
- NullObject.new
39
- )
35
+ value(node_with_itemprop(:recipeyield).content) || NullObject.new
40
36
  end
41
37
 
42
38
  end
@@ -0,0 +1,22 @@
1
+ module Hangry
2
+ module Parsers
3
+ module NonStandard
4
+ class TasteOfHomeParser < HRecipeParser
5
+
6
+ def self.can_parse?(html)
7
+ canonical_url_matches_domain?(html, 'tasteofhome.com')
8
+ end
9
+
10
+ def nodes_with_class(klass)
11
+ super.reject { |node|
12
+ # Taste of Home has nested elements with the 'ingredient' class.
13
+ # So reject all nodes with a child that has the same class.
14
+ node.css(".#{klass}").any?
15
+ }
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,56 @@
1
+ module Hangry
2
+ class RecipeAttributeCleaner
3
+
4
+ MULTILINE_ATTRIBUTES = [:instructions]
5
+
6
+ attr_reader :recipe
7
+
8
+ def initialize(recipe)
9
+ @recipe = recipe
10
+ end
11
+
12
+ def clean
13
+ RECIPE_ATTRIBUTES.each do |attribute|
14
+ recipe.public_send("#{attribute}=", clean_attribute(recipe, attribute))
15
+ end
16
+ recipe
17
+ end
18
+
19
+ private
20
+
21
+ def clean_attribute(recipe, attribute)
22
+ value = recipe.public_send(attribute)
23
+ clean_value(value, preserve_newlines: MULTILINE_ATTRIBUTES.include?(attribute))
24
+ end
25
+
26
+ def clean_value(value, options={})
27
+ case value
28
+ when String
29
+ clean_string(value, options)
30
+ when Array
31
+ value.map { |string| clean_string(string, options) }
32
+ when Hash
33
+ value.each do |key, string|
34
+ next unless string
35
+ recipe.nutrition[key] = clean_string(string, options)
36
+ end
37
+ else
38
+ value
39
+ end
40
+ end
41
+
42
+ def clean_string(string, options={})
43
+ preserve_newlines = options.fetch(:preserve_newlines, false)
44
+
45
+ string.strip! # remove leading and trailing spaces
46
+ if preserve_newlines
47
+ string.gsub!(/\s*\n\s*/, "\n") # replace any whitespace group with a newline with a single newline
48
+ string.squeeze!(' ') # consolidate duplicate spaces into a single space
49
+ else
50
+ string.gsub!(/\s+/, ' ') # replace all consecutive whitespace with a single space
51
+ end
52
+ string
53
+ end
54
+
55
+ end
56
+ end
@@ -33,13 +33,6 @@ module Hangry
33
33
  CanonicalUrlParser.new(html).canonical_domain == domain
34
34
  end
35
35
 
36
- def clean_nutrition(recipe)
37
- recipe.nutrition.each do |key, value|
38
- next unless value
39
- recipe.nutrition[key] = clean_string value
40
- end
41
- end
42
-
43
36
  private
44
37
 
45
38
  class NullObject
@@ -63,17 +56,11 @@ module Hangry
63
56
  end
64
57
  end
65
58
 
66
- def clean_string(string, options={})
67
- preserve_newlines = options.fetch(:preserve_newlines, false)
68
-
69
- string.strip! # remove leading and trailing spaces
70
- if preserve_newlines
71
- string.gsub!(/\s*\n\s*/, "\n") # replace any whitespace group with a newline with a single newline
72
- string.squeeze!(' ') # consolidate duplicate spaces into a single space
73
- else
74
- string.gsub!(/\s+/, ' ') # replace all consecutive whitespace with a single space
59
+ def maybe(value)
60
+ case value
61
+ when nil then NullObject.new
62
+ else value
75
63
  end
76
- string
77
64
  end
78
65
 
79
66
  def initialize_nutrition
@@ -37,26 +37,25 @@ module Hangry
37
37
  else
38
38
  author_node.content
39
39
  end
40
- clean_string author
40
+ author
41
41
  end
42
42
  def parse_cook_time
43
43
  parse_time(:cookTime)
44
44
  end
45
45
  def parse_description
46
- clean_string node_with_itemprop(:description).content
46
+ node_with_itemprop(:description).content
47
47
  end
48
48
  def parse_ingredients
49
49
  nodes_with_itemprop(self.class.ingredient_itemprop).map(&:content).map { |ingredient|
50
50
  # remove newlines and excess whitespace from ingredients
51
- clean_string ingredient
51
+ ingredient
52
52
  }.reject(&:blank?)
53
53
  end
54
54
  def parse_instructions
55
- content = nodes_with_itemprop(:recipeInstructions).map(&:content).join("\n")
56
- clean_string content, preserve_newlines: true
55
+ nodes_with_itemprop(:recipeInstructions).map(&:content).join("\n")
57
56
  end
58
57
  def parse_name
59
- clean_string node_with_itemprop(:name).content
58
+ node_with_itemprop(:name).content
60
59
  end
61
60
  def parse_nutrition
62
61
  recipe.nutrition.tap do |nutrition|
@@ -93,11 +92,9 @@ module Hangry
93
92
  parse_time(:totalTime)
94
93
  end
95
94
  def parse_yield
96
- clean_string(
97
- value(node_with_itemprop(:recipeYield)['content']) ||
98
- value(node_with_itemprop(:recipeYield).content) ||
99
- NullObject.new
100
- )
95
+ value(node_with_itemprop(:recipeYield)['content']) ||
96
+ value(node_with_itemprop(:recipeYield).content) ||
97
+ NullObject.new
101
98
  end
102
99
 
103
100
  end
@@ -1,3 +1,3 @@
1
1
  module Hangry
2
- VERSION = "0.0.11"
2
+ VERSION = "0.0.12"
3
3
  end
@@ -0,0 +1,713 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-GB" lang="en-GB">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <meta name="description" content="An authentic seafood and chicken paella that boasts some of Spain’s finest ingredients, from calasparra rice to chorizo." />
6
+ <meta name="keywords" content="bbc, food, recipes, Paella" />
7
+ <title>Paella : BBC - Food - Recipes</title>
8
+ <meta http-equiv="X-UA-Compatible" content="IE=8" />
9
+ <link rel="schema.dcterms" href="http://purl.org/dc/terms/" />
10
+ <link rel="index" href="http://www.bbc.co.uk/a-z/" title="A to Z" />
11
+ <link rel="help" href="http://www.bbc.co.uk/help/" title="BBC Help" />
12
+ <link rel="copyright" href="http://www.bbc.co.uk/terms/" title="Terms of Use" />
13
+ <link rel="icon" href="http://www.bbc.co.uk/favicon.ico" type="image/x-icon" />
14
+ <meta name="viewport" content="width = 996" />
15
+ <link rel="stylesheet" type="text/css" href="http://static.bbci.co.uk/frameworks/barlesque/2.44.2/desktop/3.5/style/main.css" />
16
+ <script type="text/javascript">/*<![CDATA[*/ if (typeof bbccookies_flag === 'undefined') { bbccookies_flag = 'ON'; } showCTA_flag = false; cta_enabled = (showCTA_flag && (bbccookies_flag === 'ON') ); (function(){var e="ckns_policy",m="Thu, 01 Jan 1970 00:00:00 GMT",k={ads:true,personalisation:true,performance:true,necessary:true};function f(p){if(f.cache[p]){return f.cache[p]}var o=p.split("/"),q=[""];do{q.unshift((o.join("/")||"/"));o.pop()}while(q[0]!=="/");f.cache[p]=q;return q}f.cache={};function a(p){if(a.cache[p]){return a.cache[p]}var q=p.split("."),o=[];while(q.length&&"|co.uk|com|".indexOf("|"+q.join(".")+"|")===-1){if(q.length){o.push(q.join("."))}q.shift()}f.cache[p]=o;return o}a.cache={};function i(o,t,p){var z=[""].concat(a(window.location.hostname)),w=f(window.location.pathname),y="",r,x;for(var s=0,v=z.length;s<v;s++){r=z[s];for(var q=0,u=w.length;q<u;q++){x=w[q];y=o+"="+t+";"+(r?"domain="+r+";":"")+(x?"path="+x+";":"")+(p?"expires="+p+";":"");bbccookies.set(y,true)}}}window.bbccookies={_setEverywhere:i,cookiesEnabled:function(){var o="ckns_testcookie"+Math.floor(Math.random()*100000);this.set(o+"=1");if(this.get().indexOf(o)>-1){g(o);return true}return false},set:function(o){return document.cookie=o},get:function(){return document.cookie},_setPolicy:function(o){return h.apply(this,arguments)},readPolicy:function(o){return b.apply(this,arguments)},_deletePolicy:function(){i(e,"",m)},isAllowed:function(){return true},_isConfirmed:function(){return c()!==null},_acceptsAll:function(){var o=b();return o&&!(j(o).indexOf("0")>-1)},_getCookieName:function(){return d.apply(this,arguments)},_showPrompt:function(){return(!this._isConfirmed()&&window.cta_enabled&&this.cookiesEnabled()&&!window.bbccookies_disable)}};bbccookies._getPolicy=bbccookies.readPolicy;function d(p){var o=(""+p).match(/^([^=]+)(?==)/);return(o&&o.length?o[0]:"")}function j(o){return""+(o.ads?1:0)+(o.personalisation?1:0)+(o.performance?1:0)}function h(r){if(typeof r==="undefined"){r=k}if(typeof arguments[0]==="string"){var o=arguments[0],q=arguments[1];if(o==="necessary"){q=true}r=b();r[o]=q}else{if(typeof arguments[0]==="object"){r.necessary=true}}var p=new Date();p.setYear(p.getFullYear()+1);p=p.toUTCString();bbccookies.set(e+"="+j(r)+";domain=bbc.co.uk;path=/;expires="+p+";");bbccookies.set(e+"="+j(r)+";domain=bbc.com;path=/;expires="+p+";");return r}function l(o){if(o===null){return null}var p=o.split("");return{ads:!!+p[0],personalisation:!!+p[1],performance:!!+p[2],necessary:true}}function c(){var o=new RegExp("(?:^|; ?)"+e+"=(\\d\\d\\d)($|;)"),p=document.cookie.match(o);if(!p){return null}return p[1]}function b(o){var p=l(c());if(!p){p=k}if(o){return p[o]}else{return p}}function g(o){return document.cookie=o+"=;expires="+m+";"}function n(){var o='<script type="text/javascript" src="http://static.bbci.co.uk/frameworks/bbccookies/0.5.9/script/bbccookies.js"><\/script>';if(window.bbccookies_flag==="ON"&&!bbccookies._acceptsAll()&&!window.bbccookies_disable){document.write(o)}}n()})(); /*]]>*/</script> <script type="text/javascript"> if (! window.gloader) { window.gloader = [ "glow", {map: "http://node1.bbcimg.co.uk/glow/glow/map.1.7.7.js"}]; } </script> <script type="text/javascript" src="http://node1.bbcimg.co.uk/glow/gloader.0.1.6.js"></script> <script type="text/javascript" src="http://static.bbci.co.uk/frameworks/requirejs/0.12.1/sharedmodules/require.js"></script> <script type="text/javascript"> bbcRequireMap = {"jquery-1":"http://static.bbci.co.uk/frameworks/jquery/0.2.1/sharedmodules/jquery-1.7.2", "jquery-1.4":"http://static.bbci.co.uk/frameworks/jquery/0.2.1/sharedmodules/jquery-1.4", "swfobject-2":"http://static.bbci.co.uk/frameworks/swfobject/0.1.10/sharedmodules/swfobject-2", "demi-1":"http://static.bbci.co.uk/frameworks/demi/0.9.8/sharedmodules/demi-1", "gelui-1":"http://static.bbci.co.uk/frameworks/gelui/0.9.9/sharedmodules/gelui-1", "cssp!gelui-1/overlay":"http://static.bbci.co.uk/frameworks/gelui/0.9.9/sharedmodules/gelui-1/overlay.css", "istats-1":"http://static.bbci.co.uk/frameworks/istats/0.16.1/modules/istats-1", "relay-1":"http://static.bbci.co.uk/frameworks/relay/0.2.4/sharedmodules/relay-1", "clock-1":"http://static.bbci.co.uk/frameworks/clock/0.1.9/sharedmodules/clock-1", "canvas-clock-1":"http://static.bbci.co.uk/frameworks/clock/0.1.9/sharedmodules/canvas-clock-1", "cssp!clock-1":"http://static.bbci.co.uk/frameworks/clock/0.1.9/sharedmodules/clock-1.css", "jssignals-1":"http://static.bbci.co.uk/frameworks/jssignals/0.3.6/modules/jssignals-1", "jcarousel-1":"http://static.bbci.co.uk/frameworks/jcarousel/0.1.10/modules/jcarousel-1"}; require({ baseUrl: 'http://static.bbci.co.uk/', paths: bbcRequireMap, waitSeconds: 30 }); </script> <script type="text/javascript" src="http://static.bbci.co.uk/frameworks/barlesque/2.44.2/desktop/3.5/script/barlesque.js"></script>
17
+ <!--[if IE 6]>
18
+ <script type="text/javascript">
19
+ try {
20
+ document.execCommand("BackgroundImageCache",false,true);
21
+ } catch(e) {}
22
+ </script>
23
+ <style type="text/css">
24
+ /* Use filters for IE6 */
25
+ #blq-blocks a {
26
+ background-image: none;
27
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.bbci.co.uk/frameworks/barlesque/2.44.2/desktop/3.5//img/blq-blocks_white_alpha.png', sizingMethod='image');
28
+ }
29
+ .blq-masthead-focus #blq-blocks a,
30
+ .blq-mast-text-dark #blq-blocks a {
31
+ background-image: none;
32
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.bbci.co.uk/frameworks/barlesque/2.44.2/desktop/3.5//img/blq-blocks_grey_alpha.png', sizingMethod='image');
33
+ }
34
+ #blq-nav-search button span {
35
+ background-image: none;
36
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.bbci.co.uk/frameworks/barlesque/2.44.2/desktop/3.5//img/blq-search_grey_alpha.png', sizingMethod='image');
37
+ }
38
+ #blq-nav-search button img {
39
+ position: absolute;
40
+ left: -999em;
41
+ }
42
+ </style>
43
+ <![endif]-->
44
+ <!--[if (IE 7])|(IE 8)>
45
+ <style type="text/css">
46
+ .blq-clearfix {
47
+ display: inline-block;
48
+ }
49
+ </style>
50
+ <![endif]-->
51
+ <script type="text/javascript">
52
+ blq.setEnvironment('live'); if (! /bbc\.co\.uk$/i.test(window.location.hostname) ) { document.documentElement.className += ' blq-not-bbc-co-uk'; } </script>
53
+ <link type="text/css" rel="stylesheet" media="screen" href="http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/style/id-gvl-3-5.css" /> <!--[if IE]>
54
+ <style type="text/css" media="screen"> body .panel-identity .hd h2{ background-image: url(http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/img/panel/logo-bbcid.gif); /* Even 8bit alpha transparent PNGs are no good here */ } .panel-id-hint .panel-bd, .panel-id-hint .panel-hd, .panel-id-hint .panel-ft{ background-image: url(http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/img/panel/bg-hint.gif); } </style>
55
+ <![endif]--> <!--[if lte IE 6]>
56
+ <style type="text/css" media="screen"> /* Secure Glow fixes */ div.panel-identity .infoPanel-pointerT { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://www.bbc.co.uk/glow/1.0.2/widgets/images/darkpanel/at.png', sizingMethod='crop'); } div.panel-identity .infoPanel-pointerR { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://www.bbc.co.uk/glow/1.0.2/widgets/images/darkpanel/ar.png', sizingMethod='crop'); } div.panel-identity .infoPanel-pointerB { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://www.bbc.co.uk/glow/1.0.2/widgets/images/darkpanel/ab.png', sizingMethod='crop'); } div.panel-identity .infoPanel-pointerL { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://www.bbc.co.uk/glow/1.0.2/widgets/images/darkpanel/al.png', sizingMethod='crop'); } /* min-height fixes */ body .panel-identity .hd h2{ height: 26px; } #blq-main a.id-cta-button{ height: 22px; } #blq-main a.id-cta-button span{ height: 12px; } /* other */ div.panel-identity .c{ zoom: 1; } /* Transparent PNG replacements */ .blq-toolbar-transp #id-status .idUsername{ background-image: url(http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/img/palettes/transp/status-id-logo-noprofile.gif); } .blq-toolbar-transp #id-status .idSignin, .blq-toolbar-transp #id-status .idUsernameWithProfile{ background-image: url(http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/img/palettes/dark/status-id-logo.gif); } </style>
57
+ <![endif]--> <!--[if lte IE 7]>
58
+ <style type="text/css" media="screen"> .panel-identity form .text, .panel-identity form .password { zoom: 1; } .panel-identity form .text p { margin: 0; } .panel-identity form .password p { margin: 0 0 18px 0; } .panel-identity p.id-registerlink a.id-register { zoom: 1; padding-top: 3px; padding-bottom: 3px; top: 3px; } </style>
59
+ <![endif]--> <!--[if lte IE 8]>
60
+ <style type="text/css" media="screen"> /* Custom PNG corners for lightbox */ div.panel-identity .pc .tr { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/img/panel/ctr.png', sizingMethod='crop'); } div.panel-identity .pc .tl { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/img/panel/ctl.png', sizingMethod='crop'); } div.panel-identity .pc .bl { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/img/panel/cbl.png', sizingMethod='crop'); } div.panel-identity .pc .br { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/img/panel/cbr.png', sizingMethod='crop'); } </style>
61
+ <![endif]--> <script type="text/javascript"> if(typeof identity == 'undefined'){ identity = {}; } idProperties = { 'env': 'live', 'staticServer': 'http://', 'dynamicServer': 'http://id.bbc.co.uk', 'secureServer': 'https://id.bbc.co.uk', 'assetVersion': '3.27.2', 'assetPath': 'http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/' }; </script> <script type="text/javascript" src="http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/script/id-core.js"></script> <script type="text/javascript" src="http://static.bbci.co.uk/modules/identity/statusbar/3.27.2/script/id.js"></script>
62
+ <script type="text/javascript" src="http://static.bbci.co.uk/frameworks/pulsesurvey/0.9.3/script/pulse.js"></script> <script type="text/javascript" src="http://www.bbc.co.uk/survey/pulse/conf.js"></script> <script type="text/javascript"> pulse.translations.intro = "We are always looking to improve the site and your opinions count."; pulse.translations.question = "Do you have a few minutes to tell us what you think about this site?"; pulse.translations.accept = "Yes"; pulse.translations.reject = "No"; </script>
63
+ <link rel="stylesheet" href="http://static.bbci.co.uk/frameworks/pulsesurvey/0.9.3/style/pulse.css" type="text/css"/>
64
+ <!--[if gte IE 6]>
65
+ <style type="text/css"> .pulse-pop li{display:inline;width:40px} </style>
66
+ <![endif]--> <!--[if IE 6]>
67
+ <style type="text/css"> .pulse-pop li{display:inline;width:40px} .pulse-pop #pulse-q{background:url(http://static.bbci.co.uk/frameworks/pulsesurvey/0.9.3/img/pulse_bg.gif) no-repeat} .pulse-pop #pulse-a{background:url(http://static.bbci.co.uk/frameworks/pulsesurvey/0.9.3/img/pulse_bg.gif) bottom no-repeat;} </style>
68
+ <![endif]--> <!--[if IE 7]>
69
+ <style type="text/css"> .pulse-pop #pulse-a{zoom:1} </style>
70
+ <![endif]--> <script type="text/javascript"> if (! window.gloader) { window.gloader = [ "glow", {map: "http://node1.bbcimg.co.uk/glow/glow/map.1.7.7.js"}]; } </script>
71
+ <!-- BBCDOTCOM template:server-side journalismVariant: false ipIsAdvertiseCombined: false adsEnabled: true showDotcom: true flagpole: ON -->
72
+ <meta name="application-name" content="BBC"/>
73
+ <meta name="msapplication-tooltip" content="Explore the BBC, for latest news, sport and weather, TV &amp; radio schedules and highlights, with nature, food, comedy, children's programmes and much more"/>
74
+ <meta name="msapplication-starturl" content="http://www.bbc.com/?ocid=global-food-pinned-ie9"/>
75
+ <meta name="msapplication-window" content="width=1024;height=768"/>
76
+ <meta name="msapplication-task" content="name=BBC Home;action-uri=http://www.bbc.com/?ocid=global-homepage-pinned-ie9;icon-uri=http://static.bbci.co.uk/bbcdotcom/0.3.175/img/favicon_16.ico" />
77
+ <meta name="msapplication-task" content="name=BBC News;action-uri=http://www.bbc.com/news/?ocid=global-news-pinned-ie9;icon-uri=http://static.bbci.co.uk/bbcdotcom/0.3.175/img/favicon_16.ico" />
78
+ <meta name="msapplication-task" content="name=BBC Sport;action-uri=http://www.bbc.com/sport/0/?ocid=global-sport-pinned-ie9;icon-uri=http://static.bbci.co.uk/bbcdotcom/0.3.175/img/favicon_16.ico" />
79
+ <meta name="msapplication-task" content="name=BBC Future;action-uri=http://www.bbc.com/future?ocid=global-future-pinned-ie9;icon-uri=http://static.bbci.co.uk/bbcdotcom/0.3.175/img/favicon_16.ico" />
80
+ <meta name="msapplication-task" content="name=BBC Travel;action-uri=http://www.bbc.com/travel?ocid=global-travel-pinned-ie9;icon-uri=http://static.bbci.co.uk/bbcdotcom/0.3.175/img/favicon_16.ico" />
81
+ <meta name="msapplication-task" content="name=BBC Weather;action-uri=http://www.bbc.com/weather/?ocid=global-weather-pinned-ie9;icon-uri=http://static.bbci.co.uk/bbcdotcom/0.3.175/img/favicon_16.ico" />
82
+ <script type="text/javascript" src="http://static.bbci.co.uk/bbcdotcom/0.3.175/script/includes/object.js"></script>
83
+ <link href="http://static.bbci.co.uk/food/1.34.0/css/main.css" media="screen" rel="stylesheet" type="text/css" />
84
+ <link href="http://static.bbci.co.uk/food/1.34.0/css/recipes/recipes-show.css" media="screen" rel="stylesheet" type="text/css" />
85
+ <link href="http://static.bbci.co.uk/food/1.34.0/css/widgets/quick-recipe-finder.css" media="screen" rel="stylesheet" type="text/css" />
86
+ <link href="http://static.bbci.co.uk/food/1.34.0/css/widgets/cps-promo-module.css" media="screen" rel="stylesheet" type="text/css" />
87
+ <link href="http://static.bbci.co.uk/food/1.34.0/css/print.css" media="print" rel="stylesheet" type="text/css" />
88
+ <style type="text/css" media="screen">
89
+ <!--
90
+ body{
91
+ background-image:url('http://static.bbci.co.uk/food/1.34.0/css/seasons/spring/f/bgs/body.png');
92
+ }
93
+ #heading span{
94
+ background-image:url('http://static.bbci.co.uk/food/1.34.0/css/seasons/spring/f/headers/food.jpg');
95
+ }
96
+ #banner-image{
97
+ background-image:url('http://static.bbci.co.uk/food/1.34.0/css/seasons/spring/f/banners/banner_1.jpg');
98
+ }
99
+ .campaigns-get-baking #sub-heading span{
100
+ background-image:url('');
101
+ }
102
+ #campaign-link.campaign span{
103
+ background-image:url('');
104
+ }
105
+ .campaigns-get-baking .get-baking span{
106
+ background-image:url('');
107
+ }
108
+ .accordion-header-open{
109
+ background-image:url('http://static.bbci.co.uk/food/1.34.0/css/seasons/spring/f/bgs/resource_list_open.png');
110
+ }
111
+ .accordion-header-open-hover{
112
+ background-image:url('http://static.bbci.co.uk/food/1.34.0/css/seasons/spring/f/bgs/resource_list_open_hover.png');
113
+ }
114
+
115
+ -->
116
+ </style>
117
+ </head>
118
+ <body id="paella_7100" class="spring recipes-show chef-antony_worrall_thompson Halloween">
119
+ <!-- BBCDOTCOM body first spectrum -->
120
+ <script type="text/javascript">/*<![CDATA[*/ bbcFlagpoles_istats = 'ON'; istatsTrackingUrl = '//sa.bbc.co.uk/bbc/bbc/s?name=food.recipes.paella_7100.page&pal_route=resourceShow&ml_name=barlesque&app_type=web&language=en-GB&ml_version=0.16.1&pal_webapp=food&prod_name=food&app_name=food'; if (window.istats_countername) { istatsTrackingUrl = istatsTrackingUrl.replace(/([?&]name=)[^&]+/ig, '$1' + istats_countername); } (function() { if ( /\bIDENTITY=/.test(document.cookie) ) { istatsTrackingUrl += '&bbc_identity=1'; } var c = (document.cookie.match(/\bckns_policy=(\d\d\d)/)||[]).pop() || ''; istatsTrackingUrl += '&bbc_mc=' + (c? 'ad'+c.charAt(0)+'ps'+c.charAt(1)+'pf'+c.charAt(2) : 'not_set'); if ( /\bckns_policy=\d\d0/.test(document.cookie) ) { istatsTrackingUrl += '&ns_nc=1'; } var screenWidthAndHeight = 'unavailable'; if (window.screen && screen.width && screen.height) { screenWidthAndHeight = screen.width + 'x' + screen.height; } istatsTrackingUrl += ('&screen_resolution=' + screenWidthAndHeight); istatsTrackingUrl += '&blq_s=3.5&blq_r=3.5&blq_v=default-worldwide'; })(); /*]]>*/</script> <!-- Begin iStats 20100118 (UX-CMC 1.1009.3) --> <script type="text/javascript">/*<![CDATA[*/ (function() { window.istats || (istats = {}); var cookieDisabled = (document.cookie.indexOf('NO-SA=') != -1), hasCookieLabels = (document.cookie.indexOf('sa_labels=') != -1), hasClickThrough = /^#sa-(.*?)(?:-sa(.*))?$/.test(document.location.hash), runSitestat = !cookieDisabled && !hasCookieLabels && !hasClickThrough && !istats._linkTracked; if (runSitestat && bbcFlagpoles_istats === 'ON') { sitestat(istatsTrackingUrl); } else { window.ns_pixelUrl = istatsTrackingUrl; /* used by Flash library to track */ } function sitestat(n){var j=document,f=j.location,b="";if(j.cookie.indexOf("st_ux=")!=-1){var k=j.cookie.split(";");var e="st_ux",h=document.domain,a="/";if(typeof ns_!="undefined"&&typeof ns_.ux!="undefined"){e=ns_.ux.cName||e;h=ns_.ux.cDomain||h;a=ns_.ux.cPath||a}for(var g=0,f=k.length;g<f;g++){var m=k[g].indexOf("st_ux=");if(m!=-1){b="&"+unescape(k[g].substring(m+6))}}document.cookie=e+"=; expires="+new Date(new Date().getTime()-60).toGMTString()+"; path="+a+"; domain="+h}ns_pixelUrl=n;n=ns_pixelUrl+"&ns__t="+(new Date().getTime())+"&ns_c="+((j.characterSet)?j.characterSet:j.defaultCharset)+"&ns_ti="+escape(j.title)+b+"&ns_jspageurl="+escape(f&&f.href?f.href:j.URL)+"&ns_referrer="+escape(j.referrer);if(n.length>2000&&n.lastIndexOf("&")){n=n.substring(0,n.lastIndexOf("&")+1)+"ns_cut="+n.substring(n.lastIndexOf("&")+1,n.lastIndexOf("=")).substring(0,40)}(j.images)?new Image().src=n:j.write('<p><i'+'mg src="'+n+'" height="1" width="1" alt="" /></p>')}; })(); /*]]>*/</script>
121
+ <noscript>
122
+ <p style="position: absolute; top: -999em;"><img src="//sa.bbc.co.uk/bbc/bbc/s?name=food.recipes.paella_7100.page&amp;pal_route=resourceShow&amp;ml_name=barlesque&amp;app_type=web&amp;language=en-GB&amp;ml_version=0.16.1&amp;pal_webapp=food&amp;prod_name=food&amp;app_name=food&amp;blq_s=3.5&amp;blq_r=3.5&amp;blq_v=default-worldwide" height="1" width="1" alt="" /></p>
123
+ </noscript>
124
+ <!-- End iStats (UX-CMC) -->
125
+ <div id="blq-global">
126
+ <div id="blq-pre-mast" lang="en-GB">
127
+ <!-- Pre mast -->
128
+ <!-- BBCDOTCOM leaderboard template:server-side journalismVariant: false ipIsAdvertiseCombined: false adsEnabled: true showDotcom: true flagpole: ON showAdAboveBlq: true blqLeaderboardAd: true -->
129
+ </div>
130
+ </div>
131
+ <script type="text/html" id="blq-bbccookies-tmpl"><![CDATA[ <div id="bbccookies-prompt"> <h2> Cookies on the BBC website </h2> <p> We use cookies to ensure that we give you the best experience on our website. If you continue without changing your settings, we'll assume that you are happy to receive all cookies on the BBC website. However, if you would like to, you can <a href="/privacy/cookies/managing/cookie-settings.html">change your cookie settings</a> at any time. </p> <ul> <li id="bbccookies-continue"> <button type="button" id="bbccookies-continue-button">Continue</button> </li> <li id="bbccookies-more"><a href="/privacy/cookies/bbc">Find out more</a></li></ul> </div> ]]></script> <script type="text/javascript">/*<![CDATA[*/ (function(){if(bbccookies._showPrompt()){var i=document,b=i.getElementById("blq-pre-mast"),f=i.getElementById("blq-global"),h=i.getElementById("blq-container"),c=i.getElementById("blq-bbccookies-tmpl"),a,g,e;if(b&&i.createElement){a=i.createElement("div");a.id="bbccookies";e=c.innerHTML;e=e.replace("<"+"![CDATA[","").replace("]]"+">","");a.innerHTML=e;if(f){f.insertBefore(a,b)}else{h.insertBefore(a,b)}g=i.getElementById("bbccookies-continue-button");g.onclick=function(){a.parentNode.removeChild(a);return false};bbccookies._setPolicy()}}})(); /*]]>*/</script>
132
+ <div id="blq-masthead" class="blq-clearfix blq-mast-bg-transparent-dark blq-lang-en-GB blq-ltr">
133
+ <span id="blq-mast-background"><span></span></span>
134
+ <div id="blq-mast" class="blq-rst">
135
+ <div id="blq-mast-bar" class="blq-masthead-container blq-default-worldwide">
136
+ <div id="blq-blocks"> <a href="/" hreflang="en-GB"> <abbr title="British Broadcasting Corporation" class="blq-home"> <img src="http://static.bbci.co.uk/frameworks/barlesque/2.44.2/desktop/3.5/img/blq-blocks_grey_alpha.png" alt="BBC" width="84" height="24" /> </abbr> </a> </div>
137
+ <div id="blq-acc-links">
138
+ <h2 id="page-top">Accessibility links</h2>
139
+ <ul>
140
+ <li><a href="#blq-content">Skip to content</a></li>
141
+ <li><a href="/accessibility/">Accessibility Help</a></li>
142
+ </ul>
143
+ </div>
144
+ <div id="blq-sign-in" class="blq-gel">
145
+ <div id="id-status">
146
+ <div class="id-out id-gel">
147
+ <h2 class="blq-hide">BBC iD</h2>
148
+ <a href="https://id.bbc.co.uk/users/signin?s=sb" class="blq-nogo has-ptrt idSignin"><span class="id-icon"><span></span></span>Sign in<span class="id-spinner"></span></a>
149
+ </div>
150
+ </div>
151
+ </div>
152
+ <div id="blq-nav">
153
+ <h2>bbc.co.uk navigation</h2>
154
+ <ul id="blq-nav-main">
155
+ <li id="blq-nav-news"> <a href="http://www.bbc.com/news/">News</a> </li>
156
+ <li id="blq-nav-sport"> <a href="http://www.bbc.co.uk/sport/">Sport</a> </li>
157
+ <li id="blq-nav-weather"> <a href="http://www.bbc.co.uk/weather/">Weather</a> </li>
158
+ <li id="blq-nav-travel"> <a href="http://www.bbc.com/travel/">Travel</a> </li>
159
+ <li id="blq-nav-future"> <a href="http://www.bbc.com/future/">Future</a> </li>
160
+ <li id="blq-nav-autos"> <a href="http://www.bbc.com/autos/">Autos</a> </li>
161
+ <li id="blq-nav-tv"> <a href="/tv/">TV</a> </li>
162
+ <li id="blq-nav-radio"> <a href="/radio/">Radio</a> </li>
163
+ <li id="blq-nav-more"> <a href="/a-z/">More&hellip;</a> </li>
164
+ </ul>
165
+ <div id="blq-nav-search">
166
+ <form method="get" action="http://search.bbc.co.uk/search" accept-charset="utf-8" id="blq-search-form">
167
+ <div> <input type="hidden" name="go" value="toolbar" /> <input type="hidden" name="uri" value="/food/recipes/paella_7100" /> <label for="blq-search-q" class="blq-hide">Search term:</label> <input id="blq-search-q" type="text" name="q" value="" maxlength="128" /> <button id="blq-search-btn" type="submit"><span><img src="http://static.bbci.co.uk/frameworks/barlesque/2.44.2/desktop/3.5/img/blq-search_grey_alpha.png" width="13" height="13" alt="Search"/></span></button> </div>
168
+ </form>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </div>
173
+ </div>
174
+ <div id="blq-container-outer" class="blq-default-worldwide blq-ltr" >
175
+ <div id="blq-container" class="blq-lang-en-GB blq-dotcom">
176
+ <div id="blq-container-inner" lang="en-GB">
177
+ <div id="blq-main" class="blq-clearfix">
178
+ <div class="gBanner" id="gBanner">
179
+ <p><img alt="BBC" src="http://static.bbci.co.uk/food/1.34.0/css/f/print/bbc_food_logo.gif"/></p>
180
+ </div>
181
+ <div id="banner">
182
+ <p id="heading"><a href="/food/">Food<span></span></a></p>
183
+ <p id="sub-heading">Recipes</p>
184
+ <div id="banner-image"></div>
185
+ </div>
186
+ <ol id="site-nav">
187
+ <li class="unselected first-child">
188
+ <a class = "" href="/food/">Home</a>
189
+ </li>
190
+ <li class="selected">
191
+ <a class = " with-more" href="/food/recipes/">Recipes</a>
192
+ <ul class="sub-nav">
193
+ <li class="sub-nav-item first-child"><a class="sub-nav-item first-child" href="/food/seasons">In Season</a></li>
194
+ <li class="sub-nav-item"><a class="sub-nav-item" href="/food/occasions">Occasions</a></li>
195
+ <li class="sub-nav-item"><a class="sub-nav-item" href="/food/cuisines">Cuisines</a></li>
196
+ <li class="sub-nav-item"><a class="sub-nav-item" href="/food/dishes">Dishes</a></li>
197
+ </ul>
198
+ </li>
199
+ <li class="unselected">
200
+ <a class = "" href="/food/chefs">Chefs</a>
201
+ </li>
202
+ <li class="unselected">
203
+ <a class = "" href="/food/programmes">Programmes</a>
204
+ </li>
205
+ <li class="unselected">
206
+ <a class = "" href="/food/ingredients">Ingredients</a>
207
+ </li>
208
+ <li class="unselected">
209
+ <a class = "" href="/food/techniques">Techniques</a>
210
+ </li>
211
+ <li class="unselected">
212
+ <a class = "" href="/food/about">FAQs</a>
213
+ </li>
214
+ <li class="binder"><span></span><a href="/food/binder/help">Recipe binder</a></li>
215
+ </ol>
216
+ <div id="site-sub-nav-helper"></div>
217
+ <div class="page hrecipe">
218
+ <div id="column-1" class="column">
219
+ <div class="article-title">
220
+ <h1 class="fn ">Paella</h1>
221
+ </div>
222
+ <div id="subcolumn-1" class="subcolumn">
223
+ <img id="food-image" class="photo" src="http://ichef.bbci.co.uk/food/ic/food_16x9_448/recipes/paella_7100_16x9.jpg" width="448" height="252" alt="Paella" />
224
+ <div id="description" class="module padded summary">
225
+ <p><span class="summary">An authentic seafood and chicken paella that boasts some of Spain’s finest ingredients, from calasparra rice to chorizo.</span></p>
226
+ </div>
227
+ <div id="ingredients" class="module bordered module padded">
228
+ <h2>Ingredients</h2>
229
+ <ul>
230
+ <li>
231
+ <p class="ingredient">170g/6oz <a href="/food/chorizo" class="name food">chorizo</a>, cut into thin slices</p>
232
+ </li>
233
+ <li>
234
+ <p class="ingredient">110g/4oz <a href="/food/pancetta" class="name food">pancetta</a>, cut into small dice</p>
235
+ </li>
236
+ <li>
237
+ <p class="ingredient">2 cloves <a href="/food/garlic" class="name food">garlic</a> finely chopped</p>
238
+ </li>
239
+ <li>
240
+ <p class="ingredient">1 large Spanish <a href="/food/onion" class="name food">onion</a>, finely diced</p>
241
+ </li>
242
+ <li>
243
+ <p class="ingredient">1 red pepper, diced</p>
244
+ </li>
245
+ <li>
246
+ <p class="ingredient">1 tsp soft <a href="/food/thyme" class="name food">thyme</a> leaves</p>
247
+ </li>
248
+ <li>
249
+ <p class="ingredient">¼ tsp dried red chilli flakes</p>
250
+ </li>
251
+ <li>
252
+ <p class="ingredient">570ml/1pint calasparra (Spanish short-grain) rice</p>
253
+ </li>
254
+ <li>
255
+ <p class="ingredient">1 tsp <a href="/food/paprika" class="name food">paprika</a></p>
256
+ </li>
257
+ <li>
258
+ <p class="ingredient">125ml/4fl oz dry <a href="/food/white_wine" class="name food">white wine</a></p>
259
+ </li>
260
+ <li>
261
+ <p class="ingredient">1.2 litres/2 pints <a href="/food/chicken_stock" class="name food">chicken stock</a>, heated with ¼ tsp saffron strands</p>
262
+ </li>
263
+ <li>
264
+ <p class="ingredient">8 <a href="/food/chicken" class="name food">chicken</a> thighs, each chopped in half and browned</p>
265
+ </li>
266
+ <li>
267
+ <p class="ingredient">18 small <a href="/food/clams" class="name food">clams</a>, cleaned</p>
268
+ </li>
269
+ <li>
270
+ <p class="ingredient">110g/4oz fresh or frozen <a href="/food/pea" class="name food">peas</a></p>
271
+ </li>
272
+ <li>
273
+ <p class="ingredient">4 large <a href="/food/tomato" class="name food">tomatoes</a>, de-seeded and diced</p>
274
+ </li>
275
+ <li>
276
+ <p class="ingredient">125ml/4fl oz good <a href="/food/olive_oil" class="name food">olive oil</a></p>
277
+ </li>
278
+ <li>
279
+ <p class="ingredient">1 head <a href="/food/garlic" class="name food">garlic</a>, cloves separated and peeled</p>
280
+ </li>
281
+ <li>
282
+ <p class="ingredient">12 jumbo raw <a href="/food/prawn" class="name food">prawns</a>, in shells</p>
283
+ </li>
284
+ <li>
285
+ <p class="ingredient">450g/1lb <a href="/food/squid" class="name food">squid</a>, cleaned and chopped into bite-sized pieces</p>
286
+ </li>
287
+ <li>
288
+ <p class="ingredient">5 tbsp chopped flatleaf <a href="/food/parsley" class="name food">parsley</a></p>
289
+ </li>
290
+ <li>
291
+ <p class="ingredient">Salt and freshly ground <a href="/food/black_pepper" class="name food">black pepper</a></p>
292
+ </li>
293
+ </ul>
294
+ </div>
295
+ <div id="preparation" class="module bordered">
296
+ <h2>Preparation method</h2>
297
+ <ol class="instructions">
298
+ <li class="instruction">
299
+ <p>Heat half the olive oil in a paella dish or heavy-based saucepan. Add the chorizo and pancetta and fry until crisp. Add the garlic, onion and pepper and heat until softened. Add the thyme, chilli flakes and calasparra rice, and stir until all the grains of rice are nicely coated and glossy. Now add the paprika and dry white wine and when it is bubbling, pour in the hot chicken stock, add the chicken thighs and cook for 5-10 minutes.</p>
300
+ </li>
301
+ <li class="instruction">
302
+ <p>Now place the clams into the dish with the join facing down so that the edges open outwards. Sprinkle in the peas and chopped tomatoes and continue to cook gently for another 10 minutes.</p>
303
+ </li>
304
+ <li class="instruction">
305
+ <p>Meanwhile, heat the remaining oil with the garlic cloves in a separate pan and add the prawns. Fry quickly for a minute or two then add them to the paella. Now do the same with the squid and add them to the paella too.</p>
306
+ </li>
307
+ <li class="instruction">
308
+ <p>Scatter the chopped parsley over the paella and serve immediately.</p>
309
+ </li>
310
+ </ol>
311
+ </div>
312
+ <div id="related-tips-list-module" class="inline-accordion module">
313
+ <h2 class="accordion-header tip"><span></span>Top recipe tip</h2>
314
+ <div>
315
+ <p>If you don't have a pan large enough to hold all of the rice and paella ingredients, use two pans and divide the rice between them.</p>
316
+ </div>
317
+ <h2 class="accordion-header techniques"><span></span>Required techniques</h2>
318
+ <ul>
319
+ <li class="">
320
+ <a href="/food/techniques/chopping_vegetables">Learning to chop: finely chopping celery</a>
321
+ </li>
322
+ <li class="">
323
+ <a href="/food/techniques/de-seeding_tomatoes">De-seeding tomatoes</a>
324
+ </li>
325
+ <li class="last-child">
326
+ <a href="/food/techniques/cleaning_squid">Cleaning and preparing squid</a>
327
+ </li>
328
+ </ul>
329
+ </div>
330
+ </div>
331
+ <div id="subcolumn-2" class="subcolumn">
332
+ <div id="chef-details" class=" module">
333
+ <h2>
334
+ By
335
+ <a href="/food/chefs/antony_worrall_thompson">
336
+ <span class="author">Antony Worrall Thompson</span>
337
+ <img src="http://ichef.bbci.co.uk/food/ic/food_1x1_72/chefs/antony_worrall_thompson_1x1.jpg" width="72" height="72" alt="Antony Worrall Thompson" />
338
+ </a>
339
+ </h2>
340
+ </div>
341
+ <div id="article-details" class="module bordered">
342
+ <h3><span class="prepTime"><span class="value-title" title="PT1H"></span>30 mins to 1 hour</span> preparation time</h3>
343
+ <h3><span class="cookTime"><span class="value-title" title="PT30M"></span>10 to 30 mins</span> cooking time</h3>
344
+ <h3 class="yield">Serves 6-8</h3>
345
+ </div>
346
+ <div id="binder-module" class="module coloured padded">
347
+ <h2>
348
+ Recipe binder
349
+ </h2>
350
+ <a id="sign-in" class="sign-in" href="https://ssl.bbc.co.uk/id/signin?ptrt=http%3A%2F%2Fwww.bbc.co.uk%2Ffood%2Frecipes%2Fpaella_7100"><span></span>Sign in to save this recipe in your binder</a>
351
+ </div>
352
+ <div class="bbc-st bbc-st-slim bbc-st-colour bbc-st-dark">
353
+ <p class="bbc-st-basic">
354
+ <a href="/sharetools/share?url=http://www.bbc.co.uk/food/recipes/paella_7100&amp;appId=Food&amp;env=int">Share this page</a>
355
+ </p>
356
+ </div>
357
+ <div id="user-actions" class="module coloured padded">
358
+ <ul>
359
+ <li><a class="print-link" href="/food/recipes/paella_7100.pdf"><span></span>Print version</a></li>
360
+ <li><a rel="nofollow" class="shopping-list-link" href="/food/recipes/paella_7100/shopping-list"><span></span>Shopping list</a></li>
361
+ <li><a class="mobile-link" href="/food/recipes/paella_7100/share"><span></span>Send to a mobile</a></li>
362
+ </ul>
363
+ </div>
364
+ <div id="recommend" class="module coloured padded">
365
+ <h2 class="description"><span>75</span> people have recommended this recipe</h2>
366
+ <a href="https://ssl.bbc.co.uk/id/signin?ptrt=http://www.bbc.co.uk/food/recipes/paella_7100" id="sign-in">Sign in to recommend</a>
367
+ </div>
368
+ <div id="related-diets-list-module" class="inline-accordion module">
369
+ <h2 class="accordion-header coloured">Special Diets</h2>
370
+ <ul>
371
+ <li class=""><a href="/food/diets/dairy_free"><span class="tag">Dairy-free</span> recipes</a></li>
372
+ <li class=""><a href="/food/diets/egg_free"><span class="tag">Egg-free</span> recipes</a></li>
373
+ <li class=""><a href="/food/diets/gluten_free"><span class="tag">Gluten-free</span> recipes</a></li>
374
+ <li class="last-child"><a href="/food/diets/healthy"><span class="tag">Healthy</span> recipes</a></li>
375
+ </ul>
376
+ </div>
377
+ </div>
378
+ </div>
379
+ <div id="column-2" class="column">
380
+ <div id="quick-recipe-finder" class="module coloured">
381
+ <h2>Quick recipe finder</h2>
382
+ <div class="search-help">
383
+ <p>Type the ingredients you want to use, then click <strong class="search-text">Go</strong>. For better results you can use quotation marks around phrases (e.g. &quot;chicken breast&quot;). Alternatively you can search by chef, programme, cuisine, diet, or dish (e.g. Lasagne).</p>
384
+ </div>
385
+ <form method="get" action="/food/recipes/search">
386
+ <fieldset>
387
+ <label for="search-keywords" id="search-keywords-label">Type ingredients, chef or programme</label>
388
+ <input type="text" id="search-keywords" name="keywords" />
389
+ <input type="image" id="search-submit" alt="Go" src="http://static.bbci.co.uk/food/1.34.0/css/f/buttons/quick_search.png" />
390
+ <label for="search-quick-filter" id="search-quick-filter-label" class="filter-label">
391
+ <input type="checkbox" id="search-quick-filter" class="filter" name="quickAndEasy" value="true" />
392
+ Quick &amp; Easy
393
+ </label>
394
+ <label for="search-vegetarian-filter" id="search-vegetarian-filter-label" class="filter-label">
395
+ <input type="checkbox" id="search-vegetarian-filter" class="filter" name="diets[]" value="vegetarian" />
396
+ Vegetarian
397
+ </label>
398
+ </fieldset>
399
+ </form>
400
+ <a id="advanced-search-link" href="/food/recipes#quick-recipe-finder">Advanced search options</a>
401
+ </div>
402
+ <div id="related-recipes-list-module" class="module grouped-resource-list-module">
403
+ <h2>Related recipes</h2>
404
+ <h3 class="accordion-header initial">Recipes for paella</h3>
405
+ <div class="accordion resource-list">
406
+ <ul class="resources">
407
+ <li>
408
+ <h4>
409
+ <a href="/food/recipes/seafood_paella_79673">
410
+ Seafood paella </a>
411
+ </h4>
412
+ <h5>By <span class="chef-name">The Hairy Bikers</span></h5>
413
+ </li>
414
+ <li class="with-image">
415
+ <h4>
416
+ <a href="/food/recipes/our_paella_92328">
417
+ <img src="http://ichef.bbci.co.uk/food/ic/food_16x9_88/recipes/our_paella_92328_16x9.jpg" width="88" height="50" alt="Our paella " />
418
+ Our paella </a>
419
+ </h4>
420
+ <h5>By <span class="chef-name">The Hairy Bikers</span></h5>
421
+ </li>
422
+ <li class=" last-child">
423
+ <h4>
424
+ <a href="/food/recipes/beachside_paella_41859">
425
+ Beachside paella </a>
426
+ </h4>
427
+ <h5>By <span class="chef-name">The Hairy Bikers</span></h5>
428
+ </li>
429
+ </ul>
430
+ <p class="see-all">See more <a href="/food/paella">paella recipes</a></p>
431
+ </div>
432
+ <h3 class="accordion-header">Antony Worrall Thompson recipes</h3>
433
+ <div class="accordion resource-list">
434
+ <ul class="resources">
435
+ <li class="with-image">
436
+ <h4>
437
+ <a href="/food/recipes/moroccanlambtagine_6696">
438
+ <img src="http://ichef.bbci.co.uk/food/ic/food_16x9_88/recipes/moroccanlambtagine_6696_16x9.jpg" width="88" height="50" alt="Moroccan lamb tagine" />
439
+ Moroccan lamb tagine </a>
440
+ </h4>
441
+ <h5>By <span class="chef-name">Antony Worrall Thompson</span></h5>
442
+ </li>
443
+ <li class="with-image">
444
+ <h4>
445
+ <a href="/food/recipes/beefwellington_2063">
446
+ <img src="http://ichef.bbci.co.uk/food/ic/food_16x9_88/recipes/beefwellington_2063_16x9.jpg" width="88" height="50" alt="Beef Wellington" />
447
+ Beef Wellington </a>
448
+ </h4>
449
+ <h5>By <span class="chef-name">Antony Worrall Thompson</span></h5>
450
+ </li>
451
+ <li class="with-image last-child">
452
+ <h4>
453
+ <a href="/food/recipes/thaisteamedsalmon_7254">
454
+ <img src="http://ichef.bbci.co.uk/food/ic/food_16x9_88/recipes/thaisteamedsalmon_7254_16x9.jpg" width="88" height="50" alt="Thai steamed salmon" />
455
+ Thai steamed salmon </a>
456
+ </h4>
457
+ <h5>By <span class="chef-name">Antony Worrall Thompson</span></h5>
458
+ </li>
459
+ </ul>
460
+ <p class="see-all">See more <a href="/food/chefs/antony_worrall_thompson">Antony Worrall Thompson recipes</a></p>
461
+ </div>
462
+ <h3 class="accordion-header">Tapas recipes</h3>
463
+ <div class="accordion resource-list">
464
+ <ul class="resources last-of-type">
465
+ <li class="with-image">
466
+ <h4>
467
+ <a href="/food/recipes/troutcroquettes_91864">
468
+ <img src="http://ichef.bbci.co.uk/food/ic/food_16x9_88/recipes/troutcroquettes_91864_16x9.jpg" width="88" height="50" alt="Trout croquettes" />
469
+ Trout croquettes </a>
470
+ </h4>
471
+ <h5>By <span class="chef-name">Valentine Warner</span></h5>
472
+ </li>
473
+ <li class="with-image">
474
+ <h4>
475
+ <a href="/food/recipes/sangria_93847">
476
+ <img src="http://ichef.bbci.co.uk/food/ic/food_16x9_88/recipes/sangria_93847_16x9.jpg" width="88" height="50" alt="Sangria" />
477
+ Sangria </a>
478
+ </h4>
479
+ <h5>By <span class="chef-name">Jill Dupleix</span></h5>
480
+ </li>
481
+ <li class="with-image last-child">
482
+ <h4>
483
+ <a href="/food/recipes/stuffedbabypeppers_67844">
484
+ <img src="http://ichef.bbci.co.uk/food/ic/food_16x9_88/recipes/stuffedbabypeppers_67844_16x9.jpg" width="88" height="50" alt="Stuffed baby peppers" />
485
+ Stuffed baby peppers </a>
486
+ </h4>
487
+ <h5>By <span class="chef-name">Gennaro Contaldo</span></h5>
488
+ </li>
489
+ </ul>
490
+ <p class="see-all">See <a href="/food/collections/tapas">more Tapas recipes recipes</a> <span class="recipe-count">(13)</span></p>
491
+ </div>
492
+ </div>
493
+ <div id="cps-promo" class="module coloured">
494
+ <h2>Food Features</h2>
495
+ <div class="cps-promo-articles-container">
496
+ <ul>
497
+ <li class="cps-promo-article">
498
+ <a href="http://www.bbc.co.uk/food/0/21881077" title="Roast leg of lamb">
499
+ <div class="cps-promo-overlay">
500
+ <h3 class="cps-promo-title">Easter lamb</h3>
501
+ <p class="cps-promo-summary">Should you buy NZ lamb for your Sunday roast?
502
+ </h3>
503
+ </div>
504
+ <img src="http://ichef.bbci.co.uk/food/ic/newsimg/food_16x9_320/66601000/jpg/_66601283_roastlegoflambwithga_90252_16x9.jpg" alt="Roast leg of lamb"/>
505
+ </a>
506
+ </li>
507
+ <li class="cps-promo-article">
508
+ <a href="http://www.bbc.co.uk/food/0/21745425" title="Paul A. Young chocolates">
509
+ <div class="cps-promo-overlay">
510
+ <h3 class="cps-promo-title">Top of the chocs</h3>
511
+ <p class="cps-promo-summary">The importance of pairing chocolate well
512
+ </h3>
513
+ </div>
514
+ <img src="http://ichef.bbci.co.uk/food/ic/newsimg/food_16x9_320/66329000/jpg/_66329969_timeline.jpg" alt="Paul A. Young chocolates"/>
515
+ </a>
516
+ </li>
517
+ <li class="cps-promo-article">
518
+ <a href="http://www.bbc.co.uk/food/0/21745424" title="Paul A. Young's Easter Simnel truffles">
519
+ <div class="cps-promo-overlay">
520
+ <h3 class="cps-promo-title">Nice spice</h3>
521
+ <p class="cps-promo-summary">How to make Paul A. Young's Easter simnel truffles
522
+ </h3>
523
+ </div>
524
+ <img src="http://ichef.bbci.co.uk/food/ic/newsimg/food_16x9_320/66329000/jpg/_66329918_truffles.jpg" alt="Paul A. Young's Easter Simnel truffles"/>
525
+ </a>
526
+ </li>
527
+ <li class="cps-promo-article">
528
+ <a href="http://www.bbc.co.uk/food/0/21881076" title="Indian spices">
529
+ <div class="cps-promo-overlay">
530
+ <h3 class="cps-promo-title">Festival of colours</h3>
531
+ <p class="cps-promo-summary">Food eaten on Hindu Holi celebration 'tastes of spring'
532
+ </h3>
533
+ </div>
534
+ <img src="http://ichef.bbci.co.uk/food/ic/newsimg/food_16x9_320/66592000/jpg/_66592895_p1010256.jpg" alt="Indian spices"/>
535
+ </a>
536
+ </li>
537
+ </ul>
538
+ </div>
539
+ <div class="prev"><span class="arrow">&nbsp;</span></div>
540
+ <div class="next"><span class="arrow">&nbsp;</span></div>
541
+ </div>
542
+ </div>
543
+ </div>
544
+ </div>
545
+ <!--[if IE 6]>
546
+ <div id="blq-ie6-upgrade">
547
+ <p> <span>You're using the Internet Explorer 6 browser to view the BBC website. Our site will work much better if you change to a more modern browser. It's free, quick and easy.</span> <a href="http://www.browserchoice.eu/">Find out more <span>about upgrading your browser</span> here&hellip;</a> </p>
548
+ </div>
549
+ <![endif]-->
550
+ <div id="blq-foot" lang="en-GB" class="blq-rst blq-clearfix blq-foot-grey">
551
+ <div id="blq-footlinks">
552
+ <h2 class="blq-hide">BBC links</h2>
553
+ <ul>
554
+ <li class="blq-footlinks-row">
555
+ <ul class="blq-footlinks-row-list">
556
+ <li><a href="http://m.bbc.co.uk/" id="blq-footer-mobile">Mobile site</a></li>
557
+ <li><a href="/terms/">Terms of Use</a></li>
558
+ <li><a href="/aboutthebbc/">About the BBC</a></li>
559
+ </ul>
560
+ </li>
561
+ <li class="blq-footlinks-row">
562
+ <ul class="blq-footlinks-row-list">
563
+ <li><a href="http://advertising.bbcworldwide.com">Advertise With Us</a></li>
564
+ <li><a href="/privacy/">Privacy</a></li>
565
+ <li><a href="/help/">BBC Help</a></li>
566
+ </ul>
567
+ </li>
568
+ <li class="blq-footlinks-row">
569
+ <ul class="blq-footlinks-row-list">
570
+ <li><a href="/bbc.com/ad-choices/">Ad Choices</a></li>
571
+ <li><a href="/privacy/bbc-cookies-policy.shtml">Cookies</a></li>
572
+ <li><a href="/accessibility/">Accessibility Help</a></li>
573
+ </ul>
574
+ </li>
575
+ <li class="blq-footlinks-row">
576
+ <ul class="blq-footlinks-row-list">
577
+ <li><a href="/guidance/">Parental Guidance</a></li>
578
+ <li><a href="/food/feedback">Contact Us</a></li>
579
+ </ul>
580
+ </li>
581
+ </ul>
582
+ <script type="text/javascript">/*<![CDATA[*/ (function() { var mLink = document.getElementById('blq-footer-mobile'), stick = function() { var d = new Date (); d.setYear(d.getFullYear() + 1); d = d.toUTCString(); window.bbccookies.set('ckps_d=m;domain=.bbc.co.uk;path=/;expires=' + d ); window.bbccookies.set('ckps_d=m;domain=.bbc.com;path=/;expires=' + d ); }; if (mLink) { if (mLink.addEventListener) { mLink.addEventListener('click', stick, false); } else if (mLink.attachEvent) { mLink.attachEvent('onclick', stick); } } })(); /*]]>*/</script>
583
+ </div>
584
+ <div id="blq-foot-blocks" class="blq-footer-image-light"><img src="http://static.bbci.co.uk/frameworks/barlesque/2.44.2/desktop/3.5/img/blocks/light.png" width="84" height="24" alt="BBC" /></div>
585
+ <p id="blq-disclaim"><span id="blq-copy">BBC &copy; 2013</span> <a href="/help/web/links/">The BBC is not responsible for the content of external sites. Read more.</a></p>
586
+ <div id="blq-obit">
587
+ <p><strong>This page is best viewed in an up-to-date web browser with style sheets (CSS) enabled. While you will be able to view the content of this page in your current browser, you will not be able to get the full visual experience. Please consider upgrading your browser software or enabling style sheets (CSS) if you are able to do so.</strong></p>
588
+ </div>
589
+ </div>
590
+ </div>
591
+ <!-- BBCDOTCOM analytics template:server-side journalismVariant: false ipIsAdvertiseCombined: false adsEnabled: true showDotcom: true flagpole: ON -->
592
+ <script type="text/javascript">
593
+ /*<![CDATA[*/
594
+ if('undefined' != typeof(bbcdotcom) && 'undefined' != typeof(bbcdotcom.stats)) {
595
+ bbcdotcom.stats.adEnabled = "no";
596
+ bbcdotcom.stats.contentType = "HTML";
597
+ }
598
+ /*]]>*/
599
+ </script>
600
+ <script type="text/javascript" src="http://js.revsci.net/gateway/gw.js?csid=J08781"></script>
601
+ <script type="text/javascript">
602
+ DM_tag();
603
+ </script>
604
+ <!-- SiteCatalyst code version: H.21.
605
+ Copyright 1996-2010 Adobe, Inc. All Rights Reserved
606
+ More info available at http://www.omniture.com -->
607
+ <script type="text/javascript">
608
+ var s_account = "bbcwglobalprod";
609
+ </script>
610
+ <script type="text/javascript" src="http://static.bbci.co.uk/bbcdotcom/0.3.175/script/s_code.js"></script>
611
+ <script type="text/javascript"><!--
612
+ /* You may give each page an identifying name, server, and channel on
613
+ the next lines. */
614
+
615
+ /************* DO NOT ALTER ANYTHING BELOW THIS LINE ! **************/
616
+ var s_code=scw.t();if(s_code)document.write(s_code)//--></script>
617
+ <script type="text/javascript"><!--
618
+ if(navigator.appVersion.indexOf('MSIE')>=0)document.write(unescape('%3C')+'\!-'+'-')
619
+ //--></script>
620
+ <noscript>
621
+ <div><a href="http://www.omniture.com" title="Web Analytics"><img
622
+ src="http://sa.bbc.com/b/ss/bbcwglobalprod/1/H.21--NS/0" height="1" width="1" alt="" /></a></div>
623
+ </noscript>
624
+ <!--/DO NOT REMOVE/-->
625
+ <!-- End SiteCatalyst code version: H.21. -->
626
+ <!-- Begin comScore Tag -->
627
+ <script type="text/javascript">
628
+ document.write(unescape("%3Cscript src='" + (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js' %3E%3C/script%3E"));
629
+ </script>
630
+ <script type="text/javascript">
631
+ /*<![CDATA[*/
632
+ COMSCORE.beacon({
633
+ c1:2,
634
+ c2:"6035051",
635
+ c3:"",
636
+ c4:"www.bbc.co.uk/food/recipes/paella_7100",
637
+ c5:"",
638
+ c6:"",
639
+ c15:""
640
+ });
641
+ /*]]>*/
642
+ </script>
643
+ <noscript>
644
+ <div>
645
+ <img src="http://b.scorecardresearch.com/b?c1=2&amp;c2=6035051&amp;c3=&amp;c4=www.bbc.co.uk/food/recipes/paella_7100&amp;c5=&amp;c6=&amp;c15=&amp;cv=1.3&amp;cj=1" style="display:none" width="0" height="0" alt="" />
646
+ </div>
647
+ </noscript>
648
+ <!-- End comScore Tag -->
649
+ <!-- START Nielsen Online SiteCensus V6.0 -->
650
+ <!-- COPYRIGHT 2010 Nielsen Online -->
651
+ <script type="text/javascript">
652
+ /*<![CDATA[*/
653
+ (function () {
654
+ var d = new Image(1, 1);
655
+ d.onerror = d.onload = function () {
656
+ d.onerror = d.onload = null;
657
+ };
658
+ d.src = [('https:' == document.location.protocol ? 'https:' : 'http:') + "//secure-us.imrworldwide.com/cgi-bin/m?ci=us-804789h&amp;cg=0&amp;cc=1&amp;si=", escape(window.location.href), "&amp;rp=",
659
+ escape(document.referrer), "&amp;ts=compact&amp;rnd=", (new Date()).getTime()].join('');
660
+ })();
661
+ /*]]>*/
662
+ </script>
663
+ <noscript>
664
+ <div>
665
+ <img src="http://secure-us.imrworldwide.com/cgi-bin/m?ci=us-804789h&amp;cg=0&amp;cc=1&amp;ts=noscript"
666
+ width="1" height="1" alt="" />
667
+ </div>
668
+ </noscript>
669
+ <!-- END Nielsen Online SiteCensus V6.0 -->
670
+ <!-- Effective Measure BBCCOM-1195 -->
671
+ <script type="text/javascript">
672
+ /*<![CDATA[*/
673
+ (function() {
674
+ var em = document.createElement('script'); em.type = 'text/javascript'; em.async = true;
675
+ em.src = ('https:' == document.location.protocol ? 'https://me-ssl' : 'http://me-cdn') + '.effectivemeasure.net/em.js';
676
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(em, s);
677
+ })();
678
+ /*]]>*/
679
+ </script>
680
+ <noscript>
681
+ <div>
682
+ <img src="http://me.effectivemeasure.net/em_image" alt="" style="position:absolute; left:-5px;" />
683
+ </div>
684
+ </noscript>
685
+ <!-- End Effective Measure -->
686
+ </div>
687
+ </div>
688
+ <script type="text/javascript"> if (typeof require !== 'undefined') { require(['istats-1'], function(istats){ istats.track('external', { region: document.getElementById('blq-main') }); istats.track('download', { region: document.getElementById('blq-main') }); }); } </script> <script type="text/html" id="blq-panel-template-promo"><![CDATA[ <div id="blq-panel-promo" class="blq-masthead-container"></div> ]]></script> <script type="text/html" id="blq-panel-template-more"><![CDATA[ <div id="blq-panel-more" class="blq-masthead-container blq-clearfix" lang="en-GB" dir="ltr"> <div class="blq-panel-container panel-paneltype-more"> <div class="panel-header"> <h2> <a href="/a-z/"> More&hellip; </a> </h2> <a href="/a-z/" class="panel-header-links panel-header-link">Full A-Z<span class="blq-hide"> of BBC sites</span></a> </div> <div class="panel-component panel-links"> <ul> <li> <a href="/cbbc/" >CBBC</a> </li> <li> <a href="/cbeebies/" >CBeebies</a> </li> <li> <a href="/comedy/" >Comedy</a> </li> </ul> <ul> <li> <a href="/food/" >Food</a> </li> <li> <a href="/health/" >Health</a> </li> <li> <a href="/history/" >History</a> </li> </ul> <ul> <li> <a href="/learning/" >Learning</a> </li> <li> <a href="/music/" >Music</a> </li> <li> <a href="/science/" >Science</a> </li> </ul> <ul> <li> <a href="/nature/" >Nature</a> </li> <li> <a href="/local/" >Local</a> </li> <li> <a href="/travelnews/" >Travel News</a> </li> </ul> </div> </div> ]]></script> <script type="text/javascript"> pulse.init( 'food', true ); </script> <script type="text/javascript">
689
+ //<![CDATA[
690
+ try{
691
+ gloader.load(
692
+ ['glow', '1', 'glow.anim', 'glow.dom', 'glow.events', 'glow.forms', 'glow.widgets', 'glow.embed', 'glow.widgets.Carousel', 'glow.widgets.InfoPanel', 'glow.widgets.AutoSuggest']
693
+ );
694
+ }
695
+ catch(e){}
696
+
697
+ var PAL_IMAGECHEF_HOST = 'http://ichef.bbci.co.uk';
698
+ var PAL_STATIC_HOST = 'http://static.bbci.co.uk';
699
+
700
+ var STATIC_ASSETS_VERSION = '1.34.0';
701
+
702
+
703
+ //]]>
704
+ </script>
705
+ <script type="text/javascript" src="http://static.bbci.co.uk/food/1.34.0/js/main.js"></script>
706
+ <script type="text/javascript" src="http://static.bbci.co.uk/food/1.34.0/js/recipes/recipes-show.js"></script>
707
+ <script type="text/javascript" src="http://static.bbci.co.uk/food/1.34.0/js/widgets/accordion.js"></script>
708
+ <script type="text/javascript" src="http://static.bbc.co.uk/modules/sharetools/v1/script/sharetools.js"></script>
709
+ <script type="text/javascript" src="http://static.bbci.co.uk/food/1.34.0/js/widgets/quick-recipe-finder.js"></script>
710
+ <script type="text/javascript" src="http://static.bbci.co.uk/food/1.34.0/js/widgets/cps-promo-module.js"></script>
711
+ </body>
712
+ </html>
713
+